Strategi Pengesanan Trend Kuantitatif

Penulis:ChaoZhang, Tarikh: 2024-02-01 11:42:22
Tag:

img

Ringkasan

Strategi ini menggunakan pelbagai penunjuk seperti Bollinger Bands, RSI, ADX, MACD untuk menilai trend pasaran dan mempunyai keupayaan pengenalan trend yang kuat. Ia mengambil trend mengikuti strategi apabila isyarat penunjuk bullish serentak. Ia menutup kedudukan untuk menghentikan kerugian apabila isyarat penunjuk bearish serentak.

Prinsip Strategi

  • Gunakan Bollinger Bands untuk menilai sama ada harga adalah berhampiran rel atas atau bawah untuk menentukan sama ada trend terbentuk
  • Gabungkan dengan penunjuk RSI untuk mengelakkan kawasan overbought dan oversold untuk mengelakkan pecah palsu
  • Gunakan ADX untuk menentukan kekuatan trend dan hanya isyarat apabila kekuatan trend adalah kuat
  • Mengambil MACD untuk menilai konsistensi trend jangka pendek dan jangka panjang
  • Batasan untuk sesi dagangan untuk mengelakkan risiko semalam

Melalui penilaian gabungan pelbagai penunjuk, ia dapat mengenal pasti dengan tepat trend harga dan menjejaki mereka tepat pada masanya apabila trend berlaku untuk mencapai pulangan yang berlebihan.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah bahawa penilaian gabungan penunjuk lebih komprehensif dan tepat, yang dapat mengenal pasti trend harga dengan berkesan dan mengelakkan isyarat palsu yang disebabkan oleh penunjuk tunggal.

Khususnya, kelebihan adalah:

  1. Bollinger Bands boleh menentukan julat dan kekuatan turun naik harga
  2. RSI mengelakkan membeli di kawasan yang terlalu banyak dibeli dan menjual di kawasan yang terlalu banyak dijual
  3. ADX menentukan kekuatan trend, hanya mengikuti trend yang kuat
  4. MACD menilai konsistensi jangka pendek dan jangka panjang
  5. Had sesi dagangan untuk mengelakkan risiko semalam

Melalui penghakiman gabungan penunjuk, ia boleh memaksimumkan mengurangkan isyarat palsu dan meningkatkan kestabilan strategi.

Analisis Risiko

Risiko utama strategi ini berasal dari:

  1. Kejadian pasaran yang menyebabkan kegagalan penunjuk
  2. Isyarat palsu yang kerap di pasaran terhad julat

Bagi risiko 1, bergantung kepada beberapa penunjuk boleh mengurangkan masalah kegagalan satu penunjuk, tetapi mekanisme pengurusan risiko masih perlu ditingkatkan.

Untuk risiko 2, parameter boleh diselaraskan dengan sesuai untuk julat perdagangan yang sempit dan mengurangkan kekerapan perdagangan untuk mengurangkan risiko.

Arahan pengoptimuman

Aspek utama yang boleh dioptimumkan strategi ini termasuk:

  1. Tambah mekanisme stop loss seperti trailing stop loss, time stop loss, breakout stop loss, dan lain-lain untuk mengelakkan menarik kembali terlalu dalam
  2. Mengoptimumkan parameter, menyesuaikan parameter indikator gabungan untuk mencari optimum
  3. Tambah penapis seperti penapis jumlah untuk mengelakkan pecah palsu dalam jumlah yang rendah
  4. Menggabungkan lebih banyak penunjuk seperti KDJ, OBV untuk meningkatkan ketepatan isyarat
  5. Mengambil kaedah pembelajaran mesin untuk mengoptimumkan parameter secara automatik

Dengan pengoptimuman berterusan, terus meningkatkan ketahanan parameter dan mengurangkan kebarangkalian isyarat palsu.

Ringkasan

Secara keseluruhan, strategi ini mempunyai keupayaan yang agak kuat untuk mengenal pasti isyarat trend melalui penilaian gabungan penunjuk yang dapat mengenal pasti trend harga dengan berkesan.

Tetapi ia juga mempunyai risiko tertentu, pengurusan risiko dan pengoptimuman parameter perlu terus ditingkatkan untuk operasi jangka panjang yang stabil.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)


Lebih lanjut