Strategi perdagangan lintas rata-rata bergerak ganda

Penulis:ChaoZhang, Tanggal: 2023-12-27 16:07:49
Tag:

img

Gambaran umum

Strategi ini menghasilkan sinyal beli dan jual berdasarkan golden cross dan death cross rata-rata bergerak. Secara khusus, ini menggunakan rata-rata bergerak eksponensial 5 hari (EMA) dan rata-rata bergerak eksponensial ganda 34 hari (DEMA). Ketika EMA 5 hari jangka pendek melintasi di atas DEMA 34 hari jangka panjang, sinyal beli dihasilkan. Ketika EMA 5 hari jangka pendek melintasi di bawah DEMA 34 hari jangka panjang, sinyal jual dihasilkan.

Logika Strategi

  1. Hitung EMA 5 hari dan DEMA 34 hari
  2. Menghasilkan sinyal beli ketika jangka pendek 5 hari EMA melintasi di atas jangka panjang 34 hari DEMA
  3. Menghasilkan sinyal jual ketika jangka pendek 5 hari EMA melintasi di bawah jangka panjang 34 hari DEMA
  4. Opsi perdagangan hanya selama sesi perdagangan tertentu
  5. Opsi untuk menggunakan stop loss trailing

Strategi ini menggabungkan faktor crossover trend following dan moving average untuk kinerja yang stabil. Moving average sebagai indikator trend following dapat secara efektif mengidentifikasi tren pasar; Kombinasi EMA dan DEMA dapat secara efektif meluruskan data harga untuk menghasilkan sinyal perdagangan; Crossover antara moving average jangka pendek dan jangka panjang dapat memberikan sinyal perdagangan awal ketika perubahan tren utama.

Analisis Keuntungan

  1. Logika strategi yang sederhana dan jelas, mudah dimengerti dan diterapkan
  2. Kombinasi penggunaan rata-rata bergerak mempertimbangkan penilaian tren dan penyelarasan data harga
  3. Crossover antara rata-rata bergerak jangka pendek dan jangka panjang dapat memberikan sinyal awal pada titik balik utama
  4. Parameter dapat dioptimalkan untuk menyesuaikan panjang rata-rata bergerak untuk produk dan kerangka waktu yang berbeda
  5. Mengintegrasikan dua faktor dapat meningkatkan stabilitas strategi

Analisis Risiko

  1. Lebih banyak sinyal palsu dapat terjadi di pasar yang berbeda
  2. Panjang rata-rata bergerak yang tidak tepat dapat menyebabkan keterlambatan sinyal
  3. Jam perdagangan yang tidak tepat dan pengaturan stop loss dapat mempengaruhi profitabilitas strategi

Risiko ini dapat dikurangi dengan menyesuaikan panjang rata-rata bergerak, mengoptimalkan jam perdagangan, dan menetapkan stop loss yang wajar.

Arahan Optimasi

  1. Sesuaikan parameter panjang rata-rata bergerak untuk produk perdagangan dan kerangka waktu yang berbeda
  2. Mengoptimalkan parameter sesi perdagangan untuk perdagangan selama periode yang paling aktif
  3. Membandingkan stop loss tetap vs trailing stop loss
  4. Pengujian dampak dari pilihan sumber harga yang berbeda pada strategi

Kesimpulan

Strategi ini menghasilkan sinyal perdagangan melalui crossover rata-rata bergerak ganda, dikombinasikan dengan teknik trend following dan data smoothing. Ini adalah strategi trend following yang sederhana dan praktis. Melalui tuning parameter dan penyempurnaan logika, ini dapat beradaptasi dengan produk dan kerangka waktu yang berbeda, memberikan sinyal awal pada perubahan tren utama, dan menghindari sinyal palsu.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

Lebih banyak