Discussion sur la documentation de MQL4 - page 18

 
Eh bien... De la façon dont je le vois, c'est la bonne réponse :

void SendMail( string subject, string some_text)
Envoie un e-mail à l'adresse spécifiée dans la fenêtre des paramètres de l'onglet Courrier.
La fonction ne fonctionne pas en mode test. Cette fonction ne peut pas non plus être appelée à partir des indicateurs utilisateur.
L'envoi peut être interdit dans les paramètres, de même que l'adresse électronique peut ne pas être spécifiée. La fonction GetLastError() doit être appelée pour obtenir les informations sur les erreurs.
[...]

Dans l'indicateur, il est vrai que je n'ai pas vérifié... :)

Z.U. Je m'oppose au titre du sujet et propose de le renommer en quelque chose comme ceci : "Amélioration de la documentation de MQL4 : suppression des inexactitudes et des lacunes". Quelque chose comme ça.
 
Dans l'exemple de la fonction OrderSelect(), j'ai rencontré une telle expression :
if(OrderSelect(12470, SELECT_BY_TICKET)==true) ...
Puis je l'ai vu à d'autres endroits dans la documentation également.

Expliquez-moi, s'agit-il simplement d'un style de programmation ?
Si ce n'est pas le cas, quelle est la raison d'utiliser l'opération de comparaison pour les variables logiques ?
Pourquoi n'utilise-t-on pas une expression plus simple ?
if(OrderSelect(12470, SELECT_BY_TICKET)) ...
 
Yurixx:
Pourquoi n'utilise-t-on pas une expression plus simple :

La première expression est intuitivement plus compréhensible et ne prête pas à controverse, surtout pour les débutants, bien que la seconde soit probablement plus largement utilisée.
 
qu'est-ce qu'un paramètre formel et qu'est-ce que cela a à voir avec les paramètres passés par référence ?
 
Souvent, les fonctions de calcul de valeurs nécessitent certains paramètres en entrée. Par exemple, si nous examinons la fonction OrderSend(), elle comporte de nombreux paramètres de ce type :
  • Symbole
  • Type de commande
  • Volume de la position en lots
  • Le prix de la découverte
  • Dérapage en pips
et ainsi de suite. Les paramètres passés à la fonction peuvent être de deux types : ceux qui ne changent en aucune façon pendant le fonctionnement de la fonction appelée, et ceux qui peuvent être traités dans celle-ci.
Par exemple, considérons la fonction suivante :

//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString(string &ArrayRes[],string InputString,string splitter)
  {
   string temp,tempArray[100];
   int pos,splitLength=StringLen(splitter),InputStrLength=StringLen(InputString),counter;
 
   pos=StringFind(InputString,splitter);
   if (pos!=-1)
      {
      if (pos==0) InputString=StringSubstr(InputString,splitLength,InputStrLength-splitLength);
      while (StringFind(InputString,splitter)!=-1)
         {
         pos=StringFind(InputString,splitter);
         InputStrLength=StringLen(InputString);
         tempArray[counter]=StringSubstr(InputString,0,pos);
         InputString=StringSubstr(InputString,pos+splitLength,InputStrLength-splitLength-pos);
         counter++;
         }
      if (StringLen(InputString)!=0)
         {
         tempArray[counter]=InputString;
         counter++;
         }   
      }
   ArrayResize(ArrayRes,counter);
   for (int i=0;i<counter;i++)  
      {
      ArrayRes[i]=tempArray[i];
      Print("i=",i,"   string=",ArrayRes[i]);
      }
   return;   
  }
Trois paramètres sont passés à SplitString() : un tableau ArrayRes par référence (précédé d'une esperluette &) et deux paramètres formels InputStrung (la chaîne à diviser en parties) et splitter (qui est le séparateur pour la division).
Lorsque la fonction est exécutée, le tableau ArraRes contient plusieurs chaînes de caractères. La fonction elle-même dans MQL4 ne peut pas retourner des types complexes (par exemple un tableau), mais en utilisant le passage des paramètres par référence, nous évitons cette restriction.

Le scénario complet est le suivant :

//+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru/"
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString(string &ArrayRes[],string InputString,string splitter)
  {
   string temp,tempArray[100];
   int pos,splitLength=StringLen(splitter),InputStrLength=StringLen(InputString),counter;
 
   pos=StringFind(InputString,splitter);
   if (pos!=-1)
      {
      if (pos==0) InputString=StringSubstr(InputString,splitLength,InputStrLength-splitLength);
      while (StringFind(InputString,splitter)!=-1)
         {
         pos=StringFind(InputString,splitter);
         InputStrLength=StringLen(InputString);
         tempArray[counter]=StringSubstr(InputString,0,pos);
         InputString=StringSubstr(InputString,pos+splitLength,InputStrLength-splitLength-pos);
         counter++;
         }
      if (StringLen(InputString)!=0)
         {
         tempArray[counter]=InputString;
         counter++;
         }   
      }
   ArrayResize(ArrayRes,counter);
   for (int i=0;i<counter;i++)  
      {
      ArrayRes[i]=tempArray[i];
      Print("i=",i,"   string=",ArrayRes[i]);
      }
   return;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   string strInfo="aae|aer3|dzse|faw323";
   string strResult[] ;
   
   SplitString(strResult,strInfo,"|");
   
   int N=ArraySize(strResult);
   if (N>0)
      {
      for (int i=0;i<N;i++) Print("strResult[",i,"]=",strResult[i]);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Exécutez-le dans votre environnement et voyez le résultat.
 
Voici une autre pièce malheureuse de la documentation

double OrderClosePrice( )
Renvoie le prix de clôture de l'ordre sélectionné.
La commande doit être présélectionnée à l'aide de OrderSelect().
Exemple :
 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true) { datetime ctm=OrderOpenTime() ; if(ctm>0) Print("Open time for the order 10 ", ctm) ;
     ctm=OrderCloseTime() ; if(ctm>0) Print("Heure de clôture de l'ordre 10 ", ctm) ; } else Print("Le code d'erreur de la sélection de l'ordre est",GetLastError()) ;

La description porte sur la fonction OrderClosePrice, tandis que l'exemple porte sur la fonction OrderClosePrice.
C'est probablement la raison pour laquelle 99 % des conseillers experts que nous examinons procèdent à une analyse absolument inutile du type d'ordre.
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 0);
Quand tu pouvais juste écrire
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)
 
Oui, c'est un point que j'ai relevé la semaine dernière. Je pense que quelque chose comme ça :

 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime  ctm= OrderOpenTime();if(ctm>0)
     Print("Open time for the order 10 ", TimeToStr(ctm)); 
     double price=OrderClosePrice();
     if(price>0) Print("Close price for the order 10 ", DoubleToStr(price,MarketInfo(OrderSymbol(),MODE_DIGITS)));
    }
  else
    Print("OrderSelect failed error code is",GetLastError());
 
Citation
------
Trois paramètres sont transmis à SplitString() : le tableau ArrayRes par référence (avec esperluette & devant) et deux paramètres formels InputStrung (la chaîne à analyser) et splitter (qui est le séparateur pour l'analyse).
Lorsque la fonction est exécutée, le tableau ArraRes contient plusieurs chaînes de caractères. La fonction elle-même dans MQL4 ne peut pas retourner des types complexes (par exemple un tableau), mais en utilisant le passage des paramètres par référence, nous évitons cette restriction.
------

Je comprends cela. Je ne comprends pas pourquoi vous les avez appelés "formels". S'agit-il de paramètres qui sont passés juste pour le plaisir, de manière purement formelle ? Il n'y a pas de telle chose en C.

Pourquoi la description des types de paramètres est-elle décrite dans la section "Variables" et non dans la section "Fonctions" ?
 
cout:
Je comprends cela. Je ne comprends pas pourquoi vous les qualifiez de "formels". S'agit-il de paramètres que l'on fait simplement passer, de manière purement formelle ? Cela n'existe pas en C.


Parce que les variables passées dans une fonction y sont passées formellement, non pas comme des variables, mais comme leurs valeurs. Les variables peuvent être manipulées (leurs valeurs changent), alors que de telles manipulations avec les valeurs n'ont aucun sens.
Voici une autre version de cet exemple :

//+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru/"
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString(string &ArrayRes[],string InputString,string splitter)
  {
   string temp,tempArray[100];
   int pos,splitLength=StringLen(splitter),InputStrLength=StringLen(InputString),counter;
 
   pos=StringFind(InputString,splitter);
   if (pos!=-1)
      {
      if (pos==0) InputString=StringSubstr(InputString,splitLength,InputStrLength-splitLength);
      while (StringFind(InputString,splitter)!=-1)
         {
         pos=StringFind(InputString,splitter);
         InputStrLength=StringLen(InputString);
         tempArray[counter]=StringSubstr(InputString,0,pos);
         InputString=StringSubstr(InputString,pos+splitLength,InputStrLength-splitLength-pos);
         counter++;
         }
      if (StringLen(InputString)!=0)
         {
         tempArray[counter]=InputString;
         counter++;
         }   
      }
   ArrayResize(ArrayRes,counter);
   for (int i=0;i<counter;i++)  
      {
      ArrayRes[i]=tempArray[i];
      Print("i=",i,"   string=",ArrayRes[i]);
      }
   InputString="Входная строка";
   splitter="разделитель";
   Print("InputString=",InputString,"    splitter=",splitter);
   return;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   string strInfo="aae|aer3|dzse|faw323";
   string strResult[] ;
   string devider="|";
   SplitString(strResult,strInfo,devider);
   
   int N=ArraySize(strResult);
   if (N>0)
      {
      for (int i=0;i<N;i++) Print("strResult[",i,"]=",strResult[i]);
      }
   Print("strInfo=",strInfo,"    devider=",devider);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Il faut donc les appeler "Passing parameters by value ".
Formellement, cela signifie que rien ne dépend de sa valeur, par exemple, réservé pour une utilisation future :). Mais les paramètres passés par valeur dépendent de quelque chose, sinon ils seraient appelés formels :).