Chiến lược giao dịch tiền điện tử tần số cao kết hợp TrippleMACD Crossover và chỉ số sức mạnh tương đối

Tác giả:ChaoZhang, Ngày: 2024-03-22 15:41:46
Tags:

img

Tổng quan

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.

Nguyên tắc chiến lược

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 lợi thế

  1. 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.

  2. Đơ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.

  3. 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.

  4. 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.

  5. 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ả.

Phân tích rủi ro

  1. 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.

  2. 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.

  3. 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.

Hướng tối ưu hóa

  1. Đ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.

  2. 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.

  3. 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.

  4. 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.

Kết luận

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)

Thêm nữa