Sistema de negociação multiestratégia de rompimento-recuo-reversão de faixa de preço dinâmica

FVG 5M 1M R:R RANGE TRADING SCALPING
Data de criação: 2025-08-22 09:55:06 última modificação: 2025-08-22 09:55:06
cópia: 0 Cliques: 332
2
focar em
319
Seguidores

Sistema de negociação multiestratégia de rompimento-recuo-reversão de faixa de preço dinâmica Sistema de negociação multiestratégia de rompimento-recuo-reversão de faixa de preço dinâmica

Visão geral

A estratégia de negociação de breakout-retração-reversão de várias estratégias é uma estratégia de negociação diária projetada especialmente para comerciantes de curta linha, baseada na faixa de preços formada na linha K nos primeiros 5 minutos após o início do mercado. A estratégia integra três modos de entrada diferentes: breakout, trap e reversão, para negociação por meio da identificação de brechas de valor justo (FVG) e padrões de breakout de faixa de preço. A estratégia é especializada em períodos de alta volatilidade na primeira hora após a abertura do mercado de ações dos EUA (09:30-10:30 EST), executando negociações em um gráfico de 1 minuto e adotando um padrão de retorno de risco de 2: 1 para gerenciar a parada de perdas.

Princípio da estratégia

O princípio central da estratégia é baseado no padrão de comportamento do preço após a formação de um intervalo inicial no início do dia, dividido em três etapas:

  1. Distância marcada: 9:30 AM:

    • Aguarde os primeiros 5 minutos após a abertura da linha K ({9:30-9:35) para o fechamento
    • Marque o ponto mais alto e o ponto mais baixo da linha K como um intervalo de negociação
    • Mude para gráficos de 1 minuto para negociação real
  2. Encontrar um ponto de entrada (apenas uma hora após o início da negociação): A estratégia oferece três formas diferentes de entrada:

    • Breaking Entry (em inglês):

      • Necessidade de satisfazer a lacuna de valor justo (FVG)
      • Breakout de qualquer linha K no FVG
      • FVG é definido como um padrão de saltos formado por três linhas K (wick-gap)
    • Trap Entry (em inglês):

      • Os preços são os primeiros a ultrapassar as fronteiras regionais
      • E depois, retroceder para dentro do intervalo.
      • A última vez que o mercado fechou foi fora da zona.
    • Reversal Entry (em inglês):

      • Preço após fracasso de uma ruptura em uma direção
      • FVG que apareceu em sentido oposto voltou para dentro do intervalo
  3. Gestão de transações:

    • Configurações de parada:
      • Estratégia de ruptura/armadilha: usar o primeiro ponto de fechamento no mínimo/máximo da linha K fora do intervalo
      • Estratégia de inversão: ponto mínimo/alto da primeira linha K no modo FVG
    • Configuração de paragem:
      • Sempre com um risco/retorno de 2:1
      • Risco de \(100, ganho de \)200.

O código de estratégia implementa uma estrutura lógica completa, incluindo detecção automática de intervalos de negociação, identificação de várias condições de entrada, configuração de níveis de stop-loss e cálculo do tamanho apropriado da posição. O sistema também inclui filtros de tempo, garantindo negociação apenas em determinados períodos de tempo, e pode seletivamente ativar ou desativar diferentes estratégias de entrada.

Vantagens estratégicas

  1. Regras Simples e ClarasA lógica condicional e o rastreamento do estado no código garantem a rigorosa execução das regras.

  2. Flexibilidade em várias formas de entradaO código passa por três estratégias de entrada diferentes: Breakout, Trap e Reversal, que permitem aos traders adaptar-se a diferentes ambientes de mercado.enableBreakenableTrapeenableReversalOs parâmetros permitem essa flexibilidade.

  3. Concentre-se em períodos de alta probabilidadeEstratégia: negociar apenas na primeira hora após a abertura, aproveitando a alta volatilidade e liquidez que geralmente existem durante esse período.inWindowAs condições garantem que as transações sejam feitas apenas entre as 9h30 e as 10h30.

  4. Gestão rigorosa dos riscos: Risco-retorno fixo de 2: 1 e configuração de stop loss baseada em ações de preços específicos, fornecendo um controle de risco claro para cada transação.riskPctOs parâmetros permitem que o usuário ajuste a porcentagem de risco de cada transação de acordo com suas preferências de risco.

  5. Não há necessidade de indicadores complexos.A estratégia não se baseia em indicadores técnicos complexos, mas sim em comportamentos e estruturas de preços puros, reduzindo o risco de superalimento.

  6. Evitação sazonalO código inclui uma lista negra de feriados (de 15 de dezembro a 15 de janeiro) para evitar períodos de volatilidade ou baixa liquidez nos mercados.

  7. Gestão de posições flexívelO sistema oferece duas maneiras de gerenciamento de posições, baseadas na porcentagem de risco ou no número fixo de contratos, para atender a diferentes necessidades de gerenciamento de fundos.

Risco estratégico

  1. Risco de Falso BreakoutA estratégia é a combinação de armadilhas e entradas de reversão, mas ainda é necessário monitorar cuidadosamente.

  2. Problemas de largura de bandaSe o intervalo de linha K nos primeiros 5 minutos após a abertura for muito largo ou muito estreito, isso pode afetar a eficácia da estratégia. Um intervalo muito estreito pode levar a um sinal de disparo frequente, enquanto um intervalo muito largo pode levar a um ponto de parada muito longo.

  3. O custo de oportunidade de uma limitação de tempoA restrição é uma forma de disciplina que impede o excesso de negociação.

  4. Limites da taxa de retorno do risco fixoEmbora o RRR de 2:1 forneça consistência, pode não ser a melhor opção em certos cenários de mercado. Em mercados de forte tendência, um RRR mais alto pode ser mais adequado.

  5. A anomalia do mercado durante o feriadoApesar de a estratégia ter evitado a negociação entre 15 de dezembro e 15 de janeiro, o comportamento do mercado antes e depois de outros feriados também pode ser anormal e afetar a estratégia.

  6. Dependência do FVGA estratégia depende do padrão FVG em breaks e reversões, mas em certas condições de mercado, o FVG pode não ser facilmente formado ou identificado.

  7. As limitações de um único período de tempoA dependência total de um gráfico de 1 minuto pode fazer com que a estratégia ignore a estrutura de mercado importante em um período de tempo maior.

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

  1. Largura do intervalo de adaptaçãoConsidere-se a possibilidade de ajustar a largura do intervalo de acordo com a dinâmica da volatilidade do mercado, por exemplo, usando um intervalo mais amplo em dias de alta volatilidade e um intervalo mais estreito em dias de baixa volatilidade. Isso pode ser feito calculando o intervalo real médio de flutuação recente (ATR) ou um indicador similar.

  2. Optimizar a janela de tempoO estudo da janela de tempo de negociação ideal para diferentes mercados pode ser feito em vez de uma janela fixa de 9:30-10:30. Alguns mercados podem apresentar padrões de ruptura de intervalos mais evidentes em diferentes períodos de tempo.

  3. Configuração de risco-retorno dinâmicoPode-se ajustar a relação de risco-retorno de acordo com a situação do mercado e a dinâmica volátil, por exemplo, aumentando os objetivos quando a tendência é forte e diminuindo os objetivos na liquidação do mercado.

  4. Integração de indicadores de sentimento de mercadoConsidere a inclusão de indicadores de amplitude de mercado ou de volatilidade como filtros para evitar a negociação em condições adversas de mercado.

  5. Confirmação do Multi-Tempos: Embora a execução da negociação permaneça no gráfico de 1 minuto, pode-se adicionar condições de confirmação de períodos de tempo mais elevados, como a verificação de consistência da direção da tendência nos gráficos de 15 minutos ou 1 hora.

  6. Optimizar definições de FVGA definição atual do FVG é relativamente simples, podendo ser considerada uma definição mais complexa ou mais precisa da zona de desequilíbrio, como considerar o corpo do corpo e não apenas a linha de sombra.

  7. Adicionar confirmação de volumeA inclusão de confirmação de volume de transação nos requisitos de entrada pode melhorar a qualidade do sinal, especialmente para a entrada de ruptura.

  8. Adaptação de paradaA adaptação dos níveis de stop loss à dinâmica da volatilidade do mercado pode melhorar a adaptabilidade da estratégia em diferentes cenários de mercado.

Resumir

O sistema de negociação de estratégias dinâmicas de ruptura-retirada-reversão de intervalos de preço é uma estratégia de negociação diária estruturada, com regras claras, que busca oportunidades de negociação através da identificação de intervalos de preço que formam o mercado de manhã e os subsequentes padrões de ruptura, armadilha ou reversão. As principais vantagens da estratégia reside na sua simplicidade e flexibilidade em várias formas de entrada, enquanto os rigorosos limites de tempo e os princípios de gerenciamento de risco ajudam a manter a disciplina de negociação.

No entanto, a estratégia também enfrenta riscos de falsas rupturas, largura de intervalo inadequada e dependência de um determinado padrão de preços. A solidez e adaptabilidade da estratégia podem ser aumentadas ainda mais por meio de métodos de configuração de intervalos de otimização, ajuste de janelas de tempo, configuração dinâmica do risco-retorno e integração de análises de múltiplos períodos de tempo.

Em última análise, esta estratégia fornece um quadro sistemático para os comerciantes de linha curta, especialmente para os investidores que buscam uma negociação eficiente durante o horário de abertura do dia. Como todas as estratégias de negociação, deve-se fazer um bom feedback e uma gestão adequada do risco antes da aplicação.

Código-fonte da estratégia
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)

// -------------------- Inputs
enableBreak    = input.bool(true,  "Enable Break Entry")
enableTrap     = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr             = input.float(2.0,  "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false,  "One Trade Per Day")
showRange      = input.bool(true,  "Show 9:30 5m Range")

// Risk management
riskPct        = input.float(1.0,  "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode       = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)

// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1

// -------------------- Time helpers (chart is assumed New York time)
newDay   = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)

// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool  haveRange = false

// -------------------- State for entries
var bool  breakUpFound           = false
var bool  breakDownFound         = false
var float initBreakUpLow         = na    // for Break/Trap long SL
var float initBreakDownHigh      = na    // for Break/Trap short SL
var bool  trapUpRetestedInside   = false
var bool  trapDownRetestedInside = false
var bool  tradedToday            = false

// Reset daily state at midnight (chart timezone)
if newDay
    rangeHi := na
    rangeLo := na
    haveRange := false
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low  : na, barmerge.gaps_off, barmerge.lookahead_off)

// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
    rangeHi := sess0930Hi
    rangeLo := sess0930Lo
    haveRange := true
    // reset session-specific flags at start of trading window
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low",  color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)

plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)

// -------------------- Convenience conditions
closeAbove  = haveRange and close > rangeHi
closeBelow  = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo

// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
    if not breakUpFound and closeAbove
        breakUpFound := true
        initBreakUpLow := low
        trapUpRetestedInside := false
    if not breakDownFound and closeBelow
        breakDownFound := true
        initBreakDownHigh := high
        trapDownRetestedInside := false

// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
    if breakUpFound and not trapUpRetestedInside and closeInside
        trapUpRetestedInside := true
    if breakDownFound and not trapDownRetestedInside and closeInside
        trapDownRetestedInside := true

// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low  AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2])  and (high[1] < low[2])  and (high < low[2])

// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)

// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
    qty = 0
    if sizeMode == "Fixed contracts"
        qty := fixedContracts
    else
        riskCash = strategy.equity * riskPct / 100.0
        riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
        qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
    qty

// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
    // Long BREAK
    breakLongOk  = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
    if breakLongOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopL = na
        stopL := close[2] > rangeHi ? low[2] : stopL
        stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
        stopL := na(stopL) and close > rangeHi ? low : stopL
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
                strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short BREAK
    breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
    if breakShortOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopS = na
        stopS := close[2] < rangeLo ? high[2] : stopS
        stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
        stopS := na(stopS) and close < rangeLo ? high : stopS
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
                strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
    // Long TRAP
    if breakUpFound and trapUpRetestedInside and closeAbove
        stopL  = na(initBreakUpLow) ? low : initBreakUpLow
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
                strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short TRAP
    if breakDownFound and trapDownRetestedInside and closeBelow
        stopS  = na(initBreakDownHigh) ? high : initBreakDownHigh
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
                strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
    // After bearish break, bullish FVG back into range → LONG
    if breakDownFound and bullFVG and closeInside
        stopL  = low[2]  // first candle of the FVG
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_REV", strategy.long, qty=qtyL)
                strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // After bullish break, bearish FVG back into range → SHORT
    if breakUpFound and bearFVG and closeInside
        stopS  = high[2] // first candle of the FVG
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
                strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry,  title="Break Long",  style=shape.triangleup,   color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry,  title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap  and breakUpFound   and trapUpRetestedInside   and closeAbove and allowEntry,  title="Trap Long",  style=shape.circle, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap  and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry,  title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long",  style=shape.diamond, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound   and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")