
La estrategia es un sistema de negociación dinámico que combina un indicador aleatorio relativamente débil (SRSI) y un indicador de tendencia/diferencia de medias móviles (MACD). Se ajusta dinámicamente el punto de parada y el punto de parada a través del indicador ATR, lo que permite la gestión inteligente del riesgo. El núcleo de la estrategia consiste en generar señales de negociación mediante la confirmación cruzada de múltiples indicadores técnicos, al tiempo que se gestiona la posición en combinación con la volatilidad del mercado.
El funcionamiento de la estrategia se basa en los siguientes mecanismos:
La estrategia combina las ventajas del SRSI y el MACD para construir un sistema de negociación sólido. El mecanismo de gestión de riesgos dinámico lo hace muy adaptable, pero aún requiere que el comerciante optimice los parámetros en función de las condiciones reales del mercado. El funcionamiento exitoso de la estrategia requiere un profundo entendimiento del mercado y una gestión razonable de las posiciones combinada con la capacidad de asumir el riesgo de los individuos.
/*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")