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