Strategi ini disebut
Menghitung indikator DEMA. DEMA adalah Double Exponential Moving Average menggunakan dual EMA, yang dapat menyaring kebisingan pasar jangka pendek dan meningkatkan akurasi sinyal.
EMA adalah rata-rata bergerak eksponensial yang bereaksi lebih cepat terhadap perubahan harga.
Menghitung indeks volatilitas ATR. ATR mengukur volatilitas pasar dan tingkat risiko. Meningkatnya ATR mewakili meningkatnya volatilitas dan kemungkinan lebih tinggi dari penarikan jangka pendek.
Ketika DEMA melintasi di bawah EMA dan ATR naik di atas ambang batas, itu menandakan awal penurunan jangka pendek dan peningkatan risiko pasar.
Ketika DEMA kembali melintasi di atas EMA, itu menandakan dukungan harga dan bouncing ke atas.
Kombinasi dua EMA dan EMA dapat secara efektif meningkatkan akurasi sinyal.
Filter volatilitas ATR menghilangkan perdagangan whipsaw berisiko rendah.
Periode kepemilikan pendek cocok untuk pelacakan momentum jangka pendek dan menghindari lindung nilai yang berkepanjangan.
Logika yang sederhana dan jelas, mudah dipahami dan diterapkan.
Parameter ATR yang tidak tepat dapat kehilangan peluang perdagangan.
Butuh untuk memantau kedua sinyal panjang dan pendek secara bersamaan, meningkatkan kesulitan operasi.
Dipengaruhi oleh volatilitas pasar jangka pendek.
Solusi: Optimasi parameter melalui backtesting. Sederhanakan logika untuk fokus pada satu sisi. Relaksasi tingkat stop loss dengan tepat.
Mengoptimalkan parameter untuk DEMA dan EMA untuk menemukan kombinasi terbaik.
Mengoptimalkan periode lookback ATR untuk menentukan benchmark volatilitas optimal.
Tambahkan indikator lain seperti BOLL Band untuk meningkatkan akurasi sinyal.
Memperkenalkan aturan stop loss dan mengambil keuntungan untuk mengunci keuntungan yang lebih konsisten.
Strategi ini membangun sistem perdagangan jangka pendek yang sederhana namun efektif menggunakan DEMA, EMA crossover dan indeks volatilitas ATR. Logika yang bersih dan kemudahan pengoperasiannya membuatnya cocok untuk perdagangan momentum frekuensi tinggi. Optimasi parameter dan logika lebih lanjut berpotensi menghasilkan kinerja yang lebih stabil.
/*backtest start: 2023-12-08 00:00:00 end: 2024-01-07 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 // 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("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", 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) // get ATR VALUE atr = atr(14) //ATRP (Average True Price in precentage) // 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) slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1) slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1) minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00) // 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)) // Determine percentage of open profit var entry = 0.0 distanceProfit = low - entry distanceProfitPercent = distanceProfit / entry //Determin if we have a long entry signal OR a sell position signal profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr) exitSignal = profitSignal and strategy.position_size !=0 and crossover(dema1, ema1) // === 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) //Invert trade direction & flipping //tradInvert = input(defval = false, title = "invert trade direction") //MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1) //plots=input(false, title="Show plots?") // Get stop loss (in pips AND percentage distance) shortStop = highest(high, 4) - (atr * slMulti) shortStopPercent = close - (close * slMulti) // Save long stop & target prices (used for drawing data to the chart & deetermining profit) var shortStopSaved = 0.0 var shortTargetSaved = 0.0 enterShort = false if shortSignal shortStopSaved := slType ? shortStop : shortStopPercent enterShort:= true entry := close // long conditions //enterLong = crossover(dema1, ema1) and atrp < maFilter //exitSignal => crossunder(dema1, ema1) //Enter trades when conditions are met strategy.entry("short", strategy.short, when=enterShort, comment="SHORT") //place exit orders (only executed after trades are active) strategy.exit(id="Short exit", from_entry="short", limit=exitSignal ? close : na, stop=shortStopSaved, when=strategy.position_size > 0, comment="end short") //short strategy //goShort() => crossunder(dema1, ema1) and atrp > maFilter //KillShort() => crossover(dema1, ema1) //strategy.entry("SHORT", strategy.short, when = goShort()) //strategy.close("COVER", when = KillShort())