Bài viết này giới thiệu về một chiến lược giao dịch tiền điện tử tần số cao dựa trên TripleMACD đường trung bình kết hợp với chỉ số tương đối mạnh (RSI). Chiến lược này sử dụng chỉ số MACD của ba nhóm các tham số khác nhau và trung bình các đường tín hiệu của chúng, đồng thời kết hợp với chỉ số RSI để xác định thời gian mua và bán tốt nhất.
Cốt lõi của chiến lược này là sử dụng ba nhóm MACD với các tham số khác nhau để bắt tín hiệu xu hướng trên các quy mô thời gian khác nhau. Bằng cách trung bình các đường tín hiệu của ba nhóm MACD, có thể làm giảm tiếng ồn hiệu quả và cung cấp tín hiệu giao dịch đáng tin cậy hơn. Trong khi đó, chỉ số RSI được sử dụng để xác định cường độ của xu hướng đa đầu.
Ngoài ra, chiến lược này cũng sử dụng sự hồi phục tuyến tính để xác định giai đoạn thu hẹp của thị trường. Bằng cách tính toán tỷ lệ của đường viền dưới và thực thể trên biểu đồ, bạn có thể xác định liệu thị trường hiện tại có ở trạng thái thu hẹp hay không. Nếu chiều dài của đường viền trên và dưới là gấp đôi chiều dài của thực thể, thì thị trường được coi là ở giai đoạn thu hẹp, tại thời điểm này chiến lược sẽ tránh giao dịch.
Phân tích đa quy mô thời gian: Bằng cách sử dụng chỉ số MACD với ba nhóm các tham số khác nhau, chiến lược này có thể nắm bắt các tín hiệu xu hướng trên các quy mô thời gian khác nhau, cải thiện độ chính xác và độ tin cậy của giao dịch.
Tăng cường tín hiệu: Bằng cách trung bình các đường tín hiệu của ba nhóm chỉ số MACD, có thể làm giảm hiệu quả tiếng ồn, tránh các tín hiệu sai lệch mà chỉ số đơn lẻ có thể tạo ra.
Xác nhận xu hướng: kết hợp với chỉ số RSI để xác nhận sức mạnh của xu hướng đa đầu, có thể làm tăng thêm độ tin cậy của tín hiệu giao dịch.
Xác định cân bằng: Sử dụng sự hồi phục tuyến tính để xác định giai đoạn cân bằng của thị trường, có thể tránh giao dịch trong tình trạng biến động, giảm rủi ro của chiến lược.
Giao dịch tự động: Chiến lược này được thiết kế cho giao dịch tự động trong khung thời gian 1 phút, có thể phản ứng nhanh với sự thay đổi của thị trường và thực hiện giao dịch, tăng hiệu quả giao dịch.
Tối ưu hóa tham số: Chiến lược này liên quan đến nhiều tham số, chẳng hạn như chu kỳ đường nhanh chậm của ba nhóm chỉ số MACD, chu kỳ của chỉ số RSI. Việc lựa chọn các tham số này có ảnh hưởng quan trọng đến hiệu suất của chiến lược và nếu không tối ưu hóa tham số, có thể dẫn đến giảm hiệu suất của chiến lược.
Rủi ro quá phù hợp: Chiến lược có thể hoạt động tốt trên dữ liệu lịch sử cụ thể, nhưng có thể không thích ứng với sự thay đổi của thị trường trong ứng dụng thực tế, dẫn đến thất bại của chiến lược.
Sự kiện thiên nga đen: Chiến lược này chủ yếu dựa trên các chỉ số kỹ thuật và có thể không phản ứng với một số sự kiện cơ bản quan trọng, điều này có thể dẫn đến chiến lược không hoạt động tốt trong môi trường thị trường cực đoan.
Điều chỉnh các tham số động: Tùy thuộc vào sự thay đổi của tình hình thị trường, các tham số trong chiến lược được điều chỉnh động, chẳng hạn như chu kỳ đường nhanh chậm của chỉ số MACD, chu kỳ của chỉ số RSI, v.v., để thích ứng với môi trường thị trường khác nhau.
Thêm nhiều chỉ số: Trên cơ sở các chỉ số MACD và RSI hiện có, bạn có thể xem xét thêm các chỉ số kỹ thuật khác, chẳng hạn như Brinband, Moving Average, v.v., để nâng cao hơn nữa độ chính xác và độ tin cậy của tín hiệu giao dịch.
Tối ưu hóa quản lý rủi ro: Thêm các biện pháp quản lý rủi ro tốt hơn vào chiến lược, chẳng hạn như dừng động, quản lý vị trí, v.v., để giảm rủi ro tổng thể của chiến lược.
Tối ưu hóa học máy: Sử dụng các thuật toán học máy, chẳng hạn như mạng thần kinh, hỗ trợ máy vector, để tối ưu hóa các tham số và quy tắc giao dịch của chiến lược, nâng cao khả năng thích ứng và ổn định của chiến lược.
Bài viết này giới thiệu một chiến lược giao dịch tiền điện tử tần số cao dựa trên TripleMACD đường trung bình kết hợp với chỉ số RSI. Chiến lược này sử dụng ba bộ tham số khác nhau của chỉ số MACD và chỉ số RSI để tạo ra tín hiệu giao dịch đáng tin cậy, đồng thời sử dụng sự hồi phục tuyến tính để xác định giai đoạn cân bằng của thị trường, để tránh giao dịch trong tình trạng xung đột.
/*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)