Errores, fallos, preguntas - página 12

 

Durante la noche me di cuenta de una cosa muy extraña, la hora de inicio del bar se refleja con un error - el error era de más de un minuto. Ahora quiero comprobarlo y he hecho un indicador de prueba

#property indicator_chart_window
datetime old_time=0;
int      MaxBars=10;    // ограничение 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| 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[])
  {
   if(rates_total<10) return(0);  // ничего не считаем и ничего не рисуем на графике         
   
   int      start_pos,   // точка старта
            count_tick;
   MqlDateTime str1,str2;
   

   if(prev_calculated==0) 
      {
      old_time=0;
      count_tick=0;
      start_pos=rates_total-3;
      }
   else start_pos=prev_calculated-1;
//--- расчет 
   for(int i=start_pos;i<rates_total;i++)
     {
      TimeToStruct(TimeCurrent(),str1); // время сервера
      TimeToStruct(time[i],      str2); // время бара  
      if(str1.min!=str2.min) {
      // Сбой - тик принадлежит не своему бару
         count_tick++;
         Print("тик №=",count_tick," i=", i," c=",close[i]," time[i]=",time[i]," time=",TimeCurrent()," delta=",str1.sec);
      }   
      } // end for(...
   return(rates_total);
  }
Registro

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

Los dos primeros ticks son claros, es un comienzo de indicador. Pero los próximos .... Resulta que hay una barra nueva según la hora del servidor, mientras que este tick pertenece a la barra antigua. Por la noche este delta es una pesadilla...

La pregunta a los desarrolladores es un error... ¿O así fue concebido?

Z.I. mientras escribía eso en el registro

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12 delta=12

Archivos adjuntos:
prov_tick.mq5  2 kb
 
Prival:

Durante la noche me di cuenta de una cosa muy extraña, la hora de inicio del bar se refleja con un error - el error era de más de un minuto. Ahora he decidido comprobarlo y he creado un indicador de prueba


Si añade el valor de rates_total a la salida, verá que se producen errores al comparar los minutos de la barra actual con los de la barra anterior.

2010.06.18 11:53:18     prov_tick_src (EURUSD,M1)       тик №=4 i=51420 rates_total=51422 c=1.23997 time[i]=2010.06.18 09:51:00 time=2010.06.18 09:52:06 delta=6
2010.06.18 11:52:12     prov_tick_src (EURUSD,M1)       тик №=3 i=51419 rates_total=51421 c=1.24061 time[i]=2010.06.18 09:50:00 time=2010.06.18 09:51:00 delta=0

Es decir, tiempo[rates_total-2].

Además, la salida delta no está del todo clara.

https://www.mql5.com/ru/docs/basis/function/events#oncalculate dice:

Los parámetros open[], high[], low[] y close[] contienen matrices con los precios de apertura, máximo, mínimo y cierre del marco temporal actual. El parámetro time[] contiene una matriz de valores de tiempo de apertura, el parámetro spread[] contiene una matriz con el historial de spreads (si se especifica un spread para un instrumento comercial). Los parámetros volume[] y tick_volume[] contienen el historial de volumen de operaciones y de ticks, respectivamente.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Prival:

Durante la noche me di cuenta de una cosa muy extraña, la hora de inicio del bar se refleja con un error - el error era de más de un minuto. He decidido comprobarlo ahora y he hecho un indicador de prueba

Registro

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #=2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

Los dos primeros ticks son claros, es un comienzo de indicador. Pero los próximos .... Resulta que hay una barra nueva según la hora del servidor, mientras que este tick pertenece a la barra antigua. Por la noche este delta es una pesadilla...

Pregunta a los desarrolladores, ¿es un error o fue diseñado así?

Z.I. mientras escribía esto es lo que aparece en el registro

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12 delta=12

Intenta hacer la prueba de la siguiente manera. Sin bucle.

      TimeToStruct(TimeCurrent(),      str1); // время сервера
      TimeToStruct(time[rates_total-1],str2); // время последнего бара  

Más adelante en el texto.

 
stringo:

Intenta comprobarlo de la siguiente manera. Sin ciclo.

Siguiente en el texto.

Lo tengo. Gracias. Hice una comprobación dentro del bucle.

   if(old_time<time[i]) 
         {
         Print("НОВЫЙ бар");
         old_time=time[i];
         //...
         }  
// а нужно вот так
   if(old_time<time[rates_total-1]) // работаем только по завершенным барам
         {
         Print("НОВЫЙ бар");
         old_time=time[rates_total-1];
         //...
         } 

En el momento de la nueva barra i no ha cambiado. No es económico, los mismos datos se calculan repetidamente. Aunque...

¿Es esta situación https://book.mql4.com/ru/samples/icustom fig.119 excluida en MQL5 si no? y esta plantilla de indicador siempre dará salida a un cierre correcto? o hay alguna trampa?

input int   MaxBars=240;
datetime old_time=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(prev_calculated==0) 
      {
      //... расчитать историю
      //...
      old_time=time[rates_total-1];
      }
// работаем только по завершенным барам
   if(old_time<time[rates_total-1]) 
      {
      old_time=time[rates_total-1];
      Print("НОВЫЙ бар close[1]=", close[rates_total-2]);
      }  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
P.D. gracias por la ciencia
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
Cuando empiezo a ejecutar mi EA todo el terminal se bloquea en el probador, pero si lo pongo en un gráfico todo va bien.

Está demostrado por la experiencia que se pueden digerir unos 110 parámetros (y hay preguntas). A las 120, el terminal se bloquea si el Asesor Experto está especificado en el probador.


Ya he dado algunas soluciones en privado, pero si pasa algo, también puedes preguntar a los desarrolladores. Creo que podrían ayudar con esta limitación...

 
Interesting:

Está demostrado por la experiencia que se pueden digerir unos 110 parámetros (y hay preguntas). A los 120 el terminal se bloquea si se especifica el Asesor Experto en el probador.


Ya he dado algunas soluciones en privado, pero si hay algo, puedes preguntar a los desarrolladores. Creo que podrían ayudar con esta limitación...

Es extraño, por supuesto, que tal restricción afecte al probador. En quad, por ejemplo, no existe ese problema
 

ahora las citas del fin de semana no vienen. ejecutando el script

Print(TimeCurrent());

resultado

2010.06.20 00:26:06 00 (USDJPY,M1) 2010.06.18 22:35:52

aunque la última barra tiene la hora 2010.06.18 23:00:00

parece extraño, muy inconveniente para probar la corrección de algunas funciones.

 

Falta el botón "Aplicar" en la ventana de configuración del indicador.


 
Interesting:

Está demostrado por la experiencia que se pueden digerir unos 110 parámetros (y hay preguntas). A los 120 el terminal se bloquea si se especifica el Asesor Experto en el probador.

Ya he dado algunas soluciones en privado, pero si hay algo, puedes preguntar a los desarrolladores. Creo que podrían ayudar con esta limitación...

Puede optimizar un máximo de 64 parámetros.
 
stringo:
Se puede optimizar un máximo de 64 parámetros.
Optimiza 64 y utiliza aproximadamente 110 en el probador (sin optimización). Aunque 110, por supuesto, ya es un número "de pesadilla" de parámetros para el Asesor Experto (pero sucede)...