
Chiến lược này là một hệ thống giao dịch động kết hợp các chỉ số tương đối mạnh (SRSI) và xu hướng trung bình di chuyển / phân tán (MACD). Nó điều chỉnh động điểm dừng và điểm dừng thông qua chỉ số ATR, thực hiện quản lý thông minh về rủi ro. Cốt lõi của chiến lược này là tạo ra tín hiệu giao dịch thông qua xác nhận chéo của nhiều chỉ số kỹ thuật, đồng thời quản lý vị trí với biến động của thị trường.
Chiến lược hoạt động dựa trên các cơ chế cốt lõi sau:
Chiến lược này xây dựng một hệ thống giao dịch vững chắc bằng cách kết hợp các lợi thế của SRSI và MACD. Cơ chế quản lý rủi ro động giúp nó có khả năng thích ứng tốt, nhưng vẫn yêu cầu các nhà giao dịch tối ưu hóa các tham số theo tình hình thị trường thực tế. Chiến lược thành công cần có sự hiểu biết sâu sắc về thị trường và quản lý vị trí hợp lý kết hợp với khả năng chịu rủi ro của cá nhân.
/*backtest
start: 2024-09-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy(title="SRSI + MACD Strategy with Dynamic Stop-Loss and Take-Profit", shorttitle="SRSI + MACD Strategy", overlay=false, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// User Inputs
smoothK = input.int(3, "K", minval=1)
smoothD = input.int(3, "D", minval=1)
lengthRSI = input.int(16, "RSI Length", minval=1)
lengthStoch = input.int(16, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
enableStopLoss = input.bool(true, "Enable Stop-Loss")
enableTakeProfit = input.bool(true, "Enable Take-Profit")
riskFactor = input.float(2.5, "Risk Factor", minval=0.1, step=1)
// Calculate K and D lines
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)
differenceKD = k - d
// Calculate MACD and normalization
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
lowestK = ta.lowest(k, lengthRSI)
highestK = ta.highest(k, lengthRSI)
normalizedMacd = (macdLine - ta.lowest(macdLine, lengthRSI)) / (ta.highest(macdLine, lengthRSI) - ta.lowest(macdLine, lengthRSI)) * (highestK - lowestK) + lowestK
differenceKMacd = k - normalizedMacd
// Sum both differences for a unique display
differenceTotal = (differenceKD + differenceKMacd) / 2
// Check if MACD is falling or rising
isMacdFalling = ta.falling(macdLine, 1)
isMacdRising = ta.rising(macdLine, 1)
// Check if K is falling or rising
isKFalling = ta.falling(k, 1)
isKdRising = ta.rising(k, 1)
// Calculate ATR and dynamic levels
atrValue = ta.atr(14)
stopLossDistance = atrValue * riskFactor
takeProfitDistance = atrValue * riskFactor
// Variables for stop-loss and take-profit levels
var float longStopPrice = na
var float longTakeProfitPrice = na
// Buy and sell conditions with differenceKD added
buyCondition = ((differenceTotal > 0 or differenceKD > 0) and (isKdRising or isMacdRising) and k < 20 )
sellCondition = ((differenceTotal <= 0 or differenceKD <= 0) and (isKFalling or isMacdFalling) and k > 80)
// Execute strategy orders with conditional stop-loss and take-profit
if buyCondition and strategy.position_size == 0
strategy.entry("Buy", strategy.long)
if strategy.position_size > 0
longStopPrice := strategy.position_avg_price - stopLossDistance
longTakeProfitPrice := strategy.position_avg_price + takeProfitDistance
if enableStopLoss or enableTakeProfit
strategy.exit("Sell/Exit", "Buy", stop=(enableStopLoss ? longStopPrice : na), limit=(enableTakeProfit ? longTakeProfitPrice : na))
if sellCondition
strategy.close("Buy")
// Hide lines when position is closed
stopLossToPlot = strategy.position_size > 0 ? longStopPrice : na
takeProfitToPlot = strategy.position_size > 0 ? longTakeProfitPrice : na
// Plot stop-loss and take-profit lines only when long positions are active
plot(enableStopLoss ? stopLossToPlot : na, title="Stop-Loss", color=color.yellow, linewidth=1, style=plot.style_linebr, offset=0, force_overlay=true)
plot(enableTakeProfit ? takeProfitToPlot : na, title="Take-Profit", color=color.yellow, linewidth=1, style=plot.style_linebr, offset=0, force_overlay=true)
// Plot the MACD and candles
plot(normalizedMacd, "Normalized MACD", color=color.new(color.purple, 0), linewidth=1, display=display.all)
h0 = hline(80, "Upper Band", color=#787B86)
hline(50, "Middle Band", color=color.new(#787B86, 50))
h1 = hline(20, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")
// New candle based on the sum of differences
plotcandle(open=0, high=differenceTotal, low=0, close=differenceTotal, color=(differenceTotal > 0 ? color.new(color.green, 60) : color.new(color.red, 60)), title="K-D + MACD Candles")