Estratégia de negociação de futuros com stop loss dinâmico e múltiplos indicadores técnicos

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
Data de criação: 2025-04-02 09:41:48 última modificação: 2025-04-02 09:41:48
cópia: 0 Cliques: 381
2
focar em
319
Seguidores

Estratégia de negociação de futuros com stop loss dinâmico e múltiplos indicadores técnicos Estratégia de negociação de futuros com stop loss dinâmico e múltiplos indicadores técnicos

Visão geral da estratégia

A estratégia é um sistema de negociação de futuros avançado que combina condições técnicas múltiplas e análise de um período de tempo mais elevado para identificar oportunidades de negociação de alta probabilidade. Esta estratégia usa uma abordagem baseada em combinação de condições múltiplas, exigindo que várias condições técnicas sejam satisfeitas simultaneamente para entrar em negociação.

Princípio da estratégia

O núcleo da estratégia é o uso de uma combinação de métodos de análise técnica para garantir que as negociações sejam feitas somente quando vários indicadores dão sinais ao mesmo tempo. Concretamente, a estratégia contém os seguintes componentes-chave:

  1. Falha de valor justo (FVG)- É identificado quando há uma diferença de preço significativa entre duas barras, indicando que pode haver um espaço não preenchido no mercado.
  2. Bloco de pedidos- Estas são as áreas-chave para a formação de reversões de preços, que geralmente se manifestam como fortes colunas de rejeição, seguidas por áreas de suporte ou resistência.
  3. Análise de fluidez- Identificar situações em que o mercado se reverte após a ruptura de um pico ou de um ponto baixo prévio, o que geralmente indica que as grandes instituições estão coletando liquidez.
  4. A estrutura de ruptura (BOS)- surgem quando o preço quebra a estrutura anterior, formando um pico mais alto ou um pico mais baixo.
  5. Confirmação de tendências de alta periodicidade- EMAs de 15 minutos e 60 minutos para confirmar a direção da tendência geral.

A estratégia só gera um sinal de entrada se houver pelo menos dois requisitos básicos (um no modo de desbloqueio) além de um sinal de ruptura estrutural, que seja consistente com a tendência de um período de tempo mais alto.

Em termos de gerenciamento de risco, a estratégia usa o ATR (Average True Range) para definir a posição de parada dinâmica, com uma distância de parada normalmente 1,5 vezes maior que o ATR. Esta abordagem aumenta a distância de parada em altas ondas e diminui a distância em baixas ondas, tornando a parada mais inteligente.

A estratégia utiliza um método de lucro em lotes para obter 50% da posição quando a posição atinge um lucro equivalente ao risco ((1R)), ao mesmo tempo em que move os perdas de parada para a posição de garantia, criando uma oportunidade de negociação sem risco. Além disso, há um mecanismo de saída baseado no tempo, que será automaticamente fechado se a negociação não se mover na direção favorável dentro do tempo especificado (default 30 minutos).

Além disso, a estratégia também inclui a função de gerenciamento de contas, que automaticamente extingue todas as posições quando as receitas da conta atingem o objetivo predefinido (US \( 3.000) ou acionam o stop loss (US \) 2.500 ou mais para o rastreamento da conta).

Vantagens estratégicas

Depois de uma análise aprofundada do código, podemos concluir que há algumas vantagens óbvias:

  1. Sistema de confirmação múltipla- Requisitos de vários requisitos técnicos para a admissão, reduzindo efetivamente os falsos sinais e melhorando a qualidade das transações.
  2. Gestão inteligente de riscos- O uso de stop-loss dinâmico baseado no ATR é mais adaptável às mudanças na volatilidade do mercado do que o stop-loss de pontos fixos ou percentual.
  3. Filtragem de tendências de alta periodicidade- Utilize a direção da tendência em períodos de tempo mais elevados e negocie apenas na direção da tendência, evitando a negociação contracorrente.
  4. Estratégia de segmentação de lucro- Por meio da obtenção de lucros em lotes e da movimentação de perdas para a posição de garantia, garante o bloqueio parcial dos lucros e oferece uma oportunidade sem risco para as posições restantes.
  5. Mecanismo de saída com base no tempo- Sair automaticamente de transações inválidas, evitando que os fundos fiquem presos em transações sem incentivo por um longo período.
  6. Gerenciamento de contas- Proteger o lucro da conta global, através da definição de metas de lucro e de stop-loss, e garantir uma gestão sólida dos fundos.
  7. Altamente adaptável- Uma alta flexibilidade através de vários parâmetros, que podem ser ajustados de acordo com diferentes condições de mercado e estilos de negociação.
  8. Integração de indicadores técnicos especializados- Combina vários conceitos de análise técnica avançada, geralmente usados apenas por traders profissionais.

Risco estratégico

Apesar da estratégia ser bem concebida, existem alguns riscos potenciais, incluindo:

  1. Riscos de otimização de parâmetros- A estratégia depende de várias configurações de parâmetros, e se a otimização excessiva pode levar a um excesso de ajuste, o desempenho será ruim em condições de mercado futuras. A solução é usar um ciclo de teste suficientemente longo e testar para a frente.
  2. Dependência do ambiente de mercado- A estratégia pode funcionar bem em mercados de tendência, mas pode produzir mais falsos sinais em mercados de intervalo. A solução é adicionar filtros de ambiente de mercado, ajustar a frequência de negociação ou parar de negociar completamente quando identificado como um mercado de choque.
  3. Execução de risco de deslizamento- Durante períodos de alta volatilidade, os preços de entrada e saída podem ter grandes diferenças em relação às expectativas, afetando o desempenho da estratégia. A solução é simular pontos de deslizamento reais em retrospectivas e usar a lista de preços de limite em vez da lista de preços de mercado na negociação real.
  4. Risco de falha técnica- Sistemas de negociação automatizados podem enfrentar falhas técnicas ou interrupções na rede. A solução é criar sistemas de backup e mecanismos de intervenção manual.
  5. Gestão da complexidade- A complexidade das estratégias pode dificultar o diagnóstico ou a compreensão de por que certas transações falham. A solução é manter um registro detalhado das transações e analisar periodicamente o desempenho da estratégia.
  6. Risco de liquidez de mercado- Em determinadas condições de mercado, como antes e depois de uma notícia importante, a liquidez pode diminuir rapidamente, resultando em um deslizamento maior ou impossibilidade de sair de uma posição. A solução é evitar a negociação durante a divulgação de dados econômicos importantes ou reduzir o tamanho da posição durante esses períodos.

Direção de otimização da estratégia

Com base na análise do código, aqui estão algumas potenciais direções de otimização:

  1. Identificação de tendências- A estratégia atual usa um simples cruzamento de EMA para determinar a tendência. Pode-se considerar a adição de outros indicadores de tendência, como o ADX, para confirmar a força da tendência, pois os mercados de forte tendência geralmente oferecem melhores oportunidades de negociação.
  2. Adaptação do mercado- Adição de mecanismos de identificação de estado de mercado para ajustar automaticamente os parâmetros da estratégia em diferentes ambientes de mercado (trend, intervalos, alta e baixa volatilidade). Isso permite que a estratégia seja mais flexível e se adapte a diferentes condições de mercado.
  3. Otimização do tempo de entrada- Considere a adição de indicadores de momentum como o RSI ou indicadores aleatórios, para garantir que a entrada seja na direção da tendência, evitando também a entrada em caso de sobrecompra ou sobrevenda excessiva, reduzindo assim o risco de reversão.
  4. Melhorar estratégias de lucro- Os lucros 1R fixos atuais podem ser muito conservadores ou muito radicais, e pode-se considerar ajustar dinamicamente os objetivos de lucro com base na volatilidade ou nos níveis de suporte/resistência, definindo objetivos mais distantes quando há maior volatilidade.
  5. Gestão de Riscos de Refinamento- Introdução de um mecanismo de ajustamento dinâmico do tamanho da posição para ajustar automaticamente a abertura de risco de acordo com o desempenho recente da estratégia e a volatilidade do mercado, aumentando o risco quando a estratégia funciona bem e reduzindo o risco quando funciona mal.
  6. Adicionar um filtro de tempo diário- Os mercados de futuros têm características diferentes em diferentes períodos de tempo, e adicionar um filtro de tempo pode evitar períodos de baixa liquidez ou falta de direção.
  7. Integração de indicadores de sentimento de mercado- Adição de indicadores de sentimento de mercado, como o VIX, para ajustar parâmetros de estratégia ou suspender a negociação em caso de extremo sentimento.
  8. Otimizar a eficiência do código- Existem algumas operações em ciclo no código atual que podem afetar a eficiência de execução, especialmente em um menor período de tempo. Otimizar esses ciclos pode aumentar a velocidade de resposta da estratégia.

Resumir

Trata-se de uma estratégia de negociação de futuros multi-indicadores bem concebida, que incorpora vários conceitos avançados de análise técnica e possui funções de gerenciamento de risco e gestão de fundos perfeitamente desenvolvidas. Ela reduz os falsos sinais, exigindo que várias condições sejam simultaneamente atendidas e a confirmação de tendências de alto período de tempo, enquanto usa uma estratégia de stop loss e batch profit baseada em ATR para otimizar a taxa de retorno de risco.

A principal vantagem da estratégia reside no seu sistema de confirmação multicamadas e na sua gestão inteligente de riscos, permitindo-lhe capturar oportunidades de negociação de alta probabilidade, mantendo um nível de risco baixo. Contudo, a complexidade da estratégia também traz desafios de otimização de parâmetros e adaptabilidade ao mercado, que necessitam de ser mantidos em vigor através de monitorização contínua e de ajustes periódicos.

A estratégia tem o potencial de manter um desempenho estável em diferentes ambientes de mercado, através da implementação de medidas de otimização recomendadas, em particular, reforçando a capacidade de adaptação ao estado do mercado e melhorando o sistema de gestão de risco. Em geral, é uma estratégia avançada para uso de traders experientes e, com a devida monitorização e adaptação, pode ser uma ferramenta poderosa no sistema de negociação.

Código-fonte da estratégia
/*backtest
start: 2024-04-02 00:00:00
end: 2025-04-01 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")