Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 466

 

Saludos a todos. Tengo una pregunta de este tipo. Tengo un indicador (fractales modificados), cuando se carga en un gráfico todo es correcto, funciona como debería, pero cuando intento utilizarlo en un EA, dice que el buffer está vacío. Al mismo tiempo, al pasar el buffer en Deinit, almacena los valores correctos.

Se adjunta el código fuente del indicador. Estoy dispuesto a escuchar consejos y sugerencias sobre lo que estoy haciendo mal.

El código es del Asesor Experto:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
Archivos adjuntos:
 
Karputov Vladimir:

Podrías sustituir los "si" del final por:

(si es tan simple como eso,,,:)

Gracias

 
Maxim Dobrovolskii:

Saludos a todos. Tengo una pregunta de este tipo. Tengo un indicador (fractales modificados), cuando se carga en un gráfico todo es correcto, funciona como debería, pero cuando intento utilizarlo en un EA, dice que el buffer está vacío. Al mismo tiempo, al pasar el buffer en Deinit, almacena los valores correctos.

Se adjunta el código fuente del indicador. Estoy dispuesto a escuchar consejos y sugerencias sobre lo que estoy haciendo mal.

Código de EA:

Un vistazo muy superficial. Pregunta: ¿Puedo tener un fractal en la barra de cero ? Pero en OnDeinit(), se hace un bucle a través de las barras y, naturalmente, se encuentra un fractal (no un valor vacío del buffer).
 
Artyom Trishkin:
Una mirada muy superficial. Pregunta: ¿puede un fractal estar en una barra de cero ? Pero en OnDeinit() se hace un bucle a través de las barras y, naturalmente, se encuentra un fractal (no un valor vacío del buffer).
En Deinit, también hago un bucle de 4-6 y todo está en su sitio y tiene valores.
 
Maxim Dobrovolskii:
En Deinit, también paso por el 4-6 y todo está en su sitio.

En OnDeinit() se ejecuta en un bucle (de 0 a 100) a través de las barras buscando un valor distinto de cero y se registra el valor encontrado.

En OnTick() se intenta dar salida sólo a las últimas 6 barras del buffer 0. Puede que no haya ningún fractal en ellos.

Primero, encuentra la barra con el fractal y luego imprime el valor de esa barra.

 
Artyom Trishkin:

En OnDeinit() se ejecuta en un bucle (de 0 a 100) a través de las barras buscando un valor distinto de cero y se registra el valor encontrado.

Pero en OnTick(), se intenta imprimir sólo las últimas 6 barras del buffer 0. Puede que no haya ningún fractal en ellos. Primero, encuentra la barra con el fractal y luego imprime el valor de esta barra.

Se supone que la sexta barra contiene fractal.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 fractal Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 fractal Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 fractal Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 fractal Up: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Función Deinit
2015.11.01 13:19:08.380 2015.10.01 00:00 Prueba de MoneyRobotics_Proboi! iniciada

Este es el comienzo del registro. La prueba comenzó, el Asesor Experto funcionó, Deinit se cargó y fractal se encontró en 6. No sé cómo abordar el búfer de indicadores.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

reproducción de imágenes.

Archivos adjuntos:
 
Maxim Dobrovolskii:

el sexto compás se supone que contiene un fractal.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 fractal Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 fractal Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 fractal Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 fractal Up: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Función Deinit
2015.11.01 13:19:08.380 2015.10.01 00:00 Prueba de MoneyRobotics_Proboi! iniciada

Este es el comienzo del registro. inicio de la prueba, el Asesor Experto ha funcionado, Deinit comienza, e inmediatamente en la 6ª posición encuentra un fractal.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

No sé cómo abordar el búfer del indicador.

Este:

if(Time[0] == prevtime) return;
   prevtime = Time[0];

hacer

prevtime = Time[0];

al final

 
Artyom Trishkin:

Esto:

hacer

al final.

¿Cómo puede afectar esto? Desgraciadamente no ha cambiado nada.

como me imagino el proceso: el indicador se carga, empieza a comprobar cada condición de tick/barra, si la condición se cumple, pone el valor en el buffer o buffers seleccionados, entonces el EA llama al indicador por el número de buffer al valor en un determinado offset y toma el valor. ¿Verdad?

 
Maxim Dobrovolskii:

¿Cómo puede afectar esto? Por desgracia, nada ha cambiado.

como me imagino el proceso: el indicador se carga, empieza a comprobar la condición cada tick/barra, si se cumple, pone el valor en el buffer o buffers seleccionados, entonces el EA llama al indicador por el número de buffer al valor en un determinado offset y toma el valor. ¿Verdad?

¿Y por qué hay una nueva barra en el indicador? Aparentemente no hay cálculos complejos
 
Victor Nikolaev:
¿Por qué hay un nuevo control de barra en el indicador? Aparentemente no hay cálculos complicados
control de una nueva barra en el EA que utiliza el indicador.
Razón de la queja: