複数のタイムフレームをフォローするストップ損失戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-08 11:24:24
タグ:

img

概要

この戦略は,私の前のシンプルなトレーリングストップ損失戦略のマルチタイムフレームバージョンです.以前の戦略は,ポジションに入るために基本的なトレーリングストップ損失のみを使用しました.それはかなりうまく機能しましたので,私はそれを改善しようとしました.私は同じATRトレーリングストップ損失を異なるタイムフレームで使用し,それらを1つの信号に組み合わせるとどうなるか考えました.

この戦略では,ATRストップのみを使用し,現在のタイムフレームに加えて他の3つの高いタイムフレームを選択できます.これらのタイムフレームのすべてのトライリングストップ損失はチャートにプロットされます. 4つのタイムフレームがすべてロング信号に同意した場合,ロングポジションを入力します.少なくとも2つのタイムフレームがロング信号に同意しない場合,ロングポジションを閉じます.ショートポジションの論理は同じです.

戦略の論理

この戦略の核心は,ストップ損失を追及し,トレンドをフォローすることにある. トレイリングストップ損失は,ATR値に基づいてストップ損失レベルを設定するために使用され,ストップ損失がヒットするのを効果的に防ぐことができます.トレンドフォローは,異なるタイムフレームでトレンド方向を観察した上でエントリーを決定します.

ストップ・ロスは,ストップ・ロスの値と,ストップ・ロスの距離を設定する.その後,ストップ・ロスの値がストップ・ロスの値を超えると,ロング/ショート・シグナルを生成する.複数のタイムフレームからのシグナルが一致すると,ポジションが取られる.その後,トレンド方向ごとにストップ・ロスのレベルを追跡する.特定のタイムフレームのシグナルが逆転した場合,ポジションを閉じます.

異なる期間のトレンド判断を組み合わせることで 偽のブレイクを効果的にフィルタリングできます 同時に,利益のストップロックとリスクを制御します

利点

  1. 複数のタイムフレームを使用することで,ノイズをフィルターし,トレンドの方向性を特定することができます
  2. ATR の 後ろのストップ は ストップ 距離 を 動的に 調整 し,停止 される 確率 を 低下 さ せる
  3. タイミングで停止する
  4. パラメータが少ない,理解し最適化が簡単

リスク分析

  1. ATRストップは,パラメータが正しく設定されていない場合,あまりにも近くまたはあまりにも遠く,ヒットしやすいまたは停止距離が大きすぎる可能性があります.
  2. 複数のタイムフレームの組み合わせは,パラメータが正しく設定されていない場合,効果的に動作しないか誤って判断する可能性があります.
  3. ストップ損失とタイムフレームパラメータの両方を正しく設定する必要があります,そうでなければ最高の結果を達成することはできません

解決策:

  1. 最適値を見つけるために異なるパラメータセットと製品をテスト
  2. 信頼性の高いトレンド判断を保証するために比率と時間枠の数を最適化
  3. ATR マルチプリファイヤを調整し,衝突しない距離と適切な距離をバランスにする

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. トレンド判断のための最良の組み合わせを見つけるために時間枠の数を追加/削減する
  2. 最適の停止距離を決定するために,異なるATR倍数を試験する.
  3. トレンドが続くにつれて,より多くのポジションを構築するために再エントリーメカニズムを追加
  4. 入力信号に他のフィルターを組み込む.例えば音量指標など.
  5. 異なる製品のパラメータ調整

結論

この戦略は,複数のタイムフレーム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)


もっと