Sumber daya yang dimuat... Pemuatan...

Strategi pembalikan rata-rata bergerak ganda

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

img

Gambaran umum

Strategi ini terutama menggunakan rata-rata bergerak ganda sebagai sinyal beli dan jual untuk mendapatkan keuntungan dari pembalikan tren. Ini pergi panjang ketika rata-rata bergerak jangka pendek melintasi di atas rata-rata bergerak jangka panjang, dan pergi pendek ketika rata-rata bergerak jangka pendek melintasi di bawah rata-rata bergerak jangka panjang.

Logika Strategi

Strategi ini pertama-tama menetapkan dua rata-rata bergerak, satu MA jangka pendek 20 hari dan satu MA jangka panjang 60 hari.

Secara khusus, ketika MA jangka pendek melintasi di atas MA jangka panjang, itu menandakan tren naik, jadi pergi panjang.

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

Logika utama kode adalah:

  1. Menghitung EMA 20 hari dan EMA 60 hari
  2. Pertimbangkan jika 20-hari EMA melintasi di atas 60-hari EMA, jika ya pergi panjang
  3. Pertimbangkan jika 20-hari EMA melintasi di bawah 60-hari EMA, jika ya pergi pendek
  4. Setelah pergi panjang, tetapkan stop loss di 3% di bawah harga tertinggi
  5. Setelah short, atur stop loss 3% di atas harga terendah
  6. Terus menyesuaikan stop loss saat berada di posisi

Analisis Keuntungan

Keuntungan dari strategi ini adalah:

  1. Logika sederhana mudah diterapkan.
  2. Dual MA dapat secara efektif menyaring pemutusan palsu.
  3. Mengemudi stop kunci dalam keuntungan maksimum.
  4. Dapat menangkap sinyal tepat waktu ketika tren berubah.
  5. Kontrol penarikan yang tepat, relatif stabil.

Analisis Risiko

Ada juga beberapa risiko:

  1. Sering berselisih antara MAs ketika tren tidak jelas, menyebabkan kerugian yang berlebihan.
  2. Pengaturan stop loss yang tidak benar bisa terlalu longgar atau terlalu agresif.
  3. Pengaturan parameter yang salah seperti panjang periode dapat melewatkan sinyal kunci.
  4. Biaya perdagangan yang tinggi mengikis margin keuntungan.

Untuk mengatasi risiko:

  1. Mengadopsi filter ketika tren tidak jelas untuk menghindari perdagangan buta.
  2. Uji dan optimalkan stop loss range untuk pengaturan yang tepat.
  3. Temukan parameter optimal melalui backtest dan tuning.
  4. Mengurangi ukuran posisi untuk menurunkan biaya perdagangan.

Ide-ide Optimasi

Strategi ini dapat dioptimalkan lebih lanjut di bidang berikut:

  1. Tambahkan filter lain seperti RSI untuk entri multi-kondisi, menghindari pemutusan palsu.

  2. Mengoptimalkan periode MA untuk menemukan campuran parameter terbaik. Dapat menguji periode yang berbeda dengan berjalan ke depan secara inkremental.

  3. Optimalkan stop loss range melalui perhitungan backtest untuk menemukan range optimal.

  4. Atur logika re-entry setelah stop loss exit untuk mengurangi frekuensi perdagangan.

  5. Gabungkan dengan indikator tren untuk menghentikan perdagangan ketika tren tidak jelas.

  6. Tambahkan ukuran posisi dan stop loss dinamis berdasarkan kondisi pasar.

Ringkasan

Singkatnya, strategi pembalikan MA ganda sederhana dan praktis secara keseluruhan, mengidentifikasi titik balik tren melalui crossover MA ganda. Tetapi ada risiko yang membutuhkan penyesuaian parameter, pengoptimalan stop loss, dan penambahan filter untuk memaksimalkan efektivitas strategi.


/*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 banyak