Momentum Moving Average Crossover Strategi

Penulis:ChaoZhang, Tanggal: 2023-09-21 21:29:22
Tag:

Gambaran umum

Strategi ini menggunakan prinsip crossover antara rata-rata bergerak cepat dan lambat untuk menentukan arah tren pasar dan menghasilkan sinyal beli dan jual.

Logika Strategi

Strategi ini menggunakan dua rata-rata bergerak, satu garis cepat dan satu garis lambat. Garis cepat menggunakan EMA 3 hari dan garis lambat menggunakan EMA 15 hari. Ketika garis cepat melintasi di atas garis lambat dari bawah, itu menunjukkan tren naik dan memberikan sinyal beli. Sebaliknya, ketika garis cepat melintasi di bawah garis lambat dari atas, itu menandakan tren turun dan memberikan sinyal jual.

Strategi ini juga menetapkan EMA 3 hari yang lebih cepat sebagai garis keluar cepat. Ketika harga pecah di bawah garis keluar cepat ini, strategi ini menilai tren telah berbalik dan harus keluar dari posisi panjang yang ada. Demikian pula, ketika harga pecah kembali di atas garis keluar, strategi ini menunjukkan tren naik yang diperbarui dan memberi sinyal untuk kembali masuk panjang.

Sinyal operasi khusus ditetapkan sebagai:

  1. Garis cepat melintasi di atas garis lambat dari bawah, pergi panjang

  2. Garis cepat melintasi di bawah garis lambat dari atas, pergi pendek

  3. Pelanggaran harga di bawah garis keluar cepat, posisi panjang ditutup

  4. Harga kembali di atas garis keluar cepat, kembali masuk panjang

Keuntungan

  • Mudah digunakan, hanya perlu mengkonfigurasi dua parameter rata-rata bergerak, mudah diterapkan

  • Data backtesting yang cukup, menggunakan indikator umum untuk mengevaluasi kelayakan

  • Banyak parameter yang dapat dikonfigurasi untuk optimasi

  • Mengadopsi garis keluar cepat sebagai stop loss untuk mengontrol risiko dengan lebih baik

  • Logika strategi yang jelas, sinyal beli dan jual yang jelas

  • Frekuensi operasi yang tepat, menghindari perdagangan yang berlebihan

Risiko

  • Kemungkinan lebih banyak sinyal palsu ketika tren tidak jelas sebagai tren mengikuti strategi

  • Rata-rata bergerak memiliki sifat tertinggal, mungkin melewatkan titik balik

  • Parameter tetap tidak dapat beradaptasi dengan perubahan pasar, membutuhkan optimasi

  • Stop loss mungkin terlalu lunak, tidak dapat menghentikan kerugian tepat waktu

  • Sinyal yang sering dapat menyebabkan biaya perdagangan yang lebih tinggi

  • Sinyal mungkin berbeda dan perlu dikonfirmasi dengan indikator lain

Risiko dapat dikelola dengan mengoptimalkan parameter, menambahkan filter, meringankan stop loss, memperbarui parameter tepat waktu dll.

Peningkatan

  • Uji dan optimalkan parameter untuk lebih sesuai dengan kondisi pasar

  • Memperkenalkan lebih banyak indikator untuk membentuk sistem yang kuat

  • Membangun pengaturan parameter adaptif berdasarkan pasar real-time

  • Menerapkan model pembelajaran mesin untuk optimasi yang lebih cerdas

  • Atur stop loss dinamis atau trailing untuk kontrol risiko yang lebih baik

  • Gabungkan indikator volume untuk menghindari perbedaan

Kesimpulan

Ini adalah strategi crossover rata-rata bergerak ganda yang relatif sederhana. Ini menentukan tren pasar dan sinyal perdagangan berdasarkan interaksi antara rata-rata bergerak cepat dan lambat. Strategi ini mudah diterapkan dan dapat disesuaikan melalui optimasi. Tetapi juga memiliki beberapa risiko. Lebih banyak filter diperlukan untuk mengkonfirmasi sinyal dan mengelola risiko. Ketika dioptimalkan dengan benar dan diterapkan pada perdagangan jangka menengah, ini dapat menjadi sistem perdagangan kuantitatif yang sangat praktis.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ehaarjee, ECHKAY, JackBauer007

//@version=4
//study(title="Tale_indicators", overlay=true)
strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1)

len_fast = input(3, minval=1, title="FAST EMA")
src_fast = input(close, title="Source for Fast")
fastMA = ema(src_fast, len_fast)
plot(fastMA, title="Slow EMA", color=color.orange)

len_slow = input(15, minval=1, title="SLOW EMA")
src_slow = input(close, title="Source for Slow")
slowMA = ema(src_slow, len_slow)
plot(slowMA, title="Fast EMA", color=color.blue)

len_fast_exit = input(3, minval=1, title="FAST EMA Exit")
src_fast_exit = input(close, title="Source for Fast Exit")
fastMAE = ema(src_fast_exit, len_fast_exit)
plot(fastMAE, title="Fast EMA Ex", color=color.red)


src_slow_enter_short = input(low, title="Source for Short Entry")
slowMASEn = ema(src_slow_enter_short, len_slow)

src_slow_enter_long = input(high, title="Source for Long Entry")
slowMALEn = ema(src_slow_enter_long, len_slow)

src_slow_exit_short = input(low, title="Source for Short Exit")
slowMASEx = ema(src_slow_enter_short, len_slow)

src_slow_exit_long = input(high, title="Source for Long Exit")
slowMALEx = ema(src_slow_enter_long, len_slow)

enter_long = crossover(fastMA, slowMALEn)
enter_short = crossunder(fastMA, slowMASEn)
exit_long = crossunder(fastMAE, slowMALEx)
exit_short = crossover(fastMAE, slowMALEx)

out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0))
plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30)

bull = fastMA > slowMALEn
bear = fastMA < slowMASEn

c = bull ? color.green : bear ? color.red  : color.white
bgcolor(c)

exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA")

bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high))
bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE))

bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE))
bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high))

bull_re = (bull and (low<slowMALEn)) and not(enter_long)
bear_re = (bear and (high>slowMASEn)) and not(enter_short)

bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) 
bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1])))

bull_reenter =  (bull_r) and not(enter_long)
bear_reenter =  (bear_r) and not(enter_short)

plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar)
plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar)

plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar)
plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar)

run_strategy = input(true, title="Run Strategy")
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 2000)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2100, title = "Thru Year",       type = input.integer, minval = 2000)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

var long_position_open = false
var short_position_open = false


if (enter_long and not(bull_exit) and not(long_position_open))
//    strategy.entry("LO", strategy.long, qty=4)
    long_position_open := true
    if (short_position_open)
//        strategy.close("SO")
        short_position_open := false

if (bull_reenter and not(long_position_open))  
//    strategy.entry("LO", strategy.long, qty=1)
    long_position_open := true

if (bull_exit and long_position_open)
//  strategy.close("LO")
    long_position_open := false
    
if (enter_short and not(bear_exit) and not(short_position_open))
//    strategy.entry("SO", strategy.short, qty=4)
    short_position_open := true
    if(long_position_open)
//        strategy.close("LO")
        long_position_open := false

if (bear_reenter and not(short_position_open))  
//    strategy.entry("SO", strategy.long, qty=1)
    long_position_open := true

if (bear_exit and short_position_open)
//    strategy.close("SO")
    short_position_open := false

if(run_strategy)
    strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4)
    strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1)
    strategy.close("LO", when=(window() and bull_exit and long_position_open))
    strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4)
    strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1)
    strategy.close("SO", when=(window() and bear_exit and short_position_open))


Lebih banyak