Erreurs, bugs, questions - page 12

 

Pendant la nuit, j'ai remarqué une chose très étrange, l'heure de début de la barre est reflétée avec une erreur - l'erreur était de plus d'une minute. Je veux maintenant le vérifier et j'ai créé un indicateur de test.

#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);
  }
Journal de bord

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

Les deux premiers tics sont clairs, c'est un début d'indicateur. Mais les prochains .... Il s'avère qu'il y a une nouvelle barre selon l'heure du serveur, alors que ce tick appartient à l'ancienne barre. La nuit, ce delta est un cauchemar...

Question aux développeurs, c'est un bug ? ou c'est ainsi qu'il a été conçu ?

Z.I. pendant l'écriture, voici ce qui apparaît dans le log

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

Dossiers :
prov_tick.mq5  2 kb
 
Prival:

Pendant la nuit, j'ai remarqué une chose très étrange, l'heure de début de la barre est reflétée avec une erreur - l'erreur était de plus d'une minute. J'ai décidé de le vérifier et j'ai créé un indicateur de test.


Si vous ajoutez la valeur de rates_total à la sortie, vous verrez que des erreurs se produisent lorsque vous comparez les minutes de la barre actuelle avec celles de la barre précédente.

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

C'est-à-dire le temps [taux_total-2].

De plus, la sortie delta n'est pas tout à fait claire.

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

Les paramètres open[], high[], low[] et close[] contiennent des tableaux avec les prix d'ouverture, maximum, minimum et de clôture de la période actuelle. Le paramètre time[] contient un tableau de valeurs de temps ouvert, le paramètre spread[] contient un tableau avec l'historique des spreads (si un spread est spécifié pour un instrument de transaction). Les paramètres volume[] et tick_volume[] contiennent l'historique du volume de la transaction et du tick, respectivement.

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

Pendant la nuit, j'ai remarqué une chose très étrange, l'heure de début de la barre est reflétée avec une erreur - l'erreur était de plus d'une minute. J'ai décidé de le vérifier maintenant et j'ai créé un indicateur de test.

Journal de bord

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

Les deux premiers tics sont clairs, c'est un début d'indicateur. Mais les prochains .... Il s'avère qu'il y a une nouvelle barre selon l'heure du serveur, alors que ce tick appartient à l'ancienne barre. La nuit, ce delta est un cauchemar...

Question aux développeurs, est-ce un bug ou cela a-t-il été conçu de cette façon ?

Z.I. pendant l'écriture, voici ce qui apparaît dans le log

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

Essayez de tester comme suit. Sans boucle.

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

Plus loin dans le texte.

 
stringo:

Essayez de vérifier comme suit. Sans cycle.

Suivant dans le texte.

Oups. Je l'ai eu. Merci. J'ai fait une vérification à l'intérieur de la boucle.

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

Au moment de la nouvelle barre, i n'a pas changé. Non économique, les mêmes données sont calculées à plusieurs reprises. Bien que...

Cette situation est-elle https://book.mql4.com/ru/samples/icustom fig.119 exclue dans MQL5 si non ? et ce modèle d'indicateur produira toujours une clôture correcte ? ou y a-t-il des pièges ?

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.S. : merci pour la science
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
Lorsque je commence à exécuter mon EA, le terminal entier se bloque dans le testeur, mais si je le place sur un graphique, tout va bien.

Il est prouvé par l'expérience qu'environ 110 paramètres peuvent être digérés (et il y a des questions). À 120, le terminal se bloque si l'Expert Advisor est spécifié dans le testeur.


J'ai déjà donné quelques solutions en privé, mais si quelque chose arrive, vous pouvez aussi demander aux développeurs. Je pense qu'ils pourraient être en mesure d'aider avec cette limitation...

 
Interesting:

Il est prouvé par l'expérience qu'environ 110 paramètres peuvent être digérés (et il y a des questions). À 120, le terminal se bloque si l'Expert Advisor est spécifié dans le testeur.


J'ai déjà donné quelques solutions en privé, mais si vous avez besoin de quelque chose, vous pouvez demander aux développeurs. Je pense qu'ils pourraient être en mesure d'aider avec cette limitation...

étrange, bien sûr, qu'une telle restriction affecte le testeur. En quad, par exemple, il n'y a pas de problème de ce type.
 

maintenant les citations du week-end n'arrivent pas. en exécutant le script

Print(TimeCurrent()) ;

résultat

20.06.2010 00:26:06 00 (USDJPY,M1) 18.06.2010 22:35:52

bien que la dernière barre ait l'heure 2010.06.18 23:00:00

il semble étrange, très peu pratique de tester l'exactitude de certaines fonctions.

 

Le bouton "Appliquer" dans la fenêtre des paramètres de l'indicateur est absent.


 
Interesting:

Il est prouvé par l'expérience qu'environ 110 paramètres peuvent être digérés (et il y a des questions). À 120, le terminal se bloque si l'Expert Advisor est spécifié dans le testeur.

J'ai déjà donné quelques solutions en privé, mais si vous avez besoin de quelque chose, vous pouvez demander aux développeurs. Je pense qu'ils pourraient être en mesure d'aider avec cette limitation...

Vous pouvez optimiser un maximum de 64 paramètres.
 
stringo:
Un maximum de 64 paramètres peuvent être optimisés.
Optimisez 64 et utilisez environ 110 dans le testeur (sans optimisation). Bien que 110, bien sûr, soit déjà un nombre "cauchemardesque" de paramètres pour le Conseiller Expert (mais cela arrive)...
Raison: