Strategi Trend Persilangan Purata Pergerakan


Tarikh penciptaan: 2023-10-27 16:19:00 Akhirnya diubah suai: 2023-10-27 16:19:00
Salin: 0 Bilangan klik: 662
1
fokus pada
1617
Pengikut

Strategi Trend Persilangan Purata Pergerakan

Gambaran keseluruhan

Strategi silang rata-rata bergerak adalah strategi momentum yang menggunakan isyarat silang dua rata-rata bergerak untuk menentukan arah trend, menghasilkan isyarat membeli dan menjual. Strategi ini menggunakan 2 purata bergerak mudah dan 1 purata bergerak indeks, berdasarkan persimpangan mereka untuk menentukan lebihan, termasuk dalam strategi perdagangan jangka pendek.

Prinsip Strategi

Strategi ini menggunakan 3 purata bergerak:

  • EMA1: Rata-rata bergerak indeks dengan tempoh yang lebih pendek, yang mewakili garis pantas
  • SMA1: purata bergerak sederhana untuk tempoh yang lebih lama, yang mewakili garis perlahan
  • SMA2: purata bergerak sederhana untuk tempoh yang lebih lama untuk menentukan arah trend

Strategi ini menilai trend berdasarkan hubungan saiz EMA1, SMA1, dan SMA2:

  • Kecenderungan naik: EMA1 > SMA1 > SMA2
  • Kecenderungan menurun: EMA1 < SMA1 < SMA2

Isyarat masuk:

  • Masukkan lebih banyak orang: lebih banyak ketika melalui jalur perlahan
  • Masuk kosong: kosongkan semasa melintasi garis lambat

Isyarat keluar:

  • Keluarnya ramai: Garis laju di bawah garis perlahan
  • Keluar kosong: Bersaing di garisan laju

Strategi ini menyediakan pelbagai konfigurasi parameter yang membolehkan anda memilih purata bergerak yang berbeza untuk masuk dan keluar.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Capture Momentum: Strategi untuk menangkap perubahan dalam trend pasaran
  2. konfigurasi fleksibel: menawarkan pelbagai pilihan purata bergerak yang boleh dikonfigurasi secara fleksibel
  3. trend filtering: Menggunakan purata bergerak jangka panjang untuk menilai arah trend, mengelakkan dagangan berlawanan arah
  4. Pengurusan risiko: boleh mengkonfigurasi hentian dan hentian, mengawal risiko perdagangan tunggal

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Whipsaws: Kemungkinan Guncangan Berterusan Sebelum Penembusan
  2. sensitive to MA parameters: penetapan parameter purata bergerak yang tidak betul boleh menyebabkan terlalu kerap atau tidak cukup sensitif
  3. lagging: Rata-rata bergerak secara semula jadi berlagu, mungkin terlepas masa terbaik untuk memecahkan
  4. No Fundamentals: Indeks teknikal semata-mata, tanpa mempertimbangkan asas

Untuk risiko whipsaws, kitaran purata bergerak boleh disesuaikan dengan sewajarnya; untuk risiko sensitiviti parameter, parameter boleh dioptimumkan; untuk risiko keterbelakangan, ia boleh dioptimumkan bersama-sama dengan petunjuk terdahulu yang lain.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Menambah penapis kepada petunjuk teknikal lain, seperti RSI, Brinks dan lain-lain, untuk meningkatkan kualiti isyarat
  2. Mengoptimumkan parameter kitaran purata bergerak untuk mencari parameter yang optimum
  3. Model pembelajaran mesin untuk menilai trend dan kebolehpercayaan isyarat
  4. Menggabungkan jumlah dagangan untuk mengelakkan harga palsu dalam keadaan kuantiti rendah
  5. Menggabungkan faktor asas untuk mengelakkan perdagangan kitaran ekonomi yang berlawanan

ringkaskan

Strategi silang rata-rata bergerak secara keseluruhannya lebih mudah dan langsung, menentukan arah trend dan masa penyertaan melalui persilangan rata-rata perlahan. Keuntungan strategi ini adalah dapat menangkap momentum, parameter konfigurasi yang fleksibel, tetapi juga terdapat beberapa risiko whipsaw, risiko ketinggalan. Dengan memperkenalkan indikator lain untuk penapisan dan pengoptimuman, strategi ini boleh menjadi strategi perdagangan kuantitatif yang sangat praktikal.

Kod sumber strategi
/*backtest
start: 2023-09-26 00:00:00
end: 2023-10-26 00:00:00
period: 1h
basePeriod: 15m
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/
// © Decam9

//@version=5
strategy(title = "Moving Average Crossover", shorttitle = "MA Crossover Strategy", overlay=true,
     initial_capital = 100000,default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

//Moving Average Inputs
EMA1 = input.int(title="Fast EMA", group = "Moving Averages:", 
     inline = "EMAs", defval=5, minval = 1)
isDynamicEMA = input.bool(title = "Dynamic Exponential Moving Average?", defval = true,
     inline = "EMAs", group = "Moving Averages:", tooltip = "Changes the source of the MA based on trend")

SMA1 = input.int(title = "Slow SMA", group = "Moving Averages:",
     inline = "SMAs", defval = 10, minval = 1)
isDynamicSMA = input.bool(title = "Dynamic Simple Moving Average?", defval = false,
     inline = "SMAs", group = "Moving Averages:", tooltip = "Changes the source of the MA based on trend")

SMA2 = input.int(title="Trend Determining SMA", group = "Moving Averages:",
     inline = "MAs", defval=13, minval = 1)

//Moving Averages
Trend = ta.sma(close, SMA2)
Fast = ta.ema(isDynamicEMA ? (close > Trend ? low : high) : close, EMA1)
Slow = ta.sma(isDynamicSMA ? (close > Trend ? low : high) : close, SMA1)

//Allowed Entries
islong = input.bool(title = "Long", group = "Allowed Entries:",
     inline = "Entries",defval = true)
isshort = input.bool(title = "Short", group = "Allowed Entries:",
     inline = "Entries", defval= true)

//Entry Long Conditions
buycond = input.string(title="Buy when", group = "Entry Conditions:", 
     inline = "Conditions",defval="Fast-Slow Crossing", 
     options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])
     
intrendbuy = input.bool(title = "In trend", defval = true, group = "Entry Conditions:",
     inline = "Conditions", tooltip = "In trend if price is above SMA 2")

//Entry Short Conditions
sellcond = input.string(title="Sell when", group = "Entry Conditions:", 
     inline = "Conditions2",defval="Fast-Slow Crossing", 
     options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])
     
intrendsell = input.bool(title = "In trend",defval = true, group = "Entry Conditions:",
     inline = "Conditions2", tooltip = "In trend if price is below SMA 2?")

//Exit Long Conditions
closebuy = input.string(title="Close long when", group = "Exit Conditions:", 
     defval="Fast-Slow Crossing", options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])

//Exit Short Conditions
closeshort = input.string(title="Close short when", group = "Exit Conditions:", 
     defval="Fast-Slow Crossing", options=["Fast-Slow Crossing", "Fast-Trend Crossing","Slow-Trend Crossing"])
     

//Filters
filterlong =input.bool(title = "Long Entries", inline = 'linefilt', group = 'Apply Filters to', 
     defval = true)
filtershort =input.bool(title = "Short Entries", inline = 'linefilt', group = 'Apply Filters to', 
     defval = true)
filterend =input.bool(title = "Exits", inline = 'linefilt', group = 'Apply Filters to', 
     defval = true)
usevol =input.bool(title = "", inline = 'linefiltvol', group = 'Relative Volume Filter:', 
     defval = false)
rvol = input.int(title = "Volume >", inline = 'linefiltvol', group = 'Relative Volume Filter:', 
     defval = 1)
len_vol = input.int(title = "Avg. Volume Over Period", inline = 'linefiltvol', group = 'Relative Volume Filter:', 
     defval = 30, minval = 1,
     tooltip="The current volume must be greater than N times the M-period average volume.")
useatr =input.bool(title = "", inline = 'linefiltatr', group = 'Volatility Filter:', 
     defval = false)
len_atr1 = input.int(title = "ATR", inline = 'linefiltatr', group = 'Volatility Filter:', 
     defval = 5, minval = 1)
len_atr2 = input.int(title = "> ATR", inline = 'linefiltatr', group = 'Volatility Filter:', 
     defval = 30, minval = 1,
     tooltip="The N-period ATR must be greater than the M-period ATR.")
usersi =input.bool(title = "", inline = 'linersi', group = 'Overbought/Oversold Filter:', 
     defval = false)
rsitrhs1 = input.int(title = "", inline = 'linersi', group = 'Overbought/Oversold Filter:', 
     defval = 0, minval=0, maxval=100)
rsitrhs2 = input.int(title = "< RSI (14) <", inline = 'linersi', group = 'Overbought/Oversold Filter:', 
     defval = 100, minval=0, maxval=100,
     tooltip="RSI(14) must be in the range between N and M.")
issl =  input.bool(title = "SL", inline = 'linesl1', group = 'Stop Loss / Take Profit:', 
     defval = false)
slpercent =  input.float(title = ", %", inline = 'linesl1', group = 'Stop Loss / Take Profit:', 
     defval = 10, minval=0.0)
istrailing =  input.bool(title = "Trailing", inline = 'linesl1', group = 'Stop Loss / Take Profit:', 
     defval = false)
istp =  input.bool(title = "TP", inline = 'linetp1', group = 'Stop Loss / Take Profit:', 
     defval = false)
tppercent =  input.float(title = ", %", inline = 'linetp1', group = 'Stop Loss / Take Profit:', 
     defval = 20)
     
//Conditions for Crossing
fscrossup = ta.crossover(Fast,Slow)
fscrossdw = ta.crossunder(Fast,Slow)
ftcrossup = ta.crossover(Fast,Trend)
ftcrossdw = ta.crossunder(Fast,Trend)
stcrossup = ta.crossover(Slow,Trend)
stcrossdw = ta.crossunder(Slow,Trend)

//Defining in trend
uptrend = Fast >= Slow and Slow >= Trend
downtrend = Fast <= Slow and Slow <= Trend
justCrossed = ta.cross(Fast,Slow) or ta.cross(Slow,Trend)


//Entry Signals
crosslong = if intrendbuy
    (buycond =="Fast-Slow Crossing" and uptrend ? fscrossup:(buycond =="Fast-Trend Crossing" and uptrend ? ftcrossup:(buycond == "Slow-Trend Crossing" and uptrend ? stcrossup : na))) 
else
    (buycond =="Fast-Slow Crossing"?fscrossup:(buycond=="Fast-Trend Crossing"?ftcrossup:stcrossup))

crossshort = if intrendsell
    (sellcond =="Fast-Slow Crossing" and downtrend ? fscrossdw:(sellcond =="Fast-Trend Crossing" and downtrend ? ftcrossdw:(sellcond == "Slow-Trend Crossing" and downtrend ? stcrossdw : na))) 
else
    (sellcond =="Fast-Slow Crossing"?fscrossdw:(buycond=="Fast-Trend Crossing"?ftcrossdw:stcrossdw))
crossexitlong = (closebuy =="Fast-Slow Crossing"?fscrossdw:(closebuy=="Fast-Trend Crossing"?ftcrossdw:stcrossdw))
crossexitshort = (closeshort =="Fast-Slow Crossing"?fscrossup:(closeshort=="Fast-Trend Crossing"?ftcrossup:stcrossup))


// Filters
rsifilter = usersi?(ta.rsi(close,14) > rsitrhs1 and ta.rsi(close,14) < rsitrhs2):true
volatilityfilter = useatr?(ta.atr(len_atr1) > ta.atr(len_atr2)):true
volumefilter = usevol?(volume > rvol*ta.sma(volume,len_vol)):true
totalfilter = volatilityfilter and volumefilter and rsifilter

//Filtered signals
golong  = crosslong  and islong  and (filterlong?totalfilter:true) 
goshort = crossshort and isshort and (filtershort?totalfilter:true)
endlong  = crossexitlong and (filterend?totalfilter:true)
endshort = crossexitshort and (filterend?totalfilter:true)

// Entry price and TP
startprice = ta.valuewhen(condition=golong or goshort, source=close, occurrence=0)
pm = golong?1:goshort?-1:1/math.sign(strategy.position_size)
takeprofit = startprice*(1+pm*tppercent*0.01)
// fixed stop loss
stoploss = startprice * (1-pm*slpercent*0.01)
// trailing stop loss
if istrailing and strategy.position_size>0
    stoploss := math.max(close*(1 - slpercent*0.01),stoploss[1])
else if istrailing and strategy.position_size<0
    stoploss := math.min(close*(1 + slpercent*0.01),stoploss[1])
    
if golong and islong
    strategy.entry("long",   strategy.long )
if goshort and isshort
    strategy.entry("short",  strategy.short)
if endlong
    strategy.close("long")
if endshort
    strategy.close("short")

// Exit via SL or TP
strategy.exit(id="sl/tp long", from_entry="long", stop=issl?stoploss:na, 
              limit=istp?takeprofit:na)
strategy.exit(id="sl/tp short",from_entry="short",stop=issl?stoploss:na, 
              limit=istp?takeprofit:na)