Multi Timeframe Moving Average Crossover Strategy adalah strategi perdagangan algoritma yang menggunakan isyarat crossover purata bergerak antara tempoh jangka masa yang berbeza untuk menentukan arah trend.
Strategi ini mengira penunjuk CCI dalam tempoh yang berbeza untuk menentukan arah trend pasaran, digabungkan dengan isyarat MACD untuk mencari salib emas dan salib kematian, dan akhirnya menggunakan penunjuk ATR untuk menetapkan paras stop loss/take profit, untuk membeli rendah dan menjual tinggi.
Secara khusus, ia mula-mula mengira CCI 20 tempoh untuk menilai trend menaik atau menurun. Kemudian ia memeriksa sama ada garis MACD melintasi untuk mengenal pasti isyarat perdagangan. Seterusnya, ATR digunakan untuk menjana hentian untuk mengunci keuntungan. Akhirnya, semua isyarat dikonsolidasikan untuk menjana isyarat kemasukan dan keluar.
Kombinasi pelbagai penunjuk meningkatkan ketepatan isyarat
Gabungan CCI, MACD dan ATR meningkatkan kebolehpercayaan isyarat dagangan dengan menilai trend, momentum dan turun naik secara kolektif.
Analisis jangka masa berbilang menangkap irama pasaran
CCI jangka panjang memahami trend keseluruhan, manakala MACD frekuensi yang lebih tinggi mencari titik perubahan tempatan, yang membolehkan strategi untuk memanfaatkan perubahan pasaran yang besar.
ATR kawalan hentian belakang risiko dengan berkesan
Stop loss berdasarkan ATR boleh menyesuaikan diri dengan turun naik pasaran, sementara ciri trailingnya lebih mengunci keuntungan apabila pasaran bergerak dengan baik.
Ruang pengoptimuman terhad
Kebanyakan parameter mempunyai ruang penyesuaian yang sempit, dengan mudah mencapai sempalan prestasi.
Peningkatan beban pengkomputeran
Pelbagai penunjuk yang berjalan bersama boleh meningkatkan beban pengkomputeran, menyebabkan kelewatan dalam perdagangan frekuensi tinggi.
Isyarat kerap, kawalan risiko terhad
Isyarat boleh kerap, sementara kawalan risiko bergantung terutamanya pada hentian trailing ATR, yang mempunyai batasan terhadap pergerakan melampau.
Mempakai pembelajaran mesin untuk penyesuaian parameter yang lebih cekap
Pengoptimuman Bayesian, algoritma genetik dan lain-lain boleh membolehkan penyesuaian parameter yang lebih pintar dan cekap.
Tambah penunjuk fungsional untuk meningkatkan kebolehsesuaian
Menggabungkan penunjuk lain seperti turun naik, jumlah, sentimen boleh membuat strategi lebih kukuh dan fleksibel.
Memperkukuhkan pengurusan risiko untuk kestabilan yang lebih baik
Peraturan stop loss yang lebih saintifik boleh direka, dan modul lanjut seperti ukuran kedudukan boleh membantu melindungi daripada peristiwa melampau.
Multi Timeframe Moving Average Crossover Strategy menggunakan kuasa CCI, MACD dan ATR untuk mencapai penangkapan trend yang boleh dipercayai dan kawalan risiko yang cekap. Ia mengambil kira trend, momentum dan turun naik untuk menghasilkan isyarat yang tepat, memahami irama pasaran dan menguruskan risiko. Walaupun beberapa aspek seperti penyesuaian parameter, beban pengkomputeran dan kawalan risiko dapat ditingkatkan lagi, ia adalah sistem perdagangan algoritma yang kukuh. Dengan beberapa peningkatan menggunakan pembelajaran mesin, lebih banyak penunjuk dan pengurusan risiko yang lebih baik, prestasi dapat mencapai tahap 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)