Strategi crossover purata bergerak adalah strategi perdagangan kuantitatif yang mudah namun berkesan berdasarkan purata bergerak. Ia menggunakan persilangan garis purata bergerak pantas dan garis purata bergerak perlahan untuk menjana isyarat beli dan jual. Apabila garis pantas menembusi garis perlahan dari bawah, isyarat beli dihasilkan. Apabila garis pantas menembusi garis perlahan dari atas, isyarat jual dihasilkan.
Logik teras strategi ini terletak pada menggunakan purata bergerak untuk menilai trend pasaran. Purata bergerak sendiri mempunyai fungsi menapis bunyi pasaran rawak. Purata bergerak pantas dapat bertindak balas terhadap perubahan harga dengan lebih cepat dan mencerminkan trend terkini, sementara purata bergerak perlahan bertindak balas lebih perlahan terhadap perubahan harga terkini dan mewakili trend jangka menengah hingga panjang. Penembusan garis pantas melalui garis perlahan bermaksud bahawa trend jangka pendek telah berbalik untuk konsisten dengan trend jangka menengah dan panjang, sehingga menghasilkan isyarat perdagangan.
Secara khusus, strategi ini pertama menentukan purata bergerak pantas sig1 dan purata bergerak perlahan sig2. Kemudian, titik beli dan jual ditentukan mengikut hubungan silang antara sig1 dan sig2. Apabila sig1 memecahkan sig2 dari bawah, longcondition longCondition dihasilkan. Apabila sig1 memecahkan sig2 dari atas, shortcondition shortCondition dihasilkan. Strategi kemudian meletakkan pesanan apabila syarat panjang dan pendek dipenuhi, dan menetapkan stop loss dan mengambil keuntungan untuk keluar pesanan.
Kelebihan strategi ini adalah penting:
Terdapat juga beberapa risiko dengan strategi ini:
Langkah-langkah pengoptimuman:
Secara umum, strategi crossover purata bergerak adalah strategi kuant dengan logik yang mudah, kepraktisan yang kuat dan kestabilan. Dengan penyesuaian parameter dan pengoptimuman yang betul, ia dapat menjana keuntungan yang stabil dalam pelbagai persekitaran pasaran. Layak memberi tumpuan dan digunakan untuk peniaga kuantitatif.
/*backtest start: 2023-11-14 00:00:00 end: 2023-11-16 04:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 // Simple yet effective MA cross strategy. // You'll have to tune the parameters to get an optimal win ratio. // If JPY or XAU or any other currency with pips defined as the // second decimal digit are involved, do not forget to set the respective flag on. // // Created by vitelot/yanez/Vts, who's the same fellow with different user names // December 2018 -- Merry Xmas // strategy("MA cross strategy Vts", overlay=true, initial_capital=1000, currency="EUR", pyramiding=0) yr = input(2016, title="Starting year to analyse") src = input(close, title="Source") maType = input( defval="EMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA"]) // isJPY = input(false, title="Is JPY or XAU involved?") // JPY and Gold have the pips defined as the 2 decimal digit maPar1 = input(26, minval=1, title="MA fast period") maPar2 = input(51, minval=2, title="MA slow period") atrPar = input(14,minval=1, title="ATR period") atrMulSL = input(1.5, title="SL ATR multiplicator") atrMulTP = input(1.0, title="TP ATR multiplicator") hma(sig, n) => // Hull moving average definition wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n))) mcg(sig,length) => // Mc Ginley MA definition mg = 0.0 mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4)) ma(t,sig,len) => if t =="SMA" sma(sig,len) else if t == "EMA" ema(sig,len) else if t == "HMA" hma(sig,len) else if t == "McG" // Mc Ginley mcg(sig,len) else wma(sig,len) sig1 = ma(maType, src, maPar1) sig2 = ma(maType, src, maPar2) tickFactor = isJPY? 1e3: 1e5 sl = atrMulSL*atr(atrPar)*tickFactor tp = atrMulTP*atr(atrPar)*tickFactor plot(sig1, color=aqua, title="MA1", linewidth=2) plot(sig2, color=orange, title="MA2", linewidth=2) longCondition = crossunder(sig2, sig1) and year>=yr // change the >= to == if you like exact years not a range if (longCondition) strategy.entry("Long", strategy.long, qty=1) // exit trade when SL and TP are hit strategy.exit("Exit Long", "Long", loss=sl, profit=tp) if (crossunder(sig1, sig2)) // or when the short condition is met strategy.close("Long") shortCondition = crossover(sig2,sig1) and year>=yr // change the >= to == if you like exact years not a range if (shortCondition) strategy.entry("Short", strategy.short, qty=1) strategy.exit("Exit Short", "Short", loss=sl, profit=tp) if (crossover(sig1,sig2)) strategy.close("Short")