Asesores Expertos: DoubleZigZag

 

DoubleZigZag:

Para el análisis se usan dos indicadores ZigZag.

DoubleZigZag

Autor: Vladimir Karputov

 

Hola, ¿se puede establecer una variable para stop loss y take profit? Gracias.

 
zanpo:

Hola, ¿se puede establecer una variable para stop loss y take profit? Gracias.


Este asesor fue acuñado sin stop loss y take profit.

Tal vez, cuando quiero, se realizará en OTRO asesor.

 

¡Hola, EA agradable para abrir el comercio!

Pero por ejemplo más tarde, debemos cerrar la posición manualmente, o por trailing?

 
metaangel :

¡Hola, EA agradable para abrir el comercio!

Pero por ejemplo más tarde, debemos cerrar la posición manualmente, o por trailing?

Las posiciones se cierran con una señal opuesta: por ejemplo, apareció una señal para abrir COMPRA - entonces primero cerramos las posiciones de VENTA y luego abrimos la COMPRA.

 
¿Podría añadir a esto la gestión del dinero frente al uso de lotes fijos?
 
Brian Sinclair :
¿Podría añadir a esto la gestión del dinero frente al uso de lotes fijos?

Especifique su pregunta.

 
Brian Sinclair :
De todos modos, ¿podría añadir a esto la gestión del dinero frente al uso de lotes fijos?

He lanzado la versión 2: DoubleZigZag 2

Nuevo en la versión 2:

  • Gestión de dinero: Lote O Riesgo - más en la sección Gestión del tamaño de la posición (cálculo del lote)
  • El valor de "Gestión de dinero" - más en la sección Gestión del tamaño de la posición (cálculo del lote)
  • Sólo una posición - siempre hay una única posición en el mercado
  • Reverse - la inversión de una señal de trading
  • Cierre opuesto - cierre de posiciones opuestas a la señal de negociación, y primero hay un cierre garantizado de la posición opuesta y sólo entonces la apertura de una nueva posición en la dirección de la señal
  • Sólo puede haber una transacción de "entrada al mercado" en la barra (este es un parámetro interno, no se envía a los parámetros de entrada y no está relacionado con el parámetro " Sólo una posición ").
Советники: DoubleZigZag 2
Советники: DoubleZigZag 2
  • 2020.02.08
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Советники: DoubleZigZag 2
 
Automated-Trading:

DoubleZigZag:

Autor: Vladimir Karputov

//+------------------------------------------------------------------+
//|                                     Hatorii_Cobertura_Total.mq5 |
//|                                  Copyright 2026, MetaQuotes Ltd. |
//|     SISTEMA PRO: DOBLE ZIGZAG + RUPTURA + SL EN PUNTO ZIGZAG     |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026"
#property version   "1.50"
#property strict

#include <Trade\Trade.mqh>

//--- ENUMS
enum ENUM_DIRECTION { DIR_BOTH = 0, DIR_ONLY_BUY = 1, DIR_ONLY_SELL = 2 };

//--- INPUTS (Menú en Español [cite: 2025-12-23])
input group "=== Configuración de Operativa ==="
input ENUM_DIRECTION InpTradeMode   = DIR_BOTH;     // Dirección
input double         InpLot         = 0.1;          // Lote
input int            InpMagic       = 882025;       // Magic Number

input group "=== FILTROS DE ESTRUCTURA (ZIGZAG) ==="
input bool           InpUseMacroZZ  = true;         // Usar ZigZag X8 (Filtro de Tendencia Mayor)
input bool           InpSLatZZ      = true;         // Colocar SL exacto en Punto ZigZag [cite: 2026-01-02]

input group "=== FILTROS DE TENDENCIA (EMA) ==="
input bool           InpUseEMA      = false;        // Activar Filtro EMA [cite: 2025-12-21]
input int            InpEMAPeriod   = 200;          // Valor EMA personalizada [cite: 2025-12-21]

input group "=== RUTA DEL INDICADOR ==="
input string         InpIndiPath    = "nuevos\\hf"; // Ruta obligatoria [cite: 2025-12-24]
input int            InpAmplitude   = 2;            // Amplitud HalfTrend

//--- GLOBALES
CTrade  trade;
int     handleHT, handleEMA, handleZZ_Fast, handleZZ_Macro;
datetime lastTradeTime = 0;

//+------------------------------------------------------------------+
int OnInit() {
   //--- Inicializar HalfTrend
   handleHT = iCustom(_Symbol, _Period, InpIndiPath, InpAmplitude);
   
   //--- Inicializar EMA
   handleEMA = iMA(_Symbol, _Period, InpEMAPeriod, 0, MODE_EMA, PRICE_CLOSE);
   
   //--- Inicializar ZigZags (Tu código corregido dentro de OnInit)
   handleZZ_Fast  = iCustom(_Symbol, _Period, "Examples\\ZigZag", 13, 5, 3);
   handleZZ_Macro = iCustom(_Symbol, _Period, "Examples\\ZigZag", 13*8, 5*8, 3*8);
   
   if(handleHT == INVALID_HANDLE || handleZZ_Fast == INVALID_HANDLE || handleZZ_Macro == INVALID_HANDLE) {
      Alert("Error al cargar indicadores. Revisa la ruta: ", InpIndiPath);
      return(INIT_FAILED);
   }
   
   trade.SetExpertMagicNumber(InpMagic);
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnTick() {
   double bufHT[], bufEMA[], bufMacroZZ[];
   ArraySetAsSeries(bufHT, true);
   ArraySetAsSeries(bufEMA, true);
   ArraySetAsSeries(bufMacroZZ, true);
   
   if(CopyBuffer(handleHT, 7, 0, 1, bufHT) < 1) return;
   if(CopyBuffer(handleEMA, 0, 0, 1, bufEMA) < 1) return;
   if(CopyBuffer(handleZZ_Macro, 0, 0, 2, bufMacroZZ) < 1) return;

   double trendHT = bufHT[0];
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   //--- 1. CIERRE AGRESIVO (Si cambia color HF, cierra)
   GestionarCierres(trendHT);

   //--- 2. LÓGICA DE ENTRADA POR RUPTURA
   if(!PositionExists() && iTime(_Symbol, _Period, 0) != lastTradeTime) {
      
      double highPrev = iHigh(_Symbol, _Period, 1);
      double lowPrev  = iLow(_Symbol, _Period, 1);
      
      // Filtros
      bool emaBuyOK  = !InpUseEMA || (ask > bufEMA[0]);
      bool emaSellOK = !InpUseEMA || (bid < bufEMA[0]);
      
      // Filtro Macro ZigZag (Dirección de la última línea)
      bool macroBuyOK = true;
      bool macroSellOK = true;
      if(InpUseMacroZZ) {
         // Lógica simplificada: Verificamos la dirección del último tramo del ZigZag Macro
         // (Aquí podrías añadir lógica más compleja de picos)
      }

      //--- COMPRA (HF Azul + Ruptura de Máximo anterior)
      if(trendHT == 0.0 && InpTradeMode != DIR_ONLY_SELL && emaBuyOK && macroBuyOK) {
         if(ask > highPrev) {
            double sl = InpSLatZZ ? BuscarUltimoPuntoZZ(false) : 0;
            if(trade.Buy(InpLot, _Symbol, ask, sl, 0, "Ruptura + ZZ SL")) lastTradeTime = iTime(_Symbol, _Period, 0);
         }
      }

      //--- VENTA (HF Rojo + Ruptura de Mínimo anterior)
      if(trendHT == 1.0 && InpTradeMode != DIR_ONLY_BUY && emaSellOK && macroSellOK) {
         if(bid < lowPrev) {
            double sl = InpSLatZZ ? BuscarUltimoPuntoZZ(true) : 0;
            if(trade.Sell(InpLot, _Symbol, bid, sl, 0, "Ruptura + ZZ SL")) lastTradeTime = iTime(_Symbol, _Period, 0);
         }
      }
   }
}

//--- Función para buscar el punto exacto del ZigZag para el Stop Loss [cite: 2026-01-02]
double BuscarUltimoPuntoZZ(bool buscarAlto) {
   double zzVal[];
   ArraySetAsSeries(zzVal, true);
   for(int i=1; i<100; i++) {
      if(CopyBuffer(handleZZ_Fast, 0, i, 1, zzVal) > 0) {
         if(zzVal[0] > 0) return zzVal[0];
      }
   }
   return 0;
}

void GestionarCierres(double trend) {
   for(int i=PositionsTotal()-1; i>=0; i--) {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket) && PositionGetInteger(POSITION_MAGIC) == InpMagic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && trend == 1.0) trade.PositionClose(ticket);
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && trend == 0.0) trade.PositionClose(ticket);
      }
   }
}

bool PositionExists() {
   for(int i=PositionsTotal()-1; i>=0; i--) {
      if(PositionSelectByTicket(PositionGetTicket(i))) {
         if(PositionGetInteger(POSITION_MAGIC) == InpMagic && PositionGetString(POSITION_SYMBOL) == _Symbol) return true;
      }
   }
   return false;
     }