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); } //+------------------------------------------------------------------+