SuperTrend Strategi Dua Arah

Penulis:ChaoZhang, Tanggal: 2023-10-08 15:02:45
Tag:

Gambaran umum

Strategi ini menggunakan band atas dan bawah yang dihitung berdasarkan indikator ATR untuk menentukan arah tren saat ini dan menghasilkan sinyal beli dan jual.

Logika Strategi

  1. Menghitung indikator ATR, yang mewakili rentang volatilitas harga rata-rata.
  2. Menghitung band atas dan bawah berdasarkan nilai ATR dikalikan dengan faktor.
  3. Tentukan arah tren berdasarkan hubungan harga dengan band.
    • Ketika harga berada di atas band atas, itu adalah tren naik.
    • Ketika harga berada di bawah band bawah, itu adalah downtrend.
  4. Menghasilkan sinyal beli dan jual ketika tren berubah arah.
    • Sinyal beli dihasilkan di dekat band atas ketika tren berubah dari tren menurun ke tren naik.
    • Sinyal jual dihasilkan di dekat band bawah ketika tren berubah dari tren naik ke tren turun.
  5. Visualisasikan band atas/bawah, arah tren dan sinyal perdagangan.

Analisis Keuntungan

  • Menggunakan ATR untuk menentukan tren dapat menyesuaikan band dengan volatilitas pasar dengan menyesuaikan parameter.
  • Menangkap pembalikan tren tepat waktu dengan pecahnya band.
  • Menyaring sinyal dengan arah tren untuk menghindari pecah palsu.
  • Visualisasi band dan sinyal yang jelas.

Analisis Risiko

  • Periode ATR yang tidak tepat dapat melepaskan band dari harga.
  • Multiplikator yang terlalu besar/kecil menyebabkan lebih banyak sinyal palsu dan sinyal tertinggal.
  • Waktu pembalikan yang tidak akurat menyebabkan kerugian dari perdagangan pembalikan.
  • Membutuhkan filter lain untuk mengurangi disiksa.

Arahan Optimasi

  • Optimalisasi dinamika periode ATR agar sesuai dengan volatilitas pasar.
  • Pengaturan parameter untuk produk dan jangka waktu yang berbeda.
  • Gabungkan indikator lain seperti volume untuk validasi tren.
  • Menggunakan pembelajaran mesin untuk optimasi parameter.

Ringkasan

Strategi ini mengimplementasikan gagasan menentukan tren dua arah berdasarkan ATR. Sinyal pecah dihasilkan dan disaring oleh arah tren untuk menghindari sinyal palsu. Parameter dapat disetel untuk lingkungan pasar yang berbeda. Masih ada beberapa risiko yang perlu dioptimalkan lebih lanjut. Secara keseluruhan, ini adalah strategi sederhana dan praktis yang layak untuk diteliti dan ditingkatkan.


/*backtest
start: 2022-10-01 00:00:00
end: 2023-10-07 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

TradeId = "RVG"

InitCapital = 1000
InitPosition = 1000
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true

//@version=4
// strategy("Supertrend RG", overlay = true,process_orders_on_close=true,commission_type=strategy.commission.percent,commission_value=InitCommission,
//  currency=currency.USD,initial_capital=InitCapital,default_qty_type=strategy.cash, default_qty_value=InitPosition, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick,pyramiding=InitPyramidMax)

//
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2018, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true



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=true)
highlighting = input(title="Highlighter 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
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
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=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
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


strategy.entry(TradeId + " Long", true, when=buySignal[1] and time_cond)
strategy.entry(TradeId + " Short", false, when=sellSignal[1] and time_cond)   




Lebih banyak