Strategi Dagangan Crossover Momentum Moving Average

Penulis:ChaoZhang, Tarikh: 2024-01-24 11:09:58
Tag:

img

Ringkasan

Strategi ini menghasilkan isyarat perdagangan berdasarkan persilangan antara garis purata bergerak pantas dan perlahan untuk menentukan trend pasaran dan titik masuk. Apabila EMA pantas melintasi di atas EMA perlahan, ia dinilai bahawa pasaran berada dalam trend menaik dan isyarat beli dihasilkan. Apabila EMA pantas melintasi di bawah EMA perlahan, ia dinilai bahawa pasaran berada dalam trend menurun dan isyarat jual dihasilkan. Strategi ini juga menetapkan harga stop loss dan mengambil keuntungan untuk menguruskan risiko.

Logika Strategi

Strategi ini menggunakan persilangan antara EMA cepat (8 hari) dan EMA perlahan (21 hari) untuk menentukan trend pasaran.

  1. Mengira EMA 8 hari dan EMA 21 hari
  2. Apabila EMA 8 hari melintasi di atas EMA 21 hari, ia ditentukan bahawa trend pasaran telah berbalik dan trend menaik telah bermula
  3. Apabila EMA 8 hari melintasi di bawah EMA 21 hari, ia ditentukan bahawa trend pasaran telah berbalik dan trend menurun telah bermula
  4. Semasa aliran naik, isyarat beli dihasilkan. Semasa aliran turun, isyarat jual dihasilkan
  5. Tetapkan harga stop loss dan mengambil keuntungan untuk menguruskan risiko untuk setiap kedudukan

Strategi ini menggabungkan penunjuk momentum dan analisis trend untuk menangkap arah pasaran dan titik pembalikan dengan berkesan.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Pembebasan EMA yang cepat dan perlahan dapat menentukan trend pasaran dan isyarat perdagangan dengan berkesan
  2. Ruang pengoptimuman yang besar untuk parameter strategi di mana tempoh EMA boleh disesuaikan lebih lanjut
  3. Isyarat bunyi bising boleh ditapis dengan berkesan dengan menggabungkan penunjuk momentum
  4. Kawalan risiko aktif dengan mengkonfigurasi logik stop loss dan mengambil keuntungan

Ringkasnya, strategi ini menggabungkan penunjuk trend dan momentum. Melalui penyesuaian parameter, ia dapat menyesuaikan diri dengan persekitaran pasaran yang berbeza dan merupakan strategi perdagangan jangka pendek yang agak fleksibel.

Analisis Risiko

Terdapat juga beberapa risiko dengan strategi ini:

  1. Dalam pasaran yang berbeza, isyarat silang EMA yang kerap boleh menghasilkan lebih banyak perdagangan palsu
  2. Risiko jurang tidak ditangani dengan berkesan
  3. Arah trend jangka panjang tidak dipertimbangkan

Untuk menangani risiko ini, beberapa pengoptimuman boleh dibuat:

  1. Tambah penapis lain seperti Bollinger Bands, KDJ untuk mengurangkan isyarat palsu
  2. Menggabungkan penunjuk jangka masa yang lebih tinggi untuk menentukan trend jangka panjang
  3. Mengoptimumkan parameter seperti panjang EMA untuk menyesuaikan diri dengan pasaran yang berbeza
  4. Intervensi manual untuk mengelakkan kerugian seluncur besar dari jurang

Arahan pengoptimuman

Masih banyak ruang untuk mengoptimumkan strategi ini:

  1. Mengoptimumkan parameter tempoh EMA berdasarkan prestasi sejarah
  2. Tambah penunjuk teknikal lain untuk penapisan isyarat e.g. KDJ, MACD untuk meningkatkan ketepatan
  3. Mengoptimumkan tetapan stop loss dan mengambil keuntungan untuk lebih sesuai dengan ciri pasaran
  4. Menggunakan teknik pembelajaran mesin untuk pengoptimuman parameter automatik

Langkah-langkah ini dapat meningkatkan kestabilan, kesesuaian dan keuntungan strategi.

Kesimpulan

Kesimpulannya, ini adalah strategi perdagangan jangka pendek biasa berdasarkan trend berikut dan memintas penunjuk momentum. Ia menggabungkan EMA logik persilangan dan berhenti kerugian / mengambil keuntungan untuk dengan cepat menangkap peluang pasaran arah. Terdapat ruang yang cukup untuk pengoptimuman dengan memperkenalkan penunjuk bantuan lain dan kaedah penyusunan parameter automatik, yang boleh membuat prestasi strategi lebih stabil dan cemerlang. Ia sesuai untuk pelabur yang mempunyai beberapa pemahaman pasaran dan bersedia untuk berdagang dengan kerap.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
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/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)

Lebih lanjut