
Multi Timeframe Moving Average Crossover Strategy adalah strategi perdagangan algoritmik yang menggunakan sinyal silang antara rata-rata bergerak dari periode waktu yang berbeda untuk menentukan arah tren. Strategi ini memanfaatkan kombinasi indikator tren, indikator momentum, dan indikator volatilitas untuk membuat sinyal strategi lebih dapat diandalkan.
Strategi ini menentukan arah tren pasar dengan menghitung indikator CCI dari berbagai periode, kemudian digabungkan dengan indikator MACD untuk mencari sinyal garpu mati, dan akhirnya menggunakan indikator ATR untuk menetapkan stop loss stop loss, sehingga dapat melakukan low buy high sell.
Secara khusus, pertama-tama menghitung indikator CCI selama 20 siklus untuk menilai tren pasar berdasarkan positif-negatifnya; kemudian menghitung apakah garis rata-rata MACD yang cepat dan lambat terjadi persilangan, untuk menentukan apakah ada sinyal jual beli yang dihasilkan; kemudian menggunakan indikator ATR untuk menghasilkan mekanisme tracking stop loss, untuk mengunci keuntungan lebih lanjut; dan terakhir, sinyal dari beberapa indikator di atas digabungkan, untuk menghasilkan sinyal strategi jual beli akhir.
Strategi ini menggunakan kombinasi tiga indikator CCI, MACD dan ATR untuk menilai tren, momentum, dan volatilitas pasar secara komprehensif, sehingga sinyal strategi lebih akurat dan dapat diandalkan.
Dengan menggunakan CCI dari berbagai siklus untuk menilai tren pasar secara keseluruhan, dan bekerja sama dengan MACD periode tinggi untuk mencari titik jual beli rendah, dapat menangkap tren pasar yang lebih besar.
Dengan stop loss yang dihasilkan oleh indikator ATR, Anda dapat mengatur stop loss yang wajar sesuai dengan volatilitas pasar, dan memiliki fitur stop loss tracking, Anda dapat mengontrol risiko strategi dengan baik.
Sebagian besar parameter dalam strategi ini tidak memiliki ruang untuk penyesuaian yang besar, sehingga mudah mencapai batas efek, yang membatasi peningkatan lebih lanjut dari efek strategi.
Karena strategi menggunakan beberapa indikator untuk melakukan operasi kombinasi, beban komputasi strategi meningkat sampai batas tertentu. Masalah karton dapat terjadi dalam perdagangan frekuensi tinggi.
Sinyal-sinyal strategi mungkin lebih sering terjadi, dan pengendalian risiko bergantung pada pelacakan stop loss dari indikator ATR, dan pengendalian risiko untuk situasi ekstrem tidak lengkap.
Algoritma optimasi hyperparameter yang menggunakan pembelajaran mesin, seperti optimasi Bayesian, algoritma genetik, dan lain-lain, dapat dicoba untuk membuat penyesuaian parameter lebih cerdas dan efisien.
Beberapa indikator fungsional lainnya dapat dipertimbangkan, seperti indikator volatilitas, indikator kuantitatif, indikator emosi, dan lain-lain, untuk meningkatkan adaptasi dan robustnya strategi.
Prinsip stop loss yang lebih ilmiah dapat dirancang, atau modul kontrol posisi atau pengelolaan dana tertentu dapat ditambahkan, untuk lebih melindungi risiko situasi ekstrem dan menjamin stabilitas strategi.
Strategi multi-frame yang melintasi garis kesetaraan dengan menggunakan kombinasi dari tiga indikator utama CCI, MACD dan ATR, memungkinkan penilaian tren yang lebih andal dan pengendalian risiko yang efisien. Strategi ini secara komprehensif mempertimbangkan tiga dimensi tren, dinamika, dan volatilitas, dengan akurasi sinyal yang tinggi, memahami irama pasar, dan keuntungan pengendalian risiko yang efektif. Tentu saja, strategi ini juga memiliki ruang optimasi parameter tertentu, beban komputasi yang terbatas, dan pengendalian risiko yang dapat ditingkatkan.
/*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)