Dagangan Momentum: Strategi Crossover Purata Pergerakan Berganda


Tarikh penciptaan: 2024-04-01 11:53:14 Akhirnya diubah suai: 2024-04-01 11:53:14
Salin: 4 Bilangan klik: 597
1
fokus pada
1617
Pengikut

Dagangan Momentum: Strategi Crossover Purata Pergerakan Berganda

Gambaran keseluruhan

Strategi ini menggunakan purata bergerak indeks ((EMA) 8 dan 21 kitaran untuk mengenal pasti perubahan trend pasaran. Apabila EMA kitaran yang lebih pendek melintasi EMA kitaran yang lebih panjang, ia menghasilkan isyarat beli; sebaliknya, apabila EMA kitaran yang lebih pendek melintasi EMA kitaran yang lebih panjang, ia menghasilkan isyarat jual. Strategi ini juga menggabungkan tiga rendah berturut-turut yang lebih tinggi ((HLL) dan tiga tinggi berturut-turut yang lebih rendah ((LLH) sebagai isyarat untuk mengukuhkan perubahan trend.

Prinsip Strategi

  1. Hitung EMA 8 kitaran dan 21 kitaran untuk mengenal pasti arah trend utama.
  2. Kenali tiga rendah berturut-turut yang lebih tinggi (HLL) dan tiga tinggi berturut-turut yang lebih rendah (LLH), sebagai isyarat awal pembalikan trend.
  3. Apabila 8 kitaran EMA dari bawah melintasi 21 kitaran EMA, dan terdapat HLL pecah, menghasilkan isyarat beli; apabila 8 kitaran EMA dari atas melintasi 21 kitaran EMA, dan terdapat LLH pecah, menghasilkan isyarat jual.
  4. Tetapkan tahap stop loss 5% daripada harga masuk dan tahap stop loss 16% daripada harga masuk untuk mengawal risiko dan mengunci keuntungan.
  5. Apabila isyarat pembalikan berlaku, tutup dan buka semula kedudukan.

Kelebihan Strategik

  1. Gabungan EMA dan pola tingkah laku harga ((HLL dan LLH) untuk mengesahkan trend dan meningkatkan kebolehpercayaan isyarat.
  2. Tetapkan tahap stop loss dan stop loss yang jelas untuk mengawal risiko dan mengunci keuntungan.
  3. Ia boleh digunakan dalam pelbagai kerangka masa dan pasaran yang berbeza, dengan kebolehgunaan universal.
  4. Logiknya jelas, mudah difahami dan dilaksanakan.

Risiko Strategik

  1. Dalam pasaran yang bergolak, persilangan yang kerap boleh menyebabkan beberapa isyarat palsu yang menyebabkan kerugian.
  2. Tahap berhenti dan hentian yang ditetapkan mungkin tidak dapat disesuaikan dengan keadaan pasaran yang berbeza, menyebabkan potensi kos peluang atau kerugian yang lebih besar.
  3. Strategi bergantung kepada data sejarah dan mungkin kurang beradaptasi dengan peristiwa mendadak atau perubahan asas.

Arah pengoptimuman strategi

  1. Memperkenalkan mekanisme hentian dan hentian yang beradaptasi, seperti berdasarkan kadar turun naik (seperti ATR) untuk menyesuaikan tahap hentian dan hentian untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
  2. Gabungan dengan penunjuk atau faktor lain, seperti jumlah transaksi, indeks kekuatan relatif (RSI) dan lain-lain, untuk lebih menyaring isyarat dan meningkatkan kebolehpercayaan.
  3. Optimumkan parameter (seperti kitaran EMA, nisbah stop loss, dan lain-lain) untuk mencari kombinasi parameter yang berfungsi dengan baik di pasaran atau indeks tertentu.
  4. Pertimbangkan untuk memperkenalkan langkah-langkah pengurusan risiko, seperti saiz kedudukan, untuk mengawal risiko perdagangan tunggal.

ringkaskan

Strategi ini menggunakan persilangan EMA 8 kitaran dan 21 kitaran, digabungkan dengan model harga HLL dan LLH, untuk mengenal pasti trend berbalik dan menghasilkan isyarat perdagangan. Peraturan stop loss yang jelas membantu mengawal risiko dan mengunci keuntungan. Walau bagaimanapun, strategi ini mungkin menghasilkan isyarat palsu di pasaran yang bergolak, dan tahap stop loss yang tetap mungkin tidak dapat disesuaikan dengan keadaan pasaran yang berbeza.

Kod sumber strategi
/*backtest
start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range")