トレーリングストップリバーサル戦略


作成日: 2023-12-01 13:41:41 最終変更日: 2023-12-01 13:41:41
コピー: 0 クリック数: 372
1
フォロー
1166
フォロワー

トレーリングストップリバーサル戦略

概要

これは非常に単純な戦略である. それは,追跡ストップのみで構成されている. ストップがトリガーされると,ポジションは逆転され,新しいポジションに対して追跡ストップが設定されます.

戦略原則

この戦略は3つのストップタイプの1つに基づいて構築される: パーセントストップ,ATRストップ,絶対ストップ. ストップがトリガーされたとき,ポジションは逆転され,新しいポジションに追跡ストップが設定される.

具体的には,戦略はまず選択したストップタイプに応じてストップ値を計算する.次に,高点が以前のストップ価格より大きいときに多し,低点が以前のストップ価格より小さいときに空きをするという位置付け信号があるかどうかを判断する.入場後,それはリアルタイムでストップ価格を更新し,価格の変化を追跡する.多頭ストップ価格は低点としてストップ値を減算し,空頭ストップ価格は高点としてストップ値を加算する.

優位分析

この戦略の最大の利点は,非常にシンプルで,ただ1つのストップを追跡する必要があり,入場点選択と出場点選択を考慮する必要はありません. ストップ・損失値の柔軟な設定も,その適用範囲を広げるものです.

固定ストップと比較して,追跡ストップを使用することで,より大きな利益をロックできますが,ストップが衝撃を受ける確率も低下します.ストップが起動したたびに,ポジションを逆転させ,価格逆転の機会をキャッチできます.

リスク分析

この戦略に存在する主なリスクは,ストップ価格の設定が不適切で発生するリスクである.ストップ値があまりにも大きく設定され,損失が拡大する可能性がある.ストップ値があまりにも小さく設定され,ストップが頻繁にトリガーされる可能性がある.これは市場状況に応じてターゲットに最適化する必要がある.

もう一つのリスクは,ストップダメージが誘発された後,逆転ポジションの方向判断が不正確であり,その結果,価格逆転の機会を逃すか,損失を増やすことになる.これは,トレンドとサポートレジスタンス判断を組み合わせて,逆転の最適なタイミングを決定する必要がある.

最適化の方向

この戦略は以下の点で最適化できます.

  1. 傾向を判断し,逆境を回避する
  2. 市場を動的に追跡するために,ストップ・ロスの計算方法を最適化
  3. 突破に対する判断を高め,より高い確率の反転信号を確保する
  4. 波動率などの指標を組み合わせて,最適の逆転タイミングを決定する

要約する

この戦略は,単純な追跡ストップメカニズムによって収益性を発揮し,初心者向けに適した量化戦略である.従来のストップメカニズムと比較して,ストップメカニズムを増加させ,ストップメカニズムを誘発した後にポジションを逆転させ,それにより追加の収益を得ることができる.継続的なテストと最適化により,この戦略は,非常に実用的な量化プログラムになることができます.

ストラテジーソースコード
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)

////////////
// Inputs //

sl_type    = input("%", options = ["%", "ATR", "Absolute"])

sl_perc    = input(4,     title = "% SL",        type = input.float)
atr_length = input(10,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)
sl_absol   = input(10,    title = "Absolute SL", type = input.float)

// 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 //

// SL values
sl_val = sl_type == "ATR"      ? atr_mult * atr(atr_length) : 
         sl_type == "Absolute" ? sl_absol : 
         close * sl_perc / 100
         
// 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]) 

//////////////
// PLOTINGS //

plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)

//////////////
// STRATEGY //

if (time_cond and pos != 1)
    strategy.entry("long",  true, stop = trailing_sl)
  
if (time_cond and pos != -1) 
    strategy.entry("short", false, stop = trailing_sl)