Как пользоваться этими коэффициентами правильно? По умолчанию значения одинаковы.
input double InpCoefficient_1 = 2.1; // Coefficient 1 input double InpCoefficient_2 = 2.1; // Coefficient 2
Как пользоваться этими коэффициентами правильно? По умолчанию значения одинаковы.
Параметры советника
- Coefficient 1 — соотношение количества вершин младшего зигзага в катетах старшего;
- Coefficient 2 — соотношение разницы цен в вершинах старшего зигзага.
Параметры советника
- Coefficient 1 — соотношение количества вершин младшего зигзага в катетах старшего;
- Coefficient 2 — соотношение разницы цен в вершинах старшего зигзага.
Для каждой пары и для каждого таймфрейма всё индивидуально - нужно запустить тест и примерно прикинуть коэффициенты. Затем оптимизировать немного в + и немного в -.
используемый "Examples/ZigZag" не всегда ЗигЗаг как того от него ожидают..
вы это учитываете ?
в ленте в архивах сохранилась картинка бага:

используемый "Examples/ZigZag" не всегда ЗигЗаг как того от него ожидают..
вы это учитываете ?
в ленте в архивах сохранилась картинка бага:
Нет, пользуем то, что имеем.
Как пользоваться этими коэффициентами правильно? По умолчанию значения одинаковы.
Foro sobre el trading, sistemas de trading automáticos y simulación de estrategias comerciales.
Asesores Expertos: DoubleZigZag
hatorii, 2026.01.23 21:38
//+------------------------------------------------------------------+ //| 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; }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
DoubleZigZag 2:
Вторая версия. Стратегия используются два индикатора ZigZag.
Автор: Vladimir Karputov