Estratégias de negociação quantitativa eficientes com base em faixas de preço e avanços

Pivot CONSOLIDATION ZONE BREAKOUT
Data de criação: 2025-02-20 11:41:51 última modificação: 2025-02-27 17:46:06
cópia: 2 Cliques: 363
2
focar em
319
Seguidores

Estratégias de negociação quantitativa eficientes com base em faixas de preço e avanços Estratégias de negociação quantitativa eficientes com base em faixas de preço e avanços

Visão geral

Trata-se de uma estratégia de negociação quantitativa e eficiente baseada em intervalos de preço e rupturas. A estratégia funciona principalmente identificando os intervalos de liquidação no mercado e negociando quando os preços atravessam esses intervalos. A estratégia usa o indicador ZigZag para identificar pontos de preço críticos, combinando pontos altos e baixos para definir os intervalos de liquidação e sinalizar negociações quando os preços atravessam esses intervalos.

Princípio da estratégia

A lógica central da estratégia inclui os seguintes passos-chave:

  1. Identificar pontos de inflexão importantes através de preços mais altos e mais baixos no período de loopback
  2. Segue os movimentos de preços usando o algoritmo ZigZag para identificar pontos de suporte e resistência
  3. Confirmar o intervalo de consolidação válido definindo o comprimento mínimo de consolidação
  4. Atualização dinâmica dos limites superiores e inferiores, acompanhamento em tempo real das mudanças na região
  5. Triggerar um sinal de negociação quando o preço ultrapassar o intervalo de liquidação

Vantagens estratégicas

  1. Adaptabilidade - estratégias capazes de identificar e atualizar intervalos de liquidação de forma dinâmica, adaptando-se a diferentes cenários de mercado
  2. Risco controlado - fornece uma posição de stop loss clara para a negociação, definida por um claro intervalo de liquidação
  3. Suporte de visualização - fornece visualizações das áreas de liquidação para ajudar os comerciantes a entender o estado do mercado
  4. Negociação bidirecional - apoiar oportunidades de negociação para cima e para baixo, maximizando oportunidades de mercado
  5. Parâmetros ajustáveis - oferece vários parâmetros ajustáveis para facilitar a otimização de acordo com diferentes características do mercado

Risco estratégico

  1. Risco de Falso Breakout - o mercado pode ter um Falso Breakout, o que pode levar a falhas de negociação
  2. Risco de deslizamento - pode haver um deslizamento maior em situações de velocidade
  3. Dependência do cenário de mercado - estratégias que funcionam bem em mercados de turbulência, mas podem não funcionar bem em mercados de tendência
  4. Sensibilidade de parâmetros - configuração inadequada de parâmetros pode afetar o desempenho da política
  5. Risco de gestão de fundos - necessidade de controlar razoavelmente a quantidade de fundos em cada transação

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

  1. Introdução de indicadores de volume de negócios - confirmação da eficácia dos avanços através do volume de negócios
  2. Otimizar o tempo de entrada - aumentar o mecanismo de confirmação de chamadas de volta e melhorar a qualidade da entrada
  3. Melhorar os mecanismos de suspensão de perdas - conceber estratégias de suspensão de perdas mais flexíveis
  4. Aumentar o filtro do cenário de mercado - adicionar o discernimento de tendências e operar no cenário de mercado apropriado
  5. Parâmetros de otimização adaptam-se automaticamente à volatilidade do mercado

Resumir

Trata-se de uma estratégia de negociação quantitativa concebida de forma racional e logicamente clara. Oferece aos comerciantes um sistema de negociação confiável através da identificação de intervalos de compensação e da captura de sinais de ruptura. O efeito de visualização da estratégia e a flexibilidade dos parâmetros a tornam mais prática.

Código-fonte da estratégia
/*backtest
start: 2024-09-01 00:00:00
end: 2025-02-18 08:00:00
period: 5d
basePeriod: 5d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

// This code is released under the Mozilla Public License 2.0
// More details at: https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue

//@version=5
strategy("Consolidation Zones - Live [Strategy]", overlay=true, max_bars_back=1100)

//-----------------------------------------------------------------------//
//                        Input Variables
//-----------------------------------------------------------------------//
prd       = input.int(defval=10, title="Loopback Period", minval=2, maxval=50)
conslen   = input.int(defval=5,  title="Min. Consolidation Length", minval=2, maxval=20)
paintcons = input.bool(defval=true, title="Color Consolidation Zone?")
zonecol   = input.color(defval=color.new(color.blue, 70), title="Zone Color")

//-----------------------------------------------------------------------//
//                  Variables and Calculations for ZZ (ZigZag) Detection
//-----------------------------------------------------------------------//

// Check if the bar has the highest High or lowest Low in the last prd bars
float hb_ = ta.highestbars(prd) == 0 ? high : na
float lb_ = ta.lowestbars(prd)  == 0 ? low  : na

// Convert to bool to check if hb_ and lb_ are valid (not na)
bool hasHb = not na(hb_)
bool hasLb = not na(lb_)

// Direction variable to determine the trend, based on the last high or low pivot
var int dir = 0

// ZigZag value and last pivot
float zz = na
float pp = na

// 1) Determine direction based on whether a high or low pivot occurred
dir := if hasHb and not hasLb
    1
else if hasLb and not hasHb
    -1
else
    dir  // unchanged direction

// 2) If both a high and low pivot occurred in the same bar
bool sameBar = hasHb and hasLb
if sameBar
    if dir == 1
        zz := hb_
    else
        zz := lb_
else
    zz := hasHb ? hb_ : (hasLb ? lb_ : na)

// 3) Storing last pivots (pp) - iterate over older bars
for x = 0 to 1000
    if na(close) or dir != dir[x]
        break
    if not na(zz[x])  // if zz[x] is a valid value
        if na(pp)
            pp := zz[x]
        else
            if dir[x] == 1 and zz[x] > pp
                pp := zz[x]
            if dir[x] == -1 and zz[x] < pp
                pp := zz[x]

//-----------------------------------------------------------------------//
//                Logic for Consolidation Zone Detection
//-----------------------------------------------------------------------//
var int   conscnt    = 0
var float condhigh   = na
var float condlow    = na

float H_ = ta.highest(conslen)
float L_ = ta.lowest(conslen)

var line upline      = na
var line dnline      = na

bool breakoutup    = false
bool breakoutdown  = false

// Check if pp has changed
bool changedPP = ta.change(pp) != 0

if changedPP
    // If enough candles are in consolidation, check for breakout
    if conscnt > conslen and not na(condhigh) and not na(condlow) and not na(pp)
        if pp > condhigh
            breakoutup := true
        if pp < condlow
            breakoutdown := true
    
    // Check if we are still "in the zone"
    bool inZone = conscnt > 0 and not na(pp) and not na(condhigh) and not na(condlow) and (pp <= condhigh) and (pp >= condlow)
    if inZone
        conscnt += 1
    else
        conscnt := 0
else
    // No change in pivot -> continue consolidation
    conscnt += 1

if conscnt >= conslen
    // At the first "touch" of the required number of candles
    if conscnt == conslen
        condhigh := H_
        condlow  := L_
    else
        condhigh := math.max(condhigh, high)
        condlow  := math.min(condlow, low)
    

//-----------------------------------------------------------------------//
//                          Drawing Fill
//-----------------------------------------------------------------------//
// Declare two plot variables (just ordinary assignment)
condHighPlot = plot(condhigh, color=na, style=plot.style_stepline)
condLowPlot  = plot(condlow,  color=na, style=plot.style_stepline)

// bool to check if we want to color the zone
bool doFill = paintcons and (conscnt > conslen)

// Calling fill
fill(condHighPlot, condLowPlot, color= doFill ? zonecol : color.new(color.white, 100))

//-----------------------------------------------------------------------//
//                          Alerts & STRATEGY
//-----------------------------------------------------------------------//
alertcondition(breakoutup,   title="Breakout Up",   message="Breakout Up")
alertcondition(breakoutdown, title="Breakout Down", message="Breakout Down")

if breakoutup
    // Close short first
    if strategy.position_size < 0
        strategy.close("Breakout Short")
    // Open LONG
    strategy.entry("Breakout Long", strategy.long)

if breakoutdown
    // Close long first
    if strategy.position_size > 0
        strategy.close("Breakout Long")
    // Open SHORT
    strategy.entry("Breakout Short", strategy.short)