Erreurs, bugs, questions - page 2859

 

Dans le journal du testeur

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

Qu'est-ce que cela signifie ?

 
Aleksey Vyazmikin:

Dans le journal du testeur

Qu'est-ce que cela signifie ?

Cela signifie que lorsque la prochaine valeur de m1 ohlc est reçue (ou l'état de la barre lors du test par les prix ouverts), le champ temps contient 0.

fonction indéfinie signifie que le problème s'est produit en dehors des fonctions prédéfinies (OnTick, OnTimer, etc.), c'est-à-dire dans la boucle principale du testeur.

 
Slava:

Cela signifie que lorsque l'on obtient la prochaine valeur m1 ohlc (ou l'état de la barre lorsque l'on teste par les prix ouverts), le champ temps contient 0.

fonction indéfinie signifie que le problème s'est produit en dehors des fonctions prédéfinies (OnTick, OnTimer, etc.), c'est-à-dire dans la boucle principale du testeur.

Tout fonctionnait bien toute la journée et puis ça a commencé. Que puis-je faire en tant qu'utilisateur ?

 
Slava:

Cela signifie que lorsque l'on obtient la prochaine valeur m1 ohlc (ou l'état de la barre lorsque l'on teste par les prix ouverts), le champ temps contient 0.

fonction indéfinie signifie que le problème s'est produit en dehors des fonctions prédéfinies (OnTick, OnTimer, etc.), c'est-à-dire dans la boucle principale du testeur.

Je ne comprends pas, y a-t-il une erreur dans mon code ou une erreur dans le terminal ? J'ai effacé tout l'historique - ça n'a pas aidé.

Ajouté :

J'ai trouvé une fonction dans mon code, la désactiver évite l'erreur, mais dans un autre EA cette fonction fonctionne correctement ! Comment cela ? Je peux le déposer dans mon message privé.

Même lorsque cette fonction boguée est activée, OnTick() s'exécute complètement sur la première barre et ensuite cette erreur.

Sur différents terminaux, l'erreur est confirmée.

Je l'ai fait fonctionner par ticks - pas d'erreur...

Mais l'étrangeté se trouve dans le journal :

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

Sur les ticks si on regarde l'outil, le premier tick était exactement à 10:00, et la session de trading est toujours fermée à cette heure. Ceci est en mode visuel, sans tique la première impression vient à 10 heures.

 
Igor Makanu:

Le moyen le plus simple est de vérifier la permission d'initialisation au début de chaque EA dans OnTick()

C'est le principal point d'achoppement du problème.
 
fxsaber:
C'est le principal problème de la tâche.

Essayez de faire attention aux identifiants des tableaux et de procéder par ancienneté. Mais cela n'annule pas l'interaction des EA. Ou créez un fichier ou une base de données SQLite avec les ID des graphiques dans la séquence de lancement.

Quelque chose comme, à la première initialisation, s'il n'y a pas de Chart_ID() dans la liste, alors il est entré dans la liste. S'il n'est pas fermé en raison de la fermeture du terminal, il est retiré de la liste. De cette manière, il sera possible de configurer l'interaction des EA.

 
fxsaber:
C'est le principal point d'achoppement du problème.

en dessinant comment je le vois... créé 2 EA avec ce code :

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

et une EA de contrôle, qui fonctionne par minuterie ( 5 sec )

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


J'ai vérifié, tout fonctionne, la seule chose, ou cela n'a pas fonctionné avec GlobalVariableSetOnCondition() pour faire un enregistrement dans les variables globales

 
fxsaber:
C'est le principal problème de la tâche.

GlobalVariableSetOnCondition est tout ce qu'il faut pour résoudre le problème.

L'opération n'est autorisée que si GlobalVariableSetOnCondition a renvoyé true.
Après une initialisation réussie et la libération des ressources, la variable principale revient à son état initial et un autre EA démarre.

Dans DeInit - suppression inconditionnelle de la variable, afin de ne pas se retrouver dans le terminal sans aucune EA (si le chargement précédent n'a pas été effectué correctement).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Merci pour les recommandations. Je vais regarder GlobalVariableSetOnCondition.

 
Est-ce un comportement correct du compilateur ?
class A
{
public:
  static int i;
  
  static int f()
  {
    A::i = 123;
    
    return(A::i);
  }
};

static int A::i = A::f();

void OnStart()
{
  Alert(A::i); // 123
}
Il semble que A::i ne soit pas créé lors de l'appel de la méthode A::f(), qui appelle A::i.
Raison: