Errores, fallos, preguntas - página 1391

 
Ilya Malev:

Después de pulsar "actualizar" se calcula todo. Sería más conveniente que los datos del indicador, creados en el inite, se calcularan antes de la primera llamada de OnCalculate/OnTimer, etc.

Sería útil tener la posibilidad de esperar su cálculo después de la inicialización en el bucle dentro del indicador.

Para calcular el indicador, el usuario debe pulsar varias veces "refrescar" en el gráfico. Lo necesita. Recordará la vieja MT4 y se quedará en ella, a pesar de algunas ventajas de MT5.

Cualquier cálculo en los indicadores DEBE hacerse sólo en OnCalculate().
 
Karputov Vladimir:
Cualquier cálculo en los indicadores DEBE hacerse sólo en OnCalculate().
Me refiero a las lecturas del indicador Ishimoku en este caso. Me refiero a las lecturas de los indicadores que se utilizan en el actual, es decir, en OnCalculate. Así que se calculan antes de la llamada de OnCalculate, como era en MT4. O sería posible esperar su cálculo en OnCalculate. De lo contrario, los usuarios tendrán que pulsar varias veces el botón "Actualizar" para crear un indicador. Como no todos los indicadores se construyen sobre todo el historial en 1 segundo, hay indicadores complejos que tardan más en calcularse. Todo este tiempo el usuario tendrá que esperar sobre el botón "Refrescar", mientras que en MT4 sólo hay que esperar a que se dibuje.
 
Ilya Malev:
Me refiero a las lecturas del indicador Ishimoku en este caso. Me refiero a las lecturas de los indicadores que se utilizan en el actual, es decir, OnCalculate. Así que se calculan antes de llamar a OnCalculate, como era en MT4.
En OnInit() se realiza la preparación del entorno comercial para el indicador. Y sólo en OnCalculate() se pueden utilizar los datos del indicador.
 
Ilya Malev:
Me refiero a las lecturas del indicador Ishimoku en este caso. Me refiero a las lecturas de los indicadores que se utilizan en la corriente, es decir, en OnCalculate. Así que se calculan antes de la llamada de OnCalculate, como era en MT4. O sería posible esperar su cálculo en OnCalculate. De lo contrario, los usuarios tendrán que pulsar varias veces el botón "Actualizar" para crear un indicador. Como no todos los indicadores se construyen sobre todo el historial en 1 segundo, hay indicadores complejos que tardan más en calcularse. Todo este tiempo el usuario tendrá que esperar sobre el botón "Refrescar", mientras que en MT4 sólo hay que esperar a que se dibuje.

Este problema surge de vez en cuando en el foro. Desafortunadamente, llamar a OnCalculate() en OnTimer() no resuelve el problema.

Pero puedes probarlo. Puede encontrar un ejemplo en este artículo: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Después podrás escribir si ha funcionado o no.

 
Karputov Vladimir:
OnInit() prepara el entorno de negociación para el indicador. Y sólo en OnCalculate() se pueden utilizar los datos del indicador.
Resulta que no se puede, sin pulsar el botón "Actualizar" en el gráfico una o varias veces (o esperar 1/número de ticks), si el indicador utiliza otros indicadores de otros símbolos y/o tf.
 
Anatoli Kazharski:

Este problema surge de vez en cuando en el foro. Desafortunadamente, llamar a OnCalculate() en OnTimer() no resuelve el problema.

Pero puedes probarlo. Puede encontrar un ejemplo en este artículo: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Después escribe si ha funcionado o no, si no es mucho problema.

Gracias por el enlace. Lo probaré y te lo haré saber.
 
Ilya Malev:
Resulta que no se puede, sin pulsar el botón de "Actualizar" en el gráfico una o varias veces (o esperar 1/pocos ticks), si el indicador utiliza otros indicadores de otros símbolos y/o tf.

¿Y si miras más de cerca el funcionamiento del código que di? ¿Y en particular a los expertos? Después de reiniciar el terminal el fin de semana:

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

Es perfectamente visible que el cálculo sólo se realizó en la segunda llamada a OnCaalculate(). Así que nadie elimina la responsabilidad del programador para las comprobaciones: comprobar el resultado de CopyBuffer() en OncalCulate() - si la función no devolvió nada, debe ser comprobado en la siguiente entrada en OnCalculate().

 
Anatoli Kazharski:

Este problema surge de vez en cuando en el foro. Desafortunadamente, llamar a OnCalculate() en OnTimer() no resuelve el problema.

Pero puedes probarlo. Puede encontrar un ejemplo en este artículo: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Por favor, escribe más tarde, si no es mucha molestia, si ha funcionado o no.

Todavía no he leído el artículo, pero funciona bien con OnTimer

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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[])
  {
   static int count=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

Tengo una imagen extraña que muestra que llamar a OnCalculate desde OnTimer funciona) Necesito añadir valores correctos en timeseries

 
Ilya Malev:

Todavía no he leído el artículo, pero la recepción con OnTimer funciona bien

En los indicadores simples funciona bien. Pero en las más complejas, por alguna razón, a veces se atasca. )
 
Ilya Malev:

Todavía no he leído el artículo, pero la recepción con OnTimer funciona bien

Utiliza el Styler - es mejor para identificar errores.

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
Aumentar la variable count antes de salir de OnCalculate() - en este caso esta variable contará correctamente todas las ejecuciones en OnCalculate.