- 新建策略,對應的策略的文件路徑,user_data/strategies/test.py
freqtrade new-strategy --strategy test
- 附加參數,低級模板
freqtrade new-strategy --strategy test --template minimal
- 高級模板
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 元數據字典、
未完待續