
A estratégia de negociação de ruptura e reversão de múltiplos indicadores é uma estratégia de negociação quantitativa que combina a análise técnica de indicadores e o comportamento dos preços, com o objetivo de capturar as duas principais oportunidades de negociação no mercado: a reversão de preços e a ruptura de tendências. A estratégia integra habilmente vários indicadores técnicos, como a média móvel, o índice de força relativamente forte (RSI), o alcance real médio (ATR) e o preço médio ponderado pelo volume de negociação (VWAP), ao mesmo tempo em que introduz um mecanismo de ruptura entre as faixas de negociação (ORB) para aumentar a confiabilidade do sinal de entrada. A estratégia usa um design de parada de duplo objetivo e possui um mecanismo de gestão de risco que automaticamente ajusta o stop loss até o ponto de equilíbrio de equilíbrio, especialmente adequado para aplicações em períodos de tempo curtos, como o gráfico de 2 minutos.
O princípio central da estratégia é identificar três categorias de oportunidades de negócios potencialmente lucrativas, filtradas e confirmadas por múltiplos indicadores:
Sinal de negociação inverso:
Sinais de ruptura da tendência:
Sinal de ruptura ORB:
A estratégia usa o indicador ATR para calcular a posição de stop loss dinâmica, definida por um período retrospectivo de preço mínimo/máximo de um determinado período (default 7) e multiplicado por um valor de ATR reduzido (default 0.5). Após a entrada, a estratégia define dois objetivos de stop loss:
Quando o primeiro objetivo de stop-loss é atingido, a estratégia automaticamente ajusta o stop-loss para o preço de entrada, protegendo efetivamente os lucros obtidos.
Sinais de entrada diversificadosA estratégia é capaz de se adaptar a vários ambientes de mercado, aumentando efetivamente as oportunidades de negociação, enquanto mantém uma alta qualidade de sinal.
Uma boa gestão de riscosA estratégia usa um mecanismo de parada gradual, permitindo que parte dos lucros seja obtida e, ao mesmo tempo, os lucros potenciais sejam preservados. Quando o primeiro objetivo de parada é atingido, o stop loss é automaticamente ajustado para o ponto de equilíbrio de ganhos e perdas, protegendo o capital ao mesmo tempo em que permite que os lucros corram.
Calculação de stop loss dinâmicoO uso do indicador ATR para calcular a posição de stop loss permite que o nível de stop loss seja ajustado de acordo com a dinâmica de volatilidade do mercado, refletindo com mais precisão a situação atual do mercado, evitando uma configuração de stop loss muito apertada ou muito relaxada.
Confirmação de transaçãoIntrodução de um mecanismo de confirmação de volume de transações, especialmente no sinal ORB, que exige que o volume de transações no momento da ruptura seja superior a um determinado múltiplo do volume de transações médias no período de abertura, filtrando efetivamente as rupturas de baixa qualidade.
Filtragem de tendências: Determine a direção da tendência a longo prazo através da média móvel simples de 200 períodos (SMA200), assegure que a direção da negociação esteja de acordo com as principais tendências e aumente a taxa de sucesso da negociação.
Integração da gestão de fundosEstratégia: Mecanismos de gerenciamento de fundos embutidos, limitação da proporção de fundos utilizados em cada transação (default de 50% de capital), assegura a diversificação da distribuição de fundos e reduz o risco de uma única transação.
Solução: Considere aumentar os indicadores prospectivos, como a identificação de padrões de comportamento dos preços, ou reduzir os parâmetros das médias móveis de períodos mais longos, aumentando a sensibilidade às mudanças no mercado.
Solução: Adotar métodos apropriados de otimização de parâmetros, como validação em frente, simulação de Monte Carlo, evitando otimização excessiva; ou usar parâmetros fixos, com foco em um design de regras mais robusto.
Solução: criar um sistema de prioridade de sinal mais rigoroso ou introduzir mecanismos de confirmação adicionais para garantir que as transações sejam executadas apenas em casos de alta probabilidade.
Solução: Considere usar estratégias de hedge de opções, ou aumentar a distância de parada em condições de mercado altamente voláteis, ou até mesmo reduzir temporariamente o tamanho da posição.
Solução: Implementar controle de risco global, limitar o tamanho da posição global ou dispersar a negociação entre as diferentes classes de ativos, reduzindo o risco de correlação.
Motivo de otimização: combinações de indicadores de peso fixo tradicionais têm dificuldade em se adaptar a diferentes fases do mercado, enquanto a aprendizagem de máquina pode aprender automaticamente o padrão de combinação de indicadores ideal a partir de dados históricos.
Motivos de otimização: O sentimento do mercado tem uma influência significativa sobre a movimentação de preços no curto prazo. A integração de indicadores como este permite capturar os pontos de inflexão do mercado com antecedência, otimizando o momento de entrada e saída.
Motivo de otimização: o retorno do risco fixo pode não ser flexível o suficiente em diferentes cenários de mercado, e o ajuste dinâmico pode definir objetivos mais longos em mercados de alta volatilidade e objetivos mais conservadores em mercados de baixa volatilidade.
Motivo de otimização: A atividade do mercado mostra uma diferença significativa em diferentes momentos do dia, e o filtro de tempo pode ajudar a estratégia a se concentrar nos momentos de negociação mais vantajosos.
Motivo de otimização: o risco está diretamente relacionado com a volatilidade do mercado, e a gestão de posições dinâmica permite manter níveis de risco mais consistentes e melhorar o rendimento ajustado ao risco a longo prazo.
A estratégia de negociação de ruptura e reversão de múltiplos indicadores é um sistema de negociação quantitativa abrangente que combina vários métodos de análise técnica, integrando sinais de ruptura de reversão, ruptura de tendência e ruptura entre os intervalos de abertura, combinados com um mecanismo de gerenciamento de risco e gerenciamento de fundos perfeitos, com o objetivo de capturar oportunidades de negociação em vários ambientes de mercado. Os principais benefícios da estratégia são a diversificação de sinais, o controle de risco perfeito e a capacidade de personalização de parâmetros, especialmente adequados para negociação de curto prazo.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-03-31 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Reversal & Breakout Strategy with ORB", overlay=true, pyramiding=2, initial_capital=50000)
// --- Inputs ---
ema9Length = input.int(9, "9 EMA Length", minval=1)
ema20Length = input.int(20, "20 EMA Length", minval=1)
sma50Length = input.int(50, "50 SMA Length", minval=1)
sma200Length = input.int(200, "200 SMA Length", minval=1)
rsiLength = input.int(14, "RSI Length", minval=1)
rsiOverbought = input.int(70, "RSI Overbought", minval=0, maxval=100)
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=100)
atrLength = input.int(14, "ATR Length", minval=1)
stopMulti = input.float(0.5, "Stop Loss ATR Multiplier", minval=0.1, step=0.1)
stopLookback = input.int(7, "Stop Loss Lookback", minval=1)
rr1 = input.float(0.5, "Risk:Reward Target 1", minval=0.1, step=0.1)
rr2 = input.float(1.1, "Risk:Reward Target 2", minval=0.1, step=0.1)
target1Percent = input.float(25, "Profit % Target 1", minval=0, maxval=100)
orbBars = input.int(15, "Opening Range Bars", minval=1, tooltip="Number of bars to define the opening range (e.g., 15 bars = 30 min on 2-min chart)")
volThreshold = input.float(1.5, "Volume Threshold Multiplier", minval=1.0, step=0.1, tooltip="Volume must be this multiple of the opening range average")
// --- Indicators ---
// Moving Averages
ema9 = ta.ema(close, ema9Length)
ema20 = ta.ema(close, ema20Length)
sma50 = ta.sma(close, sma50Length)
sma200 = ta.sma(close, sma200Length)
// VWAP
vwapValue = ta.vwap(close)
// RSI
rsi = ta.rsi(close, rsiLength)
// ATR
atr = ta.atr(atrLength)
// --- Opening Range Breakout ---
var float openingRangeHigh = na
var float openingRangeLow = na
var float openingRangeAvgVol = na
if bar_index < orbBars
openingRangeHigh := na
openingRangeLow := na
openingRangeAvgVol := na
else if bar_index == orbBars
openingRangeHigh := ta.highest(high, orbBars)
openingRangeLow := ta.lowest(low, orbBars)
openingRangeAvgVol := ta.sma(volume, orbBars)
orbLong = not na(openingRangeHigh) and ta.crossover(close, openingRangeHigh) and volume > openingRangeAvgVol * volThreshold
orbShort = not na(openingRangeLow) and ta.crossunder(close, openingRangeLow) and volume > openingRangeAvgVol * volThreshold
// --- Trend Detection ---
trendUp = close > sma200
trendDown = close < sma200
// --- Reversal Conditions ---
reversalLong = ta.crossover(close, sma50) and rsi < rsiOversold and close < vwapValue and trendUp
reversalShort = ta.crossunder(close, sma50) and rsi > rsiOverbought and close > vwapValue and trendDown
// --- Range Breakout Conditions ---
breakoutLong = ta.crossover(ema9, ema20) and close > vwapValue and trendUp
breakoutShort = ta.crossunder(ema9, ema20) and close < vwapValue and trendDown
// Combine conditions
longCondition = (reversalLong or breakoutLong or orbLong)
shortCondition = (reversalShort or breakoutShort or orbShort)
// --- Calculate Position Size ---
equityPerPosition = 25000.0 // $50,000 / 2 positions
positionSizeLong = math.floor(equityPerPosition / close)
positionSizeShort = math.floor(equityPerPosition / close)
// --- Stop Loss Calculation ---
longStop = ta.lowest(low, stopLookback) - (atr * stopMulti)
shortStop = ta.highest(high, stopLookback) + (atr * stopMulti)
// --- Variables to Store Trade Levels ---
var float tradeStop = na
var float tradeTarget1 = na
var float tradeTarget2 = na
var float initialPositionSize = na
var bool breakEvenSet = false // Track if stop has been moved to break-even
var float stopLevel = na // Dedicated variable for stop loss in exits
var float target1Level = na // Dedicated variable for first take profit
var float target2Level = na // Dedicated variable for second take profit
var float qtyTotal = na // Track total quantity
// --- Reset Levels Before New Trade ---
var bool newTrade = false
if longCondition or shortCondition
newTrade := true
else
newTrade := false
if strategy.position_size == 0 and newTrade
tradeStop := na
tradeTarget1 := na
tradeTarget2 := na
stopLevel := na
target1Level := na
target2Level := na
initialPositionSize := na
qtyTotal := na
breakEvenSet := false
// --- Strategy Entries ---
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=positionSizeLong * 2)
tradeStop := longStop
stopLevel := longStop
stopDistance = close - tradeStop
tradeTarget1 := close + (stopDistance * rr1)
tradeTarget2 := close + (stopDistance * rr2)
target1Level := tradeTarget1
target2Level := tradeTarget2
initialPositionSize := positionSizeLong * 2
qtyTotal := positionSizeLong * 2
breakEvenSet := false // Reset break-even flag
if shortCondition and strategy.position_size == 0
strategy.entry("Short", strategy.short, qty=positionSizeShort * 2)
tradeStop := shortStop
stopLevel := shortStop
stopDistance = tradeStop - close
tradeTarget1 := close - (stopDistance * rr1)
tradeTarget2 := close - (stopDistance * rr2)
target1Level := tradeTarget1
target2Level := tradeTarget2
initialPositionSize := positionSizeShort * 2
qtyTotal := positionSizeShort * 2
breakEvenSet := false // Reset break-even flag
// --- Trade Exits ---
if strategy.position_size > 0
qty_tp1 = qtyTotal * (target1Percent / 100)
qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
strategy.exit("Long Exit 1", "Long", qty=qty_tp1, stop=stopLevel, limit=target1Level)
strategy.exit("Long Exit 2", "Long", qty=qty_tp2, stop=stopLevel, limit=target2Level)
if strategy.position_size < 0
qty_tp1 = qtyTotal * (target1Percent / 100)
qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
strategy.exit("Short Exit 1", "Short", qty=qty_tp1, stop=stopLevel, limit=target1Level)
strategy.exit("Short Exit 2", "Short", qty=qty_tp2, stop=stopLevel, limit=target2Level)
// --- Move Stop to Break-even ---
if strategy.position_size != 0 and not na(initialPositionSize) and not breakEvenSet
if math.abs(strategy.position_size) < math.abs(initialPositionSize)
tradeStop := strategy.position_avg_price
stopLevel := strategy.position_avg_price
tradeTarget1 := na // Clear first target for plotting
breakEvenSet := true // Mark break-even as set
// --- Manual Close Fallback ---
if strategy.position_size > 0
if close >= target2Level or close <= stopLevel
strategy.close("Long", qty=qtyTotal, comment="Manual Close")
if strategy.position_size < 0
if close <= target2Level or close >= stopLevel
strategy.close("Short", qty=qtyTotal, comment="Manual Close")
// --- Reset Levels When No Position ---
if strategy.position_size == 0 and not newTrade
tradeStop := na
tradeTarget1 := na
tradeTarget2 := na
stopLevel := na
target1Level := na
target2Level := na
initialPositionSize := na
qtyTotal := na
breakEvenSet := false
// --- Plotting ---
plot(tradeStop, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(tradeTarget1, title="Take Profit 1", color=color.green, linewidth=1, style=plot.style_linebr)
plot(tradeTarget2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)