Erreurs, bugs, questions - page 2759

 
Sergey Dzyublik:
Bug dans le débogueur MT5 (build 2450) : déclenchement incorrect des points d'arrêt définis manuellement :

Pouvez-vous expliquer pourquoi vous devez vous donner tout ce mal ?

if(false)
Utilisez-vous un débogueur ?
 
Sergey Chalyshev:

Pouvez-vous nous expliquer pourquoi nous devons tordre le code de cette façon ?

Utilisez-vous le débogage ?

Le code montre un BAG où la condition ne peut pas être saisie, mais le point d'arrêt se déclenche toujours à un endroit complètement différent du code.
D'autres questions ?

 

J'ai écrit le message suivant au support de découverte.

J'ai testé le robot sur une histoire. J'ai obtenu des résultats étranges. La partie inférieure du tableau est sur la capture d'écran. Si vous considérez que je trade avec 100 000 roubles, le solde négatif de -6049 avec 17% de drawdown semble incroyable. En effet, lorsque j'ouvrele graphique testant cet ensemble de paramètres, j'obtiens un solde positif au niveau du drawdown spécifié. Le compte est réel 75287 (comme on le voit sur la photo). Quelle peut être la raison d'un tel comportement du programme ?

Je peux également ajouter que tous les jeux de paramètres se comportent de cette manière.

J'ai la réponse :

Malheureusement, ces questions ne relèvent pas de l'assistance technique.

Veuillez contacter les développeurs du terminal.

Quelle pourrait être la raison ?

 
Sergey Dzyublik:

Le code montre un BAG où une condition ne peut pas être saisie, mais déclenche quand même un point d'arrêt à un endroit complètement différent du code.
D'autres questions ?

Tout me semble correct. Le programme ignore if(false) et se déclenche au fragment de code le plus proche).

 
TraSer:

Il me semble que tout est correct. Le programme ignore if(false) et se déclenche à l'endroit le plus proche dans le code).

Ce n'est pas du tout correct. Si j'ai besoin de m'arrêter uniquement lorsqu'une condition est remplie, et que l'arrêt se fera à chaque tick, je vais devenir fou pendant...

 
Sergey Dzyublik:

D'autres questions ?

qu'est-ce qui vous fait penser que le compilateur n'a pas jeté le texte de la condition if(false) {....} lors de la compilation du projet ?

un point d'arrêt apparaît sur le premier caractère de texte ME du reste du code car ME ne peut pas décaler les chaînes de caractères, les pliages et autres merveilles VS

ME ne peut pas analyser le code en temps réel, au maximum des autosubstitutions sont disponibles.

bien que si c'est un bug, c'est un bug

 
Igor Makanu:

qu'est-ce qui vous fait penser que le compilateur n'a pas jeté le texte de la condition if(false) {....} lors de la compilation du projet ?

le point d'arrêt était au premier caractère de texte ME du reste du code car ME ne peut pas décaler les chaînes de caractères, les pliages et autres merveilles VS

ME ne peut pas analyser le code en temps réel, tout au plus des autosubstitutions sont disponibles

bien que si c'est un bug, c'est un bug.

Vous devez le tester dans des conditions normales. J'ai eu ceci l'autre jour : en exécutant le code étape par étape

  if(desiredProfit > 0 && summProfit > desiredProfit)
   {
    CloseAllPosition();
    DeleteAllPending();
    openSeries = Should_I_open;
    return;
   }

dans le débogueur, avec une condition explicite non remplie, les appels de fonction n'ont pas été exécutés, mais return ; l'est. J'ai décidé que puisqu'il n'y a plus de code après le crochet courbe et qu'il n'y a plus qu'un crochet courbe terminant void OnTick(), le compilateur a déplacé return

 
Alexey Viktorov:

Ceci doit être testé avec une condition normale.

Oui, c'est ce dont je parle, pas faux, mais quelque chose comme ça :

int i=1;
if(--i == 0)...

habituellement le compilateur ne voit pas une telle condition lors de la compilation

 
Merci pour la critique, je suis revenu à la version originale et j'ai mis en évidence le problème rencontré sans sur-optimiser le code :
.
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
Sergey Dzyublik:

Le code montre un BAG où une condition ne peut pas être saisie, mais déclenche quand même un point d'arrêt à un endroit complètement différent du code.
D'autres questions ?

L'optimiseur de code a tout jeté et la fonction est restée vide.

Le point d'arrêt s'est déplacé jusqu'à la toute fin de la fonction et s'est déclenché.