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.
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:
Keuntungan dari strategi ini adalah:
Ada juga beberapa risiko:
Untuk mengatasi risiko:
Strategi ini dapat dioptimalkan lebih lanjut di bidang berikut:
Tambahkan filter lain seperti RSI untuk entri multi-kondisi, menghindari pemutusan palsu.
Mengoptimalkan periode MA untuk menemukan campuran parameter terbaik. Dapat menguji periode yang berbeda dengan berjalan ke depan secara inkremental.
Optimalkan stop loss range melalui perhitungan backtest untuk menemukan range optimal.
Atur logika re-entry setelah stop loss exit untuk mengurangi frekuensi perdagangan.
Gabungkan dengan indikator tren untuk menghentikan perdagangan ketika tren tidak jelas.
Tambahkan ukuran posisi dan stop loss dinamis berdasarkan kondisi pasar.
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)