Strategi purata bergerak dinamik

Penulis:ChaoZhang, Tarikh: 2023-11-23 11:39:24
Tag:

img

Ringkasan

Strategi ini dinamakan Dynamic Moving Average Strategy. Idea utamanya adalah menggunakan arah purata bergerak dan hubungannya dengan harga untuk menentukan trend. Masuk ke pasaran mengikut arah trend dan tutup kedudukan apabila tidak ada trend.

Prinsip Strategi

Strategi ini menggunakan harga sumber dalam tempoh panjang untuk mengira purata bergerak, di mana harga sumber boleh menjadi OHLC4, HLC3, harga penutupan dan lain-lain. Purata bergerak yang dihasilkan ditakrifkan sebagai sma. Kemudian garis panjang dan garis pendek digambarkan berdasarkan peratusan nilai purata bergerak untuk menentukan sama ada kita sedang dalam trend menaik atau menurun.

Secara khusus, garis pendek dikira sebagai: shortline = sma * ((100 + shortlevel) / 100), di mana shortlevel adalah nombor positif yang ditetapkan oleh pengguna, mewakili peratusan bahawa garis pendek di atas purata bergerak.

Oleh itu, nilai garis pendek sentiasa lebih besar daripada purata bergerak, dan nilai garis panjang sentiasa kurang daripada purata bergerak. Apabila harga melintasi di atas garis pendek, ia mewakili bahawa trend menaik bermula. Pada masa ini jika needlong membenarkan panjang, ia akan meletakkan pesanan panjang pada tahap harga garis panjang. Apabila harga melintasi di bawah garis panjang, ia mewakili bahawa trend menurun bermula. Pada masa ini jika needshort membenarkan pendek, ia akan meletakkan pesanan pendek pada tahap harga garis pendek.

Tidak kira panjang atau pendek, apabila harga bergerak kembali ke purata bergerak, ia bermakna trend berakhir.

Jadi arah trend dan entri yang sepadan dan wujud ditentukan oleh hubungan dinamik antara garis panjang / pendek dan garis purata bergerak.

Kelebihan

Kelebihan terbesar strategi ini adalah bahawa dengan menetapkan garis panjang dan pendek secara dinamik, ia dapat menangkap arah trend utama dengan relatif fleksibel.

Kedua, purata bergerak itu sendiri mempunyai kesan penapisan hingga tahap tertentu, yang mengelakkan terperangkap oleh turun naik frekuensi tinggi hingga tahap tertentu.

Risiko

Risiko terbesar strategi ini adalah bahawa prestasi purata bergerak berbeza dalam tempoh yang berbeza. Biasanya purata bergerak mencukupi untuk mewakili arah trend, tetapi dalam beberapa keadaan pasaran yang melampau, purata bergerak boleh ditembusi dalam jangka pendek, menyebabkan entri yang salah, atau perbezaan atas dll. Dalam kes ini purata bergerak jangka panjang diperlukan untuk memastikan ketepatan penilaian trend.

Satu lagi aspek risiko adalah bahawa purata bergerak sendiri mempunyai inersia yang tinggi. Untuk beberapa turun naik harga yang pendek dan sengit, sukar bagi purata bergerak untuk bertindak balas tepat pada masanya, sehingga kehilangan titik masuk atau keluar. Tempoh perlu dikurangkan untuk mempercepatkan kelajuan tindak balas purata bergerak.

Peningkatan

Strategi ini boleh dioptimumkan lagi dalam aspek berikut:

  1. Tambah logik stop loss. Oleh kerana purata bergerak mempunyai ketinggalan dalam menilai trend, terperangkap tidak dapat dielakkan sepenuhnya. Oleh itu, hentian yang sesuai dapat mengurangkan risiko.

  2. Mengoptimumkan parameter garis panjang / pendek. Pada masa ini peratusan garis panjang / pendek menyimpang dari purata bergerak tetap. Ini boleh diuji pada set data yang berbeza untuk mencari nilai optimum.

  3. Selain kedudukan garis panjang / pendek, algoritma juga boleh menilai kekuatan trend, untuk mengelakkan kesilapan dari isyarat trend yang lemah.

  4. Cuba gunakan purata bergerak untuk produk perdagangan lain untuk mengesahkan prestasi produk silang.

Kesimpulan

Strategi ini menentukan trend dan tempat dagangan panjang / pendek yang sesuai dengan menetapkan titik masuk dan keluar secara dinamik berdasarkan purata bergerak. Kaedah ini menghasilkan isyarat perdagangan secara dinamik berdasarkan purata bergerak lebih fleksibel dan pintar dalam menangkap trend harga berbanding dengan tahap pemicu statik. Ia juga menyelesaikan masalah kekurangan ketepatan masa purata bergerak sendiri. Dengan pengujian balik sistematik dan pengoptimuman parameter, strategi ini dapat menghasilkan keuntungan yang baik.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy(title = "Noro's ShiftMA Strategy v1.1", shorttitle = "ShiftMA str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
per = input(3, title = "Length")
src = input(ohlc4, title = "Source")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMAs
sma = sma(src, per) 
//sma = lowest(low, per)
shortline = sma * ((100 + shortlevel) / 100)
longline = sma * ((100 + longlevel) / 100)
plot(shortline, linewidth = 2, color = red, title = "Short line")
plot(sma, linewidth = 2, color = blue, title = "SMA line")
plot(longline, linewidth = 2, color = lime, title = "Long line")

//plot(round(buy * 100000000), linewidth = 2, color = lime)
//plot(round(sell * 100000000), linewidth = 2, color = red)

//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if (not na(close[per])) and size == 0 and needlong
    strategy.entry("L", strategy.long, lot, limit = longline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size == 0 and needshort
    strategy.entry("S", strategy.short, lot, limit = shortline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size > 0 
    strategy.entry("Close", strategy.short, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size < 0 
    strategy.entry("Close", strategy.long, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Lebih lanjut