Strategi Pelacakan Tren Kuantitatif

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

img

Gambaran umum

Strategi ini mengadopsi beberapa indikator seperti Bollinger Bands, RSI, ADX, MACD untuk menilai tren pasar dan memiliki kemampuan identifikasi tren yang kuat.

Prinsip Strategi

  • Gunakan Bollinger Bands untuk menilai apakah harga dekat rel atas atau bawah untuk menentukan apakah tren terbentuk
  • Gabungkan dengan indikator RSI untuk menghindari area overbought dan oversold untuk mencegah breakout palsu
  • Gunakan ADX untuk menentukan kekuatan tren dan hanya sinyal ketika kekuatan tren yang kuat
  • Mengadopsi MACD untuk menilai konsistensi tren jangka pendek dan jangka panjang
  • Batasan untuk sesi perdagangan untuk menghindari risiko overnight

Melalui penilaian gabungan dari beberapa indikator, ia dapat secara akurat mengidentifikasi tren harga dan melacaknya tepat waktu ketika tren terjadi untuk mencapai hasil yang berlebihan.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa penilaian kombinasi indikator lebih komprehensif dan akurat, yang dapat secara efektif mengidentifikasi tren harga dan menghindari sinyal palsu yang disebabkan oleh indikator tunggal.

Secara khusus, keuntungannya adalah:

  1. Bollinger Bands dapat menentukan rentang fluktuasi harga dan kekuatan
  2. RSI menghindari membeli di daerah yang terlalu banyak dibeli dan menjual di daerah yang terlalu banyak dijual
  3. ADX menentukan kekuatan tren, hanya mengikuti tren yang kuat
  4. MACD menilai konsistensi jangka pendek dan jangka panjang
  5. Batas sesi perdagangan untuk menghindari risiko overnight

Melalui penilaian kombinasi indikator, dapat memaksimalkan mengurangi sinyal palsu dan meningkatkan stabilitas strategi.

Analisis Risiko

Risiko utama dari strategi ini berasal dari:

  1. Peristiwa pasar yang menyebabkan kegagalan indikator
  2. Sinyal palsu yang sering terjadi di pasar yang terikat rentang

Untuk risiko 1, ketergantungan pada beberapa indikator dapat mengurangi masalah kegagalan indikator tunggal sampai batas tertentu, tetapi mekanisme manajemen risiko masih perlu ditingkatkan.

Untuk risiko 2, parameter dapat disesuaikan sesuai dengan kisaran perdagangan yang sempit dan mengurangi frekuensi perdagangan untuk mengurangi risiko.

Arahan Optimasi

Aspek utama yang dapat dioptimalkan dari strategi ini meliputi:

  1. Tambahkan mekanisme stop loss seperti trailing stop loss, time stop loss, breakout stop loss, dll untuk menghindari menarik kembali terlalu dalam
  2. Mengoptimalkan parameter, menyesuaikan kombinasi parameter indikator untuk menemukan optimal
  3. Tambahkan filter seperti volume filter untuk menghindari false breakout dalam volume rendah
  4. Masukkan lebih banyak indikator seperti KDJ, OBV untuk meningkatkan akurasi sinyal
  5. Mengadopsi metode pembelajaran mesin untuk mengoptimalkan parameter secara otomatis

Dengan optimasi terus menerus, terus meningkatkan ketahanan parameter dan mengurangi probabilitas sinyal palsu.

Ringkasan

Secara keseluruhan strategi ini memiliki kemampuan yang relatif kuat untuk mengidentifikasi sinyal tren melalui penilaian kombinasi indikator yang dapat secara efektif mengidentifikasi tren harga.

Tetapi juga memiliki risiko tertentu, manajemen risiko dan optimasi parameter perlu terus ditingkatkan untuk operasi jangka panjang yang stabil. Jika metode seperti pembelajaran mesin dapat diperkenalkan nanti untuk mencapai optimasi otomatis parameter, itu akan sangat meningkatkan ketahanan dan profitabilitas strategi.


/*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 banyak