
A estratégia é um sistema de negociação inteligente que combina vários indicadores tecnológicos para identificar oportunidades de mercado por meio de uma análise integrada do Fair Value Gap (FVG), sinais de tendência e comportamento de preços. O sistema usa um mecanismo de dupla estratégia, combinando o acompanhamento de tendências e características de negociação de faixas, para otimizar o desempenho das negociações por meio de gerenciamento de posição dinâmico e mecanismo de saída multidimensional.
A lógica central da estratégia baseia-se nas seguintes dimensões:
A estratégia utiliza vários indicadores técnicos e técnicas de negociação para construir um sistema de negociação completo. Sua vantagem reside na capacidade de se adaptar às mudanças do mercado, mantendo um controle rigoroso do risco. Embora haja algum espaço para otimização, é uma estratégia de negociação quantitativa razoavelmente projetada.
/*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