
Chiến lược giao dịch đồng bộ chỉ số động lượng kép là một hệ thống giao dịch định lượng dựa trên phân tích kỹ thuật, chiến lược này kết hợp một cách khéo léo lợi thế của chỉ số tương đối yếu ((RSI) và chỉ số phân tán kết thúc đường trung bình di chuyển ((MACD), tập trung vào việc nắm bắt xu hướng tăng mạnh trong thị trường. Chiến lược này chỉ thực hiện giao dịch đa đầu, thực hiện quá trình quyết định giao dịch có hệ thống bằng cách xác định tín hiệu đột phá động lượng và kết hợp với cơ chế quản lý rủi ro.
Chiến lược này hoạt động dựa trên sự phối hợp của hai chỉ số kỹ thuật quan trọng. Đầu tiên, chiến lược sử dụng chỉ số RSI để đo tốc độ và mức độ biến động giá để xác định xem thị trường có đang quá mua hay quá bán hay không; và thứ hai, sử dụng chỉ số MACD để xác định sự thay đổi và cường độ của động lực trong xu hướng thị trường.
Điều kiện tham gia:
Điều kiện lọc bổ sung:
Điều kiện:
Chiến lược này được thiết kế để theo dõi trạng thái, đảm bảo rằng bạn có thể vào khi bạn ở trạng thái bằng phẳng và có thể ra ngoài khi bạn đang giữ vị trí, tránh các vấn đề về tín hiệu lặp đi lặp lại. Thiết kế này làm cho mỗi lần vào chỉ có một lần ra ngoài, giữ cho logic giao dịch rõ ràng và nhất quán.
Hiệu ứng đồng bộ của chỉ sốKết hợp lợi thế của hai chỉ số RSI và MACD, RSI có thể phản ứng nhanh chóng với biến động giá, trong khi MACD có thể xác nhận xu hướng trung hạn và dài hạn, cả hai đều tăng cường độ tin cậy của tín hiệu.
Cơ chế lọc linh hoạtChiến lược cung cấp hai cơ chế tùy chọn lọc xu hướng EMA và lọc ngữ cảnh bán tháo, cho phép các nhà giao dịch điều chỉnh khả năng thích ứng của chiến lược theo môi trường thị trường khác nhau.
Quản lý rủi ro tốt: Cơ chế dừng dừng tích hợp, cho phép thương nhân đặt các tham số phần trăm theo sở thích rủi ro của mình, kiểm soát hiệu quả các lỗ hổng rủi ro cho mỗi giao dịch.
Kiểm soát trạng thái rõ ràng: Theo dõi các biến trạng thái để đảm bảo tính nhất quán và logic của tín hiệu giao dịch, tránh các vấn đề về nhập cảnh hoặc xuất cảnh lặp lại.
Khả năng tùy chỉnh caoChiến lược cung cấp nhiều tham số có thể điều chỉnh, bao gồm độ dài RSI, tham số MACD, điều kiện lọc và tham số quản lý rủi ro, cho phép các nhà giao dịch tối ưu hóa cho các điều kiện thị trường khác nhau và các loại giao dịch.
Hỗ trợ hình ảnhChiến lược cung cấp các tính năng trực quan như đánh dấu vào / ra, màu K-line và hiển thị nền kích hoạt, giúp thương nhân hiểu trực quan và điều chỉnh chiến lược.
Rủi ro đột phá giả: Trong thị trường chấn động, RSI và MACD có thể tạo ra các tín hiệu phá vỡ sai thường xuyên, dẫn đến giao dịch thua lỗ liên tục. Để giảm thiểu rủi ro này, các bộ lọc môi trường thị trường bổ sung như chỉ số tỷ lệ dao động hoặc chỉ số cường độ xu hướng có thể được thêm vào.
Hạn chế giao dịch một chiềuTrong hệ thống giao dịch toàn diện, bạn có thể xem xét thêm chiến lược đầu trống tương ứng hoặc tạm dừng giao dịch trong xu hướng giảm rõ ràng.
Độ nhạy tham sốHiệu suất chiến lược nhạy cảm với cài đặt tham số, các thị trường và khung thời gian khác nhau có thể yêu cầu các kết hợp tham số khác nhau. Chúng tôi khuyên bạn nên tối ưu hóa tham số bằng cách kiểm tra lại trong nhiều điều kiện thị trường và xem xét sử dụng phương pháp tham số thích ứng.
Cài đặt rủi ro dừng lỗLệnh dừng quá nhỏ có thể dẫn đến việc kích hoạt thường xuyên, trong khi lệnh dừng quá lớn có thể dẫn đến tổn thất đơn lẻ quá lớn. Bạn nên điều chỉnh tỷ lệ dừng theo đặc tính biến động của thị trường mục tiêu hoặc xem xét sử dụng phương pháp dừng động như ATR.
Tín hiệu chậm phát: Là chỉ số trễ, tín hiệu của RSI và MACD có thể xuất hiện sau khi giá đã thay đổi rõ rệt, ảnh hưởng đến giá nhập và lợi nhuận. Bạn có thể cân nhắc kết hợp với các chỉ số trước nhạy cảm hơn để tối ưu hóa thời gian nhập.
Hệ thống tham số thích ứngPhát triển cơ chế điều chỉnh tham số thích ứng dựa trên tỷ lệ biến động của thị trường hoặc cường độ của xu hướng, cho phép các tham số của RSI và MACD được tự động tối ưu hóa theo điều kiện thị trường hiện tại, nâng cao khả năng thích ứng của chiến lược trong các môi trường thị trường khác nhau.
Phân tích nhiều khung thời gianTiến hành các cơ chế xác nhận nhiều khung thời gian, chẳng hạn như xác nhận hướng xu hướng trong khung thời gian lớn hơn, sau đó thực hiện các giao dịch cụ thể trong khung thời gian nhỏ hơn để giảm tín hiệu giả và tăng tỷ lệ thắng.
Cơ chế dừng lỗ động: Thay đổi dừng phần trăm cố định thành dừng động dựa trên ATR, để thích ứng tốt hơn với sự biến động của thị trường, bảo vệ vốn và đồng thời cho giá đủ không gian thở.
Tối ưu hóa quản lý tài chínhTiến hành các thuật toán quản lý vị trí dựa trên giá trị ròng, biến động và tỷ lệ thắng của tài khoản, chẳng hạn như công thức Kelly hoặc mô hình rủi ro tỷ lệ cố định, để lỗ hổng rủi ro cho mỗi giao dịch phù hợp với tình trạng tài khoản và điều kiện thị trường hiện tại.
Bộ lọc môi trường thị trường tích hợpThêm bộ lọc có thể nhận diện môi trường thị trường (trend, biến động hoặc biến đổi), chẳng hạn như ADX (trung bình chỉ số hướng), chỉ số biến động hoặc công cụ phân tích chu kỳ, để thực hiện giao dịch trong điều kiện thị trường phù hợp với chiến lược.
Thêm logic giao dịch không đầu: Chiến lược mở rộng để bao gồm các quy tắc giao dịch không đầu, cho phép nó có hiệu quả tương tự trong xu hướng giảm, do đó xây dựng một hệ thống giao dịch toàn diện.
Chiến lược giao dịch đồng bộ với chỉ số động lượng kép tạo ra một hệ thống giao dịch định lượng có tính logic rõ ràng, có thể kiểm soát rủi ro bằng cách kết hợp lợi thế của hai chỉ số kỹ thuật cổ điển RSI và MACD. Chiến lược này tập trung vào việc nắm bắt cơ hội động lượng trong xu hướng tăng, đồng thời nâng cao chất lượng giao dịch thông qua nhiều cơ chế lọc và công cụ quản lý rủi ro. Mặc dù có những rủi ro vốn có như đột phá giả và nhạy cảm với tham số, chiến lược này có tiềm năng nâng cao hơn nữa hiệu suất của nó trong các môi trường thị trường khác nhau thông qua các hướng tối ưu hóa được đề xuất như điều chỉnh tham số, phân tích nhiều khung thời gian và quản lý rủi ro động. Chiến lược này đặc biệt phù hợp cho các nhà đầu tư theo đuổi xu hướng và giao dịch động lượng, có thể đạt được kết quả ổn định trong lĩnh vực giao dịch định lượng do phân tích kỹ thuật thúc đẩy thông qua điều chỉnh và kiểm soát rủi ro tham số hợp lý.
/*backtest
start: 2025-02-28 00:00:00
end: 2025-08-10 00:00:00
period: 3h
basePeriod: 3h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// Vibe coded by Andrew Grothe 2025-08-08. Adjust the TP/SL on lines 28 & 29 to fine tune the strategy
strategy("RSI + MACD Long-Only Strategy", overlay=true, pyramiding=0, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.0)
// Inputs — RSI
rsiLen = input.int(14, "RSI Length", minval=1, group="RSI")
rsiOB = input.int(70, "RSI Overbought", minval=50, maxval=100, group="RSI")
rsiOS = input.int(30, "RSI Oversold", minval=0, maxval=50, group="RSI")
rsiMid = input.int(50, "RSI Midline", minval=0, maxval=100, group="RSI")
// Inputs — MACD
fastLen = input.int(12, "MACD Fast Length", minval=1, group="MACD")
slowLen = input.int(26, "MACD Slow Length", minval=1, group="MACD")
sigLen = input.int(9, "MACD Signal Length", minval=1, group="MACD")
requireAboveZero = input.bool(false, "Require MACD > 0 (trend filter)", group="MACD")
// Inputs — Filters & Visuals
useOversoldContext = input.bool(false, "Entry must be within N bars after RSI < Oversold", group="Signals")
oversoldWindowBars = input.int(10, "N bars after oversold", minval=1, group="Signals")
useEMATrend = input.bool(false, "Only Long if price > EMA", group="Signals")
emaLen = input.int(200, "EMA Length", minval=1, group="Signals")
showMarkers = input.bool(true, "Plot Entry/Exit Markers", group="Visuals")
colorBars = input.bool(false, "Color Bars on Signals", group="Visuals")
// Inputs — Risk
// 1 hour = 2.0/1.0, 2 hour = 10.5/2.5
useTPSL = input.bool(true, "Use Take Profit / Stop Loss", group="Risk")
tpPerc = input.float(11.5, "Take Profit %", minval=0.0, step=0.1, group="Risk")
slPerc = input.float(2.5, "Stop Loss %", minval=0.0, step=0.1, group="Risk")
// Core calculations
rsi = ta.rsi(close, rsiLen)
[macd, macdSignal, macdHist] = ta.macd(close, fastLen, slowLen, sigLen)
emaTrend = ta.ema(close, emaLen)
// Conditions
macdBull = macd > macdSignal and (not requireAboveZero or macd > 0)
rsiBull = rsi > rsiMid
recentlyOversold = ta.barssince(rsi < rsiOS) <= oversoldWindowBars
trendOk = not useEMATrend or close > emaTrend
// Precompute cross events to avoid conditional execution warnings
rsiCrossUpMid = ta.crossover(rsi, rsiMid)
macdCrossUp = ta.crossover(macd, macdSignal)
rsiCrossDownMid = ta.crossunder(rsi, rsiMid)
macdCrossDown = ta.crossunder(macd, macdSignal)
// Signals (long-only)
longTrigger = (rsiCrossUpMid and macdBull) or (macdCrossUp and rsi >= rsiMid)
longEntry = longTrigger and (not useOversoldContext or recentlyOversold) and trendOk
exitSignal = rsiCrossDownMid or (macdCrossDown and macdHist <= 0)
// Stateful gating so we only get one exit per entry
var bool inLong = false
inLongPrev = barstate.isfirst ? false : inLong[1]
finalLongEntry = longEntry and not inLongPrev
finalExit = exitSignal and inLongPrev
inLong := (inLongPrev or finalLongEntry) and not finalExit
// Plots
plot(useEMATrend ? emaTrend : na, title="EMA", color=color.orange, linewidth=2)
plotshape(showMarkers and finalLongEntry, title="Long Entry", style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.tiny, text="Long")
plotshape(showMarkers and finalExit, title="Exit", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, text="Exit")
barcolor(colorBars ? (finalLongEntry ? color.lime : finalExit ? color.red : na) : na)
// Debug background to visualize when raw long trigger occurs
bgcolor(longTrigger ? color.new(color.lime, 90) : na)
// Alerts
//alertcondition(finalLongEntry, title="RSI+MACD Long Entry", message="RSI+MACD Long Entry on {{ticker}} {{interval}} at {{close}}")
//alertcondition(finalExit, title="RSI+MACD Exit", message="RSI+MACD Exit on {{ticker}} {{interval}} at {{close}}")
// Strategy Orders — Long only
if finalLongEntry
strategy.entry("Long", strategy.long)
// Protective exits (TP/SL) while in position
if useTPSL and strategy.position_size > 0
longSL = strategy.position_avg_price * (1 - slPerc / 100.0)
longTP = strategy.position_avg_price * (1 + tpPerc / 100.0)
strategy.exit("Long TP/SL", from_entry="Long", stop=longSL, limit=longTP)
// Signal-based exit
if finalExit and strategy.position_size > 0
strategy.close("Long", comment="Signal Exit")