Benachrichtigung und Kommentar für Externe Indikatoren (Teil Zwei)

Vladimir | 29 April, 2016

Einführung

Der erste Artikel "Benachrichtigung und Kommentar für Externe Indikatoren" befasste sich mit der Methode Daten von Indikatoren zu erhalten, mit in einem Chart angezeigten Windings-Symbole als Quelle der von Informationen.

Hier werden wir sehen, wie wir Daten aus Indikator-Puffern erhalten können und diese verwenden um über bestimmte Indikatorereignisse zu informieren.

Während es eine Gruppe an Operatoren gibt, die eingesetzt werden um die erforderlichen Merkmale beim Lesen der Parameter oder grafischer Zeichnungen zu erhalten, können Parameter des Indikator-Puffer nur gesetzt werden. Hier können wir keine, sagen wir, Farbe erhalten. Alles was wir empfangen können, sind Kurs- und Zeit-Eigenschaften. Als Beispiel nehmen wir einen Indikator, der auf dem Prinzip der Farbänderung bei der Anzeige von Informationen in dem Indikator basiert.
Eine der Optionen zum Speichern von Informationen in Indikator-Puffer solcher Indikatoren ist so angeordnet, dass zwei Indikator-Puffer zur Anzeige einer Linie verwendet werden. Jeder der Puffer hat eine statische Farbe zugewiesen. Die Informationen werden in einer Weise ausgegeben, dass zu jedem Zeitpunkt nur einer der Puffer an der Anzeige der Informationen beteiligt ist. Der aktive Indikator hat Parameterwerte größer als Null. Der Parameterwert im inaktiven Puffer ist Null.

So haben wir die Werte, die über die ausgegebene Information über die Änderungen in dem Indikator analysiert werden können.



Indikator-Puffer Datenausgabe

Die MQL Ressourcen ermöglichen es uns Eingabe/Ausgabe Daten in acht Indikator-Puffer ein-/auszugeben.
Deshalb werden wir alle acht von ihnen analysieren.

Bedingungen, die in der Analyse angewendet werden, sind wie folgt: Wenn der Indikator Wert sich von Null zu einem maßgeblichen ändert, einschließlich der Umkehr-Änderung, d.h. von einem maßgeblichen zu Null, muss der Anwender darauf hingewiesen werden. Wir nehmen den Wert des ersten geänderten Indikator-Puffers und prüfen die Werte von allen Puffern einen nach dem anderen, beginnend mit dem ersten, oder jedem anderen Balken, wie von dem Anwender in den der externen Variable angegeben.

extern int     StartBar=1;       // Start bar

Als ein Bespiel nehmen wir den Trend_mtf Indikator, der Informationen wie folgt ausgibt:

Abbildung 1

Sobald sie erkannt ist, wird die Änderung durch den Indikator registriert und der Betrieb des Indikators stoppt.

Es gibt mehrere MQL4 Features, die zur Ausgabe von Daten verwendet werden können:

  • Benachrichtigungsfenster,
  • Kommentare in dem Indikator-Fenster
  • Abspielen einer Sound-Datei.

Ein Unterprogramm, das Daten ausgibt, sieht aus wie folgt.

//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator Subfunction                             |
//+------------------------------------------------------------------+

void AlertComment (string text)
   {
      if (SignalAlert   == true)    Alert    (text);
      if (SignalComment == true)    Comment  (text);
      if (SignalPlay    == true)    PlaySound(Signal);
   }

Wir fügen die erforderlichen Daten hinzu, die nach Ermessen des Anwenders gesteuert werden.

Lassen Sie uns auch die Möglichkeit hinzufügen, einen durch den Anwender angegebenen Benutzerkommentar auszugeben.

extern int     StartBar=1;                            // Start bar
extern string  indicator = "Insert Indicator Name";   // Custom indicator
extern bool    VLine = true;                          // Vertical line output switch
extern bool    SignalAlert=false;                     // Alert window output switch
extern bool    SignalComment=true;                    // Comment output switch
extern bool    SignalPlay= false;                     // Sound play switch
extern string  Signal = "alert.wav";                  // Custom sound file
extern string  UserText = "direction changed";        // User comment

wobei:

StartBar

Die Variable zeigt den Start der Berechnung an:

indicator

Here geben wir den Namen des Indikators an, für den wir Daten erhalten wollen.

Dis wird gefolgt von einer Reihe logischer Parameter, die durch den Anwender genutzt werden können, um die relevanten Programm-Parameter auszugeben.

VLine

Gibt an, ob eine vertikale Linie am Punkt der Veränderung in den Indikator-Parametern anzeigt (true) oder nicht anzeigt(false).

SignalAlert

Gibt an, ob das Informationsfenster angezeigt (true) oder nicht angezeigt (false) wird, wenn es Änderungen in den Indikator-Parametern gibt.

SignalComment

Gibt an, ob Daten in dem Chart ausgegeben (true) oder nicht ausgegeben (false) werden, wenn es Änderungen in den Indikator-Parametern gibt.

SignalPlay

Gibt an, ob eine Sound-Datei abgespielt (true) oder nicht abgespielt werden soll, wenn es Änderungen in den Indikator-Parametern gibt.

Signal

Hier geben wir den Namen der Sound-Datei ein, die abgespielt wird, wenn es Änderungen in den Indikator-Parametern gibt.

UserText

Hier geben wir den Text ein, den wir in dem Chart sehen möchten, wenn es Änderungen in den Indikator-Parametern gibt, falls wir den Standardtext nicht mögen.

In ähnlicher Weise können Sie einen Parameter hinzufügen, um die relevanten Informationen per E-Mail zu senden.

Jetzt müssen wir nur noch die Indikatordaten lesen und mit unseren Parametern handhaben.

Der Handling Block-Code ist wie folgt:

   for(int ii=StartBar;ii<ExtBars;ii++)
      for(int i=0;i<8;i++)
        {
         First =iCustom(NULL,0,indicator,i,ii);
         Second=iCustom(NULL,0,indicator,i,ii+1);
         if((Second==0 && First>0) || (Second>0 && First==0))
           {
            text=StringConcatenate(Str+" -  On ",ii+1," bar ",Symbol()," -  ",indicator," ");
            AlertComment(text+UserText);
            if(VLine==true)
               ObjectCreate(STRING_ID+"VL_"+i,0,0,Time[ii],Bid);
            return;
           }
        }

Nach der Umsetztun des angegebenen Ansatzes und der Einstellung der entsprechenden Parameter zur Anzeige der vertikale Linie, sieht das Chart aus wie folgt:

Abbildung 2



Fazit

Trotz der zahlreichen Kommentare über die Unzulänglichkeiten von MQL4, bietet diese Sprache zahlreiche Funktionen, die bei der Programmierung verschiedener Handels- und Informationsanwendungen eingesetzt werden können. Zusätzlich unterstützt sie intuitives Lernen und gibt ihnen Zugriff auf eine enorme Bibliothek betriebsfertiger Anwendungen.

Der vollständige Code des Information-Indikators ist im Folgenden angegeben:

//+------------------------------------------------------------------+
//|                                               AlertSignal_v1.mq4 |
//|                                  Copyright ɠ2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright  "Copyright ɠ2009, FIBOOK.RU"
#property link       "http://fibook.ru"
#define Str           "http://fibook.ru"
#define STRING_ID    "AlertSignal_"
#property indicator_chart_window
extern int     StartBar=1;                       // Start bar
extern string indicator="Insert Indicator Name"; // Custom indicator
extern bool    VLine=true;                       // Vertical line output switch
extern bool    SignalAlert=false;                // Alert window output switch
extern bool    SignalComment=true;               // Comment output switch
extern bool    SignalPlay=false;                 // Sound play switch
extern string  Signal="alert.wav";               // Custom sound file
extern string  UserText="direction changed";   // User comment
IndicatorShortName("AlertSignal_v1 ");
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator deinitialization function               |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int i=0;i<8;i++)
      ObjectDelete(STRING_ID+"VL_"+i);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator iteration function                      |
//+------------------------------------------------------------------+
int start()
  {
   string     text;
   int        ExtBars=150;  // Number of the last bars for calculation
   double     First;        // Internal variable
   double     Second;       // Internal variable
   int        per;          // Internal variable
   if(indicator=="Insert Indicator Name")
     {
      Alert(indicator);
      return;
     }
   if(per==Time[0]) return; // Adjust once in a period
   per=Time[0];
//----
   for(int ii=StartBar;ii<ExtBars;ii++)
      for(int i=0;i<8;i++)
        {
         First =iCustom(NULL,0,indicator,i,ii);
         Second=iCustom(NULL,0,indicator,i,ii+1);
         if((Second==0 && First>0) || (Second>0 && First==0))
           {
            text=StringConcatenate(Str+" - On ",ii+1," bar ",Symbol()," -  ",indicator," ");
            AlertComment(text+UserText);
            if(VLine==true)
               ObjectCreate(STRING_ID+"VL_"+i,0,0,Time[ii],Bid);
            return;
           }
        }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator Subfunction                             |
//+------------------------------------------------------------------+
void AlertComment(string text)
  {
   if(SignalAlert==true) Alert(text);
   if(SignalComment==true) Comment(text);
   if(SignalPlay==true) PlaySound(Signal);
  }
//+------------------------------------------------------------------+