Strategi pembalikan purata bergerak berganda

Penulis:ChaoZhang, Tarikh: 2023-10-24 10:56:08
Tag:

img

Ringkasan

Strategi ini terutamanya menggunakan purata bergerak berganda sebagai isyarat beli dan jual untuk mendapat keuntungan daripada pembalikan trend. Ia pergi lama apabila purata bergerak jangka pendek melintasi di atas purata bergerak jangka panjang, dan pergi pendek apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka panjang.

Logika Strategi

Strategi ini mula-mula menetapkan dua purata bergerak, satu jangka pendek 20 hari MA dan satu jangka panjang 60 hari MA. Ia kemudian menilai situasi persimpangan antara kedua-dua MA untuk menentukan kemasukan.

Secara khusus, apabila MA jangka pendek melintasi di atas MA jangka panjang, ia menandakan aliran naik, jadi pergi panjang.

Kaedah stop loss selepas pergi panjang atau pendek adalah trailing stop berdasarkan harga tertinggi dan harga terendah untuk mengunci keuntungan maksimum.

Logik utama kod adalah:

  1. Mengira EMA 20 hari dan EMA 60 hari
  2. Menghakimi jika 20 hari EMA melintasi di atas 60 hari EMA, jika ya pergi lama
  3. Menghakimi jika 20 hari EMA melintasi di bawah 60 hari EMA, jika ya pergi pendek
  4. Selepas pergi lama, tetapkan stop loss pada 3% di bawah harga tertinggi
  5. Selepas pergi pendek, tetapkan stop loss pada 3% di atas harga terendah
  6. Tetap menyesuaikan stop loss apabila berada di kedudukan

Analisis Kelebihan

Kelebihan strategi ini ialah:

  1. Logik yang mudah dilaksanakan.
  2. Dual MA boleh menapis pemotongan palsu dengan berkesan.
  3. Mengekalkan kunci berhenti dalam keuntungan maksimum.
  4. Boleh menangkap isyarat tepat pada masanya apabila trend berubah.
  5. Kawalan pengeluaran yang betul, agak stabil.

Analisis Risiko

Terdapat juga beberapa risiko:

  1. Perpaduan antara MA yang kerap apabila trend tidak jelas, membawa kepada kerugian yang berlebihan.
  2. Tetapan stop loss yang tidak betul boleh terlalu longgar atau terlalu agresif.
  3. Tetapan parameter yang salah seperti panjang tempoh mungkin terlepas isyarat utama.
  4. Kos perdagangan yang tinggi mengikis margin keuntungan.

Untuk menangani risiko:

  1. Mengambil penapis apabila trend tidak jelas untuk mengelakkan perdagangan buta.
  2. Uji dan mengoptimumkan julat kehilangan berhenti untuk tetapan yang betul.
  3. Cari parameter yang optimum melalui backtest dan penyesuaian.
  4. Mengurangkan saiz kedudukan untuk mengurangkan kos dagangan.

Idea pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam bidang berikut:

  1. Tambah penapis lain seperti RSI untuk kemasukan pelbagai keadaan, mengelakkan pecah palsu.

  2. Mengoptimumkan tempoh MA untuk mencari campuran parameter terbaik. Boleh menguji tempoh yang berbeza dengan langkah ke hadapan.

  3. Mengoptimumkan julat stop loss melalui pengiraan backtest untuk mencari julat optimum.

  4. Tetapkan logik masuk semula selepas keluar stop loss untuk mengurangkan kekerapan perdagangan.

  5. Gabungkan dengan penunjuk trend untuk menghentikan perdagangan apabila trend tidak jelas.

  6. Tambah saiz kedudukan dan stop loss dinamik berdasarkan keadaan pasaran.

Ringkasan

Ringkasnya, strategi pembalikan MA berganda adalah mudah dan praktikal secara keseluruhan, mengenal pasti titik perubahan trend melalui persilangan MA berganda. Tetapi terdapat risiko yang memerlukan penyesuaian parameter, pengoptimuman stop loss, dan penambahan penapis untuk memaksimumkan keberkesanan strategi. Dengan pengoptimuman yang teliti dan pengurusan risiko yang disiplin, ia boleh menjadi strategi perdagangan ayunan yang membawa keuntungan yang stabil.


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


//@version=2
strategy("Noro's Bands Scalper Strategy v1.4", shorttitle = "Scalper str 1.4", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
takepercent = input(0, defval = 0, minval = 0, maxval = 1000, title = "take, %")
needbe = input(true, defval = true, title = "Bands Entry")
needct = input(false, defval = false, title = "Counter-trend entry")
needdb = input(true, defval = true, title = "Double Body")
len = input(20, defval = 20, minval = 2, maxval = 200, title = "Period")
needbb = input(true, defval = true, title = "Show Bands")
needbg = input(true, defval = true, title = "Show Background")
src = close

//PriceChannel 1
lasthigh = highest(src, len)
lastlow = lowest(src, len)
center = (lasthigh + lastlow) / 2

//Distance
dist = abs(src - center)
distsma = sma(dist, len)
hd = center + distsma
ld = center - distsma
hd2 = center + distsma * 2
ld2 = center - distsma * 2

//Trend
trend = close < ld and high < center ? -1 : close > hd and low > center ? 1 : trend[1]

//Lines
colo = needbb == false ? na : black
plot(hd2, color = colo, linewidth = 1, transp = 0, title = "High band 2")
plot(hd, color = colo, linewidth = 1, transp = 0, title = "High band 1")
plot(center, color = colo, linewidth = 1, transp = 0, title = "center")
plot(ld, color = colo, linewidth = 1, transp = 0, title = "Low band 1")
plot(ld2, color = colo, linewidth = 1, transp = 0, title = "Low band 2")

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Body
body = abs(close - open)
smabody = needdb == false ? ema(body, 30) : ema(body, 30) * 2
candle = high - low

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up7 = trend == 1 and ((bar == -1 and bar[1] == -1) or (body > smabody and bar == -1)) ? 1 : 0
dn7 = trend == 1 and ((bar == 1 and bar[1] == 1) or (close > hd and needbe == true)) and close > strategy.position_avg_price * (100 + takepercent) / 100 ? 1 : 0
up8 = trend == -1 and ((bar == -1 and bar[1] == -1) or (close < ld2 and needbe == true)) and close < strategy.position_avg_price * (100 - takepercent) / 100 ? 1 : 0
dn8 = trend == -1 and ((bar == 1 and bar[1] == 1) or (body > smabody and bar == 1)) ? 1 : 0

if up7 == 1 or up8 == 1 
    strategy.entry("Long", strategy.long, needlong == false ? 0 : trend == -1 and needct == false ? 0 : na)

if dn7 == 1 or dn8 == 1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : trend == 1 and needct == false ? 0 : na)

Lebih lanjut