Alarm und Benachrichtigung für Externe Indikatoren

Vladimir | 6 April, 2016

Einleitung

Die Praxis zeigt, dass die Entwickler von Indikatoren nicht immer die Möglichkeit der Anzeige von Alarmmeldungen oder Benachrichtigungen in einen Indikator-Code eingebaut haben, was zu einer vermehrten Anfrage geführt hat, die Möglichkeit einer solchen Anzeige von Signalen einem Indikator hinzuzufügen.

MQL4 Möglichkeiten für die Anzeige von Informationen der Indikatoren

Die Möglichkeiten der MQL4 Programmiersprache beinhalten nicht die erweiterte Nutzung von Indikatorpuffern, zum Beispiel deren Erweiterung durch das Hinzufügen eines Benachrichtigung oder durch die Anzeige eines Alarms, was ein Vorteil hinsichtlich der einfacheren Kreierung eines Programmcodes sein könnte. Auf der anderen Seite ermöglicht MQL4 das Lesen der Position von Objekten und den Erhalt ihrer vollständigen Eigenschaften.

In diesem Artikel möchte ich die Methode zum Erhalten von Daten durch ein Signal eines Indikators zeigen, der an einen Chart angehängt ist, sowie auch dessen Benachrichtigung, Alarmmeldung oder die Kreierung einer globalen Variablen für die weitere Verwendung zu Informationszwecken, zum Beispiel für die Weitergabe an einen Expert Advisor.

Alle Markierungen auf einem Chart verwenden Wingdings und Pfeil-Codes. Deshalb ist es nicht schwierig, Informationen über eine eingezeichnete Markierung auf einem Chart zu erhalten. Übrigens, wenn der Autor eines Indikators eine durchaus informative Beschreibung des OBJ_ARROW Objekts hinzufügt, kann ein Benutzer leicht ein Signal identifizieren. Ein Beispiel dafür ist die Beschreibung von Markierungen, die durch den Macher von klassischen japanischen Candlestick-Charts vorgegeben sind. Bei der Standard-Ausführung seines Indikators, muss ein Benutzer nur den Mauszeiger über die Markierung bewegen, um eine Pop-up-Hilfe mit einem entsprechenden Text zu erhalten.



Standard-Anzeige eines Signals


In MQL4 können Sie einige eingebaute Optionen für eine informativere Art und Weise der Datenpräsentation verwenden.

Unter den Sprachbefehlen, gibt die Funktion

double ObjectGet (string name, int prop_id)

den Wert einer bestimmten Objekteigenschaft retour. Um Fehlerdaten zu erhalten, rufen Sie die GetLastError() Funktion ab.
Sehen Sie auch unter ObjectSet().

Parameter:
Name - Objektname.
prop_id - Identifizierer von Objekteigenschaften. Kann jeder Wert von der List der Objekteigenschaften sein.

Identifizierer von Objekteigenschaften werden in den Funktionen ObjectGet() und ObjectSet() verwendet. Kann irgendeiner der unten angeführten Werte sein:

Konstante Wert Typ Beschreibung
OBJPROP_TIME10datetimeErhält/legt die erste Koordinate des Zeitpunkts fest
OBJPROP_PRICE11doubleErhält/legt die erste Koordinate des Kurses fest
OBJPROP_TIME22datetimeErhält/legt die zweite Koordinate des Zeitpunkts fest
OBJPROP_PRICE23doubleErhält/legt die zweite Koordinate des Kurses fest
OBJPROP_TIME34datetimeErhält/legt die dritte Koordinate des Zeitpunkts fest
OBJPROP_PRICE35doubleErhält/legt die dritte Koordinate des Kurses fest
OBJPROP_COLOR6colorErhält/legt die Farbe eines Objekts fest
OBJPROP_STYLE7intErhält/legt die Linienart eines Objekts fest
OBJPROP_WIDTH8intErhält/legt die Linienbreite eines Objekts fest
OBJPROP_BACK9boolErhält/legt die Hintergrunddarstellung eines Objekts fest
OBJPROP_RAY10boolErhält/legt die Strahleneigenschaften für Objekte des Typs OBJ_TREND und dergleichen fest
OBJPROP_ELLIPSE11boolErhält/legt die Anzeige der vollständigen Ellipse OBJ_FIBOARC fest
OBJPROP_SCALE12doubleErhält/legt den Wert einer Objektskalierung fest
OBJPROP_ANGLE13doubleErhält/legt den Winkel in Grad für OBJ_TRENDBYANGLE fest

OBJPROP_ARROWCODE

14

int

Erhält/legt den Pfeil-Code von OBJ_ARROW fest. Kann eines der Wingdings Symbole oder einer der vorgegebenen Pfeil-Codes sein

OBJPROP_TIMEFRAMES15intErhält/legt die Darstellung in verschiedenen Zeiträumen fest. Kann eine bzw. kann eine Kombination aus mehreren Konstanten der Objektsichtbarkeit sein
OBJPROP_DEVIATION16doubleErhält/legt den Abweichungswert für OBJ_STDDEVCHANNEL fest
OBJPROP_FONTSIZE100intErhält/legt die Schriftgröße für OBJ_TEXT und OBJ_LABEL fest
OBJPROP_CORNER101intErhält/legt die Nummer des Bindungswinkels für OBJ_LABEL fest. Können Werte von 0-3 sein
OBJPROP_XDISTANCE102intErhält/legt die Distanz der X Koordinate in Pixel relativ zum Bindungswinkel für OBJ_LABEL fest
OBJPROP_YDISTANCE103intErhält/legt die Distanz der Y Koordinate in Pixel relativ zum Bindungswinkel für OBJ_LABEL fest
OBJPROP_FIBOLEVELS200intErhält/legt die Anzahl der Niveaus des Fibonacci Objekts fest. Kann von 1 bis 32 sein
OBJPROP_LEVELCOLOR201colorErhält/legt die Linienfarbe der Objektebene fest
OBJPROP_LEVELSTYLE202intErhält/legt die Linienart der Objektebene fest
OBJPROP_LEVELWIDTH203intErhält/legt die Linienbreite der Objektebene fest
OBJPROP_FIRSTLEVEL+n210+nintErhält/legt die Nummer der Objektebene fest, wobei n der Index der installierten/erhaltenen Ebene ist. Kann von 0 bis 31 sein

Lassen Sie uns deshalb den Parameter OBJPROP_ARROWCODE verwenden, um ein notwendiges Objekt zu finden und wir werden die Liste aller Objekte erhalten. Lassen Sie uns danach die notwendigen Objekte auswählen und die Informationen über sie in der gewünschten Form anzeigen.

Lassen Sie uns dann einen Code zum Erhalten von Informationen über die Namen der Candlesticks für den Indikator “Japan” kreieren. Wir bekommen den folgenden Code:

int    obj_total=ObjectsTotal(); // Define the total number of objects on a chart
  for(int i=0;i<obj_total;i++) // Loop of going through all objects with the purpose of finding necessary ones
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE) // reading the code
Zuerst sollten wir definieren, wie wir mit Wingdings umgehen und entsprechend die Parameter im Programmcode einstellen. In diesem Beispiel werden wir den Teil der Wingdings Tabelle behandeln, der mit 100 beginnt.

Die Variable ExtBars wird zur Definierung der Anzahl der letzten Balken zum Finden gezeichneter Objekte in einem Chart verwendet.

if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>100&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])

Jetzt wollen wir Alarme und (oder) Benachrichtigungen zeigen.

       if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
       if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}

In der Befehlszeile wird

("\n","\n","\n",
für die Anzeige von Informationen auf der dritten Linie der Anzeige verwendet.

Bei Bedarf können Sie das Senden der Informationen an globale Variable inkludieren, um sie in einem Expert Advisor zu verwenden. Da dadurch eine mögliche Verletzung des Urheberrechts hinsichtlich des Autors des Indikators beseitigt wird, erhalten wir die Möglichkeit, die Informationen für eigene Zwecke zu verwenden und müssen nicht den jeweiligen Autor bitten, seinen Code zu ändern.

Mit der beschriebenen Vorgehensweise erhalten wir folgendes Ergebnis:


Der Indikator zeigt nun externe Informationen


In der analogen Art und Weise funktioniert der Code mit dem Indikator ExCandles2. Dies ist der zweite Indikator, der in MQL4 veröffentlicht wurde; er wurde zusammen mit dem veröffentlichten Code getestet.

Fazit

Hier ist der Quellcode des Indikators für die Anzeige von Informationen über erscheinende Signale von Indikatoren:

//+------------------------------------------------------------------+
//|                                                  AlertSignal.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, FIBOOK.RU"
#property link      "http://fibook.ru"

#property indicator_chart_window
extern int ExtBars=10;        // Number of last bars for calculation
extern int ExtArrow=100;      // Code number in the "wingdings" table for the count start
extern bool ExtAlert=true;    // Switch of Alerts displaying
extern bool ExtComment=true;  // Switch of Comments displaying
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if (per == Time[0]) return; // Correct once per a period
      per = Time[0];

   int cod=0;
//----

int    obj_total=ObjectsTotal();
  for(int i=0;i<obj_total;i++)
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>ExtArrow&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])
                {
                  if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
                  if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}
                }
     }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+