MQL5 Cookbook: Verschiedene Print-Modi nutzen

Anatoli Kazharski | 27 Juni, 2016


Einleitung

Dies ist der erste Beitrag der MQL5 Cookbook-Reihe. Ich beginne mit einfachen Beispielen, damit auch diejenigen, die gerade ihren ersten Erfahrungen im Programmieren machen, mit der neuen Sprache vertraut werden. Ich kann mich noch gut an meine ersten Anstrengungen beim Entwurf und Programmieren von Handelssystemen erinnern, die sich extrem schwierig gestalteten. Das lag schlichtweg an der Tatsache, dass dies die erste Programmiersprache meines Lebens war. Damals dachte ich, das wäre überhaupt nichts für mich und dass ich das niemals verstehen würde.

Doch bald stellte sich das Ganze als wesentlich leichter heraus als gedacht - und nach wenigen Monaten konnte ich ziemlich komplexes Programm entwickeln. Mehr dazu finden Sie im Beitrag "Unbegrenzte Möglichkeiten mit MetaTrader 5 und MQL5".

In vorliegenden Artikel möchte ich Anfänger unter den Entwicklern von Expert Advisors durch den Programmierungsprozess führen und dabei von einfachen bis hin zu komplexen Beispiele gehen. Ich kopiere hier keine Informationen, die unter 'Hilfe' im MetaEditor 5 Menü sowieso schon zur Verfügung stehen, also stellen Sie sich darauf ein, reichlich oft F1 drücken zu müssen. Gleichzeitig gibt Ihnen die Beitragsreihe viele Beispiele, einsatzbereite Funktionen und Schemata an die Hand, die Sie für Ihre Entwicklungen nutzen können - sowohl in ihrem Original als auch in abgewandelter Form.

Fangen wir also an. In diesem Beitrag erstellen wir ein einfaches Script, das einige der Symboleigenschaften in verschiedenen Modi druckt. Wenn man ein Programm entwickelt, insbesondere in den frühen Stadien des Lernens, trifft man oft auf Situationen, wo das Programm nicht so antwortet, wie man es erwarten würde. In solchen Fällen muss man die Werte bestimmter Variablen überprüfen, die an Berechnungen beteiligt sind. In unserem Fall schauen wir uns drei Methoden genauer an, wo wir die Funktionen Print(), Comment() und Alert() verwenden. Danach können Sie für sich selbst entscheiden, welche Methode Ihnen am meisten zusagt.


Der MQL5-Assistent

Meine Beschäftigung mit MQL5 begann mit Scripten. Das geht reichlich leicht und schnell. Sobald das Script geladen ist, führt es die von Ihnen erzeugte Funktion aus und wird dann aus dem Chart gelöscht. Somit können Sie von unterwegs einfach ausprobieren und herausfinden, in welche Richtung Sie weitergehen wollen.

Sollten Sie noch kein MetaTrader 5 Handelsterminal installiert haben, dann machen Sie das direkt jetzt. Nach erfolgreicher Installation, das Terminal starten und den MetaEditor 5 durch Drücken von F4 öffnen. Mit dieser Taste können Sie rasch zwischen dem MetaTrader 5 Handelsterminal und MetaEditor 5 hin- und herspringen. Sie können den MetaEditor 5 auch durch Anklicken der entsprechenden Schaltfläche in der Werkzeugleiste des Terminals aufrufen. Nehmen Sie sich die Zeit und machen sich mit der Programmschnittstelle richtig vertraut. Verwenden Sie dazu 'Hilfe' (F1) im Handelsterminal und in MetaEditor 5, da wir auf gewisse Punkte nur sehr kurz, wenn überhaupt, eingehen.

Starten Sie den MetaEditor 5 und drücken Strg+N oder 'Neu', unterhalb des Hauptmenüs im MetaEditor Bedienfeld. Ein MQL5-Assistent Fenster geht auf, in dem Sie die Art des Programms, das Sie erzeugen möchten, wählen können. In unserem Fall wählen wir 'Script' und drücken dann 'Weiter':

Abb. 1 MQL5-Assistent - Script

Abb. 1 MQL5-Assistent - Script

Anschließend müssen Sie den Namen des Scripts (Dateinamen) eingeben. Als Standardeinstellung werden Scripts unter Metatrader 5\MQL5\Scripts\file_name.mq5 angelegt. In diesem Directory können Sie auch Ordner zur Gruppierung Ihrer Dateien nach Verwendungszweck anlegen.

Abb. 2 MQL5-Assistent - Dateiname

Abb. 2 MQL5-Assistent - Dateiname

Sie können jetzt ggf. auch Eingabeparameter hinzufügen. Wenn alles eingerichtet und fertig ist, auf 'Beenden' klicken. Mit Hilfe des Templates wird nun ein neues Dokument angelegt und Sie können mit dem Script fortfahren:

//+------------------------------------------------------------------+
//|                                                   PrintModes.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    
  }
//+------------------------------------------------------------------+


Einen Code schreiben

Alles, was nach einem Doppel-Slash steht, ist eine Anmerkung und hat keinerlei Auswirkung auf die Programmsausführung. Es empfiehlt sich immer, Ihren Code mit detaillierten Anmerkungen zu versehen, da dies beim Verständnis der Programmlogik ganz erheblich hilft - insbesondere nach einer langen Pause.

Alles was nach #property in den ersten drei Codezeilen oben kommt, bezieht sich auf die Eigenschaften des Programms. Weitere Informationen zu jeder Funktion und ihrer Eigenschaft finden Sie in den MQL5 Referenzhinweisen. Um sich schnell die Beschreibung jeder gegebenen Funktion anzusehen, genügt ein Doppelklick auf die Funktion und schon wird sie ausgewählt. Danach F1 drücken. Das 'Hilfe'-Fenster geht auf und zeigt Ihnen die Beschreibung der ausgewählten Funktion.

Ihr folgt die Hauptfunktion des Scripts - OnStart(), die alle anderen Funktionen und Berechnungen enthält.

Wir müssen jedoch die Möglichkeit berücksichtigen, vor der Programmausführung, eine Methode zum Druck der benötigten Information auswählen zu können. Wir sollten also einen externen Parameter haben, mit dessen Hilfe wir den nötigen Modus aus der Dropdown-Liste auswählen können. Des weiteren müssen wir noch eine andere Eigenschaft angeben (#property), die für das Öffnen eines Fensters mit externen Parametern des Scripts vor der Programmausführung, verantwortlich ist. Diese Eigenschaft lautet script_show_inputs. Diese Eigenschaft fügen wir unterhalb aller anderen Eigenschaften, die unser Code bereits besitzt, hinzu:

#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//---

Um die Dropdown-Liste in den externen Parametern zu haben. müssen wir eine Aufzählung aller Modi anlegen. Diesen Code fügen wird nach den Programmeigenschaften ein:

// ENUMERATION
enum ENUM_PRINT_MODE
  {
   PRINT   = 0,
   COMMENT = 1,
   ALERT   = 2
  };
//---

Danach folgt der einzige externe Parameter in diesem Script - PrintMode:

// INPUT PARAMETERS
input ENUM_PRINT_MODE printMode=PRINT; // Print mode

Als Regel gilt: Eingabeparameter befinden sich immer am Anfang des Programms, mit dem Eingabe-Modifikator,der die externen Parameter festlegt, die vor die Art der Variable platziert werden. Lassen wir das Script jetzt laufen, geht ein Programmfenster auf und wir können aus der Dropdown-Liste des Print Mode Parameters dort einen Print-Modus auswählen:

Abb. 3 Fenster mit den Script-Parametern

Abb. 3 Fenster mit den Script-Parametern

Anschließend erzeugen wir Variablen und weisen ihnen einige Werte zu (in unserem Fall wollen wir wir einige Symboldaten drucken), um diese zukünftig mit Hilfe des vom Anwender im externen Parameter festgelegten Modus drucken zu können. Aus diesem Grund müssen wir eine separate Anwenderfunktion anordnen - PrintSymbolProperties() - die in der Hauptfunktion OnStart() aufgerufen wird.

Um diese Funktion zu erzeugen, müssen wir den Cdoe, wie unten gezeigt, einfügen:

//+------------------------------------------------------------------+
//| PRINTING SYMBOL PROPERTIES                                       |
//+------------------------------------------------------------------+
void PrintSymbolProperties()
  {
    
  }

Die Art des Wertes, der geliefert werden soll, sollte vor dem Namen der Funktion spezifiziert werden. Muss die Funktion alternativ nichts liefern - so wie in unserem Fall, sollte dort - nichtig stehen. Jetzt müssen wir den restlichen Code in den Korpus der PrintSymbolProperties() Funktion schreiben, und zwar zwischen die Klammern. Doch erzeugen wir erst einmal die Variablen:

string symb_symbol    = "";  // Symbol
int    symb_digits    = 0;   // Number of decimal places

int    symb_spread    = 0;   // Difference between the ask price and bid price (spread)
int    symb_stoplevel = 0;   // Stop levels
double symb_ask       = 0.0; // Ask price
double symb_bid       = 0.0; // Bid price

Die Art der Variable hängt vom Datentyp ab, der ihr zugewiesen werden soll. Weisen wir jetzt also diesen Variablen Werte zu. Um die Symboleigenschaften zu bekommen, bietet MQL5 für jeden Datentyp spezielle Funktionen.

symb_symbol    =Symbol();
symb_digits    =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
symb_spread    =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
symb_ask       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
symb_bid       =SymbolInfoDouble(_Symbol,SYMBOL_BID);
//---

Damit Sie das ganze Material auch wirklich verstehen und lernen, studieren Sie in den MQL5 Referenzhinweisen jede einzelne Funktion und Parameter, die sie übertragen. Alle Symboleigenschaften werden in einer Tabelle aufgeführt, auf die Sie immer weider zurückgreifen müssen.

Da inzwischen den Variablen Werte zugewiesen worden sind, müssen wir noch für jeden Druck-Modus einen passenden Code schreiben. Und der sieht so aus:

//---
// If it says to print to the journal
   if(printMode==PRINT)
     {
      Print("Symbol: ",symb_symbol,"\n",
            "Digits: ",symb_digits,"\n",
            "Spread: ",symb_spread,"\n",
            "Stops Level: ",symb_stoplevel,"\n",
            "Ask: ",symb_ask,"\n",
            "Bid: ",symb_bid
            );
     }
//---
// If it says to print to the chart
   if(printMode==COMMENT)
     {
      int mb_res=-1; // Variable with the option selected in the dialog box
      //---
      Comment("Symbol: ",symb_symbol,"\n",
              "Digits: ",symb_digits,"\n",
              "Spread: ",symb_spread,"\n",
              "Stops Level: ",symb_stoplevel,"\n",
              "Ask: ",symb_ask,"\n",
              "Bid: ",symb_bid
              );
      //---
      // Open a dialog box
      mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION);
      //---
      // If "Yes" is clicked, remove the comments from the chart 
      if(mb_res==IDYES) { Comment(""); }
      //---
      return;
     }
//---
// If it says to print to the alert window
   if(printMode==ALERT)
     {
      Alert("Symbol: "+symb_symbol+"\n",
            "Digits: "+IntegerToString(symb_digits)+"\n",
            "Spread: "+IntegerToString(symb_spread)+"\n",
            "Stops Level: "+IntegerToString(symb_stoplevel)+"\n",
            "Ask: "+DoubleToString(symb_ask,_Digits)+"\n",
            "Bid: "+DoubleToString(symb_bid,_Digits)
            );
     }
//---

Wenn Sie für den externen Parameter des Expert Advisors 'PRINT' wählen, wird die Information in das Logbuch des Expert Advisors gedruckt (Registerkarte Toolbox - Experts ):

Abb. 4 Registerkarte Toolbox - Experts

Abb. 4 Registerkarte Toolbox - Experts

Wählen Sie 'COMMENT', wird die Information in der oberen linken Ecke des Charts angezeigt. Nachdem die Information im Chart erscheint, öffnet die Funktion MessageBox() ein Dialogfenster, in dem Sie aufgefordert werden, Anmerkungen vom Chart zu löschen:

Abb. 5 Anmerkungen in der oberen linken Ecke des Charts

Abb. 5 Anmerkungen in der oberen linken Ecke des Charts

Wenn Sie sich für 'ALERT' entscheiden, geht nach Starten des Scripts ein Warnfenster mit der geforderten Information auf oder es erscheint eine einfache Meldung an den Anwender. In diesem Fall, so wie bei der Option 'PRINT' auch, wird diese Information ebenfalls ins Logbuch gedruckt, doch wird noch zusätzlich von einer Audio-Benachrichtigung begleitet.

Abb. 6 Warn-Fenster

Abb. 6 Warn-Fenster

Unten steht der gesamte Code für das Script:

//+------------------------------------------------------------------+
//|                                                   PrintModes.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2012, MetaQuotes Software Corp."
#property link        "http://tol64.blogspot.com"
#property description "email: hello.tol64@gmail.com"
#property version     "1.00"
#property script_show_inputs
//---
//--- ENUMERATION
enum ENUM_PRINT_MODE
  {
   PRINT   = 0,
   COMMENT = 1,
   ALERT   = 2
  };
//---
// INPUT PARAMETERS
input ENUM_PRINT_MODE printMode=PRINT; // Print mode
//---
//+------------------------------------------------------------------+
//| MAIN FUNCTION                                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PrintSymbolProperties();
  }
//+------------------------------------------------------------------+
//| PRINTING SYMBOL PROPERTIES                                       |
//+------------------------------------------------------------------+
void PrintSymbolProperties()
  {
   string symb_symbol    = "";  // Symbol
   int    symb_digits    = 0;   // Number of decimal places
   int    symb_spread    = 0;   // Difference between the ask price and bid price (spread)
   int    symb_stoplevel = 0;   // Stop levels
   double symb_ask       = 0.0; // Ask price
   double symb_bid       = 0.0; // Bid price
//---
   symb_symbol    =Symbol();
   symb_digits    =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   symb_spread    =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   symb_ask       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   symb_bid       =SymbolInfoDouble(_Symbol,SYMBOL_BID);
//---
// If it says to print to the journal
   if(printMode==PRINT)
     {
      Print("Symbol: ",symb_symbol,"\n",
            "Digits: ",symb_digits,"\n",
            "Spread: ",symb_spread,"\n",
            "Stops Level: ",symb_stoplevel,"\n",
            "Ask: ",symb_ask,"\n",
            "Bid: ",symb_bid
            );
     }
//---
// If it says to print to the chart
   if(printMode==COMMENT)
     {
      int mb_res=-1; // Variable with the option selected in the dialog box
      //---
      Comment("Symbol: ",symb_symbol,"\n",
              "Digits: ",symb_digits,"\n",
              "Spread: ",symb_spread,"\n",
              "Stops Level: ",symb_stoplevel,"\n",
              "Ask: ",symb_ask,"\n",
              "Bid: ",symb_bid
              );
      //---
      // Open a dialog box
      mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION);
      //---
      // If "Yes" is clicked, remove the comments from the chart  
      if(mb_res==IDYES) { Comment(""); }
      //---
      return;
     }
//---
// If it says to print to the alert window
   if(printMode==ALERT)
     {
      Alert("Symbol: "+symb_symbol+"\n",
            "Digits: "+IntegerToString(symb_digits)+"\n",
            "Spread: "+IntegerToString(symb_spread)+"\n",
            "Stops Level: "+IntegerToString(symb_stoplevel)+"\n",
            "Ask: "+DoubleToString(symb_ask,_Digits)+"\n",
            "Bid: "+DoubleToString(symb_bid,_Digits)
            );
     }
  }

//+------------------------------------------------------------------+


Fazit

Hiermit beenden wir diesen Beitrag. Zusätzlich zu den oben beschriebenen Methoden, können Sie auch Daten in eine Datei schreiben. Das kann eine simple Textdatei sein oder sogar ein HTML-Bericht, der mit Hilfe von CSS sauber formatiert ist. Doch diese Methoden sind für Anfänger viel zu kompliziert, sodass die oben erklärten Methoden für den Anfang zunächst mal reichen sollten.