Strategi perdagangan berjangka intraday crossover dengan rata-rata bergerak ganda

Penulis:ChaoZhang, Tanggal: 2023-11-15 16:48:02
Tag:

img

Gambaran umum

Strategi ini memanfaatkan prinsip crossover rata-rata bergerak ganda, menggabungkan indikator ATR untuk stop loss dan take profit, dan menambahkan kontrol jam perdagangan untuk merancang strategi perdagangan intraday yang cocok untuk kontrak berjangka.

Logika Strategi

Strategi ini menggunakan garis WMA 5 periode dan 20 periode crossover sebagai sinyal masuk. Ini pergi panjang ketika garis 5 periode melanggar di atas garis 20 periode, dan pergi pendek ketika garis 5 periode melanggar di bawah garis 20 periode. Ini juga menggunakan garis WMA 50 periode untuk menentukan arah tren.

Selain itu, strategi ini memanfaatkan indikator ATR untuk mengatur tingkat stop loss dan take profit yang dinamis. ATR mencerminkan volatilitas pasar.

Akhirnya, strategi hanya memicu perdagangan selama jam perdagangan AS (9:00-14:30 CST) untuk menghindari volatilitas tinggi di sekitar pasar terbuka dan ditutup di mana sinyal palsu mudah terbentuk.

Analisis Keuntungan

Strategi ini memiliki keuntungan berikut:

  1. Crossover rata-rata bergerak ganda secara efektif menangkap titik balik tren untuk masuk tepat waktu.

  2. Filter tren menghindari perdagangan melawan tren utama dan mengurangi sinyal palsu.

  3. Kontrol stop loss berbasis ATR dinamis per kerugian perdagangan.

  4. Membatasi jam perdagangan menghindari periode buka dan tutup yang tidak stabil.

  5. Aturan sederhana dan jelas, mudah dipahami dan diterapkan untuk pemula.

  6. Parameter yang dapat disesuaikan seperti periode MA, ATR multiplier, jam perdagangan dll untuk optimasi.

Analisis Risiko

Strategi ini juga memiliki risiko berikut:

  1. Lebih banyak pemicu stop loss selama pasar yang terikat jangkauan.

  2. Dual MA crossover memiliki lag dan mungkin melewatkan jangka pendek breakouts.

  3. Pengaturan parameter ATR yang tidak benar menyebabkan stop loss besar atau kecil.

  4. Hanya mengandalkan indikator teknis tanpa analisis fundamental.

  5. Efektivitas bergantung pada simbol yang tepat dan kerangka waktu.

  6. Sistem mekanik memiliki risiko diperdagangkan.

  7. Parameter perlu disesuaikan untuk sesi perdagangan yang berbeda.

Ini dapat ditingkatkan melalui penyesuaian parameter, kombinasi indikator, intervensi manual selektif dll.

Arahan Optimasi

Strategi dapat ditingkatkan dalam aspek berikut:

  1. Uji sistem MA yang berbeda seperti EMA, DMA dll.

  2. Tambahkan filter teknis lainnya seperti MACD, RSI dll.

  3. Mengoptimalkan parameter ATR untuk stop loss/profit yang lebih baik.

  4. Sertakan indikator volume untuk menemukan sinyal masuk berkualitas tinggi.

  5. Sesuaikan parameter berdasarkan spesifikasi simbol.

  6. Mengintegrasikan faktor dasar untuk menghindari perdagangan melawan pasar.

  7. Memperkenalkan pembelajaran mesin seperti jaringan saraf untuk pemodelan pasar.

  8. Jelajahi kombinasi multi-frame waktu untuk lebih banyak kesempatan.

  9. Membangun strategi bersama untuk meningkatkan ketahanan.

Kesimpulan

Dalam kesimpulan, ini adalah strategi sederhana dan intuitif yang cocok untuk pemula untuk berlatih perdagangan langsung. Pada saat yang sama, ruang yang sangat besar tersisa untuk optimasi melalui indikator lebih teknis atau pembelajaran mesin. Penyesuaian parameter berdasarkan simbol dan dinamika pasar juga penting. Strategi ini menyediakan kerangka referensi untuk pemula perdagangan kuantitatif, tetapi membutuhkan pengujian dan peningkatan yang tak henti-hentinya untuk keuntungan yang stabil.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
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/
// © james4392010

//@version=4

strategy(title="DayTradingFutures Cross-Strategy", overlay=true)




// === GENERAL INPUTS ===
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



wmaFastSource   = input(defval = close, title = "Fast WMA Source")
wmaFastLength   = input(defval = 5, title = "Fast WMA Period")
wmaSlowSource   = input(defval = close, title = "Slow WMA Source")
wmaSlowLength   = input(defval = 20, title = "Slow WMA Period")
wmaDirectionSource  = input(defval = close, title = "Trend 50 Period Source")
wmaDirectionLength  = input(defval = 50, title = "Trend 50 Period")
timeinrange(res, sess) => time(res, sess) != 0



// === SERIES SETUP ===
/// a couple of ma's..
wmaFast = wma(close, 5)
wmaSlow = wma(close, 20)
wmaDirection = wma(close, 50)





// === PLOTTING ===
fast = plot(series=wmaFast, color=color.white, linewidth=2)
slow = plot(series=wmaSlow, color=color.yellow, linewidth=2)
direction = plot(series=wmaDirection, color=color.red, linewidth=2)


// === INPUT BACKTEST RANGE ===

//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 = 2022, title = "From Year", minval = 2022)
 
// 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 = 2022, title = "To Year", minval = 2022)
//startDate = timestamp(fromYear, fromMonth, fromDay)
//finishDate = timestamp(toYear, toMonth, toDay)
//inDateRange= (time >= fromDay, fromMonth, fromYear and time <= toDay, toMonth, toYear) 



// === FUNCTION EXAMPLE ===
//inDateRange = (time >= fromDay, fromMonth, fromYear) and (time <= toDay, toMonth, toYear)


// === LOGIC ===

enterLong = crossover(wmaFast, wmaSlow) and close > wmaDirection and timeinrange(timeframe.period, "0900-1430")
enterShort = crossunder(wmaFast, wmaSlow) and close < wmaDirection and timeinrange(timeframe.period, "0900-1430")

//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 = enterLong 
//plotshape(enterLong ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green)
plotshape(enterLong and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)
//dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)

sellSignal = enterShort
//plotshape(enterShort ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red)
plotshape(enterShort and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)
//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="Buy", message="Buy!")
alertcondition(sellSignal, title="Sell", message="Sell!")
//changeCond = trend != trend[1]
//alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")



// Entry for strategy //

//tp=input(25,title="TakeProfit")
//sl=input(40,title="StopLoss")

strategy.entry("Long",1, when=buySignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)

strategy.entry("Short",1, when=sellSignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)
//strategy.exit("Exit", wmaFastwmaSlow)

//Buy and Sell Signals

//strategy.close_all(when =not timeinrange(timeframe.period, "1000-1430"))   


// === FILL ====

fill (fast, slow, color = wmaSlow > wmaDirection ? color.green : color.red)
//fill(when=enterLong, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterLong, sl, color = color.new(color.red, 90), title = "Loss area")
//fill(when=enterShort, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterShort, sl, color = color.new(color.red, 90), title = "Loss area")






Lebih banyak