Questions des débutants MQL4 MT4 MetaTrader 4 - page 115

 

Les gars, voici une question : comment mettre des valeurs variables dans un tableau unidimensionnel ?

Ne l'envoyez pas à l'aide - il n'y a AUCUN exemple pour un tel problème.


Disons qu'il existe une variable a, qui change sous certaines conditions.

Je veux un tableau pour stocker les 3 dernières valeurs de cette variable. Comment cela est-il mis en œuvre dans mql4 ?


Je suis en train d'écrire int mas[3] ;

mas[]=a ; à l'intérieur de la boucle, après une condition qui modifie a,

Le compilateur donne ']', mais rien ne fonctionne, bien que logiquement cela devrait. - Il veut que je mette une expression inconnue dans mas[]=a à l'intérieur des parenthèses.

Est-ce que MQL4 a une fonction qui remplit le tableau avec une valeur variable à chaque itération de la boucle ?


 
Igor Makanu:

Je m'excuse de ne pas avoir trouvé le début de la correspondance, mais je tiens à vous conseiller immédiatement d'éviter les conditions complexes et les calculs dans celles-ci - cela rend le code illisible et par conséquent complique la recherche d'erreurs logiques, j'écrirais votre code comme ceci :

Si vous comprenez ce que je veux dire, vous pouvez modifier le code que je vous ai donné un peu plus, je veux dire le mettre dans une condition séparéeif(OrderType()==OP_BUY....

Il sera alors beaucoup plus facile de trouver des erreurs de logique, je pense.

Insérer après chaque OrderSend => return

ou faire une sélection via le commutateur :

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

J'ai essayé ça et ça ne marche pas.

vous avez peu de paramètres d'entrée dans votre appel d'indicateur personnalisé - comptez combien devariables externes dans l'indicateurMorning Flat ? (extern) - c'est le nombre de paramètres que vous devez passer lorsque vous utilisez iCustom

 
John Smith:
.....

J'écris int mas[3]=a ; à l'intérieur de la boucle après la condition lorsque a change,

mais rien ne fonctionne, bien que logiquement cela devrait.

Apprenez à faire toutes les actions étape par étape plutôt que toutes en même temps.

Exemple :

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

vous avez peu de paramètres d'entrée dans votre appel d'indicateur personnalisé - comptez combien devariables externes dans l'indicateurMorning Flat ? (extern) - c'est le nombre de paramètres que vous devez passer lorsque vous utilisez iCustom

Je les ai déjà tous essayés.

J'ai résolu le problème d'une autre manière. J'ai inséré le code de calcul du prix de l'indicateur dans mon Expert Advisor.

 
Igor Makanu:

La logique du code est la même, mais si vous divisez les conditions, il est plus rapide de trouver où se trouve l'erreur logique, et dans votre cas, si vous la mettez dans une condition séparée, vous obtenez une optimisation - la condition sera vérifiée une fois et non 4 fois :

en une condition séparée, nous obtenons une optimisation du code - la condition sera vérifiée une fois et non 4 fois comme dans votre exemple.

Vérifier la sortie dans le journal du conseiller expert en utilisant la fonction

pour la journalisation afin que vous puissiez voir quel fragment de code a été exécuté et avec quels paramètres.

Je vous remercie de votre réponse. Divisez les conditions jusqu'à la limite. Vérifié la logique avec les commentaires. Il s'est avéré que la fermeture de la position est basée sur les conditions de la première position ouverte. Cela signifie que si nous avons d'abord ouvert une position d'achat ou de vente avec la condition 1, puis une deuxième position ouverte avec la même condition mais avec la condition 2, cette condition de fermeture est ignorée et la deuxième position est également fermée avec la condition 1, quel que soit l'autre chiffre magique. Que dois-je faire ?

 
Vladimir Tkach:

Je les ai déjà tous parcourus.

J'ai résolu le problème d'une manière différente. J'ai collé le code de calcul du prix de l'indicateur au conseiller expert.

J'ai remarqué que iCustom() n'a pas été appelé correctement, ça devrait être comme ça :

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

Je passe 7 paramètres lorsque j'appelle l'indicateur, vous l'avez appelé avec 3 paramètres.

Je laisserais l'appel de l'indicateur, mais je modifierais l'indicateur lui-même - je supprimerais les variables externes et les objets graphiques du code de l'indicateur.


novichok2018:

J'ai vérifié la logique avec les commentaires. Il s'est avéré que les positions sont fermées en fonction des conditions de la première position ouverte.

Félicitations ! Vous êtes sur la bonne voie, mais il est préférable au stade du débogage de l'imprimer dans le journal (Print()) plutôt que dans le commentaire ( Commetn())

Montrez-moi le code.

 
Igor Makanu:

J'ai remarqué que vous n'avez pas appelé iCustom() correctement, cela devrait être comme ceci :

Je passe 7 paramètres lorsque j'appelle l'indicateur, et vous l'avez appelé avec 3 paramètres.

Je laisserais l'appel de l'indicateur, mais je modifierais l'indicateur lui-même - je supprimerais les variables externes et les objets graphiques du code de l'indicateur.


Félicitations ! Vous êtes sur la bonne voie, mais il est préférable au stade du débogage de sortir dans le journal (Print()) plutôt que dans le commentaire (Commetn()).

montrer le code.

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

J'ai enlevé les empreintes.

 
novichok2018:

J'ai enlevé les empreintes.

Je ne connais pas toute la logique de votre code, mais après chaque fermeture d'ordre vous devez certainement sortir de la boucle via break ; et au prochain tick vous devez vérifier à nouveau les ordres sur vos conditions - je ne sais pas comment se comporteOrderSelect() après la fermeture de l'ordre - si l'ordre est fermé, alors qu'est-ce qui est sélectionné, ou y aura-t-il une erreur ?

En fait, votre problème est que vous voulez tout vérifier et fermer en même temps dans une seule boucle.

switch()

ou créer une fonction pour clôturer l'ordre (il existe des fonctions toutes faites pour les ordres https://www.mql5.com/ru/forum/131859/page2#434206 )

ou utilisez la rupture après la fermeture de l'ordre dans votre code.

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

Je ne connais pas toute la logique de votre code, mais après chaque fermeture d'un ordre, vous devez certainement sortir de la boucle via break ; et au prochain tick, vous devez vérifier vos conditions à nouveau - je ne sais pas comment se comporteOrderSelect() après la fermeture de l'ordre - si l'ordre est fermé, alors ce qui est sélectionné, ou une erreur se produira ?

En fait, votre problème est que vous voulez tout vérifier et fermer en même temps dans une seule boucle.

switch()

ou créer une fonction pour clôturer l'ordre (il existe des fonctions toutes faites pour les ordres https://www.mql5.com/ru/forum/107476 )

ou utilisez la rupture après la fermeture de l'ordre dans votre code.

Merci. La rupture semble avoir aidé. Nous verrons ce qui se passera ensuite.

Raison: