Multi Timeframe Moving Average Crossover Strategi

Penulis:ChaoZhang, Tanggal: 2024-02-19 15:41:29
Tag:

img

Gambaran umum

Multi Timeframe Moving Average Crossover Strategy adalah strategi perdagangan algoritmik yang memanfaatkan sinyal crossover rata-rata bergerak antara periode waktu yang berbeda untuk menentukan arah tren.

Logika Strategi

Strategi ini menghitung indikator CCI selama periode yang berbeda untuk menentukan arah tren pasar, dikombinasikan dengan sinyal MACD untuk menemukan golden crosses dan death crosses, dan akhirnya menggunakan indikator ATR untuk menetapkan tingkat stop loss/take profit, untuk membeli rendah dan menjual tinggi.

Secara khusus, pertama-tama menghitung CCI 20-periode untuk menilai tren bullish atau bearish. Kemudian, ATR digunakan untuk menghasilkan trailing stop untuk mengunci keuntungan. Akhirnya, semua sinyal dikonsolidasikan untuk menghasilkan sinyal masuk dan keluar.

Keuntungan

  1. Kombinasi beberapa indikator meningkatkan akurasi sinyal

    Kombinasi CCI, MACD dan ATR meningkatkan keandalan sinyal perdagangan dengan secara kolektif menilai tren, momentum dan volatilitas.

  2. Analisis multi-frame waktu menangkap irama pasar

    CCI jangka panjang memahami tren keseluruhan, sementara MACD frekuensi yang lebih tinggi menemukan titik balik lokal, yang memungkinkan strategi untuk memanfaatkan perubahan pasar yang besar.

  3. ATR pengendalian penghentian belakang risiko secara efektif

    Stop loss berdasarkan ATR dapat beradaptasi dengan volatilitas pasar, sementara fitur trailingnya lebih mengunci keuntungan saat pasar bergerak menguntungkan.

Risiko

  1. Ruang pengoptimalan terbatas

    Sebagian besar parameter memiliki ruang penyesuaian yang sempit, dengan mudah mencapai kemacetan kinerja.

  2. Peningkatan beban komputasi

    Beberapa indikator yang berjalan bersama dapat meningkatkan beban komputasi, menyebabkan keterlambatan dalam perdagangan frekuensi tinggi.

  3. Sinyal yang sering, pengendalian risiko terbatas

    Sinyal dapat sering, sementara pengendalian risiko terutama bergantung pada ATR trailing stop, yang memiliki keterbatasan terhadap gerakan ekstrem.

Peningkatan

  1. Menerapkan pembelajaran mesin untuk penyesuaian parameter yang lebih efisien

    Optimasi Bayesian, algoritma genetik dll dapat memungkinkan penyesuaian parameter yang lebih cerdas dan efisien.

  2. Tambahkan indikator fungsional untuk meningkatkan kemampuan beradaptasi

    Menggabungkan indikator lain seperti volatilitas, volume, sentimen dapat membuat strategi lebih kuat dan fleksibel.

  3. Meningkatkan manajemen risiko untuk stabilitas yang lebih baik

    Aturan stop loss yang lebih ilmiah dapat dirancang, dan modul lebih lanjut seperti ukuran posisi dapat membantu melindungi terhadap peristiwa ekstrem.

Kesimpulan

Multi Timeframe Moving Average Crossover Strategy memanfaatkan kekuatan CCI, MACD dan ATR untuk mencapai penangkapan tren yang dapat diandalkan dan pengendalian risiko yang efisien. Ini memperhitungkan tren, momentum dan volatilitas untuk menghasilkan sinyal yang akurat, memahami ritme pasar dan mengelola risiko. Meskipun beberapa aspek seperti penyesuaian parameter, beban komputasi dan pengendalian risiko dapat ditingkatkan lebih lanjut, ini adalah sistem perdagangan algoritmik yang solid. Dengan beberapa peningkatan menggunakan pembelajaran mesin, lebih banyak indikator dan manajemen risiko yang lebih baik, kinerjanya dapat mencapai tingkat baru.


/*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"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)



Lebih banyak