Strategi Tren Crossover Rata-rata Bergerak


Tanggal Pembuatan: 2023-10-27 16:19:00 Akhirnya memodifikasi: 2023-10-27 16:19:00
menyalin: 0 Jumlah klik: 662
1
fokus pada
1617
Pengikut

Strategi Tren Crossover Rata-rata Bergerak

Ringkasan

Strategi moving average crossover adalah strategi momentum yang menggunakan sinyal crossover dari dua moving average untuk menentukan arah tren, menghasilkan sinyal beli dan jual. Strategi ini menggunakan 2 moving average sederhana dan 1 moving average indeks, berdasarkan pada persimpangan mereka untuk menentukan lelang, termasuk dalam strategi perdagangan jangka pendek menengah.

Prinsip Strategi

Strategi ini menggunakan 3 rata-rata bergerak:

  • EMA1: Rata-rata pergerakan indeks dengan periode yang lebih pendek, yang mewakili garis cepat
  • SMA1: Rata-rata bergerak sederhana dari periode yang lebih panjang, yang mewakili garis lambat
  • SMA2: Rata-rata bergerak sederhana untuk periode yang lebih lama untuk menentukan arah tren

Strategi ini menilai tren berdasarkan hubungan antara ukuran EMA1, SMA1, dan SMA2:

  • Tren naik: EMA1 > SMA1 > SMA2
  • Tren penurunan: EMA1 < SMA1 < SMA2

Sinyal masuk:

  • Masuk dengan banyak kepala: Lakukan lebih banyak ketika melewati jalur lambat di jalur cepat
  • Masuk dengan kepala kosong: kosongkan saat melewati jalur lambat

Tanda keluar:

  • Keluarnya banyak pemain: Garis cepat di bawah garis lambat
  • Keluar dengan kepala kosong: Bertahan di jalur cepat saat melewati jalur lambat

Strategi ini menawarkan berbagai konfigurasi parameter yang dapat dipilih untuk memilih moving average yang berbeda untuk masuk dan keluar.

Analisis Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Capture Momentum: Strategi untuk menangkap perubahan tren pasar, momentum
  2. Konfigurasi fleksibel: menyediakan berbagai pilihan moving average yang dapat dikonfigurasi secara fleksibel
  3. trend filtering: Menggunakan moving average periode panjang untuk menilai arah tren, menghindari perdagangan berlawanan arah
  4. manajemen risiko: dapat mengkonfigurasi stop loss dan stop loss, mengendalikan risiko transaksi tunggal

Analisis risiko

Strategi ini juga memiliki risiko sebagai berikut:

  1. Whipsaws: kemungkinan adanya getaran terus menerus sebelum penembusan yang menyebabkan beberapa penembusan palsu
  2. sensitive to MA parameters: pengaturan parameter moving average yang tidak tepat dapat menyebabkan terlalu sering atau tidak cukup sensitif
  3. lagging: Moving average bersifat laggy, mungkin melewatkan titik terbaik untuk terobosan
  4. No Fundamentals: Indikator berteknologi murni, tidak mempertimbangkan dasar-dasar

Untuk risiko whipsaws, siklus moving average dapat disesuaikan; untuk risiko sensitivitas parameter, parameter dapat dioptimalkan; untuk risiko keterbelakangan, dapat dioptimalkan dalam kombinasi dengan indikator awal lainnya.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Menambahkan filter untuk indikator teknis lainnya, seperti RSI, Brinks, dan lain-lain, untuk meningkatkan kualitas sinyal
  2. Mengoptimalkan parameter siklus moving average, mencari parameter optimal
  3. Menambahkan model pembelajaran mesin untuk menilai tren dan keandalan sinyal
  4. Terkait volume transaksi, hindari false breakout pada saat volume rendah
  5. Menggabungkan Faktor Dasar untuk Menghindari Perdagangan Berlawanan Siklus Ekonomi

Meringkaskan

Strategi crossover rata-rata bergerak secara keseluruhan relatif sederhana dan langsung, menentukan arah tren dan waktu partisipasi melalui crossover rata-rata yang cepat dan lambat. Keuntungan dari strategi ini adalah dapat menangkap momentum, parameter konfigurasi yang fleksibel, tetapi juga ada beberapa masalah seperti risiko whipsaw, risiko keterlambatan. Dengan mengoptimalkan penyaringan dengan memperkenalkan indikator lain, strategi ini dapat menjadi strategi perdagangan kuantitatif yang sangat praktis.

Kode 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)