この戦略の主なアイデアは,ATR指標に基づいて長距離および短距離ストップロスの線を計算することです.価格がこれらのストップロスの線を突破したとき,取引信号を生成します.トレンド追跡と振動捕捉の両方を持っています.
この戦略は,N期間のATRを因数で掛け算し,長期・短期ストップ損失線を計算する.具体的な計算式は以下のとおりである.
Long Stop = Highest Price - ATR * Coefficient
Short Stop = Lowest Price + ATR * Coefficient
価格が上昇してロングストップ・ロスのラインを突破するとロングになり,価格が下がってショートストップ・ロスのラインを突破するとショートになります. ロングまたはショートした後,ストップ・ロスのラインを移動するためにリアルタイムで価格変動を追います.
ATR帯をストップ・ロスのレベルとして使用することで,この方法はストップ・ロスのリスクを保証しながら価格トレンドを完全に捕捉することができます.価格に重大な突破が発生したとき,シグナルを生成し,誤ったブレイクを効果的にフィルタリングすることができます.
この戦略の最大の利点は,リスクを制御しながら価格動向を把握するためにストップロスのレベルを自動的に調整できるということです.具体的な利点は以下の通りです.
ATR指標に基づく浮動ストップ・ロスは,単一の損失を効果的に制御するために,市場の変動に応じてストップ・ロスの範囲を調整できます.
突破的な信号発信方法を採用することで 騒音をフィルタリングして 頂点や底を追いかけないことができます
ストップ・ロスの線をリアルタイムで調整して 価格変動を追跡することで ストップ・ロスは 余りにも緩やかになり 利益が増えることが 防げます
この戦略には,主にストップ・ロスのレベルと信号生成の設定に集中するいくつかのリスクもあります. 具体的なリスクポイントは:
不適切なATRサイクルと係数は,過剰に広いまたは狭いストップ損失を引き起こす可能性があります.
突破シグナル方法では 初期トレンドの機会を逃す可能性があります
トレンド終了時にストップ・ロスの追跡が遅れてしまい,完全に脱出できないかもしれません.
対策は主に,ストップロスをより合理的にするためにパラメータを調整するか,傾向とシグナルを決定するために他の指標を助けることです.
この戦略は,次の側面においてさらに最適化することができる.
リスクをさらにコントロールするために 2階層ストップ・ロスを設定します
他の指標を組み合わせて 傾向を特定し 信号の質を向上させる
傾向が続くと利益を増やすために 移動停止利益戦略を追加します
ATR サイクルと係数パラメータを最適化して,ストップ・ロスを実際の価格変動に近いものにします.
ストップ・ロスのレベルを自動的に調整することでリスクを効果的に制御し,トレンド追跡を通じて良い利益を得ることができます.既存のベースで他の分析方法を組み合わせることで戦略をさらに最適化し,改善し,より安定し,スマートにすることができます.
/*backtest start: 2024-01-04 00:00:00 end: 2024-02-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © melihtuna //@version=4 strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent) length = input(title="ATR Period", type=input.integer, defval=22) mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false) useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true) highlightState = input(title="Highlight State ?", type=input.bool, defval=true) atr = mult * atr(length) longStop = (useClose ? highest(close, length) : highest(length)) - atr longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop var int dir = 1 dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir var color longColor = color.green var color shortColor = color.red longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor) buySignal = dir == 1 and dir[1] == -1 plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0) plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0) shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor) sellSignal = dir == -1 and dir[1] == 1 plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0) plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0) midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false) longFillColor = highlightState ? (dir == 1 ? longColor : na) : na shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor) fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor) long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings") start = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings") finish = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings") window() => true slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings") tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings") tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings") tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings") lastBuyPrice = strategy.position_avg_price diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100 diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100 posHiRatio=0.0 posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0 s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100 s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100 s_posHiRatio=0.0 s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0 strategy.entry("LONG", strategy.long, when = window() and buySignal) strategy.close("LONG", when = window() and sellSignal) strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG") strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG") strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG") if long_short strategy.entry("SHORT", strategy.short, when = window() and sellSignal) strategy.close("SHORT", when = window() and buySignal) strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT") strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT") strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")