Experts: Programmation MQL5 pour les Traders - Codes Source du livre. Partie 6

 

Programmation MQL5 pour les Traders - Codes Source du livre. Partie 6:

Dans la partie 6 de la "Programmation MQL5 pour les traders", nous étudierons un élément clé du langage MQL5 : l'automatisation du trading. Nous commencerons par une description des entités fondamentales, telles que les spécifications des instruments financiers et les paramètres du compte de trading. Il s'agit de conditions préalables à la création d’Expert Advisors fonctionnant correctement.

Programmation MQL5 pour les Traders - Codes Source du livre. Partie 6

Auteur : MetaQuotes

 
Superbe
 

Utilisez lebouton CODE (Alt-S) lorsque vous insérez du code.

Un modérateur a mis en forme le code incorrectement collé. En général, ce type de code est supprimé.

@StanislavKorotky Pouvez-vous nous aider à résoudre cette erreur, je pense qu'elle a commencé après les mises à jour de MT5 car je savais que le code fonctionnait les mois précédents sans aucune modification.

parameter convertion type 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20

la conversion du paramètre 'double[][2]' en 'string[][] &' n'est pas autorisée TradeFilter.mqh 332 20
la conversion du paramètre 'long[][2]' en 'string[][] &' n'est pas autorisée TradeFilter.mqh 163 17


Je pense que le code ci-dessous aidera à reproduire le problème :

void printSymbols() {
   SymbolFilter f;                      // objet filtre
   string symbols[];                    // tableau pour les noms 
   long permissions[][2];               // tableau pour les données (valeurs des propriétés)
   
   // liste des propriétés du symbole demandées
   ENUM_SYMBOL_INFO_INTEGER modes[] = {
      SYMBOL_TRADE_MODE,
      SYMBOL_ORDER_MODE
   };
   
   // appliquer le filtre, obtenir des tableaux avec les résultats
   f.let(SYMBOL_VISIBLE, true).select(true, modes, symbols, permissions);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Trade permissions for the symbols (%d) ===== ", n);
   for(int i = 0; i < n; ++i)  {
      Print(symbols[i] + ":");
      for(int j = 0; j < ArraySize(modes); ++j) {
         // afficher les descriptions des bits et des nombres "tels quels"
         PrintFormat("  %s (%d)",
            SymbolMonitor::stringify(permissions[i][j], modes[j]),
            permissions[i][j]);
      }
   }
}

Stanislav Korotky - marketeer - Trader's profile
Stanislav Korotky - marketeer - Trader's profile
  • 2025.07.05
  • www.mql5.com
Trader's profile
 
pauldic #:
@StanislavKorotky Pouvez-vous nous aider à résoudre cette erreur, je pense qu'elle a commencé après les mises à jour de MT5 car je savais que le code fonctionnait les mois précédents sans aucune modification.

parameter convertion type 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20
la conversion du paramètre 'double[][2]' en 'string[][] &' n'est pas autorisée TradeFilter.mqh 332 20
la conversion du paramètre 'long[][2]' en 'string[][] &' n'est pas autorisée TradeFilter.mqh 163 17


Je pense que le code ci-dessous aidera à reproduire le problème :


Veuillez trouver les lignes :

   // nous avons besoin de cette surcharge parce que le tri intégré ArraySort
   // ne prend pas en charge les tableaux de chaînes de caractères
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }

dans les fichiers d'en-tête SymbolFilter.mqh et TradeFilter.mqh, et ajoutez la surcharge de méthode suivante à côté d'elles :

   // nous avons besoin de cette surcharge parce que le tri intégré ArraySort
   // ne prend pas en charge les tableaux de chaînes de caractères
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }
   
   template<typename T>
   void ArraySort(T &s[][]) const
   {
      ::ArraySort(s);
   }
PS. Cette question ne semble pas avoir de rapport avec l'article.
 
Stanislav Korotky #:

Veuillez trouver les lignes :

dans les fichiers d'en-tête SymbolFilter.mqh et TradeFilter.mqh, et ajoutez la surcharge de méthode suivante à côté d'elles :

PS. Cette question ne semble pas liée à l'article.

Merci pour votre réponse rapide, après avoir fait la mise à jour, j'ai eu plus d'erreurs qui s'affichent :

parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'OrderMonitor&[][]'                   TradeFilter.mqh 338     20
parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'PositionMonitor&[][]'                        TradeFilter.mqh 338     20
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'OrderMonitor&[][]'                             TradeFilter.mqh 163     17
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'PositionMonitor&[][]'                  TradeFilter.mqh 163     17
etc..

J'ai remarqué que le fait d'appeler directement le QuickSortTm générique au lieu de l'ArraySort corrigeait temporairement le problème, bien que je ne pense pas que ce soit la solution optimale.

QuickSortTm<V> qt(array);
//ArraySort(array) ;
 
pauldic #:

Merci pour votre réponse rapide, après avoir fait la mise à jour, j'ai eu d'autres erreurs disant :

C'est étrange, après la correction suggérée ci-dessus, j'ai compilé et exécuté ce script /MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5 avec succès sur la build 5346. Vous n'avez pas montré votre code source.
 
Stanislav Korotky #:
C'est étrange, après la correction suggérée ci-dessus, j'ai compilé et exécuté ce script /MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5 avec succès sur la build 5346. Vous n'avez pas montré votre code source.
Pardonnez-moi d'avoir omis mon code source, j'ai donc repris la correction que vous m'avez suggérée afin d'obtenir à nouveau les erreurs et il semble que ces parties de mon code soient celles qui conduisent à l'erreur d'après le journal
Je fonctionne sur la version 5 build 5327

void printActiveOrders() {
   
   OrderFilter filter;
   ENUM_ORDER_PROPERTY_DOUBLE properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP};
   double d[][4];
   ENUM_ORDER_TYPE types[];
   ulong tickets[], magics[];
   string symbols[], comments[];
   
   filter.select(properties, tickets, d);
   filter.select(ORDER_SYMBOL, tickets, symbols);
   filter.select(ORDER_COMMENT, tickets, comments);
   filter.select(ORDER_TYPE, tickets, types);
   filter.select(ORDER_MAGIC, tickets, magics);
   
   Print("Orders ..................  ", ArraySize(tickets));
   for (int i=0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", magics[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], "\t", comments[i]);
   }
}


void printPositions() {
   PositionFilter filter;
   
   ENUM_POSITION_PROPERTY_DOUBLE properties[] = {POSITION_PRICE_OPEN, POSITION_VOLUME, POSITION_SL, POSITION_TP, POSITION_PROFIT, POSITION_SWAP};
   
   ENUM_POSITION_TYPE types[];
   double d[][6];
   ulong tickets[], extIds[];
   string symbols[], comments[];
   
   filter.let(POSITION_MAGIC, sets.MagicNumber).select(properties, tickets, d);
   filter.select(POSITION_SYMBOL, tickets, symbols);
   filter.select(POSITION_COMMENT, tickets, comments);
   filter.select(POSITION_TYPE, tickets, types);
   filter.select(POSITION_IDENTIFIER, tickets, extIds);

   Print("Tickets\t  Parent Id\tSymbols \t Trade Type \t\t\t\t\t\tEntry \t Lots \t\t SL  \t\t\t TP \t\t\t\t Profit \tSwat \t\tComments");
   for ( int i =0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : (string)extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", (string)NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5], "\t", comments[i]);
      //Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5]);
   }
}


Sur le côté, je vois souvent ces messages :

This single line message always shows whenever I attach my EA to a chart:
Unresolved int value as enum: 8 for MonitorInterface<ENUM_POSITION_PROPERTY_INTEGER,ENUM_POSITION_PROPERTY_DOUBLE,ENUM_POSITION_PROPERTY_STRING>::TradeState


While these ones below shows when it is detached

2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   8 leaked strings left
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   2 undeleted dynamic objects found:
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'WebSocketConnectionHybi'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'MqlWebSocketTransport'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   576 bytes of leaked memory found
Dossiers :
log.txt  34 kb
 
pauldic #:
Pardonnez-moi d'avoir omis ma source, j'ai donc repris la correction que vous m'avez suggérée afin d'obtenir à nouveau les erreurs et il semble que ces parties de mon code soient celles qui conduisent à l'erreur d'après le journal

. Par ailleurs, je vois souvent ces messages :

J'ai oublié que la lettre T était déjà utilisée comme typename du template de la classe (c'est étrange que le compilateur n'ait pas produit d'erreur dans ce cas), donc changer T par n'importe quelle autre lettre libre sera correct, par exemple X :

   template<typename X>
   void ArraySort(X &s[][]) const
   {
      ::ArraySort(s);
   }

En ce qui concerne le premier avertissement, voici une explication tirée des forums (que je vous ai donnée plus tôt) :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Experts : MQL5 Programming for Traders - Source Codes from the Book. Partie 7

Stanislav Korotky, 2025.06.14 16:26

Il s'agit simplement d'un avertissement causé par le fait que l'énumération intégrée correspondante de MQL5 présente une lacune dans les constantes qui sont normalement assignées consécutivement. Cette lacune est due au fait que MQL5 est en constante évolution et que certaines constantes peuvent devenir obsolètes et être éliminées. Vous pouvez éditer le code source pour éviter de tels avertissements.

Et à propos de la fuite de mémoire, je crains qu'il n'y ait une omission dans votre code source personnalisé, le livre n'a pas montré ce genre de choses. Vous devriez fournir un code de test complet pour reproduire le problème.

PS. Il est plus efficace d'exécuter une seule sélection pour toutes les propriétés qui vous intéressent :

   // EXEMPLE : demande de profit, de symbole, de ticket pour les positions
   // par nombre magique spécifique, trié par profit
   
   #include <MQL5Book/Tuples.mqh>
   #include <MQL5Book/PositionFilter.mqh>
   #property script_show_inputs
   
   input ulong Magic;
   
   void OnStart()
   {
      int props[] = {POSITION_PROFIT, POSITION_SYMBOL, POSITION_TICKET};
      Tuple3<double,string,ulong> tuples[];
      PositionFilter filter;
      filter.let(POSITION_MAGIC, Magic).select(props, tuples, true);
      ArrayPrint(tuples);
   }



NB : Je pense que les modérateurs devraient déplacer toutes les questions et réponses concernant le livre (à partir de #41) vers le fil de discussion approprié, par exemple, ici - https://www.mql5.com/en/forum/459067.

Experts: MQL5 Programming for Traders – Source Codes from the Book. Part 6
Experts: MQL5 Programming for Traders – Source Codes from the Book. Part 6
  • 2023.12.15
  • www.mql5.com
MQL5 Programming for Traders – Source Codes from the Book. Part 6 : Author: MetaQuotes...
 
Stanislav Korotky #:

J'ai oublié que la lettre T était déjà utilisée comme modèle de classe typename (il est étrange que le compilateur n'ait pas produit d'erreur dans ce cas), donc remplacer T par n'importe quelle autre lettre libre sera correct, par exemple X :

En ce qui concerne le premier avertissement, voici une explication tirée des forums (que je vous ai donnée plus tôt) :

Et à propos de la fuite de mémoire - je crains qu'il y ait une omission dans votre code source personnalisé, le livre n'a pas montré de telles choses. Vous devriez fournir un code de test complet pour reproduire le problème.

PS. Il est plus efficace d'exécuter une seule sélection pour toutes les propriétés qui vous intéressent :



NB : Je pense que les modérateurs devraient déplacer toutes les questions et réponses concernant le livre (à partir de #41) vers le fil de discussion approprié, par exemple, ici - https://www.mql5.com/en/forum/459067.

Merci beaucoup pour ce petit changement T -> X qui a fait la magie. Et merci encore pour le pointeur vers ma question précédente (j'avais oublié que je l'avais déjà posée) et votre rappel m'a permis de voir la mise à jour de toyjson3.mqh que j'avais manquée auparavant et pour le 'select' am je vais faire les corrections.

Je crois que vous avez raison à propos de la fuite, je pense que j'ai déjà une idée d'où elle vient.

Merci beaucoup mon frère.
 
void printActiveOrders() {
   int properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT};
   Tuple9<double,double,double,double,long,long,long,string,string> values[]; 
   OrderFilter filter;
   filter.select(properties, values);
   Print("\nFound:  ", ArraySize(values), " Orders\n{ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT}");
   ArrayPrint(values);
}

void printDeals() {
   DealFilter filter;    
   int properties[] = {DEAL_TIME, DEAL_SYMBOL, DEAL_TICKET, DEAL_TYPE, DEAL_VOLUME, DEAL_PRICE, DEAL_COMMISSION, DEAL_PROFIT};
   
   Tuple8<long,string,long,long,double,double,double,double> data[];   
   filter.select(properties, data, true); // Filtrer par temps
   Print("\nFound:  ", ArraySize(data), " Deals\nTIME, SYMBOL, TICKET, TYPE, VOLUME, PRICE, COMMISSION, PROFIT");
   ArrayPrint(data);
}

@StanislavKorotky
Je peux accéder aux transactions et aux ordres avec ce code, mais je n'ai pas réussi à comprendre comment y accéder pour une période spécifique. Je n'ai pas réussi à comprendre comment accéder à la même chose pour une période spécifique. Pouvez-vous me guider vers un document ou un exemple sur la façon de faire la même chose pour une période spécifique ?

 
pauldic #:

Je peux accéder aux transactions et aux ordres avec ce code, mais je n'ai pas réussi à comprendre comment y accéder pour une période de temps spécifique. Je n'ai pas réussi à comprendre comment accéder à la même chose pour une période spécifique. Pouvez-vous me guider vers un document ou un exemple sur la façon de faire la même chose pour une période spécifique ?

Les ordres, les transactions et les positions ne sont pas liés aux périodes de temps. Soit vous avez mal compris quelque chose, soit votre formulation est incorrecte.