Strategi Crossover Purata Bergerak

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

Ringkasan

Strategi ini menggunakan prinsip persilangan antara purata bergerak pantas dan perlahan untuk menentukan arah trend pasaran dan menjana isyarat beli dan jual. Strategi ini mudah dan mudah dilaksanakan, sesuai untuk perdagangan jangka menengah.

Logika Strategi

Strategi ini menggunakan dua purata bergerak, satu garis pantas dan satu garis perlahan. Garis pantas menggunakan EMA 3 hari dan garis perlahan menggunakan EMA 15 hari. Apabila garis pantas melintasi di atas garis perlahan dari bawah, ia menunjukkan trend menaik dan memberi isyarat beli. Sebaliknya, apabila garis pantas melintasi di bawah garis perlahan dari atas, ia menandakan trend menurun dan memberikan isyarat jual.

Strategi ini juga menetapkan EMA 3 hari yang lebih cepat sebagai garisan keluar yang cepat. Apabila harga pecah di bawah garisan keluar yang cepat ini, ia menilai trend telah berbalik dan harus keluar dari kedudukan panjang yang sedia ada. Begitu juga, apabila harga pecah kembali di atas garisan keluar, ia menunjukkan aliran naik yang diperbaharui dan memberi isyarat untuk memasuki panjang semula.

Isyarat operasi khusus ditetapkan sebagai:

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

  2. Garis pantas melintasi di bawah garis perlahan dari atas, pergi pendek

  3. Harga pecah di bawah garis keluar pantas, tutup kedudukan panjang

  4. Harga kembali di atas garisan keluar cepat, masuk semula panjang

Kelebihan

  • Mudah digunakan, hanya perlu mengkonfigurasi dua parameter purata bergerak, mudah dilaksanakan

  • Data backtesting yang mencukupi, menggunakan penunjuk biasa untuk menilai daya maju

  • Banyak parameter yang boleh dikonfigurasi untuk pengoptimuman

  • Mengambil garis keluar pantas sebagai stop loss untuk mengawal risiko dengan lebih baik

  • Logik strategi yang jelas, isyarat beli dan jual yang jelas

  • Frekuensi operasi yang sesuai, mengelakkan perdagangan berlebihan

Risiko

  • Rendah kepada isyarat palsu apabila trend tidak jelas sebagai trend mengikuti strategi

  • Purata bergerak mempunyai sifat yang tertinggal, mungkin terlepas titik giliran

  • Parameter tetap tidak dapat menyesuaikan diri dengan perubahan pasaran, memerlukan pengoptimuman

  • Hentikan kerugian mungkin terlalu lembut, tidak dapat menghentikan kerugian pada masa

  • Isyarat yang kerap boleh membawa kepada kos dagangan yang lebih tinggi

  • Isyarat mungkin berbeza dan memerlukan pengesahan dengan penunjuk lain

Risiko boleh dikendalikan dengan mengoptimumkan parameter, menambah penapis, melegakan stop loss, mengemas kini parameter tepat pada masanya dll.

Peningkatan

  • Uji dan optimumkan parameter untuk menyesuaikan dengan keadaan pasaran yang lebih baik

  • Memperkenalkan lebih banyak penunjuk untuk membentuk sistem yang kukuh

  • Membina tetapan parameter adaptif berdasarkan pasaran masa nyata

  • Menggunakan model pembelajaran mesin untuk pengoptimuman yang lebih pintar

  • Tetapkan stop loss dinamik atau trailing untuk kawalan risiko yang lebih baik

  • Gabungkan penunjuk jumlah untuk mengelakkan perbezaan

Kesimpulan

Ini adalah strategi crossover purata bergerak berganda yang agak mudah. Ia menentukan trend pasaran dan isyarat perdagangan berdasarkan interaksi antara purata bergerak cepat dan perlahan. Strategi ini mudah dilaksanakan dan boleh disesuaikan melalui pengoptimuman. Tetapi ia juga mempunyai beberapa risiko. Lebih banyak penapis diperlukan untuk mengesahkan isyarat dan menguruskan risiko. Apabila dioptimumkan dengan betul dan digunakan untuk perdagangan jangka menengah, ia boleh menjadi sistem perdagangan kuantitatif yang sangat praktikal.


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