Triple Exponential Moving Average Convergence Divergence and Relative Strength Index Combined 1-Minute Chart Cryptocurrency Strategi Perdagangan Kuantitatif

Penulis:ChaoZhang, Tanggal: 2024-03-29 11:16:10
Tag:

img

Gambaran umum

Strategi ini menggabungkan metode Triple Exponential Moving Average Convergence Divergence (Triple MACD) dan Relative Strength Index (RSI), yang dirancang khusus untuk perdagangan kuantitatif di pasar cryptocurrency pada kerangka waktu 1 menit. Ide utama di balik strategi ini adalah untuk menangkap perubahan momentum bullish dan bearish menggunakan indikator MACD dengan parameter periode yang berbeda, sambil menggunakan indikator RSI untuk mengkonfirmasi kekuatan tren. Dengan rata-rata tiga sinyal MACD, kebisingan dapat secara efektif dihaluskan, meningkatkan keandalan sinyal perdagangan. Selain itu, strategi ini menggunakan teknik regresi linier untuk mengidentifikasi fase konsolidasi di pasar, menghindari perdagangan sering selama aksi harga. Strategi ini cocok untuk perdagangan grid, mampu menghasilkan laba yang stabil di tengah fluktuasi cepat dari seluruh pasar cryptocurrency.

Prinsip Strategi

Strategi ini menggunakan tiga indikator MACD dengan parameter yang berbeda: periode garis cepat 5/13/34 dan periode garis lambat 8/21/144. Hal ini menghitung perbedaan antara mereka untuk mendapatkan nilai MACD. Tiga nilai MACD ini kemudian rata-rata, dan histogram MACD akhir diperoleh dengan mengurangi nilai Sinyal (N-periode EMA dari MACD) dari rata-rata MACD. Pada saat yang sama, indikator RSI 14 periode dihitung untuk membantu menentukan kekuatan tren. Sinyal panjang dihasilkan ketika histogram MACD rata-rata bergeser dari negatif menjadi positif, RSI di bawah 55, dan ada keselarasan bullish. Sebaliknya, sinyal dekat dipicu ketika histogram MACD rata-rata berubah dari positif menjadi negatif, RSI di atas 45, dan ada keselarasan strategi. Selanjutnya, garis regresi 11-periode diterapkan untuk mengidentifikasi bayangan candlestick, yang berkisar antara panjang dan rasio pasar yang beranalisis.

Analisis Keuntungan

  1. Kombinasi indikator MACD multi-periode secara objektif mencerminkan perubahan tren di pasar pada skala waktu yang berbeda, meningkatkan akurasi identifikasi tren.
  2. Mengintegrasikan MACD dengan indikator RSI membentuk kondisi masuk dan keluar yang ketat, berkontribusi pada peningkatan profitabilitas strategi dan kontrol penarikan.
  3. Rata-rata sinyal MACD secara efektif menghilangkan sinyal palsu yang disebabkan oleh osilasi indikator yang sering, membuat sinyal perdagangan lebih dapat diandalkan.
  4. Menggunakan regresi linier untuk menentukan pasar berkisar membantu menghindari memasuki perdagangan selama pasar berosilasi ketika tren tidak jelas, mengurangi kehilangan perdagangan.
  5. Di pasar cryptocurrency yang berubah dengan cepat, strategi perdagangan kuantitatif tingkat 1 menit lebih baik untuk menangkap peluang perdagangan yang timbul dari fluktuasi pasar secara tepat waktu.

Analisis Risiko

  1. Jika pasar tetap dalam keadaan osilasi yang luas untuk jangka waktu yang lama, sinyal perdagangan seringkali menjadi tidak valid.
  2. Karena volatilitas pasar cryptocurrency yang tinggi, fluktuasi abnormal yang ekstrim dalam jangka pendek dapat menyebabkan penurunan yang signifikan.
  3. Pilihan parameter strategi memiliki dampak yang jelas pada profitabilitas keseluruhan. Pengaturan parameter yang tidak tepat dapat menyebabkan strategi gagal. Oleh karena itu, optimasi parameter yang cukup dan verifikasi backtesting untuk instrumen perdagangan yang berbeda diperlukan sebelum perdagangan langsung.

Arahan Optimasi

  1. Pertimbangkan untuk memperkenalkan indikator yang terkait dengan volatilitas harga, seperti ATR, untuk menyaring sinyal masuk dan mengurangi potensi kerugian yang disebabkan oleh fluktuasi pasar yang tidak normal.
  2. Selain regresi linier, metode lain seperti level support dan resistance, saluran Bollinger Bands, dll., dapat dieksplorasi untuk meningkatkan lebih lanjut keakuratan mengidentifikasi pasar range.
  3. Di pasar tren, memperkenalkan stop-loss untuk mengoptimalkan titik keluar, memaksimalkan keuntungan dari setiap perdagangan.
  4. Mengingat perbedaan karakteristik antara berbagai instrumen perdagangan, tetapkan parameter strategi yang berbeda untuk instrumen yang berbeda untuk meningkatkan kemampuan beradaptasi dan stabilitas dari keseluruhan strategi.

Ringkasan

Strategi ini dengan cerdas menggabungkan Triple MACD dengan indikator RSI dan memanfaatkan teknik regresi linier untuk mengidentifikasi pasar berkisar, membentuk satu set lengkap strategi perdagangan kuantitatif frekuensi tinggi. Kondisi masuk dan keluar yang ketat dan penerapan sinyal MACD rata-rata berkontribusi pada peningkatan akurasi perdagangan dan kontrol penarikan. Meskipun strategi ini berkinerja lebih baik di pasar tren unidirectional, langkah-langkah seperti memperkenalkan filter volatilitas, mengoptimalkan metode identifikasi pasar berkisar, mengatur stop-loss, dan menetapkan parameter independen untuk instrumen yang berbeda dapat lebih meningkatkan fleksibilitas dan ketahanan strategi. Secara keseluruhan, ini adalah strategi perdagangan kuantitatif cryptocurrency yang sangat menjanjikan yang layak dioptimalkan lebih lanjut dan aplikasi perdagangan langsung.


/*backtest
start: 2023-03-23 00:00:00
end: 2024-03-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="TrippleMACD", shorttitle="TrippleMACD + RSI strategy", format=format.price, precision=4, overlay=true)

// RSI 
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
showDivergence = input.bool(false, title="Show Divergence", group="RSI Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)

// Divergence
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)

plFound = na(ta.pivotlow(rsi, lookbackLeft, lookbackRight)) ? false : true
phFound = na(ta.pivothigh(rsi, lookbackLeft, lookbackRight)) ? false : true
_inRange(cond) =>
	bars = ta.barssince(cond == true)
	rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Regular Bullish
// rsi: Higher Low

rsiHL = rsi[lookbackRight] > ta.valuewhen(plFound, rsi[lookbackRight], 1) and _inRange(plFound[1])

// Price: Lower Low

priceLL = low[lookbackRight] < ta.valuewhen(plFound, low[lookbackRight], 1)
bullCondAlert = priceLL and rsiHL and plFound
bullCond = showDivergence and bullCondAlert

// rsi: Lower High

rsiLH = rsi[lookbackRight] < ta.valuewhen(phFound, rsi[lookbackRight], 1) and _inRange(phFound[1])

// Price: Higher High

priceHH = high[lookbackRight] > ta.valuewhen(phFound, high[lookbackRight], 1)

bearCondAlert = priceHH and rsiLH and phFound
bearCond = showDivergence and bearCondAlert

// Getting inputs
stopLuse          = input(1.040)
fast_length = input(title = "Fast Length", defval = 5)
slow_length = input(title = "Slow Length", defval = 8)
fast_length2 = input(title = "Fast Length2", defval = 13)
slow_length2 = input(title = "Slow Length2", defval = 21)
fast_length3 = input(title = "Fast Length3", defval = 34)
slow_length3 = input(title = "Slow Length3", defval = 144)
fast_length4 = input(title = "Fast Length3", defval = 68)
slow_length4 = input(title = "Slow Length3", defval = 288)
src = input(title = "Source", defval = close)
signal_length2 = input.int(title="Signal Smoothing", minval = 1, maxval = 200, defval = 11)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)

fast_ma2 = sma_source == "SMA2" ? ta.sma(src, fast_length2) : ta.ema(src, fast_length2)
slow_ma2 = sma_source == "SMA2" ? ta.sma(src, slow_length2) : ta.ema(src, slow_length2)

fast_ma3 = sma_source == "SMA3" ? ta.sma(src, fast_length3) : ta.ema(src, fast_length3)
slow_ma3 = sma_source == "SMA3" ? ta.sma(src, slow_length3) : ta.ema(src, slow_length3)

fast_ma4 = sma_source == "SMA3" ? ta.sma(src, fast_length3) : ta.ema(src, fast_length3)
slow_ma4 = sma_source == "SMA3" ? ta.sma(src, slow_length3) : ta.ema(src, slow_length3)

macd = fast_ma - slow_ma
macd2 = fast_ma2 - slow_ma2
macd3 = fast_ma3 - slow_ma3
macd4 = fast_ma4 - slow_ma4

signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
signal2 = sma_signal == "SMA" ? ta.sma(macd2, signal_length) : ta.ema(macd2, signal_length)
signal3 = sma_signal == "SMA" ? ta.sma(macd3, signal_length) : ta.ema(macd3, signal_length)
signal4 = sma_signal == "SMA" ? ta.sma(macd4, signal_length) : ta.ema(macd4, signal_length)
//hist = (macd + macd2 + macd3)/1 - (signal + signal2 + signal3)/1
hist = (macd + macd2 + macd3 + macd4)/4 - (signal + signal2 + signal3 + signal4)/4
signal5 = (signal + signal2 + signal3)/3

sma_signal2 = input.bool(title="Simple MA (Signal Line)", defval=true)

lin_reg = input.bool(title="Lin Reg", defval=true)
linreg_length = input.int(title="Linear Regression Length", minval = 1, maxval = 200, defval = 11)

bopen = lin_reg ? ta.linreg(open, linreg_length, 0) : open
bhigh = lin_reg ? ta.linreg(high, linreg_length, 0) : high
blow = lin_reg ? ta.linreg(low, linreg_length, 0) : low
bclose = lin_reg ? ta.linreg(close, linreg_length, 0) : close

shadow = (bhigh - bclose) + (bopen - blow)
body = bclose - bopen
perc = (shadow/body)
cond2 = perc >=2 and bclose+bclose[1]/2 > bopen+bopen[1]/2

r = bopen < bclose

//signal5 = sma_signal2 ? ta.sma(bclose, signal_length) : ta.ema(bclose, signal_length)
plotcandle(r ? bopen : na, r ? bhigh : na, r ? blow: na, r ? bclose : na, title="LinReg Candles", color= color.green, wickcolor=color.green, bordercolor=color.green, editable= true)
plotcandle(r ? na : bopen, r ? na : bhigh, r ? na : blow, r ? na : bclose, title="LinReg Candles", color=color.red, wickcolor=color.red, bordercolor=color.red, editable= true)
//alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
//alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')

green = hist >= 0 ? (hist[1] < hist ? "G" : "GL") : (hist[1] < hist ? "RL" : "R")
Buy = green == "G" and green[1] != "G" and green[1] != "GL" and bopen < bclose and rsi < 55.0 //and not cond2
//StopBuy = (green == "R" or green == "RL" or green == "RL") and bopen > bclose and bopen[1] < bclose[1]
StopBuy = bopen > bclose and bopen[1] < bclose[1] and (green == "G" or green == "GL" or green == "R") and bopen[2] < bclose[2] and bopen[3] < bclose[3]
hists = close[3] < close[2] and close[2] < close[1]
//Buy = green == "RL" and hist[0] > -0.07 and hist[0] < 0.00 and rsi < 55.0 and hists
//StopBuy = green == "GL" or green == "R"
alertcondition(Buy, "Long","Покупка в лонг")
alertcondition(StopBuy, "StopLong","Закрытие сделки")

//hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist + (close - (close * 0.03)), title = "Histogram", style = plot.style_line, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plotshape(Buy ? low : na, 'Buy', shape.labelup, location.belowbar , color=color.new(#0abe40, 50), size=size.small, offset=0)
plotshape(StopBuy ? low : na, 'Buy', shape.cross, location.abovebar , color=color.new(#be0a0a, 50), size=size.small, offset=0)
plot(macd4  + (close - (close * 0.01)),   title = "MACD",   color = #2962FF)
plot(signal5 + (close - (close * 0.01)), title = "Signal", color = #FF6D00)

plotchar(cond2 , char='↓', color = color.rgb(0, 230, 119), text = "-")

if (Buy)
    strategy.entry("long", strategy.long)

// if (startShortTrade)
//     strategy.entry("short", strategy.short)

profitTarget = strategy.position_avg_price * stopLuse
strategy.exit("Take Profit", "long", limit=profitTarget)
// strategy.exit("Take Profit", "short", limit=profitTarget)

Lebih banyak