1. 新しい戦略、対応する戦略のファイルパス、user_data/strategies/test.py
freqtrade new-strategy --strategy test
2. 追加パラメータ、低レベルテンプレート
freqtrade new-strategy --strategy test --template minimal
3. 高レベルテンプレート
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本のキャンドルのための5%
str(timeframe_mins * 3): 0.02, # 3本のキャンドル後の2%
str(timeframe_mins * 6): 0.01, # 6本のキャンドル後の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: 情報ペアをマージした後のデータフレームをffillします。
:param candle_type: '', mark, index, premiumIndex, または funding_rate
"""
カスタム指標 populate_indicators ()、買いまたは売り信号で使用する必要がある指標
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
指定された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: DataFrame
:param metadata: 現在取引されているペアのような追加情報
:return: エントリー列が設定されたDataFrame
"""
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: DataFrame
:param metadata: 現在取引されているペアのような追加情報
:return: 退出列が設定されたDataFrame
"""
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 メタデータ辞書、
未完待続