Lo que devuelven las funciones Lowest y Highest - página 5

 
Candid Ya estoy bien.
Klot, interesante opción.

Si sus variantes de zigzag muestran resultados interesantes, ¿puedo aplicarlas en mi desarrollo?

Por supuesto que sí, estoy siguiendo el desarrollo con interés y me gusta mucho tu trabajo.
 
Gracias.
 
2 nen:
Más sobre las "opciones". Ahora una de las condiciones para la conmutación del extremo: la corriente baja es mayor que la corriente baja en más puntos de ExtDeviation (similar para la alta). El código permite implementar otras opciones con bastante facilidad, si es necesario.
Bueno, siguiendo a klot me gustaría añadir que mi interés actual por el zigzag está causado únicamente por mi interés en su diseño.
 
He vuelto a corregir el código fuente: ayer descubrí que la regla de la primera barra significativa a veces no se respeta en los minutos. Para comprobarlo, sólo tenía una hora y media de tiempo en línea, pero parece que era cuestión de comparar el doble con el cero.
 
Otro error: los extremos sólo pueden cambiarse al final de una barra, de lo contrario hay una diferencia entre el tiempo real y el histórico. No es difícil de arreglar. Todavía no he corregido el código fuente en la rama - deje que la nueva versión se ejecute en minutos.
 
Candid, hizo una versión 45 del indicador ZUP: http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=117997
Incluye su zigzag como un zigzag externo. En cuanto aparezca una versión estable que funcione, lo cambiaré.
 
Hasta ahora no veo ningún problema, aquí está la versión corregida del código:
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Navy

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
//extern int ExtBackstep=3;

int    shift;
double res=0;
int i;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;
int BarTime;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  int fBar;
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    BarTime = 0;
    FirstRun = false;
  }


//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (BarTime!=Time[shift]) {
      BarTime=Time[shift];
      if (res > hPoint ) {
        MaxDist = Bars-CurMaxBar-shift+1;
        MinDist = Bars-CurMinBar-shift+1;
        if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
          if (AfterMax) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          } else {  //  if (AfterMax)
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  else if (AfterMax)    
        }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
      }  //  if (res > hPoint )
    }  //  if (BarTime!=Time[0])
    if (AfterMax) {
      res = Low[shift]-CurMin;
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      }  //  if (res < mhPoint)
    }  //  if (AfterMax) 
    if (AfterMin) {
      res = CurMax-High[shift];
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      }  //  if (res < mhPoint)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


Sobre el tema de las peculiaridades de los diferentes zigzags. La característica principal de este zigzag es que todo se hace en una sola pasada, la revisión de los datos históricos se hace sólo cuando se fija un extremo, y sólo para los datos posteriores a ese extremo. Es decir, debe ser bastante rápido. Los detalles del dibujo dependerán, por supuesto, de los criterios de fijación de los extremos, pero aquí se pueden aplicar fácilmente varias opciones. Por ejemplo, ya he realizado variantes de conmutación por porcentaje de un movimiento anterior, por salida de High del mínimo (respectivamente Low del máximo) y vinculando el cambio al tamaño medio de la barra.

 
Aquí hay otro problema con el indicador: he encontrado un pliegue en mi zigzag (la cruz del cursor en la imagen). La hora de la curva corresponde a cuando se apagó el terminal, el precio corresponde a cuando se volvió a encender.


Para aclarar mis sospechas, he insertado la impresión en el código:
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift]=",High[shift],", Low[shift]=",Low[shift]);


El terminal se cerró y se reinició unos minutos después. Y aquí hay un fragmento del registro:

2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, Alto[turno]=1.2763, Bajo[turno]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: turno=0, Bares=38233, Tiempo[turno]=2006.10.31 22:51, Alto[turno]=1.2763, Mínimo[cambio]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=1, Bars=38233, Tiempo[cambio]=2006.10.31 22:50, Máximo[cambio]=1.2763, Mínimo[cambio]=1.2762 2006.10.3131 23:58:26 CZZ2 EURUSD,M1: shift=2, Bars=38233, Time[shift]=2006.10.31 22:49, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=3, Bars=38233, Time[shift]=2006.10.31 22:47, Máximo[turno]=1.2763, Mínimo[turno]=1.2762 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=4, Bars=38233, Time[shift]=2006.10.31 22:45, Máximo[turno]=1.2763, Low[shift]=1.2762 2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=0, Bars=38230, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=1, Bars=38230, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762 2006.10.31 23:58:23 CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, Máximo[turno]=1.2762, Mínimo[turno]=1.2762 2006.10.31 23:58:22 CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, Máximo[turno]=1.2762, Mínimo[turno]=1.2762


Puede ver que a las 23:58:23 el historial no se ha bombeado todavía, y a las 23:58:25 se ha bombeado el último 1 bar. Y sólo para el 2006.10.31 23:58:26 todas las barras intermedias fueron bombeadas.
Pregunta a los desarrolladores: ¿es ésta la secuencia normal de paginación? Y si es así, ¿qué sentido tiene? Evidentemente, es deseable tener el valor del precio actual antes. Pero la existencia prevista de un agujero en la historia durante algún tiempo significa esencialmente un fracaso garantizado de los indicadores para este tiempo. ¿No es más seguro para el usuario posponer el cálculo de los indicadores hasta que el historial esté completamente intercambiado? ¿O al menos reiniciarlos después del intercambio completo?

 
Lo de "reiniciar" ha sido un error, sería esencialmente un pionero :)
 
Estoy familiarizado con este tipo de paginación de la historia. He hecho una comprobación de las cinco primeras rupturas en zigzag Y un recálculo del indicador ZUP.