Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 26

 
trader781:

Une fois que vous aurez nettoyé votre code, il sera plus lisible pour vous, sans parler des autres personnes qui doivent comprendre votre logique. C'est là que l'on verra tous les bugs.

OK, c'est mieux ?
Maintenant, supprimez les accolades appariées inutiles et disposez le reste normalement en blocs, et vous verrez où vous avez des défauts de logique.
 
Artyom Trishkin:
Maintenant, enlevez les crochets appariés supplémentaires et disposez le reste normalement dans des blocs, et vous verrez où votre logique est défectueuse.
Quels sont les autres ?
 
trader781:
Lesquelles sont redondantes ?
Vous avez beaucoup de parenthèses inutiles dans votre code - utilisez un outil de style et vous verrez immédiatement les parenthèses vides superflues.
 
Artyom Trishkin:
Vous avez beaucoup d'accolades inutiles dans votre code - traitez le code avec un stylet, et vous verrez immédiatement les accolades vides supplémentaires.
Terminé
Dossiers :
 
trader781:
Terminé
Je regarderai ça plus tard - ça prendra au moins quatre heures...
 
trader781:
Fabriqué par
1.count++ ; // compte les ticks depuis le début du programme

Meilleure méthode : if(count<=20) count++ ; - pourquoi compter davantage si vous n'avez besoin que de 21 ?

2.
   if(count>20) //  если количество тиков больше начинаем работу ... и дальше код эксперта
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
      return;
     }

Et voici le wigwam. Cela ne vérifiera le nombre de barres et n'imprimera que sile compte >20, le reste du code fonctionnera si lecompte<=20.

3.

if(OrderSymbol()==Symbol() && OrderType()<2)
            continue;

Si vous n'avez besoin de prendre en compte que les marchés (et c'est ce que vous attendez de la suite du code), vous n'avez pas besoin decontinuer du tout.

4.

         if(y==true && (OrderType()==0)) //+-----покупка
           {
            dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));

              {
               if((dummy==true) && ((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==false))

                  PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               dummy=false;
               ExpertRemove();
              }
           }

Il ferme une commande et s'élimine lui-même ? Et s'il y en a d'autres ? Et nous avons une minute entière pour dormir.

Je n'ai pas regardé le code ci-dessus, il n'y a pas encore d'endroit pour le tester.

 

1 ok, je vais le corriger

2 ce n'est pas ok, les blocs suivants ne devraient pas fonctionner àcount<20

3 OK, je vais le corriger

4 Oui, c'est une minute mais elle ne doit être lancée que s'il n'y a plus d'ordres de marché pour le symbole en cours. J'ai essayé de l'implémenter par le biais d'un résultat négatif de la sélection de l'ordre, c'est pourquoi nous devrions définir le retour quelque part, mais le retour dans void OnTick() ne semble pas très bon. Et encore une fois, OrdersTotal() donnera un résultat erroné si nous avons beaucoup d'ordres pour tous les symboles.

 
trader781:

2 n'est pas OK, les blocs suivants ne devraient pas fonctionner lorsquecount<20

Ensuite, nous devons ajouter else return après le bloc ;

4 Oui, c'est une minute mais elle ne doit être lancée que s'il n'y a plus d'ordres de marché pour le symbole en cours. J'ai essayé de l'implémenter à travers un résultat négatif de la sélection des ordres, c'est pourquoi nous devrions définir le retour quelque part, alors que le retour dans void OnTick() ne semble pas très bon. Et encore une fois, OrdersTotal() donnera un résultat erroné si nous avons beaucoup d'ordres sur tous les symboles.

Pourquoi avons-nous besoin de trois sons ?

Eh bien, nous pouvons tout faire en deux étapes : dans la première boucle, vous fermez les ordres et dans la suivante, vous recalculez tous les ordres au marché pour vérifier s'il en reste, et s'il n'y en a pas, les fanfares jouent.

Mais je ne comprends toujours pas quel est le truc avec la musique après la clôture des commandes. Bon, vous pouvez imprimer un journal, envoyer un message par courrier ou une notification sur votre smartphone, mais pourquoi transformer un EA en boîte à musique ?
 
Vitalie Postolache:

Ensuite, vous devez ajouter un retour après le bloc else return;

Pourquoi avons-nous besoin de trois fois plus de son ?

Mais vous pouvez tout faire en deux étapes : dans la première boucle, vous fermez les ordres, et dans la suivante, vous recalculez tous les ordres au marché pour vérifier s'il y en a qui ne sont pas fermés, et s'il n'y en a pas, la fanfare joue.

Je ne comprends toujours pas quel est le truc avec la musique lorsque les commandes ont été clôturées. Bien, nous pouvons l'imprimer sur le journal, envoyer un message par courrier ou le notifier sur le smartphone, mais pourquoi devrions-nous transformer notre EA en boîte à musique ?

Comment séparez-vous les cycles ?

Comment lier le son au dernier ordre clôturé ? Parce que s'il n'y a pas d'ordre, le conseiller expert ne déclenchera pas de son.

Et une dernière chose : je suis content de la musique pour l'instant.

 
trader781:

Comment séparer les cycles ?

Comment lier le son au dernier ordre fermé ? car s'il n'y a pas d'ordre, l'Expert Advisor ne fonctionnera pas.

Et enfin, je suis content de la musique pour l'instant.

Que voulez-vous dire par "séparé" ? Nous n'avons pas besoin de séparer quoi que ce soit. Nous avons juste besoin de deux boucles (elles sont presque les mêmes) mais l'une a OrderClose() et l'autre a un compteur d'ordres. Le critère de sélection des commandes est le même. Si le compteur est=0, toutes les commandes ont été fermées et nous pouvons jouer de la musique.

J'ai également remarqué que la condition

         if(Uslovie1==true) //Bid+ma6
           {
            if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
              {
                 {y=true;}
              }
           }

Il ne semble pas être lié à un certain ordre, alors à quoi sert-il dans la boucle ?

Je le vérifierais avant la boucle de fermeture.

Raison: