
La estrategia es un sistema de negociación inteligente que combina múltiples indicadores tecnológicos para identificar oportunidades de mercado a través de un análisis integral de la brecha de valor justo (FVG), las señales de tendencia y el comportamiento de los precios. El sistema utiliza un mecanismo de doble estrategia, que combina el seguimiento de tendencias y las características de las transacciones de banda, para optimizar el rendimiento de las operaciones a través de la gestión dinámica de la posición y el mecanismo de salida multidimensional.
La lógica central de la estrategia se basa en las siguientes dimensiones:
La estrategia utiliza una combinación de indicadores técnicos y técnicas de negociación para construir un sistema de negociación completo. Su ventaja radica en la capacidad de adaptarse a los cambios en el mercado, mientras se mantiene un control estricto del riesgo. Aunque hay cierto espacio para la optimización, en general, es una estrategia de negociación cuantitativa de diseño razonable.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-02-20 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=6
strategy("Adaptive Trend Signals", overlay=true, margin_long=100, margin_short=100, pyramiding=1, initial_capital=50000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
// 1. Enhanced Inputs with Debugging Options
fvgSize = input.float(0.25, "FVG Size (%)", minval=0.1, step=0.05)
atrPeriod = input.int(14, "ATR Period") // Increased for better stability
rsiPeriod = input.int(7, "RSI Period")
useSuperTrend = input.bool(true, "Use SuperTrend Filter")
useTrendFilter = input.bool(false, "Use 200 EMA Trend Filter") // Disabled by default
volatilityThreshold = input.float(1.0, "Volatility Threshold (ATR%)", step=0.1) // Increased threshold
useVolume = input.bool(true, "Use Volume Confirmation")
riskPercentage = input.float(2.0, "Risk %", minval=0.1, maxval=5)
// 2. Advanced Market Filters with Trend Change Detection
var int marketTrend = 0
var bool trendChanged = false
ema200 = ta.ema(close, 200)
prevMarketTrend = marketTrend
marketTrend := close > ema200 ? 1 : close < ema200 ? -1 : 0
trendChanged := marketTrend != prevMarketTrend
// 3. Enhanced FVG Detection with Adjusted Volume Requirements
bullishFVG = (low[1] > high[2] and (low[1] - high[2])/high[2]*100 >= fvgSize) or
(low > high[1] and (low - high[1])/high[1]*100 >= fvgSize)
bearishFVG = (high[1] < low[2] and (low[2] - high[1])/low[2]*100 >= fvgSize) or
(high < low[1] and (low[1] - high)/low[1]*100 >= fvgSize)
// 4. Smart Money Confirmation System with Signal Debugging
rsi = ta.rsi(close, rsiPeriod)
[macdLine, signalLine, _] = ta.macd(close, 5, 13, 5)
[supertrendLine, supertrendDir] = ta.supertrend(3, 10)
// Script 2 Indicators
[macdLine2, signalLine2, _] = ta.macd(close, 4, 11, 3)
[supertrendLine2, supertrendDir2] = ta.supertrend(3, 7)
vWAP = ta.vwap(close)
ema21 = ta.ema(close, 21)
// 5. Price Action Filters from Script 2
breakoutLong = close > ta.highest(high, 5) and (useVolume ? volume > ta.sma(volume, 10)*1.8 : true)
breakdownShort = close < ta.lowest(low, 5) and (useVolume ? volume > ta.sma(volume, 10)*1.8 : true)
bullishRejection = low < vWAP and close > (high + low)/2 and close > open
bearishRejection = high > vWAP and close < (high + low)/2 and close < open
// 6. Combined Entry Conditions
longBaseCond = (bullishFVG and rsi < 35 and macdLine > signalLine) or
(bullishFVG and rsi < 38 and supertrendDir2 == 1) or
(breakoutLong and macdLine2 > signalLine2) or
(bullishRejection and close > ema21)
shortBaseCond = (bearishFVG and rsi > 65 and macdLine < signalLine) or
(bearishFVG and rsi > 62 and supertrendDir2 == -1) or
(breakdownShort and macdLine2 < signalLine2) or
(bearishRejection and close < ema21)
longSignal = longBaseCond and (not useSuperTrend or supertrendDir == 1) and (not useTrendFilter or marketTrend == 1)
shortSignal = shortBaseCond and (not useSuperTrend or supertrendDir == -1) and (not useTrendFilter or marketTrend == -1)
// 7. Position Sizing with Minimum Quantity
var float longEntryPrice = na
var float shortEntryPrice = na
atr = ta.atr(atrPeriod)
positionSizeScript1 = math.max(strategy.equity * riskPercentage / 100 / (atr * 1.5), 1)
positionSizeScript2 = strategy.equity * riskPercentage / 100 / (atr * 2)
// 8. Dynamic Exit System with Dual Strategies
var float trailPrice = na
if longSignal or trendChanged and marketTrend == 1
trailPrice := close
if shortSignal or trendChanged and marketTrend == -1
trailPrice := close
trailOffset = atr * 0.75
// Script 1 Exit Logic
if strategy.position_size > 0
trailPrice := math.max(trailPrice, close)
strategy.exit("Long Exit", "Long", stop=trailPrice - trailOffset, trail_offset=trailOffset)
if strategy.position_size < 0
trailPrice := math.min(trailPrice, close)
strategy.exit("Short Exit", "Short", stop=trailPrice + trailOffset, trail_offset=trailOffset)
// Script 2 Exit Logic
longStop = close - atr * 1.2
shortStop = close + atr * 1.2
strategy.exit("Long Exit 2", "Long", stop=longStop, limit=na(longEntryPrice) ? na : longEntryPrice + (atr * 4), trail_points=not na(longEntryPrice) and close > longEntryPrice + atr ? atr * 3 : na, trail_offset=atr * 0.8)
strategy.exit("Short Exit 2", "Short", stop=shortStop, limit=na(shortEntryPrice) ? na : shortEntryPrice - (atr * 4), trail_points=not na(shortEntryPrice) and close < shortEntryPrice - atr ? atr * 3 : na, trail_offset=atr * 0.8)
// 9. Trend Change Signals and Visuals
// plot(supertrendLine, "SuperTrend", color=color.new(#2962FF, 0))
// plot(supertrendLine2, "SuperTrend 2", color=color.new(#FF00FF, 0))
// plot(ema200, "200 EMA", color=color.new(#FF6D00, 0))
// plot(ema21, "21 EMA", color=color.new(#00FFFF, 0))
bgcolor(marketTrend == 1 ? color.new(color.green, 90) :
marketTrend == -1 ? color.new(color.red, 90) : na)
plotshape(trendChanged and marketTrend == 1, "Bullish Trend", shape.labelup,
location.belowbar, color=color.green, text="▲ Trend Up")
plotshape(trendChanged and marketTrend == -1, "Bearish Trend", shape.labeldown,
location.abovebar, color=color.red, text="▼ Trend Down")
// 10. Signal Visualization for Both Strategies
// plotshape(longSignal, "Long Entry", shape.triangleup, location.belowbar,
// color=color.new(#00FF00, 0), size=size.small)
// plotshape(shortSignal, "Short Entry", shape.triangledown, location.abovebar,
// color=color.new(#FF0000, 0), size=size.small)
// plotshape(breakoutLong, "Breakout Long", shape.flag, location.belowbar,
// color=color.new(#00FF00, 50), size=size.small)
// plotshape(breakdownShort, "Breakdown Short", shape.flag, location.abovebar,
// color=color.new(#FF0000, 50), size=size.small)
// 11. Order Execution with Dual Entry Systems
if trendChanged and marketTrend == 1
strategy.entry("Long Trend", strategy.long, qty=positionSizeScript1)
longEntryPrice := close
if trendChanged and marketTrend == -1
strategy.entry("Short Trend", strategy.short, qty=positionSizeScript1)
shortEntryPrice := close
if longSignal and strategy.position_size == 0
strategy.entry("Long Signal", strategy.long, qty=positionSizeScript2)
longEntryPrice := close
if shortSignal and strategy.position_size == 0
strategy.entry("Short Signal", strategy.short, qty=positionSizeScript2)
shortEntryPrice := close