Estrategias comerciales cuantitativas eficientes basadas en rangos de precios y avances

Pivot CONSOLIDATION ZONE BREAKOUT
Fecha de creación: 2025-02-20 11:41:51 Última modificación: 2025-02-27 17:46:06
Copiar: 2 Número de Visitas: 363
2
Seguir
319
Seguidores

Estrategias comerciales cuantitativas eficientes basadas en rangos de precios y avances Estrategias comerciales cuantitativas eficientes basadas en rangos de precios y avances

Descripción general

Se trata de una estrategia de trading cuantitativa eficiente basada en rangos de precios y rupturas. La estrategia se basa principalmente en identificar los rangos de reajuste en el mercado y en operar cuando los precios superan estos rangos. La estrategia utiliza el indicador ZigZag para identificar los puntos de precio clave, combinando los puntos altos y bajos que definen las zonas de reajuste y emitiendo señales de operación cuando los precios superan estos rangos.

Principio de estrategia

La lógica central de la estrategia incluye los siguientes pasos clave:

  1. Identificar los puntos de inflexión importantes a través de los máximos y mínimos de los precios en el período de retroceso
  2. Sigue el movimiento de los precios con el algoritmo ZigZag para determinar los puntos clave de soporte y resistencia
  3. Confirmar el intervalo de consolidación válido estableciendo la longitud mínima de consolidación
  4. Actualización dinámica de los límites superiores e inferiores, seguimiento en tiempo real de los cambios en la zona de comprobación
  5. Se activa una señal de negociación cuando el precio supera el rango de reestructuración

Ventajas estratégicas

  1. Adaptabilidad: las estrategias pueden identificar y actualizar de forma dinámica los intervalos de recaudación para adaptarse a diferentes entornos del mercado.
  2. Riesgo controlado - ofrece una clara posición de stop loss para las operaciones mediante una clara definición de los rangos de liquidación
  3. Soporte de visualización - proporciona una visualización de las zonas de balanceo para ayudar a los operadores a entender el estado del mercado
  4. Negociación bidireccional - Apoyar las oportunidades de negociación de ruptura hacia arriba y hacia abajo para maximizar las oportunidades de mercado
  5. Parámetros ajustables - Ofrece varios parámetros ajustables para optimizar según las diferentes características del mercado

Riesgo estratégico

  1. Riesgo de brechas falsas - el mercado puede sufrir brechas falsas, lo que puede conducir al fracaso de las operaciones
  2. Riesgo de deslizamiento - Es posible que se produzcan deslizamientos más grandes a alta velocidad
  3. Dependencia del entorno del mercado: las estrategias pueden funcionar mejor en mercados convulsionados, pero pueden funcionar peor en mercados de tendencia.
  4. Sensibilidad de los parámetros - la configuración incorrecta de los parámetros puede afectar el rendimiento de la política
  5. Riesgo de gestión de fondos: control razonable del volumen de fondos en cada transacción

Dirección de optimización de la estrategia

  1. Introducción de indicadores de volumen de negocios - La efectividad de las brechas se confirma a través del volumen de negocios
  2. Optimizar el tiempo de ingreso - Aumentar el mecanismo de confirmación de retorno y mejorar la calidad de ingreso
  3. Mecanismos de detención de pérdidas mejorados - diseño de estrategias de detención de pérdidas más flexibles
  4. Aumentar el filtro de entorno de mercado - añadir el juicio de tendencias para operar en el entorno de mercado adecuado
  5. Adaptación de parámetros de optimización - Ajuste automático de los parámetros en función de la volatilidad del mercado

Resumir

Se trata de una estrategia de trading cuantificada, diseñada de manera razonable y lógica. Proporciona a los operadores un sistema de trading fiable mediante la identificación de intervalos de convergencia y la captura de señales de ruptura. La visualización de la estrategia y la flexibilidad de los parámetros la hacen muy práctica.

Código Fuente de la Estrategia
/*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)