Strategi penyeberangan rata-rata pergerakan multi-kerangka waktu


Tanggal Pembuatan: 2024-02-19 15:41:29 Akhirnya memodifikasi: 2024-02-19 15:41:29
menyalin: 0 Jumlah klik: 654
1
fokus pada
1617
Pengikut

Strategi penyeberangan rata-rata pergerakan multi-kerangka waktu

Ringkasan

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.

Prinsip Strategi

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.

Keunggulan Strategis

  1. Kombinasi multi-indikator untuk meningkatkan akurasi sinyal

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.

  1. Analisis Multi-Frame Time, Mengetahui Ritme Pasar

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.

  1. ATR Stop Loss Tracking, Pengendalian Resiko yang Efektif

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.

Risiko Strategis

  1. Optimasi parameter terbatas

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.

  1. Kombinasi multi-indikator meningkatkan beban komputasi

Karena strategi menggunakan beberapa indikator untuk melakukan operasi kombinasi, beban komputasi strategi meningkat sampai batas tertentu. Masalah karton dapat terjadi dalam perdagangan frekuensi tinggi.

  1. Sinyal sering, kendali risiko terbatas

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.

Optimasi Strategi

  1. Menggunakan algoritma pembelajaran mesin untuk meningkatkan efisiensi optimasi parameter

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.

  1. Meningkatkan Indikator Fungsional, Meningkatkan Elastisitas Strategi

Beberapa indikator fungsional lainnya dapat dipertimbangkan, seperti indikator volatilitas, indikator kuantitatif, indikator emosi, dan lain-lain, untuk meningkatkan adaptasi dan robustnya strategi.

  1. Meningkatkan Modul Manajemen Risiko dan Strategi Pengendalian Risiko

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.

Meringkaskan

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.

Kode Sumber Strategi
/*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)