Perdagangan momentum dengan strategi crossover purata bergerak berganda

Penulis:ChaoZhang, Tarikh: 2024-04-01 11:53:14
Tag:

img

Ringkasan

Strategi ini menggunakan purata bergerak eksponen (EMA) 8 tempoh dan 21 tempoh untuk mengenal pasti perubahan dalam trend pasaran. Isyarat beli dihasilkan apabila EMA jangka pendek melintasi di atas EMA jangka panjang dari bawah, sementara isyarat jual dihasilkan apabila EMA jangka pendek melintasi di bawah EMA jangka panjang dari atas. Strategi ini juga menggabungkan tiga Low Tinggi berturut-turut (HLs) dan tiga Low High berturut-turut (LHs) sebagai pengesahan lanjut pembalikan trend. Di samping itu, tahap stop-loss dan take-profit ditetapkan untuk menguruskan risiko dan mengunci keuntungan.

Prinsip Strategi

  1. Mengira EMA 8 tempoh dan 21 tempoh untuk mengenal pasti arah trend utama.
  2. Mengenal pasti tiga Low Tinggi berturut-turut (HLs) dan tiga Low High berturut-turut (LHs) sebagai isyarat awal potensi pembalikan trend.
  3. Menghasilkan isyarat beli apabila EMA 8 tempoh melintasi di atas EMA 21 tempoh dan pecah HL berlaku; Menghasilkan isyarat jual apabila EMA 8 tempoh melintasi di bawah EMA 21 tempoh dan pecah LH berlaku.
  4. Tetapkan tahap stop-loss pada 5% daripada harga masuk dan tahap mengambil keuntungan pada 16% daripada harga masuk untuk menguruskan risiko dan mengunci keuntungan.
  5. Tutup kedudukan dan buka kedudukan terbalik apabila isyarat bertentangan muncul.

Kelebihan Strategi

  1. Menggabungkan EMA dan corak tindakan harga (HL dan LH) untuk mengesahkan trend, meningkatkan kebolehpercayaan isyarat.
  2. Menetapkan tahap stop-loss dan mengambil keuntungan yang jelas, membantu menguruskan risiko dan mengunci keuntungan.
  3. Boleh digunakan untuk pelbagai jangka masa dan pasaran yang berbeza, menawarkan beberapa tahap fleksibiliti.
  4. Logik yang jelas, mudah difahami dan dilaksanakan.

Risiko Strategi

  1. Dalam pasaran yang berbelit-belit, persilangan yang kerap boleh membawa kepada beberapa isyarat palsu, yang mengakibatkan kerugian.
  2. Tahap stop loss dan take profit tetap mungkin tidak menyesuaikan diri dengan baik dengan keadaan pasaran yang berbeza, yang membawa kepada kos peluang yang berpotensi atau kerugian yang lebih besar.
  3. Strategi ini bergantung pada data sejarah dan mungkin tidak menyesuaikan diri dengan baik dengan peristiwa tiba-tiba atau perubahan asas.

Arahan Pengoptimuman Strategi

  1. Memperkenalkan mekanisme stop-loss dan mengambil keuntungan yang disesuaikan, seperti menyesuaikan tahap berdasarkan turun naik (contohnya, ATR), untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
  2. Masukkan penunjuk atau faktor lain, seperti jumlah, Indeks Kekuatan Relatif (RSI), dan lain-lain, untuk menapis isyarat dan meningkatkan kebolehpercayaan.
  3. Mengoptimumkan parameter (contohnya, tempoh EMA, peratusan stop-loss dan mengambil keuntungan) untuk mencari kombinasi yang paling berprestasi untuk pasaran atau instrumen tertentu.
  4. Pertimbangkan untuk memperkenalkan langkah pengurusan risiko, seperti ukuran kedudukan, untuk mengawal pendedahan risiko perdagangan individu.

Ringkasan

Strategi ini menggunakan persilangan EMA 8 tempoh dan 21 tempoh, digabungkan dengan corak harga HL dan LH, untuk mengenal pasti pembalikan trend dan menghasilkan isyarat perdagangan. Peraturan stop-loss dan take-profit yang jelas membantu menguruskan risiko dan mengunci keuntungan. Walau bagaimanapun, strategi ini mungkin menghasilkan isyarat palsu di pasaran yang berbelit-belit, dan tahap stop-loss dan take-profit tetap mungkin tidak menyesuaikan diri dengan baik dengan keadaan pasaran yang berbeza. Untuk meningkatkan lagi, pertimbangkan untuk memperkenalkan stop-loss dan take-profit adaptif, menggabungkan penunjuk lain, mengoptimumkan parameter, dan memperkenalkan langkah pengurusan risiko. Secara keseluruhan, strategi ini menyediakan rangka kerja untuk perdagangan momentum dan trend-mengikuti tetapi memerlukan penyesuaian dan pengoptimuman berdasarkan pasaran tertentu dan pilihan individu.


/*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") 


Lebih lanjut