Strategi Dagangan Cryptocurrency Frekuensi Tinggi Menggabungkan TrippleMACD Crossover dan Indeks Kekuatan Relatif

Penulis:ChaoZhang, Tarikh: 2024-03-22 15:41:46
Tag:

img

Ringkasan

Artikel ini memperkenalkan strategi perdagangan mata wang kripto frekuensi tinggi yang menggabungkan persilangan TrippleMACD dengan Indeks Kekuatan Relatif (RSI). Strategi ini menggunakan tiga set penunjuk MACD dengan parameter yang berbeza dan purata garis isyarat mereka, sambil juga menggabungkan penunjuk RSI untuk menentukan masa beli dan jual yang optimum. Strategi ini direka untuk perdagangan automatik pada jangka masa 1 minit, hanya mempertimbangkan perdagangan panjang. Di samping itu, strategi ini menggunakan regresi linear untuk mengenal pasti fasa penyatuan di pasaran, mengelakkan perdagangan semasa keadaan pasaran yang bergelombang.

Prinsip Strategi

Inti dari strategi ini adalah menggunakan tiga set penunjuk MACD dengan parameter yang berbeza untuk menangkap isyarat trend pada pelbagai skala masa. Dengan rata-rata garis isyarat ketiga-tiga penunjuk MACD ini, bunyi bising dapat dihaluskan dengan berkesan, memberikan isyarat perdagangan yang lebih boleh dipercayai. Pada masa yang sama, penunjuk RSI digunakan untuk mengesahkan kekuatan trend kenaikan. Strategi ini menghasilkan isyarat beli hanya apabila ketiga-tiga penunjuk MACD menunjukkan isyarat kenaikan dan penunjuk RSI juga mengesahkan kekuatan trend kenaikan.

Selain itu, strategi menggunakan regresi linear untuk mengenal pasti fasa penyatuan di pasaran. Dengan mengira nisbah panjang bayangan atas dan bawah kepada panjang badan lilin, dapat ditentukan sama ada pasaran semasa berada dalam keadaan penyatuan. Jika panjang bayangan atas dan bawah lebih daripada dua kali panjang badan, pasaran dianggap berada dalam fasa penyatuan, dan strategi akan mengelakkan perdagangan dalam masa ini.

Analisis Kelebihan

  1. Analisis pelbagai jangka masa: Dengan menggunakan tiga set penunjuk MACD dengan parameter yang berbeza, strategi dapat menangkap isyarat trend pada pelbagai skala masa, meningkatkan ketepatan dan kebolehpercayaan perdagangan.

  2. Penghapusan isyarat: Purata garis isyarat ketiga-tiga penunjuk MACD secara berkesan menghapuskan bunyi bising, mengelakkan isyarat yang mengelirukan yang mungkin dihasilkan oleh satu penunjuk.

  3. Pengesahan trend: Memasukkan penunjuk RSI untuk mengesahkan kekuatan trend menaik meningkatkan kebolehpercayaan isyarat perdagangan.

  4. Pengenalan penyatuan: Menggunakan regresi linear untuk mengenal pasti fasa penyatuan di pasaran membolehkan strategi untuk mengelakkan perdagangan semasa keadaan pasaran yang bergelora, mengurangkan risiko strategi.

  5. Perdagangan automatik: Strategi ini direka untuk perdagangan automatik dalam jangka masa 1 minit, yang membolehkan tindak balas cepat terhadap perubahan pasaran dan pelaksanaan perdagangan yang cekap.

Analisis Risiko

  1. Pengoptimuman parameter: Strategi melibatkan beberapa parameter, seperti tempoh garis cepat dan perlahan tiga penunjuk MACD dan tempoh penunjuk RSI. Pilihan parameter ini mempunyai kesan yang signifikan terhadap prestasi strategi. Jika parameter tidak dioptimumkan dengan betul, prestasi strategi mungkin menurun.

  2. Risiko overfitting: Strategi mungkin berfungsi dengan baik pada data sejarah tertentu tetapi mungkin gagal menyesuaikan diri dengan perubahan pasaran dalam aplikasi sebenar, yang membawa kepada kegagalan strategi.

  3. Peristiwa angsa hitam: Strategi ini terutamanya bergantung kepada penunjuk teknikal dan mungkin tidak bertindak balas dengan mencukupi terhadap peristiwa asas yang penting, yang boleh membawa kepada prestasi yang buruk dalam keadaan pasaran yang melampau.

Arah pengoptimuman

  1. Penyesuaian parameter dinamik: Sesuaikan parameter dalam strategi secara dinamik, seperti tempoh garis cepat dan perlahan penunjuk MACD dan tempoh penunjuk RSI, berdasarkan perubahan dalam keadaan pasaran untuk menyesuaikan diri dengan persekitaran pasaran yang berbeza.

  2. Memasukkan penunjuk tambahan: Sebagai tambahan kepada penunjuk MACD dan RSI yang sedia ada, pertimbangkan untuk memasukkan penunjuk teknikal lain, seperti Bollinger Bands dan purata bergerak, untuk meningkatkan keakuran dan kebolehpercayaan isyarat perdagangan.

  3. Pengoptimuman pengurusan risiko: Melaksanakan langkah pengurusan risiko yang lebih komprehensif dalam strategi, seperti pengendalian stop-loss dan kedudukan dinamik, untuk mengurangkan risiko keseluruhan strategi.

  4. Pengoptimuman pembelajaran mesin: Menggunakan algoritma pembelajaran mesin, seperti rangkaian saraf dan mesin vektor sokongan, untuk mengoptimumkan parameter strategi dan peraturan perdagangan, meningkatkan kebolehsesuaian dan ketahanan strategi.

Kesimpulan

Artikel ini memperkenalkan strategi perdagangan mata wang kripto frekuensi tinggi yang menggabungkan persilangan TrippleMACD dengan penunjuk RSI. Strategi ini menggunakan tiga set penunjuk MACD dengan parameter yang berbeza dan penunjuk RSI untuk menjana isyarat perdagangan yang boleh dipercayai sambil menggunakan regresi linear untuk mengenal pasti fasa penyatuan di pasaran, mengelakkan perdagangan semasa keadaan pasaran yang berbelit-belit. Keuntungan strategi ini terletak pada analisis pelbagai jangka masa, pelunturan isyarat, pengesahan trend penyatuan, dan pengenalan perdagangan automatik. Walau bagaimanapun, ia juga menghadapi risiko perdagangan seperti pengoptimuman parameter, overfit, dan peristiwa angsa hitam.


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//indicator("Triplle",shorttitle="Triplle MACD", overlay=true, scale = scale.none)
//indicator("Triplle","TrippleMACD",true)
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"

//rsiPlot = plot(rsi, "RSI", color=#7E57C2)
//plot(rsiMA, "RSI-based MA", color=color.yellow)
//rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
//midline = hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
//rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
//fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
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)
//fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill")

//midLinePlot = plot(50, color = na, editable = false, display = display.none)
//fill(rsiPlot, midLinePlot, 100, 70, top_color = color.new(color.green, 0), bottom_color = color.new(color.green, 100),  title = "Overbought Gradient Fill")
//fill(rsiPlot, midLinePlot, 30,  0,  top_color = color.new(color.red, 100), bottom_color = color.new(color.red, 0),      title = "Oversold Gradient Fill")

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

// plot(
//      plFound ? rsi[lookbackRight] : na,
//      offset=-lookbackRight,
//      title="Regular Bullish",
//      linewidth=2,
//      color=(bullCond ? bullColor : noneColor)
//      )

// plotshape(
// 	 bullCond ? rsi[lookbackRight] : na,
// 	 offset=-lookbackRight,
// 	 title="Regular Bullish Label",
// 	 text=" Bull ",
// 	 style=shape.labelup,
// 	 location=location.absolute,
// 	 color=bullColor,
// 	 textcolor=textColor
// 	 )

//------------------------------------------------------------------------------
// Regular Bearish
// 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

// plot(
// 	 phFound ? rsi[lookbackRight] : na,
// 	 offset=-lookbackRight,
// 	 title="Regular Bearish",
// 	 linewidth=2,
// 	 color=(bearCond ? bearColor : noneColor)
// 	 )

// plotshape(
// 	 bearCond ? rsi[lookbackRight] : na,
// 	 offset=-lookbackRight,
// 	 title="Regular Bearish Label",
// 	 text=" Bear ",
// 	 style=shape.labeldown,
// 	 location=location.absolute,
// 	 color=bearColor,
// 	 textcolor=textColor
// 	 )
// END RSI

// 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 lanjut