Idea utama strategi ini adalah untuk mengira garis stop-loss panjang dan pendek berdasarkan penunjuk ATR. Ia menghasilkan isyarat perdagangan apabila harga memecahkan garis stop-loss ini. Ia mempunyai kedua-dua pengesanan trend dan keupayaan menangkap osilasi.
Strategi ini menggunakan ATR tempoh N dikalikan dengan pekali untuk mengira garis stop-loss panjang dan pendek.
Long Stop = Highest Price - ATR * Coefficient
Short Stop = Lowest Price + ATR * Coefficient
Ia pergi lama apabila harga meningkat dan memecahkan garis stop-loss panjang, dan pergi pendek apabila harga jatuh dan memecahkan garis stop-loss pendek.
Dengan menggunakan jalur ATR sebagai tahap stop-loss, kaedah ini dapat menangkap sepenuhnya trend harga sambil memastikan risiko stop-loss.
Kelebihan terbesar strategi ini ialah ia boleh menyesuaikan tahap stop-loss secara automatik untuk menangkap trend harga sambil mengawal risiko.
Stop-loss terapung berdasarkan penunjuk ATR boleh menyesuaikan julat stop-loss mengikut turun naik pasaran untuk mengawal kerugian tunggal dengan berkesan.
Menggunakan kaedah terobosan untuk menjana isyarat boleh menapis beberapa bunyi bising dan mengelakkan mengejar puncak dan bawah.
Penyesuaian garis stop-loss dalam masa nyata untuk mengesan turun naik harga menghalang stop-loss daripada terlalu longgar dan mengunci lebih banyak keuntungan.
Strategi ini juga mempunyai beberapa risiko, terutamanya tertumpu pada penetapan tahap stop-loss dan penjanaan isyarat.
Kitaran dan pekali ATR yang tidak betul boleh menyebabkan stop-loss yang terlalu luas atau sempit.
Kaedah isyarat terobosan mungkin terlepas peluang trend awal.
Mungkin ada beberapa kelewatan dalam penjejakan stop-loss semasa trend berakhir, tidak dapat keluar dengan sempurna.
Tindakan balas adalah terutamanya untuk menyesuaikan parameter untuk menjadikan stop-loss lebih munasabah, atau membantu dengan penunjuk lain untuk menentukan trend dan isyarat.
Strategi ini boleh dioptimumkan lagi dalam aspek berikut:
Menetapkan stop-loss lapisan kedua untuk mengawal risiko.
Menggabungkan penunjuk lain untuk menentukan trend dan meningkatkan kualiti isyarat.
Tambah strategi berhenti keuntungan bergerak untuk meningkatkan keuntungan apabila trend ini berterusan.
Mengoptimumkan kitaran ATR dan parameter pekali untuk menjadikan stop-loss lebih dekat dengan turun naik harga sebenar.
Secara keseluruhan, strategi ini sangat praktikal. Ia dapat mengawal risiko dengan berkesan dengan menyesuaikan tahap stop-loss secara automatik, sambil memperoleh keuntungan yang baik melalui penjejakan trend. Kita boleh mengoptimumkan dan meningkatkan lagi strategi dengan menggabungkan kaedah analisis lain pada asas yang sedia ada untuk menjadikannya lebih stabil dan pintar.
/*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")