[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 29

 
hoz:

¿Pueden decirme cómo extraer los valores de un indicador en zig-zag? ¿Cómo se aplica esto en general? Es decir, si quiero recoger un determinado extremo, no sólo el último.

Por ejemplo, ahora quiero adjuntar este zigzag a mi Asesor Experto:

Entiendo que tengo que utilizar la funcióniCustom, ya que normalmente se utiliza para dirigir un indicador personalizado, pero la pregunta es cómo conectar los nodos...

El buffer busca el valor NEUTRAL(EMPTY_VALUE) según el principio:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
y el acceso al buffer del indicador a través de iCustom().
 
TarasBY:

El buffer busca un valor EMPTY_VALUE según el principio:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

y se accede al buffer del indicador a través de iCustom().


Tiene sentido. Pero se buscará de esta manera hasta que encontremos un valor no vacío. Y si, por ejemplo, yo, y de hecho, no quiero el último valor no vacío, es decir, no el último extremo, sino otro... Por ejemplo, aquí en la captura de pantalla:

 
hoz:


Tiene sentido. Pero de esta manera la búsqueda será hasta que nos encontremos con un valor no vacío. Y si, por ejemplo, yo, y de hecho, no quiero el último valor no vacío, es decir, no el último extremo, sino otro... Por ejemplo, aquí en la captura de pantalla:

Hay que introducir el contador de extremos en el bucle y romper el bucle por el número del extremo (valor no vacío en una fila).
 
TarasBY:
Introduzca un contador de extremos en el bucle y en el número de extremos (valor no vacío en una fila), rompa el bucle.

Lo tengo. Gracias. Ahora hay que aplicar todo eso en la práctica. Entiendo lo esencial, pero mi mente está llena de filtros que me hacen hervir el cerebro...
 
hoz:

Lo tengo. Gracias. Ahora hay que aplicarlo en la práctica. Tengo la idea, pero hay tantos filtros en mi mente que mi cerebro está hirviendo...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Si necesita el número de barra del pico, cambie el tipo de función a int y en lugar de return(ind); escriba return(i);

También tenga en cuenta que si utiliza i en su código, especialmente en las búsquedas (como en el tutorial) entonces cambie i en esta función por cualquier otra variable, por ejemplo k.

Y asegúrese de configurar iCustom dentro de la función para su indicador.

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Si necesita el número de barra del pico, cambie el tipo de función a int y en lugar de return(ind); escriba return(i);

También tenga en cuenta que si utiliza i en su código, especialmente en las búsquedas (como en el tutorial) entonces cambie i en esta función por cualquier otra variable, por ejemplo k.

Y asegúrese de configurar iCustom dentro de la función para su indicador.

Nikolay, es interesante, por supuesto, tienes la condición escrita. Lo miro y pienso...

if(ind!=0) n--;

else

if(ind!=0) return(ind);

Resulta que si elbuffer del indicador personalizado devolvía el valor de cero, entonces n--, y si elbuffer del indicador personalizado devolvía el valor de cero, entonces ... devolvemos el valor del buffer indicador.

Pero las condiciones son las mismas. Y ahí y así si no es cero...

 
hoz:

Nikolai, es interesante, por supuesto, tienes la condición escrita. Cuando lo miro, pienso...

Resulta que si elbúfer del indicador personalizado devuel ve un valor de cero, entonces n--, y si elbúfer del indicador personalizado devuelve un valor de cero, entonces ... devolvemos el valor del buffer indicador.

Pero las condiciones son las mismas. Y ahí y así si no es cero...

Las llaves se cayeron al intentar insertar el código correctamente:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

Si n>1 {

si el buffer no está vacío, entonces resta 1 a n

} a la inversa{

si el buffer no está vacío, devuelve su valor

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


o como esto, que es más sucinto. Estoy obsesionado con la velocidad y la belleza del código, no me hagas caso )
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


o como esto, que es más sucinto. Estoy obsesionado con la velocidad y la belleza del código, no me hagas caso).


En general, todo está bien en ambos sentidos. Es que estoy acostumbrado a escribir el código de una manera un poco diferente, es más fácil de leer de esta manera mientras que el tuyo es diferente. El primer paréntesis de cada uno de tus códigos no se mueve. Lo pongo en mi EDITOR y todo está en su sitio así:

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


Básicamente, todo está bien en ambos sentidos. Simplemente estoy acostumbrado a escribir el código de una manera diferente: es más fácil de leer de esta manera, mientras que su código es diferente. El primer paréntesis de cada uno de tus códigos no se mueve. Lo puse en el Editor y todo está en su lugar en esta forma:


cuando el código supera las 1000 líneas, se empieza a escribir de forma compacta).

también en MT4 el rendimiento se resiente, sobre todo al realizar pruebas. La versión lacónica es más rápida.

Razón de la queja: