Ide utama dari strategi ini adalah untuk menghitung garis stop-loss panjang dan pendek berdasarkan indikator ATR. Ini menghasilkan sinyal perdagangan ketika harga menembus garis stop-loss ini.
Strategi ini menggunakan ATR periode N dikalikan dengan koefisien untuk menghitung garis stop-loss panjang dan pendek.
Long Stop = Highest Price - ATR * Coefficient
Short Stop = Lowest Price + ATR * Coefficient
Ini pergi panjang ketika harga naik dan melanggar garis stop-loss panjang, dan pergi pendek ketika harga turun dan melanggar garis stop-loss pendek. Setelah pergi panjang atau pendek, akan melacak fluktuasi harga secara real time untuk memindahkan garis stop-loss.
Dengan menggunakan band ATR sebagai level stop-loss, metode ini dapat sepenuhnya menangkap tren harga sambil memastikan risiko stop-loss.
Keuntungan terbesar dari strategi ini adalah bahwa ia dapat secara otomatis menyesuaikan tingkat stop-loss untuk menangkap tren harga sambil mengendalikan risiko.
Stop-loss yang mengambang berdasarkan indikator ATR dapat menyesuaikan rentang stop-loss sesuai dengan volatilitas pasar untuk secara efektif mengendalikan kerugian tunggal.
Mengadopsi metode terobosan untuk menghasilkan sinyal dapat menyaring beberapa kebisingan dan menghindari mengejar puncak dan dasar.
Penyesuaian garis stop-loss secara real time untuk melacak fluktuasi harga mencegah stop-loss terlalu longgar dan mengunci lebih banyak keuntungan.
Strategi ini juga memiliki beberapa risiko, terutama terkonsentrasi dalam pengaturan tingkat stop-loss dan generasi sinyal.
Siklus dan koefisien ATR yang tidak tepat dapat menyebabkan stop loss yang terlalu luas atau sempit.
Metode sinyal terobosan mungkin melewatkan peluang tren awal.
Mungkin ada beberapa keterlambatan dalam pelacakan stop-loss selama akhir tren, tidak dapat keluar dengan sempurna.
Langkah-langkah penanggulangan terutama untuk menyesuaikan parameter untuk membuat stop-loss lebih wajar, atau membantu dengan indikator lain untuk menentukan tren dan sinyal.
Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:
Atur stop-loss lapisan kedua untuk mengendalikan risiko lebih lanjut.
Menggabungkan indikator lain untuk menentukan tren dan meningkatkan kualitas sinyal.
Tambahkan strategi stop-profit bergerak untuk meningkatkan keuntungan ketika tren terus berlanjut.
Mengoptimalkan siklus ATR dan koefisien parameter untuk membuat stop-loss lebih dekat dengan fluktuasi harga yang sebenarnya.
Secara keseluruhan, strategi ini sangat praktis. Ini dapat secara efektif mengendalikan risiko dengan secara otomatis menyesuaikan tingkat stop-loss, sambil mendapatkan keuntungan yang baik melalui pelacakan tren. Kita dapat lebih mengoptimalkan dan meningkatkan strategi dengan menggabungkan metode analisis lainnya pada dasar yang ada untuk membuatnya lebih stabil dan cerdas.
/*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")