SuperTrend Strategi Dua Arah

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

Ringkasan

Strategi ini menggunakan jalur atas dan bawah yang dikira berdasarkan penunjuk ATR untuk menentukan arah trend semasa dan menjana isyarat beli dan jual.

Logika Strategi

  1. Mengira penunjuk ATR, yang mewakili julat turun naik harga purata.
  2. Mengira jalur atas dan bawah berdasarkan nilai ATR didarabkan dengan faktor.
  3. Tentukan arah trend berdasarkan hubungan harga dengan jalur.
    • Apabila harga di atas band atas, ia adalah trend menaik.
    • Apabila harga di bawah band bawah, ia adalah downtrend.
  4. Menghasilkan isyarat beli dan jual apabila trend berubah arah.
    • Isyarat beli dihasilkan berhampiran band atas apabila trend berubah dari trend menurun ke trend menaik.
    • Isyarat jual dihasilkan berhampiran jalur bawah apabila trend berubah dari trend menaik ke trend menurun.
  5. Melihat band atas/bawah, arah trend dan isyarat perdagangan.

Analisis Kelebihan

  • Menggunakan ATR untuk menentukan trend boleh menyesuaikan jalur dengan turun naik pasaran dengan menyesuaikan parameter.
  • Mencatatkan pembalikan trend tepat pada masanya dengan pecahnya jalur.
  • Menyaring isyarat mengikut arah trend untuk mengelakkan pecah palsu.
  • Visualisasi jelas jalur dan isyarat.

Analisis Risiko

  • Tempoh ATR yang tidak sesuai boleh melepaskan jalur dari harga.
  • Pengganda yang terlalu besar / kecil menyebabkan lebih banyak isyarat palsu dan isyarat yang tertinggal.
  • Masa pembalikan yang tidak tepat membawa kepada kerugian daripada perdagangan pembalikan.
  • Membutuhkan penapis lain untuk mengurangkan disapu.

Arahan pengoptimuman

  • Pengoptimuman dinamik tempoh ATR untuk menyesuaikan dengan turun naik pasaran.
  • Penyesuaian parameter untuk produk dan jangka masa yang berbeza.
  • Gabungkan penunjuk lain seperti jumlah untuk pengesahan trend.
  • Menggunakan pembelajaran mesin untuk pengoptimuman parameter.

Ringkasan

Strategi ini melaksanakan idea menentukan trend dua arah berdasarkan ATR. Isyarat pecah dihasilkan dan disaring oleh arah trend untuk mengelakkan isyarat palsu. Parameter boleh disesuaikan untuk persekitaran pasaran yang berbeza. Masih ada beberapa risiko yang memerlukan pengoptimuman lanjut. Secara keseluruhan, ini adalah strategi yang mudah dan praktikal yang patut diteliti dan diperbaiki.


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