Trend Mengikut Strategi Berdasarkan Moving Average Crossover

Penulis:ChaoZhang, Tarikh: 2023-10-24 11:02:52
Tag:

img

Ringkasan

Strategi ini terutamanya menggunakan salib emas dan salib mati purata bergerak dan penembusan lilin purata bergerak untuk membuat keputusan panjang dan pendek. Ia pergi lama apabila purata bergerak jangka pendek melintasi purata bergerak jangka panjang, dan pergi pendek apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka panjang. Harga penutupan lilin yang memecahkan purata bergerak juga digunakan sebagai isyarat kemasukan.

Prinsip-prinsip

  1. Hitung dua purata bergerak, EMA1 dan EMA2, dengan tempoh yang berbeza.

  2. Tentukan sama ada EMA1 melintasi EMA2, jika ya, pergi panjang.

  3. Tentukan sama ada EMA1 melintasi di bawah EMA2, jika ya, pergi pendek.

  4. Tentukan sama ada harga penutupan memecahkan EMA1 sebagai isyarat kemasukan.

  5. Mekanisme keluar: tetapkan stop loss atau gunakan Saluran Donchian untuk menetapkan stop loss.

Fungsi utama yang digunakan:

  • ema(): mengira purata bergerak eksponensial
  • crossover ((): menentukan sama ada EMA1 melintasi EMA2
  • crossunder ((): menentukan sama ada EMA1 melintasi di bawah EMA2
  • meningkat (() / jatuh ((): menentukan sama ada harga meningkat atau menurun
  • valuewhen(): mengembalikan nilai yang berbeza berdasarkan keadaan

Kelebihan

  1. Logik yang mudah, mudah difahami dan dilaksanakan.

  2. Menggunakan trend berikut ciri purata bergerak untuk mengesan trend dengan berkesan.

  3. Menggabungkan penembusan harga penutupan lilin membantu mengelakkan penembusan palsu.

  4. Penggunaan fleksibel kombinasi purata bergerak yang berbeza yang dapat disesuaikan dengan tempoh yang berbeza.

  5. Mekanisme stop loss mengawal risiko.

Risiko

  1. Pertukaran emas yang kerap dan perpindahan mati semasa pengukuhan pasaran menyebabkan kejatuhan.

  2. Titik stop loss tetap mungkin terlalu kaku untuk diselaraskan berdasarkan perubahan pasaran.

  3. Purata bergerak ketinggalan dan mungkin terlepas isyarat pembalikan pada titik perubahan.

  4. Penghakiman yang tepat tentang kemiringan purata bergerak diperlukan untuk menapis terobosan palsu.

  5. Pilihan parameter perlu berhati-hati, kekerapan atau kelewatan yang tidak sesuai boleh menjejaskan prestasi strategi.

Pengoptimuman

  1. Perpindahan garis sifar MACD dapat membantu menentukan trend dan penyatuan penapis.

  2. Tambah Saluran Donchian untuk garis stop loss dinamik untuk meningkatkan stop loss tetap.

  3. Tambah Bollinger Bands untuk menilai trend yang kuat atau lemah, mengelakkan perdagangan yang tidak berkesan semasa penyatuan pasaran.

  4. Mengoptimumkan kombinasi parameter purata bergerak dan menguji prestasi sebenar strategi tempoh yang berbeza.

  5. Pertimbangkan untuk menambah purata bergerak yang bersandar untuk mengurangkan lag.

Kesimpulan

Logik keseluruhan strategi ini adalah mudah dan jelas, menggunakan teknik perdagangan crossover purata bergerak klasik, dan menggabungkan penembusan lilin untuk kemasukan untuk menapis isyarat palsu dengan berkesan. Ruang pengoptimuman termasuk menggunakan penunjuk lain untuk kekuatan trend, berhenti dinamik dll. Secara umum, strategi mengikuti trend berdasarkan purata bergerak adalah klasik dan intuitif, dengan ruang penerokaan yang berharga untuk pengoptimuman.


/*backtest
start: 2023-09-01 00:00:00
end: 2023-10-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title='Mega crypto bot strategy', shorttitle='megacryptobot_Strategy', overlay=true, pyramiding=0, initial_capital=10000, currency=currency.USD)

//Candle body resistance Channel-----------------------------//
len = 34
src = input(close, title="Candle body resistance Channel")
out = sma(src, len)
last8h = highest(close, 13)
lastl8 = lowest(close, 13)
bearish = cross(close,out) == 1 and falling(close, 1)
bullish = cross(close,out) == 1 and rising(close, 1)
channel2=input(false, title="Bar Channel On/Off")
ul2=plot(channel2?last8h:last8h==nz(last8h[1])?last8h:na, color=black, linewidth=1, style=linebr, title="Candle body resistance level top", offset=0)
ll2=plot(channel2?lastl8:lastl8==nz(lastl8[1])?lastl8:na, color=black, linewidth=1, style=linebr, title="Candle body resistance level bottom", offset=0)
//fill(ul2, ll2, color=black, transp=95, title="Candle body resistance Channel")

//-----------------Support and Resistance 
RST = input(title='Support / Resistance length:',  defval=10) 
RSTT = valuewhen(high >= highest(high, RST), high, 0)
RSTB = valuewhen(low <= lowest(low, RST), low, 0)
RT2 = plot(RSTT, color=RSTT != RSTT[1] ? na : red, linewidth=1, offset=+0)
RB2 = plot(RSTB, color=RSTB != RSTB[1] ? na : green, linewidth=1, offset=0)

//--------------------Trend colour ema------------------------------------------------// 
src0 = close, len0 = input(13, minval=1, title="EMA 1")
ema0 = ema(src0, len0)
direction = rising(ema0, 2) ? +1 : falling(ema0, 2) ? -1 : 0
plot_color = direction > 0  ? lime: direction < 0 ? red : na
plot(ema0, title="EMA", style=line, linewidth=1, color = plot_color)

//-------------------- ema 2------------------------------------------------//
src02 = close, len02 = input(21, minval=1, title="EMA 2")
ema02 = ema(src02, len02)
direction2 = rising(ema02, 2) ? +1 : falling(ema02, 2) ? -1 : 0
plot_color2 = direction2 > 0  ? lime: direction2 < 0 ? red : na
plot(ema02, title="EMA Signal 2", style=line, linewidth=1, color = plot_color2)

//=============Hull MA//
show_hma = input(false, title="Display Hull MA Set:")
hma_src = input(close, title="Hull MA's Source:")
hma_base_length = input(8, minval=1, title="Hull MA's Base Length:")
hma_length_scalar = input(5, minval=0, title="Hull MA's Length Scalar:")
hullma(src, length)=>wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
plot(not show_hma ? na : hullma(hma_src, hma_base_length+hma_length_scalar*6), color=black, linewidth=2, title="Hull MA")

//============ signal Generator ==================================//
period = input('720')
ch1 = request.security(syminfo.tickerid, period, open)
ch2 = request.security(syminfo.tickerid, period, close)
longCondition = crossover(request.security(syminfo.tickerid, period, close),request.security(syminfo.tickerid, period, open))
if (longCondition)
    strategy.entry("BUY", strategy.long)
shortCondition = crossunder(request.security(syminfo.tickerid, period, close),request.security(syminfo.tickerid, period, open))
if (shortCondition)
    strategy.entry("SELL", strategy.short)

///////////////////////////////////////////////////////////////////////////////////////////

Lebih lanjut