Strategi Pengesanan Osilasi Band Pengasingan

Penulis:ChaoZhang, Tarikh: 2024-02-04 10:28:24
Tag:

img

Ringkasan

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.

Prinsip Strategi

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.

Analisis Kelebihan

Kelebihan terbesar strategi ini ialah ia boleh menyesuaikan tahap stop-loss secara automatik untuk menangkap trend harga sambil mengawal risiko.

  1. Stop-loss terapung berdasarkan penunjuk ATR boleh menyesuaikan julat stop-loss mengikut turun naik pasaran untuk mengawal kerugian tunggal dengan berkesan.

  2. Menggunakan kaedah terobosan untuk menjana isyarat boleh menapis beberapa bunyi bising dan mengelakkan mengejar puncak dan bawah.

  3. Penyesuaian garis stop-loss dalam masa nyata untuk mengesan turun naik harga menghalang stop-loss daripada terlalu longgar dan mengunci lebih banyak keuntungan.

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko, terutamanya tertumpu pada penetapan tahap stop-loss dan penjanaan isyarat.

  1. Kitaran dan pekali ATR yang tidak betul boleh menyebabkan stop-loss yang terlalu luas atau sempit.

  2. Kaedah isyarat terobosan mungkin terlepas peluang trend awal.

  3. 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.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam aspek berikut:

  1. Menetapkan stop-loss lapisan kedua untuk mengawal risiko.

  2. Menggabungkan penunjuk lain untuk menentukan trend dan meningkatkan kualiti isyarat.

  3. Tambah strategi berhenti keuntungan bergerak untuk meningkatkan keuntungan apabila trend ini berterusan.

  4. Mengoptimumkan kitaran ATR dan parameter pekali untuk menjadikan stop-loss lebih dekat dengan turun naik harga sebenar.

Ringkasan

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")

Lebih lanjut