Strategi ini dinamakan
Mengira penunjuk DEMA. DEMA adalah purata bergerak eksponensial berganda menggunakan EMA berganda, yang boleh menapis bunyi pasaran jangka pendek dan meningkatkan ketepatan isyarat.
Mengira penunjuk EMA. EMA adalah purata bergerak eksponen yang bertindak balas lebih cepat terhadap perubahan harga.
Mengira indeks turun naik ATR. ATR mengukur turun naik pasaran dan tahap risiko. Meningkat ATR mewakili peningkatan turun naik dan kemungkinan penurunan jangka pendek yang lebih tinggi.
Apabila DEMA melintasi di bawah EMA dan ATR naik di atas ambang, ia menandakan permulaan trend penurunan jangka pendek dan peningkatan risiko pasaran.
Apabila DEMA melintasi semula di atas EMA, ia menandakan sokongan harga dan lompatan ke atas.
Gabungan EMA dan EMA berganda dapat meningkatkan ketepatan isyarat dengan berkesan.
Penapis turun naik ATR menghapuskan perdagangan whipsaw berisiko rendah.
Tempoh pemegang yang pendek sesuai dengan penjejakan momentum jangka pendek dan mengelakkan lindung nilai yang berpanjangan.
Logik yang mudah dan jelas, mudah difahami dan dilaksanakan.
Parameter ATR yang tidak betul boleh kehilangan peluang perdagangan.
Perlu memantau kedua-dua isyarat panjang dan pendek pada masa yang sama, meningkatkan kesukaran operasi.
Dipengaruhi oleh turun naik pasaran jangka pendek.
Penyelesaian: pengoptimuman parameter melalui backtesting. Sederhanakan logik untuk memberi tumpuan kepada satu sisi. Relaksasi tahap stop loss dengan sewajarnya.
Mengoptimumkan parameter untuk DEMA dan EMA untuk mencari kombinasi terbaik.
Mengoptimumkan tempoh melihat balik ATR untuk menentukan penanda aras turun naik yang optimum.
Tambah penunjuk lain seperti BOLL Band untuk meningkatkan ketepatan isyarat.
Memperkenalkan peraturan stop loss dan mengambil keuntungan untuk mengunci keuntungan yang lebih konsisten.
Strategi ini membina sistem perdagangan jangka pendek yang mudah namun berkesan menggunakan DEMA, persilangan EMA dan indeks turun naik ATR. Logik yang bersih dan kemudahan operasi menjadikannya sesuai untuk perdagangan momentum frekuensi tinggi.
/*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())