Strategi SuperTrend

Penulis:ChaoZhang, Tarikh: 2024-02-02 11:11:48
Tag:

img

Ringkasan

Strategi ini menggunakan penunjuk Supertrend untuk menentukan trend harga dan memasuki kedudukan panjang atau pendek apabila trend berubah. Strategi ini membolehkan menyesuaikan tempoh ATR dan pengganda untuk mengoptimumkan parameter. Ia juga menyediakan pilihan untuk mengubah kaedah pengiraan ATR untuk hasil yang sedikit berbeza.

Strategi ini mempunyai julat tarikh backtesting terbina dalam dan keupayaan untuk berdagang hanya dalam masa tertentu pada siang hari dan menutup semua perdagangan pada akhir jangka masa itu. Ini sangat berguna untuk saham dagangan hari. Apabila pilihan jangka masa diaktifkan, anda boleh memilih untuk memasuki kedudukan semasa dengan segera apabila jangka masa bermula, atau menunggu perubahan trend untuk memasuki kedudukan pertama.

Strategi ini juga membolehkan anda menentukan tahap stop loss berasaskan peratusan dan mengambil keuntungan. Dalam kebanyakan kes, berhenti berasaskan ATR yang disediakan oleh Supertrend sendiri membuat stop loss tambahan tidak perlu. Jadi anda boleh mengaktifkan hanya mengambil keuntungan untuk mengoptimumkan mekanisme keluar.

Akhirnya, terdapat medan amaran tersuai untuk mesej masuk dan keluar yang akan digunakan dengan perkhidmatan perdagangan automatik.

Logika Strategi

Strategi Supertrend berdasarkan prinsip utama berikut:

  1. Mengira nilai ATR: Boleh memilih antara pengiraan SMA atau penunjuk ATR terbina dalam. Rumus SMA:

    atr2 = sma(tr, Periods)
    
  2. Hitung band atas dan bawah. Band atas adalah dekat tolak ATR pengganda kali ATR. Band bawah adalah dekat tambah pengganda kali ATR.

    up = close - (Multiplier * atr) 
    dn = close + (Multiplier * atr)
    
  3. Tentukan arah trend dengan membandingkan harga dengan band. Uptrend apabila harga melintasi band bawah. Downtrend apabila harga melintasi band atas.

    trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
    
  4. Menghasilkan isyarat perdagangan mengenai perubahan trend, contohnya isyarat jual apabila berubah dari trend menaik ke trend menurun:

    sellSignal = trend == -1 and trend[1] == 1 
    
  5. Penapis masuk berdasarkan isyarat dan keadaan tambahan.

  6. Gunakan stop loss dan mengambil keuntungan untuk mengunci keuntungan atau mengehadkan risiko.

Ini adalah prinsip kerja utama di sebalik strategi Supertrend. Digabungkan dengan pengoptimuman parameter, ia boleh menghasilkan hasil perdagangan yang baik.

Kelebihan

Strategi Supertrend mempunyai beberapa kelebihan:

  1. Supertrend sendiri berkesan mengenal pasti trend dan biasanya digunakan untuk berhenti.

  2. Parameter ATR yang boleh disesuaikan boleh dioptimumkan di seluruh produk untuk kesesuaian terbaik. Pengiraan SMA menyediakan pilihan lain.

  3. Julat masa backtest dan perdagangan langsung yang boleh dikonfigurasikan sesuai dengan sesi dagangan yang berbeza.

  4. Pilihan untuk memasuki perdagangan pertama dengan segera atau menunggu isyarat memenuhi produk yang berbeza.

  5. Pembinaan stop loss dan mengambil keuntungan membantu meningkatkan pengurusan risiko atau mengunci lebih banyak keuntungan.

  6. Isyarat perdagangan yang boleh disesuaikan untuk integrasi dengan sistem perdagangan automatik dan bot.

Risiko

Terdapat juga beberapa risiko yang perlu dipertimbangkan:

  1. Supertrend boleh menghasilkan isyarat palsu yang perlu disaring dengan keadaan tambahan.

  2. Parameter ATR yang tidak betul boleh menyebabkan perdagangan berlebihan atau kehilangan trend.

  3. Stop loss yang terlalu dekat boleh menyebabkan anda keluar dari perdagangan yang menguntungkan.

  4. Konfigurasi jangka masa yang tidak baik boleh melewatkan sesi dagangan atau mengikat margin tanpa perlu.

Risiko ini boleh ditangani melalui penyesuaian parameter yang sesuai atau penapis tambahan untuk meningkatkan ketahanan.

Peluang Pengoptimuman

Beberapa cara strategi boleh dioptimumkan lagi:

  1. Uji tempoh ATR yang berbeza untuk mencari keseimbangan yang betul, biasanya 10-20 berfungsi dengan baik.

  2. Cuba nilai pengganda ATR yang berbeza, biasanya 2-5 adalah sesuai, sesuaikan untuk mencari yang optimum.

  3. Tambah penapis seperti MACD, RSI dan lain-lain untuk mengurangkan isyarat palsu.

  4. Mengoptimumkan stop loss dan mengambil tahap keuntungan untuk hasil yang terbaik.

  5. Uji julat masa perdagangan yang berbeza. Tempoh yang lebih pendek sesuai dengan strategi intraday dan frekuensi tinggi.

  6. Melaksanakan pemilihan simbol automatik untuk mengesan momentum atau turun naik yang tinggi.

Kesimpulan

Secara keseluruhan, ini adalah strategi trend yang agak biasa dan praktikal. Ia dengan cekap mengesan trend dengan parameter yang boleh disesuaikan, tetapi juga mempunyai risiko yang melekat untuk diuruskan. Dengan pengoptimuman dan syarat tambahan, ia boleh disempurnakan menjadi sistem perdagangan kuant yang mantap dengan alfa yang konsisten.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
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/
// © REV0LUTI0N

//@version=4

// Strategy
strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)
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)
enableentry = input(true, title="Enter First Trade ASAP")
waitentry = input(false, title="Wait To Enter First Trade")

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

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
Long = (trend == 1 ? up : na)
buySignal = trend == 1 and trend[1] == -1

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
Short = (trend == 1 ? na : dn)
sellSignal = trend == -1 and trend[1] == 1

// Strategy Backtesting
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")

// Strategy Execution
if Long and time_cond and timetobuy and enableentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if Short and time_cond and timetobuy and enableentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if buySignal and time_cond and timetobuy and waitentry
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if sellSignal and time_cond and timetobuy and waitentry
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)






Lebih lanjut