アダプティブ トレイリングストップ戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月8日 15:06:28
タグ:

概要

この戦略は主に,価格変動に基づいてストップロスのポジションを自動的に調整し,より良いストップロスの効果を達成するための適応型ストップロスのメカニズムを実装する.この戦略は,合理的なストップロスの範囲を計算するためにATR指標を使用し,EMAラインと組み合わせて取引信号を生成する.価格はEMAラインを突破するとロングまたはショートポジションを開き,ストップロスを追跡するために適応型ストップロスのアルゴリズムを使用する.

戦略の論理

  1. ATR指標を計算し,ATR値をパラメータ a で倍して,ストップ損失範囲 nLoss として設定する.
  2. EMA線を計算する
  3. 価格がEMA線を下回るとショートします.
  4. 適応型ストップ損失アルゴリズムを使用して,次のルールで自動ストップ損失位置 xATRTrailingStop を調整します.
    • ストップロスの値がストップロスの値を超えると,ストップロスを価格マイナスストップロスの範囲 nLoss に調整します.
    • ストップ・ロスの値がストップ・ロスの値を下回ると,ストップ・ロスを価格とストップ・ロスの範囲 nLoss に調整します.
    • ストップ・ロスは変更しないようにします
  5. 価格がストップ・ロスのレベルに達するとストップ・ロスのポジションを閉じる.

利点分析

  1. 市場変動に基づいて自動にストップ損失範囲を調整し,リスクを効果的に制御する適応型ストップ損失メカニズムを実装する.
  2. ATR インジケーターで合理的なストップ損失範囲を計算し,過大または過小なストップ損失を避ける.
  3. EMA を使って取引信号を生成し,不必要な取引を削減し,市場の騒音をフィルターします.
  4. シンプルで明快な戦略論理 分かりやすく最適化できます
  5. インプットパラメータを調整し,異なる市場環境に適応できるようにします.

リスク と 改善

  1. EMA信号が遅れて,遅いエントリーにつながる可能性があります.早めのエントリーに対する判断を助けるために他の指標を使用することを検討してください.
  2. 不確実な保持期間,単一のストップ損失の大きさを制御できない.損失を制限するために利益目標または最大保持期間を設定することができます.
  3. 強いトレンド市場では,ストップロスは頻繁に起動することがあります.トレンド条件に基づいてパラメータを調整するかフィルターを追加することを検討してください.
  4. ATR 期間,ストップ損失倍数などのパラメータは,シンボルの特徴に基づいて調整されるべきであり,デフォルト値は盲目的に使用されるべきではありません.

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

  1. トレンドインジケーターを追加して トレンド方向に取引をすることで トレンドに反する取引を避けるようにします
  2. ストップ・ロスの倍数を変動に基づいて調整し,高い変動条件でより広いストップを可能にします.
  3. 設定する最大保持期間,特定の時間を超えた後にアクティブストップ損失.
  4. 価格が動くと徐々にストップを上げます
  5. ATR 期間パラメータをシンボルの特徴に基づいて調整する.

結論

この戦略は明確でシンプルな論理を持ち,適応性のあるATRベースのストップ・ロストと取引シグナルのためのEMAでリスクを管理する.しかし,最適化のための余地が多く,比較的受動的である.より積極的な市場状況に基づいてトレンド判断,ダイナミックパラメータ調整を追加することを検討する.全体的には,逆転ストップ・ロスト戦略のための良いアイデアとテンプレートとして機能するが,パラメータは盲目的にデフォルト値を適用するのではなく,異なるシンボルに調整されるべきである.


/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 

// Inputs
a = input(1,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
h = input(false, title = "Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// 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 = 2019, 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 = true
 
////////////////////////////////////////////////////////////////////////////////


xATR  = atr(c)
nLoss = a * xATR

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close

xATRTrailingStop = 0.0
xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss),
   iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), 
   iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss)))
 
pos = 0   
pos :=	iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema   = ema(src,1)
above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)

buy  = src > xATRTrailingStop and above 
sell = src < xATRTrailingStop and below

barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop 

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

barcolor(barbuy  ? color.green : na)
barcolor(barsell ? color.red   : na)

strategy.entry("long",   true, when = buy  and time_cond)
strategy.entry("short", false, when = sell and time_cond)

もっと