Erreurs, bugs, questions - page 307

 
Jager:

Lorsque j'essaie de tester sur le usdjpy, je reçois un message comme celui-ci :

et semble continuer indéfiniment, quand il est arrivé à 3000 je l'ai éteint. Les tests ont essayé de passer sur 2010.10.01 - 2010.10.10, seulement les prix d'ouverture.

Bild 401

Je n'arrive pas non plus à faire démarrer un autre agent distant, voici le journal :

J'ai également observé un schéma similaire hier... On dirait que toute l'histoire a été surchargée et apparemment il y a eu quelques problèmes en le faisant.

Il semble que j'ai attendu la fin du processus ou que j'ai redémarré le terminal.

j'ai trouvé une chose intéressante hier. après avoir recompilé l'EA, les changements ne fonctionnent pas dans le testeur jusqu'à ce que vous redémarriez le terminal - c'est l'étain !!!

 
Im_hungry:
Un soutien total - peut-être un servicedesk ? (fermez-la une centaine de fois)
A quoi bon ? Ils savent tous parfaitement bien...
 

Depuis hier, les experts ont commencé à vivre leur vie numérique.

Lors du test, il donne un focus aléatoire... Il saute la fonction OnInit() par un moyen magique, puis il génère l'erreur array out of range dans la fonction DeInit().


Le problème est qu'avec les mêmes paramètres, il peut démarrer et exécuter tout le test, ou bien se planter.

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

Voici le défi : rendre le paramètre de l'indicateur dynamique. Lorsque vous fermez une position, vous changez l'un des paramètres de l'indicateur, voilà le défi.

Maintenant, ma solution :

Je peux dire que ce code fonctionne car les tests montrent un résultat différent, mais il n'est pas clair pourquoi il fonctionne t.s. de temps en temps, j'ai regardé dans le journal - 1 semaine tout fonctionne comme il le devrait, puis il boucle et sort les mêmes valeurs dans le tampon, bien que ce soit impossible (2 semaines les mêmes valeurs dans le journal du testeur), si pas de boucles alors juste écrit une erreur :

message via Alert

D'après ce que j'ai pu comprendre, l'Expert Advisor crée un handle d'un indicateur lorsqu'une nouvelle barre apparaît et en même temps il demande de copier les buffers de cet indicateur. Mais cela ne permet pas de résoudre le cas où le calcul des indicateurs tampons peut prendre un certain temps. En d'autres termes, la poignée de l'indicateur peut être créée avec succès, mais les tampons de l'indicateur n'ont pas encore été calculés.
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
D'après ce que j'ai pu comprendre, l'Expert Advisor crée un handle d'indicateur lorsqu'une nouvelle barre apparaît et en même temps il demande de copier les buffers de cet indicateur. Mais la situation n'est pas élaborée, lorsque le calcul des indicateurs tampons peut prendre un certain temps. En d'autres termes, la poignée de l'indicateur peut être créée avec succès, mais les tampons de l'indicateur n'ont pas encore été calculés.

Oui, je suis d'accord - c'est pourquoi j'ai essayé ce design :

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

Cela fonctionne pour l'instant ! Merci pour votre aide

 

Mais de temps en temps, ça lâche :

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

Oui, je suis d'accord - c'est pourquoi j'ai essayé ce design :

Ça marche jusqu'à présent ! Merci pour votre aide

Une telle construction permet d'éviter les cas où "la poignée a été créée, mais les tampons indicateurs n'ont pas encore été calculés". Comme la construction elle-même est appelée une fois par période, vous pouvez essayer d'appeler la fonction CopyBuffer() plusieurs fois. C'est-à-dire que si CopyBuffer()<0, alors on appelle la fonction de manière répétée, aussi longtemps que la période sélectionnée le permet (dans la période de temps sélectionnée).
 
Im_hungry:

Mais de temps en temps, ça arrive :

Eh bien, c'est vrai. Votre fonction proverkaHANDLA() est un bloc indépendant, qui fait référence en interne àCopyBuffer() une seule fois.Par conséquent, si les tampons ne sont pas calculés, il réapparaîtra toujours. Jusqu'à présent, votre fonction proverkaHANDLA() ne gère pas la situation "handle créé, mais les tampons d'indicateurs ne sont pas encore calculés", mais l'ignore.

 
Yedelkin:
Cette construction permet d'éviter les cas où "la poignée a été créée, mais les tampons indicateurs n'ont pas encore été calculés". Comme la construction elle-même est appelée une fois par période, vous pouvez essayer d'appeler de façon répétée la fonction CopyBuffer(). C'est-à-dire que si le CopyBuffer()<0, alors répéter l'appel de la fonction, aussi longtemps que la période sélectionnée le permet (dans la période de temps sélectionnée).

C'est-à-dire que pendant que CopyBuffer>0 nous le calculons, et le nouveau paramètre (Close()

apparaît à la fermeture de la position. C'est-à-dire qu'il faut boucler sur While. Ça se passe comme ça.

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
Essayez de vous renseigner sur BarsCalculated dans l'aide, qui donne d'ailleurs le bon exemple.