
この戦略は,動的トレーリングストップの考え方を採用し,ATRと価格の極値に基づいて長期ショートポジションのストップを計算する.Chandelier Exitの思想と組み合わせて,ストップラインの方向に基づいて長期ショートポジションの方向を判断する.ストップラインが上方突破すると,看板と判断して,多額にする.ストップラインが下方突破すると,看板と判断して,空にする.
この戦略は,ストップ・ロズとエントリー・シグナルの判断の双重機能を兼ね備えています.
この戦略は以下の部分から構成されています.
ユーザが設定したATR周期長と倍数multに基づいて,リアルタイムでATRを計算する.ATRと価格の極値に基づいて長短ストップラインを計算する:
longStop = 最高价 - ATR
shortStop = 最低价 + ATR
前K線のストップラインと現在のK線のストップラインを比較する.現在のK線のストップラインが突破された場合,取引信号を発する:
长仓止损线上方突破,做多
短仓止损线下方突破,做空
ユーザが設定したリスクリターン比riskRewardRatioに基づいて,ATRから止損距離と停止距離を計算する. ポジション開設時にストップ・ロストとストップ・ストップを設定します.
この戦略の利点は以下の通りです.
この戦略は,ストップラインを動的に追跡し,タイムリーにストップして下落のリスクを制御します.
この戦略のストップ・ロズラインは,入場判断条件としても使われており,戦略の論理を簡素化している.
設定されたリスク/リターン比率に基づいて,より高い利益を追求する.
この戦略はシンプルで理解しやすく,拡張を最適化できます.
この戦略にはいくつかのリスクがあります.
この戦略は,二面的な取引戦略であり,同時にも,多額のリスクと空白のリスクを負う.
ATRパラメータの設定は,ストップ・ロッドラインと取引頻度に直接影響し,不適切な設定は,ストップ・ロッドが過度に緩やかまたは取引頻度が過度に高くなることにつながります.
この戦略は,平均線を整えた後の突破に適しているが,傾向が強い状況には適していない.
このリスクに対して,以下の方法で最適化できます.
MAなどのトレンド指標を組み合わせて,市場動向を判断し,逆転取引を避ける.
ATRのパラメータとリスク・リターン比率のパラメータを最適化して,ストップ・ロズとストップ・ストップを合理化します.
取引量や波動性指標のフィルタリング条件を増加させ,取引品質を確保する.
この戦略はさらに改善できる余地があります.
マシン・ラーニング・モデルの利用により,価格の動向を予測し,入場の精度を向上させる.
オプションのヘッジ品種の価格変動率を利用して,リスクのないスレージポートフォリオを構築する.
異なる市場,異なる品種の間で統計的アベरेजを行い,安定したアルファを得ます.
アルゴリズム取引エンジンによる高効率な戦略反省と実物取引.
この記事では,ダイナミック・トラッキング・ストップ・ローズに基づく量化取引戦略を詳しく分析する.この戦略は,ストップ・マネジメントと取引シグナル判断機能を同時に備えており,リスクを効果的に制御することができる.この戦略の優位性,潜在的なリスク,およびその後の最適化アイデアを分析する.この戦略は,非常に実用的な取引戦略であり,さらなる研究と応用に値する.
/*backtest
start: 2023-12-29 00:00:00
end: 2024-01-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Chandelier Exit with 1-to-1 Risk-Reward", shorttitle='CE', overlay=true)
// Chandelier Exit Logic
length = input.int(title='ATR Period', defval=22)
mult = input.float(title='ATR Multiplier', step=0.1, defval=3.0)
useClose = input.bool(title='Use Close Price for Extremums', defval=true)
atr = mult * ta.atr(length)
longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir
// Risk-Reward Ratio
riskRewardRatio = input.int(1, title="Risk-Reward Ratio", minval=1, maxval=10, step=1)
// Calculate Take Profit and Stop Loss Levels
takeProfitLevel = atr * riskRewardRatio
stopLossLevel = atr
// Entry Conditions
longCondition = dir == 1 and dir[1] == -1
shortCondition = dir == -1 and dir[1] == 1
// Entry Signals
if (longCondition)
strategy.entry("Long", strategy.long, stop=close - stopLossLevel, limit=close + takeProfitLevel)
if (shortCondition)
strategy.entry("Short", strategy.short, stop=close + stopLossLevel, limit=close - takeProfitLevel)
longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.green)
shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.red)
midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false)
fill(midPricePlot, longStopPlot, color=color.new(color.green, 90), title='Long State Filling')
fill(midPricePlot, shortStopPlot, color=color.new(color.red, 90), title='Short State Filling')
// Alerts
if (dir != dir[1])
strategy.entry("Direction Change", strategy.long, comment="Chandelier Exit has changed direction!")
if (longCondition)
strategy.entry("Buy Signal", strategy.long, comment="Chandelier Exit Buy!")
if (shortCondition)
strategy.entry("Sell Signal", strategy.short, comment="Chandelier Exit Sell!")