Programmierung
Jetzt liest du
MQL praktisch. Intelligenz, dh Benachrichtigungen am Telefon [Programmierkurs]
0

MQL praktisch. Intelligenz, dh Benachrichtigungen am Telefon [Programmierkurs]

erstellt Radek SzafronApril 12 2019

Willkommen im IV-Teil unseres praktischen Programmierkurses. Heute werden wir uns mit Angelegenheiten von immenser Wichtigkeit befassen, die wir schaffen werden Asa der Intelligenz, die sich in unserer Abwesenheit mit Geheimdienstaktivitäten befassen werden, die sich auf Kursänderungen an der Börse konzentrieren. Wenn es richtig geht, bei uns As wird sofort eine geheime (nicht sehr) Nachricht an unser Mobiltelefon senden, mit der wir die Angelegenheit selbst in die Hand nehmen können.


Achten Sie darauf, zu lesen: MQL praktisch. Panikknopf, Teil II


Unsere Anwendung ermöglicht es Ihnen, Preisniveaus festzulegen, auf denen wir eine Benachrichtigung erhalten drücken auf unserem telefon. Die Ebenen werden bestimmt, indem Sie die farbigen Linien ziehen, die nach dem Klicken auf unsere Figur gezeichnet werden Asa der Intelligenz. Beginnen wir mit dem Inhalt dieser Benachrichtigungen und der Konfiguration unserer Geräte, damit alles in Ordnung ist.

Benachrichtigungen drücken

Benachrichtigungen drücken Sie sind eine Funktion der Meta Trader-Plattform, mit der Sie Nachrichten vom Terminal an ein iOS- oder Android-Gerät senden können, auf dem die mobile Meta Trader-Anwendung installiert ist. Wenn Sie noch keine App auf Ihrem Handy haben, laden Sie sie bitte herunter, denn ohne sie unsere As es kann nicht sehr gut handhaben.

rys_1 rys_2

Die Gerätekonfiguration ist sehr schnell. Im ersten Schritt sollten Sie Ihre kennen MetaQuotes-IDdie Nummer, mit der wir die Nachricht an das entsprechende Telefon (oder den Kühlschrank mit Android-System) weiterleiten. Anzahl MetaQuotes-ID steht in der mobilen Anwendung im Menü Einstellungen / Chat und Nachrichtenwie im Bild unten.

Rys_3 Forex Programmierung

Die Nummer wird gelesen MetaQuotes-ID Sie müssen dann das MetaTarder-Programm auf Ihrem Computer im Menü eingeben Tools / Optionen / Benachrichtigungen.

Rys_4 Forex Programmierung

Fertig!

Technischer Hintergrund

Laden Sie zu Beginn das etwas tiefer gelegene Paket herunter und installieren Sie den Quellcode der heutigen Anwendung oder Datei Als Intelligence.mq4 im Katalog MQL4 \ Experts \ .

Unser Programm wird auch eine kleine grafische Oberfläche haben, die sich in der Bibliothek befindet elementy_graficzne.ex4die Sie in das Verzeichnis kopieren MQL4 \ Libraries \ As Intelligence .

DOWNLOAD-DATEIEN

wir beginnen

Nach dem Öffnen der Datei Als Intelligence.mq4Im oberen Teil sehen Sie den folgenden Code-Ausschnitt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Immobilien streng
# Import "Als Wywiadu \\ elements_graficzne.ex4"
ungültig AgencieRozpocznijMisje (int x, int s);
ungültig AgencieByeBye ();
Schnur AgencieIdentyfikujSie ();
# Import
Eingabefarbe Farbe = clrDodgerBlue;
Eingabefarbe Kolor_wylaczony = clrGold;
Eingabe ENUM_LINE_STYLE Stil = STYLE_SOLID;
Eingabe int Dicke = 2;
Schnur Name des Instruments = "";
Schnur Id_line = "INTERVIEW_LINES";
MQL4-Code

Wir starten den Code vom Bibliotheksimport aus und erstellen dann mithilfe von Eingabeschlüsselparametern Parameter für die Konfiguration im Einstellungsfenster. In den Einstellungen können wir das Erscheinungsbild der Linie festlegen, mit dem wir den Preis für unsere Benachrichtigungen festlegen.

Globale Variablen

Unter den Definitionen des Typs Eingabe Wir sehen neue, variable Deklarationen Nazwa_instrumentu oraz Id_liniidas sind außerhalb des Inhalts einer Funktion. Was heißt das Auf diese Weise definieren wir globale Variablen, Das wird an jeder Stelle in unserem Code verfügbar sein, das heißt, jede Funktion des Algorithmus kann sie lesen und ihnen einen Wert geben. Von als deklarierten Variablen Eingabe Sie unterscheiden sich nur darin, dass der Benutzer im Einstellungsfenster nicht darauf zugreifen kann.

Arrays

Beim Schreiben von Software müssen häufig so viele Daten verarbeitet werden, dass die Erstellung einer separaten Variablen für jeden von ihnen zumindest umständlich ist. Die Tabellen kommen zur Rettung, sodass Sie einen geordneten Datensatz mit einem bestimmten Typ erstellen können, beispielsweise einem Typ doppelt, verfügbar mit einem Namen, den wir festgelegt haben. Für jede Tabelle können (müssen wir nicht) ihre Größe definieren, dh wie viele Daten eines bestimmten Typs darin enthalten sind. Schauen wir uns das folgende Code-Snippet an.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Schnur Tablica_nazwy_linii [];
doppelt Tablica_dane_linii [] [4];
#define CZAS_AKTYWACJI 0
#define TYP_SYGNALU 1
#define STATUS_LINII 2
#define CENA_LINII 3
#define SYGNAL_LONG 0
#define SYGNAL_SHORT 1
#define LINIA_WYLACZONA 0
#define LINIA_ZMODYFIKOWANA 1
#define LINIA_AKTYWNA 2
#define LINIA_USUNIETA 3
MQL4-Code

Eindimensionale Platten

Im obigen Code haben wir in den Zeilen 1 und 2 zwei Tabellen erstellt. Tablica_nazwy_linii Es wird verwendet, um die Namen von Objekten zu speichern, die wir in das Diagramm einzeichnen. Jede Zeile stellt eine vom Benutzer festgelegte Benachrichtigung dar, und weil Sie in unserer Anwendung eine beliebige Anzahl von Benachrichtigungen festlegen können, die Sie zur Verwendung von Tabellen benötigen.

Tablica_nazwy_linii ist ein eindimensionales Array, das wir nach einem Paar eckiger Klammern erkennen []. In eckigen Klammern können wir die Anzahl der Daten eingeben, die wir in die Tabelle einfügen möchten. In unserem Fall wissen wir jedoch nicht, wie viel die Linie in der Grafik sein wird, da sie vom Benutzer abhängt. Lassen Sie also eine leere Klammer, dh wir werden regelmäßig dynamisch bestimmen und ändern Sie die Größe der Tabelle nach Ihren Bedürfnissen. Schauen wir uns die Zeichnung unten an, in der beschrieben wird, wie eindimensionale Platinen funktionieren.

Rys_5 Forex Programmierung

Forex Programmierung - Arrays

Mehrdimensionale Arrays

Die zweite Tafel, genannt Tablica_dane_linii dient zum Speichern zusätzlicher Daten für jede der benutzerdefinierten Benachrichtigungen. Wir können keine zusätzlichen Informationen in dieselbe Tabelle wie Objektnamen einfügen, da die Namen vom Typ sind Schnurund Typdaten doppeltund eine Tabelle kann nur einen Datentyp enthalten.

Tablica_dane_linii ist eine zweidimensionale Tafel, die zwei eckige Klammern symbolisiert [] [4]. Die erste Dimension wird wie in der Tabelle zur Identifizierung verwendet Tablica_nazwy_liniiwelche Zeile wir meinen, und die zweite Dimension, in der 4-Zusatzdaten für jede der eingestellten Benachrichtigungen gespeichert werden.

Um uns die Navigation in den Elementen einer zweidimensionalen Tabelle mithilfe von Schlüsselwörtern zu erleichtern #define Wir haben eine Liste mit vordefinierten Werten erstellt, um sich an Namen zu erinnern. Unter jedem Namen, der nach dem Schlüsselwort aufgeführt ist #define Es gibt eine Zahl, von der wir sicher sind, dass sie konstant bleibt.

Im Folgenden werden wir die Boards in der Praxis verwenden. Schauen wir uns die folgende Grafik an, die erklärt, wie eine zweidimensionale Tabelle funktioniert.

rys_6

Anwendungsstruktur

In unserer Anwendung werden fünf uns bekannte MQL-API-Funktionen für die Ereignisbehandlung verwendet.

OnInit () - Vorbereitung des Algorithmus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int OnInit ()
{
if(IsDemo() == falsch) Rückkehr INIT_FAILED;
// Record! Explore Area () ist eine kurze Version
// Untersuche Terrain () == false
if(! Invest Area ()) BlurSlady ();
EventSetMillisecondTimer(250);
AgencieRozpocznijMisje (0, 0);
Rückkehr INIT_SUCCEEDED;
}
MQL4-Code

In Funktion OnInit() Wir prüfen zunächst, ob wir an der richtigen Stelle spielen und dann, ob die Daten der Anwendung korrekt sind. Da ist es möglich, da OnInit() ist die erste Funktion, die das Programm aufruft, um falsche Daten für den Algorithmus zu erhalten? Dies kann zum Beispiel der Fall sein, wenn wir den Algorithmus in der Grafik eines Instruments ausführen und dann das Symbol ändern. In diesem Fall muss ich die zuvor gezeichneten Zeilen löschen und alle Benachrichtigungen löschen. Damit beschäftigt sich die Funktion ZatrzyjSlady ().

Im nächsten Schritt laufen wir Timer und wir rufen eine Funktion aus der Bibliothek auf Agent StartMissions (...)dessen Aufgabe ist es, unsere zu zeichnen Asa in der Tabelle.

Im Quellcode finden Sie einige weitere interessante Funktionen. Für die von Ihnen, die unsere röntgen möchten Asa Von A bis Z sollte die Interpretation zusätzlicher Materialien eine gute Schulung in der MQL-Dokumentation darstellen. Den gesamten Code der heutigen Anwendung habe ich versucht, innerhalb der diskutierten Probleme zu bleiben, damit die Interpretation so einfach wie möglich war. Ich wünsche Ihnen ein fruchtbares Lernen und, weil Sie bereits viele Elemente der Sprache kennen, viel Spaß beim Erstellen der ersten unabhängigen Lösungen!

OnChartEvent (...) - Ereignisüberwachung

1
2
3
4
5
6
7
8
9
10
11
12
ungültig OnChartEvent(const int Identifikation const long & lParam const double & dparam,
const string & SPAR)
{
if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE)
{
if(StringFind(sparam, Line_ID)> = 0) Daten aktualisieren (sparam);
}
Sonst wenn(id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == AgentIdentifySame ()) Create ();
}
}
MQL4-Code

Dank der Funktion OnChartEvent(...) Wir überwachen die Benutzerinteraktion mit der Anwendung. Im ersten prüfen wir, ob der Benutzer die Benachrichtigungszeile in das Diagramm gezogen hat (oder seine Parameter im Einstellungsfenster geändert hat), und wenn dies der Fall ist, aktualisieren wir die Daten zu unseren Benachrichtigungen in der Funktion Daten aktualisieren (...)welches als Parameter den Namen der vom Benutzer modifizierten Zeile annimmt. Mit dem Namen der empfangenen Zeile sucht die Funktion die entsprechende Zeile in den Tabellen und aktualisiert unter anderem die relevanten Daten Informationen über den für die Benachrichtigung festgelegten Preis.

Im zweiten Teil der Funktion überwachen wir die Ereignisse beim Klicken auf Objekte im Graphen unseres Algorithmus. Jeder Klick in der Figur, die wir gezeichnet haben Ass der Intelligenz erstellt eine neue Linie im Diagramm. Die erstellten Zeilen rufen nach dem Verschieben die Funktion auf Daten aktualisieren (...)Dadurch wird eine bestimmte Benachrichtigung in Abhängigkeit von dem Standort der Leitung in Bezug auf den Preis zum Zeitpunkt der Interaktion mit dem Benutzer geplant.


Fachberater


OnTimer () - wiederkehrende Aktivitäten

1
2
3
4
ungültig OnTimer ()
{
SynchronizujDane ();
}
MQL4-Code

Timer, der 4-mal pro Sekunde genannt wird, den wir in der Funktion definiert haben OnInit(), synchronisiert Daten innerhalb unseres Algorithmus. Für die Aufgaben der Funktion Zu () Dazu gehört zu prüfen, welche Zeilen bereits entfernt wurden, und ihnen die richtige Farbe zu geben, je nachdem, ob die Benachrichtigung aktiviert ist.

OnTick () - Preisbeobachtung

Alle bisher aufgeführten MQL-API-Funktionen sind uns bekannt. Zeit für etwas Neues. Funktion onTick() wird von der Plattform bei jeder Preisänderung des Instruments aufgerufen, auf dem der Algorithmus ausgeführt wird. Dies ist eine grundlegende Funktion für viele automatische Strategien. Schauen wir uns den Code unten an.

1
2
3
4
ungültig OnTick ()
{
PoczynWywiad ();
}
MQL4-Code

In Funktion onTick() unsere As er geht zur Arbeit und prüft, ob der Preis des Instruments den vom Benutzer angegebenen Wert erreicht hat. Wir gehen zur Funktion PoczynWywiad () ein bisschen weiter, und jetzt analysieren wir noch eine letzte Funktion, die zum Verwalten von Ereignissen benötigt wird, OnDeinit(...).

OnDeinit (...) - Beenden des Algorithmus

1
2
3
4
5
6
7
8
9
ungültig OnDeinit(const int Grund)
{
EventKillTimer();
AgencieByeBye ();
if(Grund! = REASON_CHARTCHANGE && Grund! = REASON_PARAMETERS)
ZatrzyjSlady ();
}
MQL4-Code

Wir halten am Anfang an Timer und wir löschen das Bild von unserem Agenten und dann mit dem Operator if Wir prüfen, warum der Antrag vollständig ist. In einigen Fällen nach dem Aufruf der Funktion OnDeinit(...) Das Programm wird neu gestartet und startet seinen Algorithmus von Anfang an, dh von der Funktion OnInit(). Dies ist beispielsweise der Fall, wenn der Benutzer das Intervall des Diagramms ändert. Wenn sich das Instrument in dieser Situation nicht geändert hat, möchten wir die von uns eingerichteten Benachrichtigungen nicht löschen. Überprüfen Sie den Grund für den Aufruf der Funktion OnDeinit(...)oder Parameter Grundkönnen wir entscheiden, ob Objekte und Daten gelöscht werden sollen, oder den Benachrichtigungssatz unverändert lassen.

Tische in der Praxis

Lassen Sie uns sehen, wie unsere Anwendung zuvor erstellte Tabellen am Beispiel einer Funktion verwendet Daten speichern (...), dessen Aufgabe es ist, eine neue Zeile in den Tabellen für die Daten für die neue Benachrichtigung anzulegen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool ZapiszDane (Schnur nazwa_linii, doppelt cena_linii)
{
int number_lin = Arraysize(Tablica_nazwy_linii);
ArrayResize(Array_line_line, number_line, + 1);
ArrayResize(Array_path, Zeilennummer + 1);
// Schreibe Zeilennummer ++ ist die abgekürzte Version number_line = number_line + 1
liczba_linii ++;
Zeilennamearray [Anzahl_ der Zeilen - 1] = Name der Zeile;
Line_Data_array [Anzahl_ der Zeilen - 1] [DAY_TIME] = 0;
Line_Data_array [Anzahl_ der Zeilen - 1] [SIRY TYPE] = SYGNAL_LONG;
Line_Data_array [Anzahl_ der Zeilen - 1] [STATUS_LINES] = LINE_DIRTY;
Line_Data_array [Anzahl_ der Zeilen - 1] [PRICE_LINE] = price_line;
Rückkehr was immer dies auch sein sollte.;
}
MQL4-Code

Prüfen Sie in Zeile 3, wie viele Artikel es enthält Tablica_nazwy_liniiund weil Tablica_nazwy_linii Ist ein Array, sollte die eindimensionale Anzahl seiner Elemente der Anzahl der Zeilen in beiden Tabellen entsprechen. Dann erhöhen wir in Zeilen 5 und 6 die Anzahl der Zeilen unserer Tabellen mit Hilfe von API um 1 ArrayResize(...). Am Ende jeder Tabelle wird eine neue Zeile hinzugefügt.

Wir erhöhen die Variable liczba_linii o 1, da wir den Tabellen eine Zeile hinzugefügt haben und dann die Daten über die neue Benachrichtigung eingeben, beginnend mit der Zeile Nr. 11, wobei wir der entsprechenden Zeile im Array den Namen der Zeile zuweisen Tablica_nazwy_linii. Beachten Sie, dass die Zeilen (und Spalten) in den Tabellen von Null aus nummeriert sind. Wenn Sie beispielsweise die Informationen für die fünfte Benachrichtigung speichern möchten, müssen Sie nach dem Namen des Arrays die Zeile 4, also in eckigen Klammern, verwenden Anzahl der Zeilen - 1 als Zeilennummer.

Zur Nummerierung von Spalten in der Tabelle Tablica_nazwy_linii Wir verwenden vordefinierte Werte zu Beginn unseres Algorithmus unter Verwendung von Schlüsselwörtern #define. Unter den Wertnamen gibt es Zahlen von 0 bis 3, da die Tabelle 4-Spalten enthält. Dank der Verwendung einer zweidimensionalen Tabelle können wir unter anderem 4-Zusatzinformationen für jede Benachrichtigung speichern den Preis und die Art des Signals, das Sie in der Funktion verwenden Daten speichern (...) Wir geben Anfangswerte.

Ass in Aktion

Eine andere Funktion, die Arrays in unserem Algorithmus verwendet, ist die Funktion PoczynWywiad ()Dort lesen wir die in den Tabellen aufbereiteten Daten und interpretieren sie, um zu entscheiden, ob dem Benutzer eine Nachricht gesendet werden soll. Schauen wir uns den Funktionscode an PoczynWywiad ().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ungültig PoczynWywiad ()
{
int i = 0;
int number_lin = Arraysize(Tablica_nazwy_linii);
für(i = 0;; und <Anzahl der Zeilen; i ++)
{
if(Array_data_data [i] [STATUS_LINES] == LINE_ACTIVE)
{
if(Array_data_data [i] [SIRY_TYPE] == SYGNAL_LONG)
{
if(Gebot > = Line_Data_Array [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
sonst
{
if(Gebot <= Line_Data_Array [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
}
}
}

In der obigen Funktion verwenden Sie eine Schleife für Wir erhalten Zugriff auf jede Zeile in der Tabelle Tablica_dane_linii. Dadurch können wir den Benachrichtigungsstatus und den Signaltyp überprüfen und anhand der empfangenen Daten prüfen, ob der Preis vorliegt Gebot es erfüllt die Bedingung, die wir erwarten. Wenn unsere As Er wird das Gefühl haben, dass es unsinnlos wäre, uns unwissend zu halten, und sendet uns schnell eine Benachrichtigung über die Funktion Eine Nachricht schicken(…), wodurch die Zeilennummer geschickt wird, in der die Daten zu der erforderlichen Benachrichtigung gespeichert sind. Nach dem Senden der Nachricht wird die Benachrichtigung deaktiviert und AsStandhaft weiter.

Schauen Sie sich den Code auf Ihrem Computer für die Funktion an Eine Nachricht schicken(…)um zu sehen, wie unser Algorithmus die MQL-API-Funktion verwendet sendNotification(…) Beim Senden von Benachrichtigungen drücken.

Summe

Wenn die Plattform dies noch nicht für Sie erledigt hat, kompilieren Sie die Datei Als Intelligence.mq4 und testen Sie Ihre neue Anwendung! Um eine neue Linie zu zeichnen, klicken Sie einfach auf das schöne Bild in der Grafik.

Im Quellcode finden Sie einige weitere interessante Funktionen. Für die von Ihnen, die unsere röntgen möchten Asa Von A bis Z sollte die Interpretation zusätzlicher Materialien eine gute Schulung in der MQL-Dokumentation darstellen. Den gesamten Code der heutigen Anwendung habe ich versucht, innerhalb der diskutierten Probleme zu bleiben, damit die Interpretation so einfach wie möglich war. Ich wünsche Ihnen ein fruchtbares Lernen und, weil Sie bereits viele Elemente der Sprache kennen, viel Spaß beim Erstellen der ersten unabhängigen Lösungen!

Was denken Sie?
Ich mag es
33%
interessant
67%
Heh ...
0%
Shock!
0%
Ich mag es nicht
0%
Verletzung
0%
Über den Autor
Radek Szafron
Der Autor der Publikation ist Radek Szafron, Inhaber der Expert Advisors Company, die seit vielen Jahren Investoren unterstützt, indem sie Technologien für den FOREX-Markt bereitstellt. Der Autor ist ein Absolvent der Warschauer School of Economics mit der Spezialisierung "Finanzmärkte" und Programmierer mit fast 20-Sommererfahrung. Das Unternehmen implementiert Algorithmen und Anwendungen, die in allen Sprachen der "C" -Familie geschrieben wurden, einschließlich der beliebten Plattformen Meta Trader 4 und 5. Expert Advisors finden Sie unter www.expertadvisors.pl.

Hinterlasse eine Antwort