Mira cómo descargar robots gratis
¡Búscanos en Facebook!
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 4

Visualizaciones:
2110
Ranking:
(19)
Publicado:
2016.06.29 16:01
Actualizado:
2016.11.22 07:33
XLab_ZZ.mq4 (4.6 KB) ver
XLab_ZZP.mq4 (4.62 KB) ver
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa



Ventajas:

  1. La función más cara es iBarShift que sustituye totalmente a todos los ciclos en el código necesario para la recuperación de picos.
  2. Toda la información necesaria para construir ZZ para cada barra est´s accesible no sólo en cada momento sino también para cada código externo.
  3. No hay picos falsos
  4. Está disponible el método eficiente para encontrar picos
  5. Muy rápido
  6. Trabajos correctos en las inserciones del historial y cambio de TFs.
  7. Perfecto para uso en EA's.


Desventajas:

1. Requisitos de memoria. En otras implementaciones similares, este indicador utiliza 5 buffers en lugar de 2 (o incluso 1). Pero (en mi humilde opinión) es un buen precio para las ventajas #6 y #7. Ninguno de los zigzag rápidos que he visto pueden procesar inserciones del historial sin una reconstrucción completa. El mío lo hace. Por otra parte lo hace de manera eficiente

2. Líneas adicionales están disponibles. Esto es necesario para hacer que los datos no sean accesibles por ningún código externo. Estas líneas no deben ser visibles.


Principio:

El ZZ es dibujado por el principio de canalización.

El ancho de canal puede ser definido en Puntos (XLab_ZZ) o en porcentaje (XLab_ZZP)


Recuperación de picos:

extern int ChannelWidth = 100;

#property indicator_chart_window
#property indicator_buffers 1

#property indicator_color1 Red
#property indicator_width1 3

datetime LastTime;

int init()
{
   LastTime = 0;
   
   return(0);
}

bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime)
{
   if (dir < 0)
   {
      datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar);
      int i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else if (dir > 0)
   {
      t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar);
      i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else 
   {
      return (false);
   }
   
   return (true);
}

int start()
{
   if (LastTime == Time[0]) return (0);
   LastTime = Time[0];
   
   double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1);
   double rdir = -dir;

   if (dir == EMPTY_VALUE) return (0);
   
   double v1, v2, v3, v4, v5;
   int    i1, i2, i3, i4, i5;
   datetime t1, t2, t3, t4, t5;
   
   GetValue(dir, 1, 0, v1, i1, t1);
   GetValue(rdir, i1, 0, v2, i2, t2);
   GetValue(dir, i2, i1, v3, i3, t3);
   GetValue(rdir, i3, i2, v4, i4, t4);
   GetValue(dir, i4, i3, v5, i5, t5);

   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);

   return(0);
}

void SetPt(string name, double price, datetime time)
{
   ObjectCreate(name, OBJ_ARROW, 0, time, price);
   ObjectSet(name, OBJPROP_ARROWCODE, 108);
   ObjectSet(name, OBJPROP_PRICE1, price);
   ObjectSet(name, OBJPROP_TIME1, time);
}

Este ejemplo es un indicador que marca (una vez por barra) los primeros cinco picos (incluyendo la formación actual)

¡Atención! Este código puede funcionar incorrectamente si el Modo de barras de 0 es puesto en ON


Modo de barra 0:

Se establece con la variable DrawZeroBar. De forma predeterminada en OFF.

Se recomienda no utilizar esta opción, especialmente si el indicador se usa en un EA


Disfrutad ;). No dudar en preguntar cualquier duda.

Si encuentra algún error, por favor informadme. Gracias.

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

s-PSI@CalculateProfitFromTime s-PSI@CalculateProfitFromTime

Revisar los resultados del trabajo de su estrategia (del historial) por hora.

Cálculo del LRMA Fast Cálculo del LRMA Fast

Con las ideas de los artículos, se implementa en este indicador 3 Métodos de aceleración de los indicadores en el ejemplo de "Regresión Lineal".

s-PSI@Refresh_v.2.0 s-PSI@Refresh_v.2.0

El script (en ausencia de comunicación) vuelve a examinar el servidor, pagina el historial, emula los ticks para los indicadores y los expertos.

VR---MOVING-AVERAGE VR---MOVING-AVERAGE

Una versión mejorada del indicador estándar de media móvil, ahora con el timeframe por hora, puedes ver las medias de plazos superiores móviles.