Strategi Pelacakan Rata-rata Pergerakan EMA Ganda


Tanggal Pembuatan: 2024-02-02 17:11:29 Akhirnya memodifikasi: 2024-02-02 17:11:29
menyalin: 0 Jumlah klik: 575
1
fokus pada
1617
Pengikut

Strategi Pelacakan Rata-rata Pergerakan EMA Ganda

Ringkasan

Dual Exponential Moving Average Trend Following Strategy adalah sebuah strategi untuk mengikuti tren yang didasarkan pada persimpangan garis rata-rata. Strategi ini dilakukan dengan menghitung EMA garis cepat dan EMA garis lambat, dan berdasarkan persimpangan mereka untuk menilai arah tren saat ini.

Prinsip Strategi

Logika inti dari strategi ini adalah menghitung rata-rata EMA dari dua periode yang berbeda, satu sebagai garis kosong, dan satu sebagai garis multihead. Secara khusus, strategi menggunakan indikator talib untuk menghitung rata-rata EMA cepat 8 periode, sebagai garis multihead; Selain itu, menghitung rata-rata EMA lambat 21 periode, sebagai garis kosong.

Strategi ini dapat dilakukan hanya dengan melakukan over atau hanya dengan melakukan over; atau dapat dilakukan secara dua arah ketika garis cepat dan lambat berselisih. Selain itu, strategi ini juga mengatur harga stop loss dan stop loss. Setelah membuka posisi, jika arah harga berjalan tidak menguntungkan, stop loss akan keluar; jika harga berjalan mencapai target yang diharapkan, stop loss akan berakhir.

Analisis Keunggulan

Keuntungan terbesar dari strategi pelacakan dua garis rata EMA adalah menggunakan kemampuan penilaian tren yang kuat dari persimpangan garis rata. EMA rata-rata sebagai alat penilaian tren yang umum digunakan, dengan persimpangan garis rata untuk mengidentifikasi tren perubahan harga dan waktu perputaran, dapat menghindari kebingungan oleh kebisingan pasar garis pendek, dan menangkap arah tren utama.

Selain itu, pengaturan arah perdagangan strategi yang fleksibel, dapat menyesuaikan diri dengan situasi satu arah, dan dapat menangkap peluang dua arah di antara harga yang bergoyang, meningkatkan kepraktisan strategi. Pada saat yang sama, pengaturan Stop Loss Stop, dapat secara efektif mengendalikan risiko, mengunci sebagian dari keuntungan.

Analisis risiko

Risiko terbesar dari strategi pelacakan rata-rata EMA ganda adalah bahwa beberapa kali penyambungan kecil dalam situasi getaran menyebabkan seringnya sinyal silang dan sinyal palsu. Ini akan menyebabkan strategi sering membuka posisi dan kehilangan. Dalam hal ini, siklus EMA dapat ditingkatkan secara tepat untuk mengurangi kemungkinan seringnya silang dan sinyal palsu.

Di sisi lain, terlalu kecilnya pengaturan stop loss juga akan meningkatkan probabilitas bahwa strategi akan ditembak. Dalam hal ini, Anda dapat memperluas stop loss dengan tepat, tetapi Anda juga perlu mempertimbangkan risiko yang akan dieksploitasi.

Arah optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam beberapa hal:

  1. Dinamis menyesuaikan siklus EMA rata-rata. Anda dapat mengubah siklus EMA secara dinamis sesuai dengan volatilitas pasar dan hasil pengukuran parameter optimal, menghindari masalah overfit di bawah siklus tetap.

  2. Tambahkan filter kondisi untuk memfilter sinyal palsu. Misalnya, dapat digabungkan dengan volume perdagangan, memfilter cross-over palsu yang dihasilkan ketika ada getaran kecil. Dapat juga digabungkan dengan indikator lain, seperti MACD, KDJ, dan lain-lain, untuk menghindari sinyal yang dihasilkan pada waktu yang tidak pasti.

  3. Optimalkan strategi stop loss, digabungkan dengan indikator seperti ATR, yang memungkinkan pelacakan dinamis stop loss. Hindari masalah stop loss yang terlalu kecil dan stop loss yang terlalu dini.

  4. Uji waktu pemegang posisi yang berbeda. Waktu pemegang posisi yang terlalu lama, mudah dipengaruhi oleh kejadian yang tidak terduga; Waktu pemegang posisi yang terlalu pendek, maka biaya transaksi dan biaya slippage lebih tinggi. Temukan hari pemegang posisi yang optimal, dapat meningkatkan profitabilitas strategi.

Meringkaskan

Strategi pelacakan EMA rata-rata ganda secara keseluruhan adalah strategi pelacakan tren yang kuat dan praktis. Ini menggunakan EMA rata-rata untuk menilai tren harga secara lintas batas, yang dapat secara efektif menangkap arah pasar. Sementara itu, pengaturan arah perdagangan yang fleksibel Settings meningkatkan fleksibilitas strategi; dan pengaturan stop loss dan stop loss mengendalikan risiko. Dengan pengoptimalan dan perbaikan lebih lanjut, strategi ini dapat menjadi alat yang kuat untuk perdagangan kuantitatif.

Kode Sumber Strategi
/*backtest
start: 2024-01-02 00:00:00
end: 2024-02-01 00:00:00
period: 2h
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, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0)

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)