ダイナミックストップ・ロースとドーブルATR・トライルストップに基づく収益戦略

作者: リン・ハーンチャオチャン, 日付: 2024-03-22 13:52:59
タグ:

img

概要

この戦略は,異なる期間の2つの平均真の範囲 (ATR) インジケーターを使用して,価格がストップ損失ラインを突破したときの取引信号を生成する2つのダイナミックなストップ損失ラインを構築する.また,ダイナミックなストップ損失とテイク利益を達成するために,現在のキャンドルボディ長さに基づいて,ダイナミックなテイク利益レベルを設定する.この戦略は,トレンドを判断するのに役立つEMAインジケーターも組み込む.

戦略の原則

  1. 2つの異なる期間のATR指標値を計算し (デフォルト10と20),それらをそれぞれの感度係数 (デフォルト1と2) で掛けると,2つのストップロスの幅が得られる.
  2. ストップ・ロスの2つの線上または下の価格ポジションとブレイクアウト状況に基づいて,ロングまたはショート・シグナルを生成する.
  3. 取利益レベルは,現在のキャンドルボディの長さの1.65倍 (調整可能) をベースに動的に計算されます.
  4. ポジションを開いた後,もし価格がメリットを取るレベルに達すると,ポジションはメリットを取るために閉鎖されます.
  5. EMA のような指標を使用して,現在の傾向を判断し,エントリーのための参照を提供します.

この戦略は,ATR指標の特徴を利用して,異なる市場の変動にうまく適応し,市場の変化に迅速に対応できる二重動的ストップロスを構築する.動的テイク・プロフィート設定により,戦略はトレンド市場でより多くの利益を得ることができます.全体として,戦略はトレンド市場で良好なパフォーマンスを発揮しますが,レンジバインド市場では頻繁な利益と損失のオフセットを経験することがあります.

利点分析

  1. ダイナミックストップ・ロスの線は異なる市場の変動に適応し,柔軟性も高い.
  2. 取利益レベルは,現在のキャンドルボディ長に基づいて動的に計算され,トレンド市場でより多くの利益を得ることができます.
  3. 傾向判断に役立つEMAおよび他の指標の使用は,エントリーのための基準を提供し,戦略の信頼性を高めます.
  4. コードロジックは明確で読みやすいので 分かりやすく最適化できます

リスク分析

  1. 範囲限定市場では,頻繁な取引が高取引コストをもたらし,収益性に影響を与える可能性があります.
  2. ストップ・ロストラインパラメータとテイク・プロフィートマルチプリキューターの設定は,異なる市場と製品特性に合わせて最適化する必要がある.不適切なパラメータは戦略のパフォーマンスが低下する可能性があります.
  3. この戦略は,主に動的ストップロスの価格ブレイクに頼り,シグナルを生成し,大きな変動の偽ブレイクで偽シグナルを生成することがあります.

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

  1. 範囲限定市場では,RSIやMACDなどの取引信号をフィルタリングするためのより多くの指標や条件を導入することを検討してください.
  2. 異なる製品や市場では,ストップ・ロストラインのパラメータとテイク・プロフィートの倍数を見つけるために,歴史的なバックテストとパラメータ最適化を使用できます.
  3. ポジション管理とリスク管理モジュールを導入し,市場変動と口座リスクに基づいてポジションサイズを動的に調整することを検討する.
  4. 信号の信頼性と正確性を高めるために,より多くの傾向判断指標を追加します.

概要

この戦略は,ダブルダイナミックストップ・ロストラインとダイナミック・テイク・プロフィートの設計により,異なる市場環境にうまく適応し,トレンド市場では良好なパフォーマンスを発揮することができる.しかし,レンジ・バインド市場では,頻繁な取引と利益と損失のオフセットの問題に直面する可能性があります.したがって,この戦略はトレンド市場での使用により適しており,製品の特性や市場状況に基づいて最適化および調整する必要があります.さらに,戦略の堅牢性と収益性を向上させるために,より多くのフィルタリング条件,ポジション管理,リスク制御モジュールなどのさらなる最適化のための余地があります.全体として,この戦略は明確なアイデア,シンプルで理解しやすい論理を有し,特定の実践的価値と最適化のための余地があり,さらなる研究と適用に値します.


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
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 = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

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

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

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

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)

もっと