Analogue à iBarShift - page 5

 
Aleksey Vyazmikin:

Pourquoi le script est-il si lent ?

La réponse est dans le profileur.

 
Andrey Khatimlianskii:

La réponse est dans le profileur.

OK, le profiler fait référence à ce morceau de code

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

Qu'est-ce qu'il n'aime pas ? La fonction n'est pas la mienne, mais l'auteur ci-dessus a affirmé qu'elle devrait fonctionner rapidement...

 
Aleksey Vyazmikin:

OK, le profiler fait référence à ce morceau de code

Et qu'est-ce qu'il n'aime pas ? La fonction n'est pas la mienne, mais l'auteur ci-dessus a affirmé qu'elle devrait fonctionner rapidement...

Je ne comprends pas vraiment l'humour, pourquoi avez-vous surchargé la fonctioniBarShift de MQL4 ? Le compilateur est probablement confus à cause de cela.
La fonction iBarShift2 est conçue pour MQL5, et dans MQL4, elle ne testait que l'exactitude de son exécution en la comparant à la fonction standard.

 
Nikolai Semko:

Je ne comprends pas l'humour, pourquoi avez-vous surchargé la fonction iBarShift de MQL4 ? Le compilateur est probablement confus à cause de cela.

Personne n'a annulé

#ifdef __MQL5__
/**************************/
#else
/**************************/
#endif

Et il ne devrait pas y avoir de confusion.

 
Nikolai Semko:

Je ne comprends pas l'humour, pourquoi avez-vous surchargé la fonction iBarShift de MQL4 ? Le compilateur peut s'embrouiller à cause de cela.
La fonction iBarShift2 est conçue pour MQL5, et dans MQL4, elle ne testait que l'exactitude de son exécution, en la comparant à la fonction standard.

Je n'ai pas dû faire attention, mais j'ai regardé à nouveau vos messages - c'est-à-dire vos fonctions pour MT4 ? C'est juste que le sujet portait sur MT5, je suppose que c'est ce qui m'a induit en erreur.

J'ai ajouté : Mince, j'ai trouvé un autre code, c'est tout flou, je m'excuse.

 
Aleksey Vyazmikin:

Je n'ai pas dû faire attention, mais j'ai regardé à nouveau vos messages - c'est-à-dire vos fonctions pour MT4 ? C'est juste que le sujet portait sur MT5, je suppose que c'est ce qui m'a induit en erreur.

Ajouté : Merde, c'est ça - j'ai trouvé un autre code - c'est tout flou, désolé.

Wow. Non. J'ai essayé votre code dans MQL5 et je me suis embrouillé. Je comprends maintenant ce que vous voulez dire.
Voici une photo intéressante.
Si votre script fonctionne sur le TF=1 Day natif, tout est OK.
Mais si je l'exécute sur un autre TF, j'obtiens des décalages disproportionnés incroyables, que je ne peux pas encore expliquer, sauf par un bug dans le compilateur.
En même temps en mode débogage ou en mode profilage il n'y a pas ces freins ! !!
Je vais maintenant expérimenter et chercher la source des freins.

 
Nikolai Semko:

Whoa. Non. J'ai essayé votre code dans MQL5 et je me suis embrouillé. Je comprends maintenant ce que vous voulez dire.
Voici une photo intéressante.
Si votre script fonctionne sur le TF=1 Day natif, tout est OK.
Mais si je l'exécute sur un autre TF, j'obtiens des décalages disproportionnés incroyables, que je ne peux pas encore expliquer, sauf par un bug dans le compilateur.
En même temps en mode débogage ou en mode profilage il n'y a pas ces freins ! !!
Je vais maintenant expérimenter et chercher la source des freins.

Commencez votre recherche en substituant une valeur normale de date à date

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
 
Aleksey Vyazmikin:

Pourquoi le script est-il si lent ?


Oui, c'est surprenant.

J'ai localisé l'emplacement des freins.

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input int calcN=1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int index=0;index<calcN;index++)
     {
      Print("0");
      datetime T=iTime(_Symbol,PERIOD_CURRENT,index);
      Print("00  "+ TimeToString(T));
      int Day_Shift=iBarShift(_Symbol,TF,T,false);
      Print("1");
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      Print("2");
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);
      Print("3");

      if(index<3)Print("1 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);
      Print("4");

      if(index<3)Print("1 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }

   Print("5");

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+   
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Print("10");
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      Print("11");
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+

Si vous exécutez ce script sur, disons, H4

vous pouvez voir que la première fois qu'il accède à

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

le système se fige.

Et cette stupeur n'est pas présente lors du profilage ou du débogage.

Un problème évident pour le service d'assistance

 
Aleksey Vyazmikin:

Pourquoi le script est-il si lent ?

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:20:49.300 Scripts script BS (Si Splice,H4) loaded successfully

2018.03.30 09:21:20.209 Scripts script BS (Si Splice,H4) removed

Merci Alexey pour cette observation.
Il s'agit d'un bogue évident dans la fonction Bars().
Ouverture de la question dans le fil de discussion " bugs, bugs, questions".

 
Nikolai Semko:

Merci Alexey pour cette observation.
Il s'agit d'un bogue évident dans la fonction Bars().
Ouverture d'une question dans le fil de discussion des bugs, bugs, questions

Merci pour l'analyse, je ne suis donc pas encore complètement fou...