Multi Timeframe Moving Average Crossover Strategi

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

img

Ringkasan

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.

Logika Strategi

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.

Kelebihan

  1. Kombinasi pelbagai penunjuk meningkatkan ketepatan isyarat

    Gabungan CCI, MACD dan ATR meningkatkan kebolehpercayaan isyarat dagangan dengan menilai trend, momentum dan turun naik secara kolektif.

  2. 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.

  3. 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.

Risiko

  1. Ruang pengoptimuman terhad

    Kebanyakan parameter mempunyai ruang penyesuaian yang sempit, dengan mudah mencapai sempalan prestasi.

  2. Peningkatan beban pengkomputeran

    Pelbagai penunjuk yang berjalan bersama boleh meningkatkan beban pengkomputeran, menyebabkan kelewatan dalam perdagangan frekuensi tinggi.

  3. Isyarat kerap, kawalan risiko terhad

    Isyarat boleh kerap, sementara kawalan risiko bergantung terutamanya pada hentian trailing ATR, yang mempunyai batasan terhadap pergerakan melampau.

Peningkatan

  1. 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.

  2. Tambah penunjuk fungsional untuk meningkatkan kebolehsesuaian

    Menggabungkan penunjuk lain seperti turun naik, jumlah, sentimen boleh membuat strategi lebih kukuh dan fleksibel.

  3. 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.

Kesimpulan

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)



Lebih lanjut