Strategi Dagangan Crossover Rata-rata Bergerak Berganda

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

img

Ringkasan

Strategi ini menghasilkan isyarat beli dan jual berdasarkan salib emas dan salib kematian purata bergerak. Khususnya, ia menggunakan purata bergerak eksponensial 5 hari (EMA) dan purata bergerak eksponensial berganda 34 hari (DEMA). Apabila EMA jangka pendek 5 hari melintasi di atas DEMA jangka panjang 34 hari, isyarat beli dihasilkan. Apabila EMA jangka pendek 5 hari melintasi di bawah DEMA jangka panjang 34 hari, isyarat jual dihasilkan.

Logika Strategi

  1. Hitung EMA 5 hari dan DEMA 34 hari
  2. Menghasilkan isyarat beli apabila jangka pendek 5 hari EMA melintasi di atas jangka panjang 34 hari DEMA
  3. Menghasilkan isyarat jual apabila jangka pendek 5 hari EMA melintasi di bawah jangka panjang 34 hari DEMA
  4. Pilihan untuk berdagang hanya semasa sesi perdagangan tertentu
  5. Pilihan untuk menggunakan Stop Loss Terakhir

Strategi ini menggabungkan kedua-dua trend berikut dan faktor crossover purata bergerak untuk prestasi yang stabil. purata bergerak sebagai trend berikut penunjuk boleh secara berkesan mengenal pasti trend pasaran; Gabungan EMA dan DEMA dapat secara berkesan meluruskan data harga untuk menjana isyarat perdagangan; crossover antara purata bergerak jangka pendek dan jangka panjang boleh memberikan isyarat perdagangan awal apabila perubahan trend utama.

Analisis Kelebihan

  1. Logik strategi yang mudah dan jelas, mudah difahami dan dilaksanakan
  2. Penggunaan gabungan purata bergerak mempertimbangkan kedua-dua penilaian trend dan data harga
  3. Crossover antara purata bergerak jangka pendek dan jangka panjang boleh memberikan isyarat awal pada titik perubahan utama
  4. Parameter boleh dioptimumkan untuk menyesuaikan panjang purata bergerak untuk produk dan jangka masa yang berbeza
  5. Mengintegrasikan dua faktor boleh meningkatkan kestabilan strategi

Analisis Risiko

  1. Lebih banyak isyarat palsu mungkin berlaku di pasaran yang berbeza
  2. Panjang purata bergerak yang tidak sesuai boleh menyebabkan kelewatan isyarat
  3. Waktu dagangan yang tidak betul dan tetapan stop loss boleh menjejaskan keuntungan strategi

Risiko ini boleh dikurangkan dengan menyesuaikan panjang purata bergerak, mengoptimumkan jam dagangan, dan menetapkan stop loss yang munasabah.

Arahan pengoptimuman

  1. Sesuaikan parameter panjang purata bergerak untuk produk dagangan dan jangka masa yang berbeza
  2. Mengoptimumkan parameter sesi dagangan untuk berdagang semasa tempoh yang paling aktif
  3. Bandingkan Stop Loss tetap vs Stop Loss berturut-turut
  4. Uji kesan pilihan sumber harga yang berbeza pada strategi

Kesimpulan

Strategi ini menjana isyarat perdagangan melalui persilangan purata bergerak berganda, digabungkan dengan teknik trend berikut dan teknik penyelarasan data. Ini adalah strategi trend berikut yang mudah dan praktikal. Melalui penyesuaian parameter dan penyempurnaan logik, ia dapat menyesuaikan diri dengan produk dan jangka masa yang berbeza, memberikan isyarat awal pada perubahan trend utama, dan mengelakkan isyarat 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 lanjut