
Strategi Crossover Purata Bergerak Jangka Masa Berbilang (Multi Timeframe Moving Average Crossover Strategy) adalah strategi perdagangan algoritma yang menggunakan isyarat silang antara purata bergerak dalam tempoh masa yang berbeza untuk menentukan arah trend. Strategi ini menggunakan gabungan indikator trend, indikator momentum dan indikator kadar turun naik, menjadikan isyarat strategi lebih dipercayai.
Strategi ini menentukan arah trend pasaran dengan mengira petunjuk CCI dari pelbagai kitaran, kemudian digabungkan dengan petunjuk MACD untuk mencari isyarat garpu mati, dan akhirnya menetapkan stop loss dengan petunjuk ATR, untuk mencapai harga rendah dan tinggi.
Khususnya, pertama-tama mengira indikator CCI 20 kitaran untuk menilai trend pasaran berdasarkan positif dan negatifnya; kemudian mengira sama ada garis purata MACD yang cepat dan perlahan berlaku, untuk menentukan sama ada ada isyarat beli dan jual dihasilkan; kemudian menggunakan indikator ATR untuk menghasilkan mekanisme pengesanan henti, untuk mengunci keuntungan lebih lanjut; dan akhirnya, sinyal gabungan beberapa indikator di atas, untuk menghasilkan isyarat strategi jual beli akhir.
Strategi ini menggunakan gabungan tiga indikator CCI, MACD dan ATR untuk menilai trend, momentum dan kadar turun naik pasaran secara menyeluruh, menjadikan isyarat strategi lebih tepat dan boleh dipercayai.
Menggunakan CCI untuk menentukan pergerakan keseluruhan pasaran dalam kitaran yang berbeza, bersama-sama dengan MACD kitaran tinggi untuk mencari titik jual beli rendah dan tinggi, dapat memahami kadar trend yang lebih besar di pasaran.
Dengan bantuan stop loss yang dihasilkan oleh penunjuk ATR, anda boleh menetapkan titik henti yang munasabah berdasarkan kadar turun naik pasaran, dan mempunyai fungsi pengesanan henti, anda dapat mengawal risiko strategi dengan baik.
Kebanyakan parameter dalam strategi ini tidak mempunyai ruang untuk penyesuaian yang besar dan mudah mencapai had kesannya, mengehadkan peningkatan lebih lanjut dalam kesannya.
Oleh kerana strategi menggunakan beberapa petunjuk untuk operasi gabungan, beban pengiraan strategi meningkat pada tahap tertentu. Masalah yang mungkin timbul dalam perdagangan frekuensi tinggi.
Isyarat strategi mungkin lebih kerap, dan kawalan risiko bergantung kepada pengesanan stop loss pada indikator ATR, dan kawalan risiko untuk keadaan yang melampau tidak lengkap.
Algoritma pengoptimuman hyperparameter pembelajaran mesin, seperti pengoptimuman Bayesian, algoritma genetik, dan lain-lain boleh dicuba untuk membuat penyesuaian parameter lebih pintar dan cekap.
Anda boleh mempertimbangkan untuk menambah beberapa penunjuk fungsi lain, seperti penunjuk kadar turun naik, penunjuk kuantitatif, penunjuk emosi, dan lain-lain, untuk meningkatkan fleksibiliti dan ketangguhan strategi.
Prinsip hentian kerugian yang lebih saintifik boleh direka bentuk, atau modul kawalan kedudukan atau pengurusan wang tertentu boleh dimasukkan, untuk lebih melindungi risiko keadaan yang melampau, memastikan kestabilan strategi.
Kerangka masa yang pelbagai merentasi strategi garis rata dengan menggunakan gabungan tiga indikator utama CCI, MACD dan ATR, untuk mencapai penilaian trend yang lebih dipercayai dan kawalan risiko yang cekap. Strategi ini mempertimbangkan tiga dimensi trend, momentum dan turun naik secara menyeluruh, mempunyai keunggulan ketepatan isyarat yang tinggi, memahami irama pasaran dan kawalan risiko yang berkesan. Sudah tentu, strategi ini juga mempunyai ruang pengoptimuman parameter tertentu, beban pengiraan yang terhad, dan kawalan risiko yang boleh 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)