Strategi crossover purata bergerak adalah strategi analisis teknikal yang sangat klasik dan biasa digunakan. Idea teras strategi ini adalah menggunakan crossover antara purata bergerak dari tempoh yang berbeza sebagai isyarat perdagangan. Apabila purata bergerak jangka pendek melintasi di atas purata bergerak jangka panjang dari bawah, isyarat beli dihasilkan. Apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka panjang dari atas, isyarat jual dihasilkan.
Strategi ini menggunakan input untuk menetapkan jenis (SMA, EMA, WMA, RMA) dan tempoh purata bergerak, serta julat masa backtesting.
Pelbagai jenis purata bergerak dikira dalam fungsi varian. purata bergerak dikira disimpan dalam pembolehubah ma.
Apabila harga penutupan melintasi di atas ma, isyarat beli dihasilkan. Apabila harga penutupan melintasi di bawah ma, isyarat jual dihasilkan.
Untuk menetapkan stop loss, julat sebenar purata 14 tempoh atr dikira. Ambil titik persilangan sebagai rujukan, tambah atau tolak 2 kali atr sebagai julat stop loss.
Logik masuk dan keluar khusus adalah seperti berikut:
Masuk panjang: dekat melintasi di atas ma dan dalam julat masa backtest, titik stop loss adalah titik masuk dekat
Keluar panjang: penutupan melintasi di bawah ma tolak 2 kali atr untuk keluar stop loss atau harga tertinggi melebihi titik masuk tutup ditambah 2 kali atr untuk keluar mengambil keuntungan
Pendaftaran pendek: dekat melintasi di bawah ma dan dalam julat masa backtest, titik stop loss adalah titik kemasukan dekat
Keluar pendek: penutupan melintasi di atas ma ditambah 2 kali atr untuk keluar stop loss atau harga terendah yang lebih rendah daripada titik masuk tutup tolak 2 kali atr untuk keluar mengambil keuntungan
Untuk menangani risiko, pengoptimuman boleh dibuat dalam aspek berikut:
Strategi ini boleh dioptimumkan dalam aspek berikut:
Strategi crossover purata bergerak adalah strategi analisis teknikal yang sangat tipikal dan biasa digunakan. Idea teras strategi adalah mudah dan mudah dilaksanakan, sesuai untuk pelbagai pasaran, dan merupakan salah satu strategi perdagangan kuantiti peringkat kemasukan. Walau bagaimanapun, strategi ini juga mempunyai beberapa masalah seperti menghasilkan isyarat yang kerap dan cenderung untuk menghentikan kerugian. Dengan pengoptimuman yang betul, prestasi dapat ditingkatkan dengan besar. Secara keseluruhan, strategi crossover purata bergerak menyediakan rangka kerja yang sangat baik untuk pembangunan strategi dan merupakan landasan pembelajaran strategi perdagangan kuantitatif.
/*backtest start: 2023-10-03 00:00:00 end: 2023-11-02 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA Cross Strategy", overlay=true,commission_value = 0.1) type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"]) length = input(28) source = close // === INPUT BACKTEST RANGE === FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2000, title = "From Year", minval = 2000) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(9999, 1, 1, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" variant(type, src, len) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v5 = wma(src, len) // Weighted v7 = rma(src, len) // Smoothed type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1 ma = variant(type,source, length) atr = security(syminfo.tickerid, "D", atr(14)) range = valuewhen(cross(close,ma), (atr*2), na) ep = valuewhen(cross(close,ma), close, na) plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1) plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999) plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999) strategy.entry("Long Entry", true, when = crossover(close,ma) and window() , stop = ep ) strategy.exit("Long Exit", "Long Entry", stop = ep-range) strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] ) strategy.entry("Short Entry", false, when = crossunder(close,ma) and window() , stop = ep ) strategy.exit("Short Exit", "Short Entry", stop = ep+range) strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )