Triple Exponential Moving Average Convergence Divergence and Relative Strength Index Combined Chart 1 phút Chiến lược giao dịch định lượng tiền điện tử

Tác giả:ChaoZhang, Ngày: 2024-03-29 11:16:10
Tags:

img

Tổng quan

Chiến lược này kết hợp các phương pháp Triple Exponential Moving Average Convergence Divergence (Triple MACD) và Relative Strength Index (RSI), được thiết kế đặc biệt để giao dịch định lượng trên thị trường tiền điện tử trong một khung thời gian 1 phút. Ý tưởng chính đằng sau chiến lược là nắm bắt những thay đổi trong đà tăng và giảm bằng cách sử dụng các chỉ số MACD với các thông số giai đoạn khác nhau, trong khi sử dụng chỉ số RSI để xác nhận sức mạnh xu hướng. Bằng cách trung bình ba tín hiệu MACD, tiếng ồn có thể được làm mịn hiệu quả, cải thiện độ tin cậy của các tín hiệu giao dịch. Ngoài ra, chiến lược sử dụng các kỹ thuật hồi quy tuyến tính để xác định các giai đoạn củng cố trên thị trường, tránh các giao dịch thường xuyên trong hành động giá nóng. Chiến lược này phù hợp với giao dịch lưới, có khả năng tạo ra lợi nhuận ổn định giữa các biến động nhanh chóng của toàn bộ thị trường tiền điện tử.

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

Chiến lược này sử dụng ba chỉ số MACD với các thông số khác nhau: giai đoạn đường nhanh 5/13/34 và giai đoạn đường chậm 8/21/144. Nó tính toán sự khác biệt giữa chúng để có được các giá trị MACD. Ba giá trị MACD này sau đó được tính trung bình, và biểu đồ MACD cuối cùng được lấy bằng cách trừ giá trị tín hiệu (N-period EMA của MACD) từ MACD trung bình. Đồng thời, một chỉ số RSI 14 giai đoạn được tính để hỗ trợ xác định sức mạnh xu hướng. Một tín hiệu dài được tạo ra khi biểu đồ MACD trung bình thay đổi từ âm sang dương, RSI dưới 55, và có sự sắp xếp tăng. Ngược lại, một tín hiệu gần được kích hoạt khi biểu đồ MACD trung bình thay đổi từ dương sang âm, RSI trên 45, và có một chiến lược sắp xếp. Hơn nữa, một đường 11 giai đoạn phù hợp để xác định các bóng hồi quy, phân tích chiều dài giữa các thân cây nến và tỷ lệ giá của thị trường.

Phân tích lợi thế

  1. Sự kết hợp của các chỉ số MACD nhiều giai đoạn phản ánh khách quan những thay đổi xu hướng trên thị trường ở các quy mô thời gian khác nhau, nâng cao độ chính xác của việc xác định xu hướng.
  2. Tích hợp MACD với chỉ số RSI tạo ra các điều kiện vào và ra nghiêm ngặt, góp phần cải thiện lợi nhuận chiến lược và kiểm soát rút tiền.
  3. Trung bình các tín hiệu MACD có hiệu quả loại bỏ các tín hiệu sai do dao động chỉ số thường xuyên, làm cho các tín hiệu giao dịch đáng tin cậy hơn.
  4. Sử dụng hồi quy tuyến tính để xác định các thị trường dao động giúp tránh tham gia giao dịch trong các thị trường dao động khi xu hướng không rõ ràng, giảm các giao dịch thua lỗ.
  5. Trong thị trường tiền điện tử đang thay đổi nhanh chóng, một chiến lược giao dịch định lượng ở mức 1 phút có vị trí tốt hơn để nắm bắt các cơ hội giao dịch phát sinh từ biến động thị trường kịp thời.

Phân tích rủi ro

  1. Chiến lược này hoạt động tốt hơn trong các thị trường xu hướng một chiều. Nếu thị trường vẫn ở trong trạng thái dao động rộng rãi trong một thời gian dài, các tín hiệu giao dịch thường có thể trở nên không hợp lệ.
  2. Do sự biến động cao của thị trường tiền điện tử, biến động bất thường cực kỳ trong ngắn hạn có thể dẫn đến giảm đáng kể.
  3. Việc lựa chọn các tham số chiến lược có tác động rõ ràng đến lợi nhuận tổng thể. Cài đặt tham số không chính xác có thể khiến chiến lược thất bại. Do đó, việc tối ưu hóa tham số và xác minh backtesting đầy đủ cho các công cụ giao dịch khác nhau là cần thiết trước khi giao dịch trực tiếp.

Hướng dẫn tối ưu hóa

  1. Xem xét việc đưa ra các chỉ số liên quan đến biến động giá, chẳng hạn như ATR, để lọc các tín hiệu nhập cảnh và giảm tổn thất tiềm năng do biến động thị trường bất thường.
  2. Ngoài hồi quy tuyến tính, các phương pháp khác như mức hỗ trợ và kháng cự, kênh Bollinger Bands, v.v., có thể được khám phá để cải thiện thêm độ chính xác xác xác định các thị trường dao động.
  3. Trong thị trường xu hướng, giới thiệu dừng lỗ để tối ưu hóa các điểm thoát, tối đa hóa lợi nhuận của mỗi giao dịch.
  4. Xem xét sự khác biệt đặc trưng giữa các công cụ giao dịch khác nhau, thiết lập các tham số chiến lược khác nhau cho các công cụ khác nhau để tăng khả năng thích nghi và ổn định của chiến lược tổng thể.

Tóm lại

Chiến lược này kết hợp khéo léo Triple MACD với chỉ số RSI và sử dụng các kỹ thuật hồi quy tuyến tính để xác định các thị trường dao động, tạo thành một tập hợp đầy đủ các chiến lược giao dịch định lượng tần số cao. Các điều kiện vào và ra hạn nghiêm ngặt và việc áp dụng các tín hiệu MACD trung bình góp phần cải thiện độ chính xác giao dịch và kiểm soát rút tiền. Mặc dù chiến lược hoạt động tốt hơn trong các thị trường xu hướng đơn hướng, các biện pháp như giới thiệu bộ lọc biến động, tối ưu hóa các phương pháp xác định thị trường dao động, thiết lập stop-loss và thiết lập các tham số độc lập cho các công cụ khác nhau có thể tăng cường khả năng thích nghi và độ bền của chiến lược. Nhìn chung, đây là một chiến lược giao dịch định lượng tiền điện tử rất hứa hẹn xứng đáng được tối ưu hóa hơn và áp dụng giao dịch trực tiếp.


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

Thêm nữa