Strategi Dagangan Jangka Panjang Berdasarkan SuperTrend

Penulis:ChaoZhang, Tarikh: 2023-09-20 17:14:33
Tag:

Ringkasan

Strategi ini mengenal pasti peluang panjang menggunakan penunjuk SuperTrend. Ia menggunakan ATR dan pengganda untuk menentukan tahap sokongan dinamik untuk kemasukan panjang.

Logika Strategi

  1. Band atas dan bawah dikira berdasarkan tempoh ATR, pengganda.

  2. Trend semasa dikesan, dengan 1 untuk uptrend dan -1 untuk downtrend. Harga pecah di atas jalur atas beralih trend dari bawah ke atas, menjana isyarat beli. Berpecah di bawah jalur bawah beralih dari atas ke bawah, menjana isyarat jual.

  3. Purata bergerak ditambahkan sebagai penapis trend. Beli hanya jika harga di atas MA apabila memecahkan di atas band atas. Jual hanya jika harga di bawah MA apabila memecahkan di bawah band bawah. Ini mengelakkan pecah palsu.

  4. Pembantu visual menonjolkan trend, isyarat dan lain-lain untuk membantu pengambilan keputusan.

Analisis Kelebihan

Kelebihan strategi ini:

  1. SuperTrend secara dinamik mengesan perubahan harga dan mencerminkan perubahan trend tepat pada masanya.

  2. Stop loss ATR menyesuaikan berhenti berdasarkan turun naik pasaran, membantu mengunci keuntungan.

  3. Penapis MA menghapuskan isyarat palsu dari bunyi bising di pasaran yang berbeza.

  4. Reka bentuk visual secara intuitif membentangkan mekanisme strategi dan keadaan pasaran.

  5. Hanya pembalikan trend perdagangan menjadikannya sesuai untuk memegang jangka panjang.

Analisis Risiko

Risiko utama ialah:

  1. SuperTrend sensitif kepada parameter. Penyesuaian band yang kerap boleh menyebabkan perdagangan berlebihan.

  2. Di pasaran yang bergelombang, berhenti boleh mencetuskan kerap.

  3. Tiada pertimbangan kos dagangan.

  4. Tiada stop loss bermakna risiko pengeluaran yang tinggi.

  5. Penapis trend mungkin terlepas beberapa peluang.

Risiko boleh dikurangkan dengan:

  1. Mengoptimumkan parameter ATR ke frekuensi penyesuaian jalur yang lebih rendah.

  2. Menambah penapisan bar yang setara untuk mengelakkan berhenti oleh perubahan kecil frekuensi tinggi.

  3. Melaksanakan stop loss dan mengambil keuntungan untuk melindungi keuntungan.

  4. Penyesuaian tempoh purata bergerak untuk kesan penapisan keseimbangan.

  5. Mengoptimumkan pengurusan wang untuk mengurangkan kesan kos perdagangan.

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dalam aspek berikut:

  1. Uji sumber harga yang berbeza seperti dekat, tinggi dll.

  2. Cuba penunjuk stop loss dinamik lain seperti Chandelier Exit.

  3. Tambah saiz kedudukan untuk mengoptimumkan penggunaan modal.

  4. Menggabungkan penunjuk turun naik untuk memperbaiki entri.

  5. Melaksanakan stop loss dan mengambil keuntungan untuk mengawal risiko.

  6. Sesuaikan parameter untuk pasaran yang berbeza.

  7. meneroka pembelajaran mesin untuk pengoptimuman parameter.

  8. Gabungkan penunjuk lain untuk meningkatkan ketepatan penapis.

Kesimpulan

Strategi ini menggunakan SuperTrend dengan berhenti dinamik untuk menentukan trend, dan menambah penapis MA untuk mengenal pasti entri panjang. Reka bentuk visual memudahkan operasi. Dengan parameter yang dioptimumkan dan ciri tambahan, ia boleh menjadi strategi perdagangan jangka panjang yang mantap.


/*backtest
start: 2020-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Long Strategy", overlay=true, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=50000)

Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR = input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)

atr2 = sma(tr, Periods)
atr = changeATR ? atr(Periods) : atr2

up = src - (Multiplier * atr)
up1 = nz(up[1], up)
up := close[1] > up1 ? max(up, up1) : up

dn = src + (Multiplier * atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn

trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1 and close > ma
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0))

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1 and close < ma
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.new(color.green, 70) : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.new(color.red, 70) : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highlighter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highlighter", color=shortFillColor)

FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       

window()  => time >= start and time <= finish ? true : false

longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())

shortCondition = sellSignal
if (shortCondition)
    strategy.close("BUY")
    strategy.entry("SELL", strategy.short, when = window())

buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)


Lebih lanjut