Strategi Dagangan Algoritma Penembusan Momentum Berganda dan Penapisan Volatiliti

Penulis:ChaoZhang, Tarikh: 2023-12-22 12:01:21
Tag:

img

Ringkasan

Strategi ini terutamanya menggunakan persilangan momentum EMA dan momentum DEMA berganda untuk mengenal pasti trend, dan menggabungkan indeks turun naik ATR untuk menapis pecah palsu, melaksanakan strategi perdagangan kuantitatif dengan penunjuk momentum berganda dan penapis turun naik.

Prinsip Strategi

Komponen utama strategi ini termasuk:

  1. Mengira EMA dan DEMA harga sebagai penunjuk momentum berganda. EMA jangka panjang mencerminkan trend jangka panjang, sementara DEMA berfungsi sebagai penunjuk momentum jangka pendek yang lebih sensitif. Isyarat beli dihasilkan apabila DEMA melintasi di atas EMA.

  2. Mengira indeks turun naik ATR. Gunakan nilai ATR untuk menentukan turun naik pasaran dan keadaan kecairan. Menapis isyarat penunjuk momentum apabila turun naik terlalu tinggi untuk mengelakkan pecah palsu.

  3. Volatiliti ATR dinilai tinggi atau rendah oleh garis purata bergerak yang diparameterkan. Isyarat penunjuk momentum hanya dicetuskan apabila volatiliti ATR di bawah garis purata bergerak.

  4. Parameter mengawal jangka masa ATR, panjang ATR, jenis dan panjang purata bergerak ATR dll.

  5. Menetapkan peraturan stop loss, mengambil keuntungan dan trailing stop untuk kedudukan panjang.

Analisis Kelebihan

Penapis EMA berganda dapat mengurangkan isyarat palsu dan perdagangan berlebihan berbanding dengan strategi silang EMA asas.

Sebagai penunjuk momentum jangka pendek yang lebih responsif, DEMA digabungkan dengan EMA jangka panjang yang stabil membentuk isyarat gabungan yang boleh dipercayai.

Dengan menyesuaikan parameter ATR, ambang turun naik yang sesuai boleh ditetapkan untuk tanda-tanda yang berbeza, meningkatkan kebolehsesuaian strategi.

Analisis Risiko

Risiko terbesar adalah bahawa tetapan parameter yang tidak betul boleh mengakibatkan terlalu sedikit isyarat perdagangan. panjang DEMA dan EMA yang terlalu panjang, atau ambang turun naik ATR yang ditetapkan terlalu tinggi, semuanya boleh melemahkan prestasi strategi sebenar. Ujian balik berulang diperlukan untuk mencari kombinasi parameter yang optimum.

Satu lagi risiko berpotensi ialah dalam keadaan pasaran yang melampau, perubahan harga boleh melanggar sekatan parameter ATR yang membawa kepada kerugian. pemantauan manual anomali pasaran diperlukan untuk menghentikan pelaksanaan strategi apabila perlu.

Arahan pengoptimuman

  1. Uji kombinasi parameter penunjuk momentum yang berbeza untuk mencari tetapan optimum.

  2. Cuba menggantikan penunjuk momentum dari EMA berganda dengan MACD atau penunjuk lain.

  3. Uji konfigurasi indeks turun naik yang berbeza, seperti keseluruhan ATR sejarah, indeks turun naik pasaran dll.

  4. Tambah penapisan jumlah untuk mengelakkan risiko daripada pecah harga palsu.

  5. Mengoptimumkan mekanisme stop loss dan mengambil keuntungan untuk meningkatkan nisbah risiko-balasan.

Kesimpulan

Strategi ini mengintegrasikan analisis momentum dan penyelidikan turun naik dengan asas teori yang kukuh. Melalui penyesuaian parameter dan pengoptimuman logik, ia boleh menjadi sistem perdagangan algoritma yang stabil dan boleh dipercayai. Dengan isyarat perdagangan yang jelas dan risiko yang boleh dikawal, ia bernilai disahkan dan dilaksanakan 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")



Lebih lanjut