この戦略は,私の前のシンプルなトレーリングストップ損失戦略のマルチタイムフレームバージョンです.以前の戦略は,ポジションに入るために基本的なトレーリングストップ損失のみを使用しました.それはかなりうまく機能しましたので,私はそれを改善しようとしました.私は同じATRトレーリングストップ損失を異なるタイムフレームで使用し,それらを1つの信号に組み合わせるとどうなるか考えました.
この戦略では,ATRストップのみを使用し,現在のタイムフレームに加えて他の3つの高いタイムフレームを選択できます.これらのタイムフレームのすべてのトライリングストップ損失はチャートにプロットされます. 4つのタイムフレームがすべてロング信号に同意した場合,ロングポジションを入力します.少なくとも2つのタイムフレームがロング信号に同意しない場合,ロングポジションを閉じます.ショートポジションの論理は同じです.
この戦略の核心は,ストップ損失を追及し,トレンドをフォローすることにある. トレイリングストップ損失は,ATR値に基づいてストップ損失レベルを設定するために使用され,ストップ損失がヒットするのを効果的に防ぐことができます.トレンドフォローは,異なるタイムフレームでトレンド方向を観察した上でエントリーを決定します.
ストップ・ロスは,ストップ・ロスの値と,ストップ・ロスの距離を設定する.その後,ストップ・ロスの値がストップ・ロスの値を超えると,ロング/ショート・シグナルを生成する.複数のタイムフレームからのシグナルが一致すると,ポジションが取られる.その後,トレンド方向ごとにストップ・ロスのレベルを追跡する.特定のタイムフレームのシグナルが逆転した場合,ポジションを閉じます.
異なる期間のトレンド判断を組み合わせることで 偽のブレイクを効果的にフィルタリングできます 同時に,利益のストップロックとリスクを制御します
解決策:
戦略は以下の側面で最適化できます.
この戦略は,複数のタイムフレームATRトレーリングストップを通じてトレンドフォローとリスク制御を組み合わせます.シングルストップと比較して,トレンド方向をより明確に識別し,シングルタイムフレームと比較して,多くのノイズをフィルタリングします.ストップパラメータとタイムフレームの適切な構成は,最高の結果を達成するための鍵です.特定の引き下げを許容し,安定したリターンを提供する投資家に適しています.さらに強化と拡張可能性もあります.非常に有望な戦略アイデアです.
/*backtest start: 2023-01-01 00:00:00 end: 2024-01-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) //////////// // Inputs // atr_length = input(14, title = "ATR Length") atr_mult = input(2, title = "ATR Mult", type = input.float) tf2 = input('120', title = "TF2", type = input.string) tf3 = input('180', title = "TF3", type = input.string) tf4 = input('240', title = "TF4", type = input.string) // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2016, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2100, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = time >= startDate and time <= finishDate ////////////////// // CALCULATIONS // tsl() => // SL values sl_val = atr_mult * atr(atr_length) // Init Variables pos = 0 trailing_sl = 0.0 // Signals long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1]) short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1]) // Calculate SL trailing_sl := short_signal ? high + sl_val : long_signal ? low - sl_val : nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) : nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : nz(trailing_sl[1]) // Position var pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1]) trailing_sl trailing_sl1 = tsl() trailing_sl2 = security(syminfo.tickerid, tf2, tsl()) trailing_sl3 = security(syminfo.tickerid, tf3, tsl()) trailing_sl4 = security(syminfo.tickerid, tf4, tsl()) pos1 = 0 pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1]) pos2 = 0 pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1]) pos3 = 0 pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1]) pos4 = 0 pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1]) total_pos = pos1 + pos2 + pos3 + pos4 ////////////// // PLOTINGS // plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1") plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25) plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50) plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75) ////////////// // STRATEGY // //strategy.entry("long", true, stop = trailing_sl1) //strategy.entry("short", false, stop = trailing_sl1) strategy.entry("long", true, when = total_pos == 4) strategy.entry("short", false, when = total_pos == -4) strategy.close("long", when = total_pos <= 0) strategy.close("short", when = total_pos >= 0)