Strategi perdagangan jangka panjang berdasarkan SuperTrend

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

Gambaran umum

Strategi ini mengidentifikasi peluang panjang menggunakan indikator SuperTrend. Ini menggunakan ATR dan pengganda untuk menentukan tingkat dukungan dinamis untuk entri panjang.

Logika Strategi

  1. Band atas dan bawah dihitung berdasarkan periode ATR, pengganda.

  2. Tren saat ini dilacak, dengan 1 untuk uptrend dan -1 untuk downtrend. Harga yang pecah di atas band atas beralih tren dari bawah ke atas, menghasilkan sinyal beli. Patah di bawah band bawah beralih dari atas ke bawah, menghasilkan sinyal jual.

  3. Rata-rata bergerak ditambahkan sebagai filter tren. Beli hanya jika harga di atas MA saat melanggar band atas. Jual hanya jika harga di bawah MA saat melanggar band bawah. Ini menghindari breakout palsu.

  4. Pembantu visual menyoroti tren, sinyal, dll untuk membantu pengambilan keputusan.

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. SuperTrend secara dinamis melacak perubahan harga dan mencerminkan pergeseran tren tepat waktu.

  2. Stop loss ATR menyesuaikan stop berdasarkan volatilitas pasar, membantu mengunci keuntungan.

  3. Filter MA menghilangkan sinyal palsu dari kebisingan di berbagai pasar.

  4. Desain visual secara intuitif menyajikan mekanisme strategi dan situasi pasar.

  5. Hanya pembalikan tren perdagangan yang membuatnya cocok untuk kepemilikan jangka panjang.

Analisis Risiko

Risiko utama adalah:

  1. SuperTrend sensitif terhadap parameter. Pengaturan band yang sering dapat menyebabkan over trading.

  2. Di pasar yang bergolak, stop bisa sering dipicu.

  3. Tidak ada pertimbangan biaya perdagangan. akun kecil menderita dampak yang lebih besar.

  4. Tidak ada stop loss berarti risiko penarikan yang tinggi.

  5. Filter tren mungkin melewatkan beberapa kesempatan.

Risiko dapat dikurangi dengan:

  1. Mengoptimalkan parameter ATR untuk pengaturan frekuensi band yang lebih rendah.

  2. Menambahkan penyaringan bar setara untuk menghindari berhenti oleh berayun kecil frekuensi tinggi.

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

  4. Pengaturan periode rata-rata bergerak untuk efek penyaringan keseimbangan.

  5. Mengoptimalkan manajemen uang untuk mengurangi dampak biaya perdagangan.

Arahan Optimasi

Strategi dapat ditingkatkan dalam aspek berikut:

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

  2. Cobalah indikator stop loss dinamis lainnya seperti Chandelier Exit.

  3. Tambahkan ukuran posisi untuk mengoptimalkan pemanfaatan modal.

  4. Masukkan indikator volatilitas untuk menyempurnakan entri.

  5. Mengimplementasikan stop loss dan mengambil keuntungan untuk mengendalikan risiko.

  6. Sesuaikan parameter untuk pasar yang berbeda.

  7. Jelajahi pembelajaran mesin untuk optimasi parameter.

  8. Gabungkan indikator lain untuk meningkatkan akurasi filter.

Kesimpulan

Strategi ini menggunakan SuperTrend dengan stop dinamis untuk menentukan tren, dan menambahkan filter MA untuk mengidentifikasi entri panjang.


/*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 banyak