Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 683

 
Igor Makanu:

No los has inicializado al principio ni en ningún sitio, sólo los has declarado

Escribí antes de usar, es decir, si tienes las variables SredRazmax, SredRazmin, Sredn como sumas de valores del array, entonces para calcular correctamente la suma, necesitas poner a cero la variable y luego sumar los valores del array y guardarlos en esta variable

es decir

Y la segunda, lo que tienes una duda, en el indicador cada tick se llamará aOnCalculate() y eso significa que contará constantemente los topes de ZigZag en cada tick, es decir, unas 40-60 veces por segundo.

Gracias, pero he probado a ponerlos a cero y he probado ausarOnStart en lugar deOnCalculate() , los valores siguen saltando y no me queda claro si ww=0 (el valor del array siempre se muestra), ¿por qué los valores saltan en el medio, cómo hacer que no cuente cada tick y sólo cuente los valores del array?

 
Dmitry Belov:

Gracias, pero he probado a ponerlos a cero y autilizarOnStart en lugar deOnCalculate()

El asunto es que OnStart() se utiliza en los scripts y OnCalculate() en los indicadores.

En el código, se suman los precios en los que se encuentran los picos de ZigZag en todo el gráfico, en la salida se escribe "Average spread" y se imprime el valor(SredRazmax-SredRazmin)/nn, y el cálculo se realiza para todas las barras

¿Por qué necesitas el indicador si no utilizas los buffers de los indicadores para dibujar? en el indicador los buffers están unidos a las barras, y sus valores se desplazarán tan pronto como aparezca una nueva barra

 
Igor Makanu:

Creo que no puedo explicar por qué sucede, el punto es que OnStart() se utiliza en las secuencias de comandos, y OnCalculate() en los indicadores, es necesario entender cómo las secuencias de comandos difieren de los indicadores en MQL

En el código, se suman los precios en los que se encuentran los picos de ZigZag en todo el gráfico, en la salida se escribe "Average spread" y se imprime el valor(SredRazmax-SredRazmin)/nn, y el cálculo se realiza para todas las barras

¿Por qué necesitas un indicador si no utilizas los buffers de los indicadores para dibujar? en el indicador los buffers están unidos a las barras y sus valores se moverán tan pronto como aparezca una nueva barra

Para ser sincero, he simplificado el problema (la fórmula original se ve un poco diferente), pensé que sería capaz de entender por qué los valores de la media saltan cuando el valor cero de la matriz permanece constante. Tengo dos bucles, uno para llenar el array, y el otro para el cálculo de la media, hay un límite de nn, y en realidad quería dar salida a un gráfico - es un zig zag estándar, pero iCustom está dibujando el infierno fuera de él, y el promedio... Al nodo cero, si es mayor que el anterior, se le resta el nodo anterior y al anterior se le resta el anterior (tendrá signo negativo, por lo que se debe multiplicar por menos 1) y todo esto se debe sumar y dividir por un número determinado de nn. Obtenemos la extensión media de los vértices. Además, quería obtener otros promedios para el zigzag, pero me quedé con los valores de "salto".

Así es más o menos como era originalmente:

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

Para ser honesto, sólo simplifiqué el problema (originalmente la fórmula se ve un poco diferente), pensé que podría entender por qué los valores de la media saltan, si el valor cero en la matriz se mantiene constante. Tengo dos bucles, uno para llenar el array, y el otro para calcular la media, hay un límite de nn, y de hecho quería dar salida a un gráfico también - es un zig zag estándar, pero iCustom dibuja el infierno fuera de él, y el promedio... Al nodo cero, si es mayor que el anterior, se le resta el nodo anterior y al anterior se le resta el anterior (tendrá signo negativo, por lo que se debe multiplicar por menos 1) y todo esto se debe sumar y dividir por un número determinado de nn nodos. Obtenemos la extensión media de los vértices. Además quería obtener otros promedios para el zigzag, pero me quedé con los valores de "salto".

Así es aproximadamente como era originalmente:

No lo entiendo muy bien, es tarde, tengo sueño, lo he retocado según he visto, tengo dudas de cómo se comportará el indicador en una barra cero (no lo he comprobado), pero dibuja y muestra los comentarios según tu fórmula

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

¿Puede ayudarme a resolver un problema como éste? (Si es posible.)

El Asesor Experto emitirá una Alerta bajo ciertas condiciones. ¿Es posible hacer que la ventana que activó la Alerta se active también?

 
Vatal:

¿Puede ayudarme a resolver un problema como éste? (Si es posible.)

El Asesor Experto emitirá una Alerta bajo ciertas condiciones. ¿Es posible hacer que la ventana que activó la Alerta se active también?

Hay un ejemplo en la documentación. Obtenga el ID del gráfico en el que se está ejecutando el EA y vaya...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

Tengo algunas dudas de cómo se comportará el indicador en una barra cero (no lo he comprobado), pero sí dibuja y utiliza su fórmula para emitir el comentario.

Sí, gracias por su tiempo, funciona, debo haber hecho algo mal. Pero no sale un array en el comentario (sólo debería haber vértices, ¿no?) y cuenta mal con el menos y el número..., el zigzag tiene una extensión diferente entre vértices. La idea es restar el anterior vértice más pequeño al último más grande (que se acaba de formar), y del anterior más pequeño restar incluso el que es más grande y el número será con signo menos, lo multiplicamos por (-1) y así sucesivamente, y todo esto se suma nn veces y se divide por nn, obtenemos la salida media. En unos 4 relojes esto sería 1,69(de a) en el USDJPY. Además, quería calcular el número de barras promedio entre los topes. Ahora trataré de entender su código, qué hice mal, por qué no me dibujó y por qué no calcula correctamente...

 
Dmitry Belov:
Sí, gracias por su tiempo, realmente funciona, debo haber hecho algo mal. Pero no sale el array en el comentario (debería tener sólo vértices, ¿no?) y cuenta mal con el menos y el número..., el zigzag tiene una extensión diferente entre vértices. La idea es restar el anterior vértice más pequeño al último más grande (que se acaba de formar), y del anterior más pequeño restar incluso el que es más grande y el número será con signo menos, lo multiplicamos por (-1) y así sucesivamente, y todo esto se suma nn veces y se divide por nn, obtenemos la salida media. En unos 4 relojes esto sería 1,69(de a) en el USDJPY. Además, quería calcular el número de barras promedio entre los topes. Ahora trataré de entender tu código, qué hice mal, por qué no me dibujó y por qué no calcula correctamente...

Los topes en el comentario no saldrán, porque el bufferindicador HZZ[] contiene valores copiados del buffer indicador ZigZag, de lo contrario no podremos dibujar, deliberadamente dividí en 2 condiciones de detección de vértices arriba y abajo:

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

Sinecesitas conocer varios topes en ZZ, entonces tienes que crear otro array para almacenar estos datos. El nuevo buffer de indicadores lo complicará, porque todos los arrays conectados a los buffers de indicadores se "deslizan" junto con el gráfico

ZS: el código es mi ejemplo, y creo que necesita un bucle a la 1 ª barra, y no a 0, volverá a calcular constantemente los valores de SredRazmax, no puedo comprobar ahora, sin terminal en el PC

 
Igor Makanu:

Los topes en el comentario no saldrán, porque el bufferindicador HZZ[] contiene valores copiados del buffer indicador ZigZag, de lo contrario no podremos dibujar, deliberadamente dividí en 2 condiciones de detección de vértices arriba y abajo:

Sinecesitas conocer algunos topes en ZZ, entonces tienes que crear otro array para almacenar estos datos. El nuevo buffer de indicadores lo complicará, porque todos los arrays conectados a los buffers de indicadores se "deslizan" junto con el gráfico

ZS: el código es mi ejemplo, y creo que hay que hacer un bucle a la 1 ª barra, y no a 0, volverá a calcular constantemente el valor de SredRazmax, no puedo comprobar ahora, sin terminal en el PC

Mi indicador tan pronto como se carga muestra los valores correctos, a continuación, cada tick aumenta el valor de la media, aunque en los valores de salida de la matriz de zig zag no hay cambio en los topes se mantienen. Eso es lo que no puedo entender, ¿por qué es así? Me falta experiencia y conocimiento del idioma. Voy a dejar de dibujar, es un zigzag normal tomado por iCustum (ahora entiendo que no puede superponer una matriz en el gráfico, por lo que dibuja el infierno). El array se "arrastrará", pero entonces los valores se recalcularán, ¿no? así lo entiendo Gracias... Lo intentaré... Aprender...
 
Cómo se le explica a un EA (ma estándar) que sólo debe comprar (vender) cuando las medias se cruzan, y no en general, cuando ma_1>ma_2. Pero compra constantemente, no puede parar
Razón de la queja: