Chiến lược giao dịch định lượng tiền điện tử dựa trên biểu đồ 1 phút kết hợp đường trung bình động hàm mũ ba và chỉ số sức mạnh tương đối


Ngày tạo: 2024-03-29 11:16:10 sửa đổi lần cuối: 2024-03-29 11:16:10
sao chép: 3 Số nhấp chuột: 670
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng tiền điện tử dựa trên biểu đồ 1 phút kết hợp đường trung bình động hàm mũ ba và chỉ số sức mạnh tương đối

Tổng quan

Chiến lược này sử dụng phương pháp kết hợp đường di chuyển trung bình ba lần ((Triple MACD) và chỉ số tương đối yếu ((RSI)) để định lượng giao dịch trên thị trường tiền điện tử, đặc biệt là cho chu kỳ thời gian 1 phút. Ý tưởng chính của chiến lược là sử dụng chỉ số MACD với các tham số chu kỳ khác nhau để nắm bắt sự thay đổi của thị trường, đồng thời sử dụng chỉ số RSI để xác nhận cường độ của xu hướng.

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

Chiến lược này sử dụng ba tham số MACD khác nhau, lần lượt có chu kỳ đường nhanh là 5/13/34 và chu kỳ đường chậm là 8/21/144, tính toán chênh lệch giữa chúng để có được giá trị MACD. Sau đó, tính trung bình cho ba MACD này, trừ đi giá trị Signal của nó bằng giá trị MACD sau trung bình (tức là chu kỳ NEMA của MACD), và có được biểu đồ trụ MACD cuối cùng. Đồng thời tính toán chỉ số RSI trong 14 chu kỳ, hỗ trợ đánh giá cường độ xu hướng.

Phân tích lợi thế

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

Phân tích rủi ro

  1. Chiến lược này hoạt động tốt hơn trong một xu hướng duy nhất, và tín hiệu giao dịch có thể bị hỏng thường xuyên nếu thị trường ở trạng thái biến động rộng.
  2. Do sự biến động lớn của thị trường tiền điện tử, nếu thị trường có biến động cực kỳ bất thường trong thời gian ngắn, có thể dẫn đến sự rút lui lớn hơn.
  3. Lựa chọn tham số chiến lược có ảnh hưởng rõ ràng đến thu nhập tổng thể, thiết lập tham số không đúng có thể dẫn đến thất bại của chiến lược. Do đó, cần phải tối ưu hóa tham số đầy đủ và kiểm tra lại các giống khác nhau trước khi thực hiện.

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

  1. Có thể xem xét giới thiệu các chỉ số liên quan đến biến động giá như ATR, lọc các tín hiệu mở vị trí, giảm thiệt hại có thể do biến động bất thường của thị trường.
  2. Đối với việc đánh giá tình hình tổng hợp, ngoài hồi quy tuyến tính, bạn cũng có thể thử sử dụng các phương pháp khác như vị trí kháng cự hỗ trợ, đường băng thông Brin để cải thiện thêm độ chính xác nhận diện.
  3. Trong một tình huống xu hướng, bạn có thể tối ưu hóa vị trí vị trí yên bằng cách giới thiệu các điểm dừng di động để tối đa hóa lợi nhuận của một giao dịch.
  4. Cân nhắc tính khác nhau của các loại giao dịch khác nhau, các tham số chiến lược khác nhau có thể được thiết lập cho các loại khác nhau, tăng khả năng thích ứng và ổn định của chiến lược tổng thể.

Tóm tắt

Chiến lược này khéo léo kết hợp ba lần MACD với chỉ số RSI và sử dụng công nghệ hồi phục tuyến tính để xác định các tình huống ổn định của thị trường, tạo thành một chiến lược giao dịch định lượng tần số cao hoàn chỉnh. Các điều kiện mở lỗ nghiêm ngặt của chiến lược và việc sử dụng tín hiệu MACD trung bình giúp cải thiện độ chính xác giao dịch và kiểm soát sự rút lui. Mặc dù chiến lược này hoạt động tốt hơn trong các tình huống xu hướng đơn phương, nhưng có thể nâng cao hơn nữa khả năng thích ứng và sự ổn định của chiến lược bằng cách đưa ra các biện pháp như lọc tỷ lệ dao động, tối ưu hóa các phương pháp nhận dạng tình huống ổn định của thị trường, thiết lập các điểm dừng di động và thiết lập các tham số độc lập cho các loại khác nhau.

Mã nguồn chiến lược
/*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)