Diskussion über die MQL4-Dokumentation - Seite 18

 
Na ja... So wie ich das sehe, ist das die richtige Antwort:

void SendMail( string subject, string some_text)
Sendet eine E-Mail an die im Einstellungsfenster auf der Registerkarte Mail angegebene Adresse.
Die Funktion funktioniert nicht im Testmodus. Diese Funktion kann auch nicht von den Benutzerindikatoren aus aufgerufen werden.
Der Versand kann in den Einstellungen verboten werden, auch die E-Mail-Adresse darf nicht angegeben werden. Die Funktion GetLastError() muss aufgerufen werden, um die Fehlerinformationen zu erhalten.
[...]

Im Indikator, zugegeben, ich habe nicht nachgesehen... :)

Z.U. Ich bin mit dem Titel des Themas nicht einverstanden und schlage vor, es in einen Titel wie diesen umzubenennen: "Verbesserung der MQL4-Dokumentation: Beseitigung von Ungenauigkeiten und Mängeln". So etwas in der Art.
 
In dem Beispiel für die Funktion OrderSelect() bin ich auf einen solchen Ausdruck gestoßen:
if(OrderSelect(12470, SELECT_BY_TICKET)==true) ...
Dann habe ich es auch an anderen Stellen in der Dokumentation gesehen.

Bitte erklären Sie das, ist es nur ein Programmierstil?
Wenn das nicht der Fall ist, was ist der Grund für die Verwendung der Vergleichsoperation für logische Variablen?
Warum wird nicht ein einfacherer Ausdruck verwendet?
if(OrderSelect(12470, SELECT_BY_TICKET)) ...
 
Yurixx:
Warum wird nicht ein einfacherer Ausdruck verwendet?

Der erste Ausdruck ist intuitiv verständlicher und vor allem für Anfänger unumstritten, obwohl der zweite Ausdruck wahrscheinlich weiter verbreitet ist.
 
Was ist ein formaler Parameter und was hat er mit Parametern zu tun, die als Referenz übergeben werden?
 
Häufig benötigen Funktionen zur Berechnung von Werten einige Parameter als Eingabe. Ein Beispiel: Die Funktion OrderSend() hat viele solcher Parameter:
  • Symbol
  • Art der Bestellung
  • Positionsvolumen in Losen
  • Der Preis der Entdeckung
  • Abweichung in Pips
und so weiter. Es gibt zwei Arten von Parametern, die an die Funktion übergeben werden: solche, die sich während der Ausführung der aufgerufenen Funktion nicht ändern, und solche, die in der Funktion verarbeitet werden können.
Betrachten wir zum Beispiel die folgende Funktion:

//+------------------------------------------------------------------+
//|  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;   
  }
Drei Parameter werden an SplitString() übergeben: ein ArrayRes-Array als Referenz (mit vorangestelltem &) und zwei formale Parameter InputStrung (die aufzuteilende Zeichenkette) und Splitter (der Splitter für die Aufteilung).
Wenn die Funktion ausgeführt wird, enthält das ArraRes-Array mehrere Zeichenketten. Die Funktion selbst kann in MQL4 keine komplexen Typen (z.B. Array) zurückgeben, aber durch die Übergabe der Parameter per Referenz umgehen wir diese Einschränkung.

Das vollständige Skript lautet wie folgt:

//+------------------------------------------------------------------+
//|                                                        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);
  }
//+------------------------------------------------------------------+
Führen Sie es in Ihrer Umgebung aus und sehen Sie sich das Ergebnis an.
 
Hier ist ein weiteres unglückliches Stück der Dokumentation

double OrderClosePrice( )
Gibt den Schlusskurs des ausgewählten Auftrags zurück.
Die Bestellung muss mit OrderSelect() vorausgewählt werden.
Beispiel:
 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("Close time for the order 10 ", ctm); } else Print("OrderSelect failed error code is",GetLastError());

Die Beschreibung bezieht sich auf die Funktion OrderClosePrice, während sich das Beispiel auf die Funktion OrderClosePrice bezieht.
Das ist wahrscheinlich der Grund, warum 99% der von uns untersuchten Expert Advisors eine absolut unnötige Analyse der Auftragsart durchführen
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 0);
Wenn Sie einfach schreiben könnten
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)
 
Ja, das ist ein Punkt, den ich letzte Woche aufgegriffen habe. Ich denke, so etwas in der Art:

 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());
 
Zitat
------
Drei Parameter werden an SplitString() übergeben: ArrayRes-Array per Referenz (mit vorangestelltem &) und zwei formale Parameter InputStrung (die zu parsende Zeichenkette) und Splitter (der Splitter für das Parsen).
Wenn die Funktion ausgeführt wird, enthält das ArraRes-Array mehrere Zeichenketten. Die Funktion selbst kann in MQL4 keine komplexen Typen (z.B. Array) zurückgeben, aber durch die Übergabe der Parameter per Referenz umgehen wir diese Einschränkung.
------

Ich verstehe das. Ich verstehe nicht, warum Sie sie "formal" genannt haben. Handelt es sich dabei um Parameter, die nur zum Spaß, rein formal, übergeben werden? So etwas gibt es in C nicht.

Warum wird die Beschreibung der Parametertypen im Abschnitt "Variablen" und nicht im Abschnitt "Funktionen" beschrieben?
 
cout:
Ich verstehe das. Ich verstehe nicht, warum Sie sie als "formal" bezeichnen. Sind es Parameter, die einfach nur herumgereicht werden, rein formal? So etwas gibt es in C nicht.


Denn die Variablen, die an eine Funktion übergeben werden, werden dort formal nicht als Variablen, sondern als ihre Werte übergeben. Variablen können manipuliert (ihre Werte geändert) werden, während solche Manipulationen mit Werten sinnlos sind.
Hier ist eine andere Version dieses Beispiels:

//+------------------------------------------------------------------+
//|                                                        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);
  }
//+------------------------------------------------------------------+
 
Nennen Sie sie also "Parameterübergabe nach Wert".
Formal bedeutet das, dass nichts von seinem Wert abhängt, z.B. reserviert für zukünftige Verwendung :). Aber Parameter, die als Wert übergeben werden, hängen von etwas ab, sonst würden sie ja formal genannt :).