Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Indicadores

ZigZag ideal - indicador para MetaTrader 5

Visualizaciones:
2220
Ranking:
(61)
Publicado:
2014.01.14 12:40
Actualizado:
2016.11.22 07:33
idealzz.mq5 (7.33 KB) ver
idealzzp.mq5 (7.33 KB) ver
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Es un zigzag simple pero muy rápido.

No hay picos suspendidos o erróneos. La recuperación de picos ha sido optimizada para los timeframes.

ZigZag ideal

Ventajas:

  1. La función más cara en los cálculos es iBarShift. Reemplaza totalmente a todos los ciclos necesarios para la recuperación de los picos. Por lo tanto, ha sido reemplazado por ArrayBSearch. Significa que el indicador será más eficiente que su equivalente de MQL4;
  2. Todos los datos necesarios para cada barra son accesibles no sólo en cada momento sino también está disponible para el EA en cualquier momento del histórico;
  3. No hay picos suspendidos;
  4. Método eficiente para encontrar picos sin buscar los valores del indicador;
  5. Muy rápido;
  6. Funciona correctamente en las inserciones del histórico y al cambiar los timeframes;
  7. Perfecto para uso en EA's.

Desventajas:

  1. Requisitos de memoria. Zig-zag necesita 2 bufferss (uno no es suficiente debido a retrasos) para el trazado correcto, mientras que aquí se utilizan 5 buffers. En mi opinión, este inconveniente es eclipsado totalmente por la ventaja #6. Ninguno de los ZigZags rápidos pueden procesar correctamente las inserciones del histórico con dos búferes.
  2. Hay disponibles líneas adicionales. Son necesarias para que los datos sean accesibles a un EA. Estas líneas no deben ser visibles.

Principio:

Zig-zag se traza por el principio de canalización. El ancho de canal puede definirse en puntos (IdealZZ) o en términos porcentuales (IdealZZP)

Recuperación de picos:

input int ChannelWidth=100;

#property indicator_chart_window

datetime LastTime;
int ZZHandle;
//+------------------------------------------------------------------+
//| Función de inicio del indicador personalizado                    |
//+------------------------------------------------------------------+
void OnInit()
  {
   LastTime = 0;
   ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth);
  }
//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
bool GetValue(double dir,int bar,int prevBar,double &peak,
             int &peakBar,datetime &peakTime,const datetime &T[])
  {
   if(dir<0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else if(dir>0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else
     {
      return(false);
     }

   return(true);
  }
//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
void SetPt(string name,double price,datetime time)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,time,price);
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108);
   ObjectSetDouble(0,name,OBJPROP_PRICE,price);
   ObjectSetInteger(0,name,OBJPROP_TIME,time);
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &T[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(LastTime==T[0]) return(rates_total);
   LastTime=T[0];

   ArraySetAsSeries(T,true);

   double dir_[1];
   if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total;
   double dir=dir_[0];
   double rdir=-dir;

   if(dir==EMPTY_VALUE) return(rates_total);

   double v1,v2,v3,v4,v5;
   int    i1,i2,i3,i4,i5;
   datetime t1,t2,t3,t4,t5;

   if(
      GetValue(dir,1,0,v1,i1,t1,T) && 
      GetValue(rdir,i1,0,v2,i2,t2,T) && 
      GetValue(dir,i2,i1,v3,i3,t3,T) && 
      GetValue(rdir,i3,i2,v4,i4,t4,T) && 
      GetValue(dir,i4,i3,v5,i5,t5,T)
      )
     {
      SetPt("1",v1,t1);
      SetPt("2",v2,t2);
      SetPt("3",v3,t3);
      SetPt("4",v4,t4);
      SetPt("5",v5,t5);
      Print(v1,"   ",v2,"  ",v3,"  ",v4," ",v5," ",i1,"  ",i2,"  ",i3," ",i4," ",i5);
     }
   else
     {
      Print("Parece un error disponible...");
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

Este ejemplo es de un indicador que marca (una vez por barra) primero cinco picos (incluyendo el que se está formando actualmente).

¡ Atención! El código puede funcionar incorrectamente, si el modo barras cero está habilitado

Modo Barra Cero:

Puede activarse el modo de código variable DrawZeroBar. Está deshabilitado de forma predeterminada. No se recomienda habilitarlo, especialmente si el indicador se utiliza en el EA.

Disfrute al usarlo. Por favor, informar cualquier si hay inconvenientes.

Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/925

Triangulo Hedge (cobertura) Triangulo Hedge (cobertura)

Se abre una posición de cobertura virtual en MetaTrader 5.

Weather Vane Weather Vane

Este indicador calcula el último precio medio de un símbolo y determina la dirección de la tendencia, de modo que se puede utilizar como señal de compraventa.

Jolly Roger EA Version Jolly Roger EA Version

Inspirado por EA de Pirat presentado en el campeonato de Trading automatizado del 2011.

Corrected Average (CA) Corrected Average (CA)

El indicador Corrected Average de A.Uhl (también conocido como la "Óptima media móvil").