skka3134

skka3134

email
telegram

加密貨幣和量化:3.策略配置

  1. 新建策略,對應的策略的文件路徑,user_data/strategies/test.py
freqtrade new-strategy --strategy test
  1. 附加參數,低級模板
freqtrade new-strategy --strategy test --template minimal
  1. 高級模板
freqtrade new-strategy --strategy test --template advanced

注意事項,不要使用未來數據,比如當天的價格最低點。
注意事項,盡力採用矢量化操作
INTERFACE_VERSION,這個是機器人使用的接口版本,默認是 3

    INTERFACE_VERSION = 3

啟用做空

    can_short: bool = False

最小投資回報率,這個命令是指在退出之前應該達到的最小回報率,即利潤達到百分之 4 時退出,30 分鐘後達到百分之 2 退出,60 分鐘後達到百分之 1 退出,不想啟用 roi,可將其設置為空

    minimal_roi = {
        "60": 0.01,
        "30": 0.02,
        "0": 0.04
    }

同樣也可將 ROI 根據時間範圍去設置

from freqtrade.exchange import timeframe_to_minutes

class AwesomeStrategy(IStrategy):

    timeframe = "1d"
    timeframe_mins = timeframe_to_minutes(timeframe)
    minimal_roi = {
        "0": 0.05,                      # 前3根K線5%
        str(timeframe_mins * 3): 0.02,  # 3根K線後2%
        str(timeframe_mins * 6): 0.01,  # 6根K線後1%
    }

設置止損百分之 10

stoploss = -0.10

時間範圍

timeframe = '5m'

策略的啟動時期,策略的啟動時期,是指在這個時間內,指標的計算會有誤差,但具體的啟動時間是多長時間,為了解決這個問題,給策略分配 startup_candle_count 這個屬性,該值是計算指標所需要的最大週期,例如

startup_candle_count = 100
dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100)

額外的信息對,這些信息對可能對策略有用,但不會被用來交易

    def informative_pairs(self):
        """
        定義額外的、信息性的對/區間組合,以便從交易所緩存。
        這些對/區間組合是不可交易的,除非它們也是白名單的一部分。
        有關更多信息,請參閱文檔
        :return: 以 (pair, interval) 格式的元組列表
            示例: return [("ETH/USDT", "5m"),
                            ("BTC/USDT", "15m"),
                            ]
        """
        return []

信息對裝飾器,所有的方法都是獨立運行,最後合併傳給 populate_indicators

def informative(timeframe: str, asset: str = '',
                fmt: Optional[Union[str, Callable[[KwArg(str)], str]]] = None,
                *,
                candle_type: Optional[CandleType] = None,
                ffill: bool = True) -> Callable[[PopulateIndicators], PopulateIndicators]:
    """
    一個裝飾器,用於 populate_indicators_Nn(self, dataframe, metadata),允許這些函數
    定義信息性指標。

    示例用法:

        @informative('1h')
        def populate_indicators_1h(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
            dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
            return dataframe

    :param timeframe: 信息性時間範圍。必須始終等於或高於策略時間範圍。
    :param asset: 信息性資產,例如 BTC, BTC/USDT, ETH/BTC。不要指定以使用
    當前對。
    :param fmt: 列格式 (str) 或列格式化器 (callable(name, asset, timeframe))。當未指定時,默認為:
    * {base}_{quote}_{column}_{timeframe} 如果指定了資產。 
    * {column}_{timeframe} 如果未指定資產。
    格式字符串支持這些格式變量:
    * {asset} - 資產的全名,例如 'BTC/USDT'。
    * {base} - 小寫的基礎貨幣,例如 'eth'。
    * {BASE} - 與 {base} 相同,但為大寫。
    * {quote} - 小寫的報價貨幣,例如 'usdt'。
    * {QUOTE} - 與 {quote} 相同,但為大寫。
    * {column} - 數據框列的名稱。
    * {timeframe} - 信息性數據框的時間範圍。
    :param ffill: 合併信息性對後填充數據框。
    :param candle_type: '', mark, index, premiumIndex, 或 funding_rate
    """

自定義指標 populate_indicators (),買入或者賣出信號中需要使用到的指標

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    """
    向給定的數據框添加幾個不同的TA指標

    性能注意事項:為了獲得最佳性能,請節省使用的指標數量。
    讓未註釋的指標僅限於您在策略或超參數配置中使用的指標,
    否則您將浪費內存和CPU使用率。
    :param dataframe: 來自交易所的數據框
    :param metadata: 附加信息,例如當前交易的對
    :return: 包含所有策略所需指標的數據框
    """
    dataframe['sar'] = ta.SAR(dataframe)
    dataframe['adx'] = ta.ADX(dataframe)
    stoch = ta.STOCHF(dataframe)
    dataframe['fastd'] = stoch['fastd']
    dataframe['fastk'] = stoch['fastk']
    dataframe['blower'] = ta.BBANDS(dataframe, nbdevup=2, nbdevdn=2)['lowerband']
    dataframe['sma'] = ta.SMA(dataframe, timeperiod=40)
    dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)
    dataframe['mfi'] = ta.MFI(dataframe)
    dataframe['rsi'] = ta.RSI(dataframe)
    dataframe['ema5'] = ta.EMA(dataframe, timeperiod=5)
    dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10)
    dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
    dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100)
    dataframe['ao'] = awesome_oscillator(dataframe)
    macd = ta.MACD(dataframe)
    dataframe['macd'] = macd['macd']
    dataframe['macdsignal'] = macd['macdsignal']
    dataframe['macdhist'] = macd['macdhist']
    hilbert = ta.HT_SINE(dataframe)
    dataframe['htsine'] = hilbert['sine']
    dataframe['htleadsine'] = hilbert['leadsine']
    dataframe['plus_dm'] = ta.PLUS_DM(dataframe)
    dataframe['plus_di'] = ta.PLUS_DI(dataframe)
    dataframe['minus_dm'] = ta.MINUS_DM(dataframe)
    dataframe['minus_di'] = ta.MINUS_DI(dataframe)
    return dataframe

入場信號

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        基於TA指標,填充給定數據框的入場信號
        :param dataframe: 數據框
        :param metadata: 附加信息,例如當前交易的對
        :return: 填充了入場列的數據框
        """
        dataframe.loc[
            (
                # 信號: RSI 穿越 30
                (qtpylib.crossed_above(dataframe['rsi'], self.buy_rsi.value)) &
                (dataframe['tema'] <= dataframe['bb_middleband']) &  # 護衛: tema 在 BB 中間以下
                (dataframe['tema'] > dataframe['tema'].shift(1)) &  # 護衛: tema 在上升
                (dataframe['volume'] > 0)  # 確保成交量不為0
            ),
            'enter_long'] = 1

        dataframe.loc[
            (
                # 信號: RSI 穿越 70
                (qtpylib.crossed_above(dataframe['rsi'], self.short_rsi.value)) &
                (dataframe['tema'] > dataframe['bb_middleband']) &  # 護衛: tema 在 BB 中間以上
                (dataframe['tema'] < dataframe['tema'].shift(1)) &  # 護衛: tema 在下降
                (dataframe['volume'] > 0)  # 確保成交量不為0
            ),
            'enter_short'] = 1

        return dataframe

退出信號

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        """
        基於TA指標,填充給定數據框的退出信號
        :param dataframe: 數據框
        :param metadata: 附加信息,例如當前交易的對
        :return: 填充了退出列的數據框
        """
        dataframe.loc[
            (
                # 信號: RSI 穿越 70
                (qtpylib.crossed_above(dataframe['rsi'], self.sell_rsi.value)) &
                (dataframe['tema'] > dataframe['bb_middleband']) &  # 護衛: tema 在 BB 中間以上
                (dataframe['tema'] < dataframe['tema'].shift(1)) &  # 護衛: tema 在下降
                (dataframe['volume'] > 0)  # 確保成交量不為0
            ),

            'exit_long'] = 1

        dataframe.loc[
            (
                # 信號: RSI 穿越 30
                (qtpylib.crossed_above(dataframe['rsi'], self.exit_short_rsi.value)) &
                # 護衛: tema 在 BB 中間以下
                (dataframe['tema'] <= dataframe['bb_middleband']) &
                (dataframe['tema'] > dataframe['tema'].shift(1)) &  # 護衛: tema 在上升
                (dataframe['volume'] > 0)  # 確保成交量不為0
            ),
            'exit_short'] = 1

        return dataframe

Metadata dict 元數據字典、
未完待續

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。