Strategi ini terutama menggunakan silang momentum EMA ganda dan momentum DEMA untuk mengidentifikasi tren, dan menggabungkan indeks volatilitas ATR untuk menyaring breakout palsu, menerapkan strategi perdagangan kuantitatif dengan indikator momentum ganda dan penyaring volatilitas.
Komponen utama dari strategi ini meliputi:
Menghitung EMA dan DEMA harga sebagai indikator momentum ganda. EMA jangka panjang mencerminkan tren jangka panjang, sementara DEMA berfungsi sebagai indikator momentum jangka pendek yang lebih sensitif. Sinyal beli dihasilkan ketika DEMA melintasi di atas EMA.
Menghitung indeks volatilitas ATR. Gunakan nilai ATR untuk menentukan volatilitas pasar dan kondisi likuiditas. Filter sinyal indikator momentum ketika volatilitas terlalu tinggi untuk menghindari pecah palsu.
Volatilitas ATR dinilai tinggi atau rendah oleh garis rata-rata bergerak yang diparameterkan.
Parameter mengontrol jangka waktu ATR, panjang ATR, jenis dan panjang rata-rata bergerak ATR, dll.
Menetapkan aturan stop loss, take profit dan trailing stop untuk posisi long.
Filter EMA ganda dapat secara signifikan mengurangi sinyal palsu dan overtrading dibandingkan dengan strategi silang EMA dasar. Menambahkan indeks volatilitas ATR secara efektif menyaring sinyal menyesatkan dari fluktuasi kecil dan menghindari terjebak.
Dibandingkan dengan indikator momentum tunggal, desain ganda dapat meningkatkan efektivitas penilaian. Sebagai indikator momentum jangka pendek yang lebih responsif, DEMA dikombinasikan dengan EMA jangka panjang yang stabil membentuk sinyal combo yang dapat diandalkan.
Dengan menyesuaikan parameter ATR, ambang volatilitas yang tepat dapat ditetapkan untuk ticker yang berbeda, meningkatkan kemampuan adaptasi strategi.
Risiko terbesar adalah bahwa pengaturan parameter yang tidak tepat dapat mengakibatkan terlalu sedikit sinyal perdagangan. panjang DEMA dan EMA yang terlalu panjang, atau ambang volatilitas ATR yang ditetapkan terlalu tinggi, semuanya dapat merusak kinerja strategi yang sebenarnya. pengujian balik berulang diperlukan untuk menemukan kombinasi parameter yang optimal.
Risiko potensial lainnya adalah bahwa dalam kondisi pasar yang ekstrim, perubahan harga dapat melanggar kendala parameter ATR yang menyebabkan kerugian. pemantauan manual dari anomali pasar diperlukan untuk menghentikan pelaksanaan strategi bila diperlukan.
Uji kombinasi parameter indikator momentum yang berbeda untuk menemukan pengaturan yang optimal.
Cobalah mengganti indikator momentum dari EMA ganda dengan MACD atau indikator lain.
Uji konfigurasi indeks volatilitas yang berbeda, seperti ATR historis keseluruhan, indeks volatilitas pasar, dll.
Tambahkan penyaringan volume untuk menghindari risiko dari penyebaran harga palsu.
Mengoptimalkan mekanisme stop loss dan take profit untuk meningkatkan rasio risiko-manfaat.
Strategi ini mengintegrasikan analisis momentum dan penelitian volatilitas dengan dasar teoritis yang kuat. Melalui penyesuaian parameter dan optimasi logika, ini dapat menjadi sistem perdagangan algoritmik yang stabil dan dapat diandalkan. Dengan sinyal perdagangan yang jelas dan risiko yang dapat dikendalikan, itu layak diverifikasi dan diimplementasikan dalam perdagangan langsung.
/*backtest start: 2023-11-21 00:00:00 end: 2023-12-21 00:00:00 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/ // © Qorbanjf //@version=4 strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true) // DEMA length = input(10, minval=1, title="DEMA LENGTH") src = input(close, title="Source") e1 = ema(src, length) e2 = ema(e1, length) dema1 = 2 * e1 - e2 plot(dema1, "DEMA", color=color.yellow) //EMA len = input(25, minval=1, title="EMA Length") srb = input(close, title="Source") offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) ema1 = ema(srb, len) plot(ema1, title="EMA", color=color.blue, offset=offset) // Inputs atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution) atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer) useMA = input(title = "Show Moving Average?", type = input.bool, defval = true) maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type") maLength = input(defval = 20, title = "Moving Average Period", minval = 1) //longLossPerc = input(title="Long Stop Loss (%)", // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01 longTrailPerc = input(title="Trail stop loss (%)", type=input.float, minval=0.0, step=0.1, defval=50) * 0.01 longProfitPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=3000) / 100 // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2017, title = "From Year", minval = 2000) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30) atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback)) atrp = (atrValue/close)*100 // Moving Average Logic ma(maType, src, length) => maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc) maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength)) // variables for enter position enterLong = crossover(dema1, ema1) and atrp < maFilter // variables for exit position sale = crossunder(dema1, ema1) // stop loss //longStopPrice = strategy.position_avg_price * (1 - longLossPerc) // trail stop // Determine trail stop loss prices longStopTrail = 0.0 longStopTrail := if (strategy.position_size > 0) stopValue = close * (1 - longTrailPerc) max(stopValue, longStopTrail[1]) else 0 //Take profit Percentage longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) //Enter trades when conditions are met strategy.entry(id="long", long=strategy.long, when=enterLong, comment="long") // strategy.close("long", when = sale, comment = "Sell") //place exit orders (only executed after trades are active) strategy.exit(id="sell", limit = longExitPrice, stop = longStopTrail, comment = "SL/TP")