Programmierung
Jetzt liest du
MQL praktisch. Panik-Taste, Teil II [Programmierkurs]
0

MQL praktisch. Panik-Taste, Teil II [Programmierkurs]

erstellt Radek Szafron29 2019 März

Willkommen zum zweiten Teil des Panic Buttons! Diese Woche schauen wir uns noch einmal den Code unserer Panik-Taste an. Unsere Aufgabe heute ist es, das Wichtigste hinzuzufügen, dh die Funktion, uns von der Belastung offener Positionen zu befreien und uns von den Zwängen zu befreien, ständig auf den Monitor zu schauen.

Wir werden die Grundfunktionalität mit etwas anderem entwickeln. Wir sorgen dafür, dass das von uns entworfene Werkzeug sicher ist und versehentliche Klicks unerschütterlich und ruhig bleiben. Wie jeder ernsthafte Knopf auf unserem Planeten hat auch unsere eine Art Sicherung, mit der Sie die Position nur dann schließen können, wenn der Klick durch Drücken einer Taste begleitet wird [Shift] auf der Tastatur.


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


Wir eröffnen eine Algorithmusfabrik

Also schalten wir den MetaEditor ein.

Lassen Sie uns den Code unserer Anwendung von letzter Woche bearbeiten. Öffnen Sie die Datei Panic Button.mq4 aus dem Katalog Experten und werfen wir einen Blick auf die Funktion OnInit (). Ihre Funktion sollte fast identisch zu der unten dargestellten Funktion aussehen, mit einem kleinen Unterschied. Heute ist ein neues Element des Codes erschienen // kommentieren .

int OnInit ()
{
if(IsDemo () == falsch)
{
 
Rückkehr INIT_FAILED;
 
}
bool blau = falsch;
if(Tylko_ten_instrument == was immer dies auch sein sollte.)
{
 
blau = was immer dies auch sein sollte.;
 
}
Przycisku_utworz_sie (5, 15blau);
// <- [So machen wir Kommentare] EventSetMillisecondTimer(250); // Ende der Neuheit
Rückkehr INIT_SUCCEEDED;
}
MQL4-Code

Fügen Sie der Funktion den fehlenden Code hinzu OnInit ().

Wir starten die Uhr

Die MQL-API-Funktion wurde dem obigen Code hinzugefügt bool EventSetMillisecondTimer(int Millisekunde)Mit dieser Option können Sie den Timer konfigurieren. Timer ist eine Methode, mit der Sie eine andere API-Funktion aufrufen können - OnTimer () jede bestimmte Anzahl von Millisekunden. Diese Lösung ermöglicht es uns, bestimmte Teile des Codes periodisch auszuführen, indem sie in die Funktion eingefügt werden OnTimer (). In unserem Fall 4 mal pro Sekunde oder was 250 Millisekunden.

Die Uhr tickt, schreiben wir also eine neue Funktion.

ungültig OnTimer()
{
 
Przycisku_badz_czujny ();
 
}
MQL4-Code

Gute Arbeit Sie haben gerade einen Algorithmus erstellt, der dafür verantwortlich ist, dass unser Button gegen versehentliche Klicks gesichert ist. Es war dieser schwierige Teil. Wenn Sie nun auf die Schaltfläche klicken, müssen Sie die Taste gedrückt halten [Shift] auf der Tastatur. Spins auf Elektronen werden in Funktion abgeschraubt Przycisku_badz_czujny ()dass wir aus der Bibliothek importiert haben Biblioteka_panic_button.ex4 letzte Woche

Die Plattform erfordert, dass der Timer ausgeschaltet wird, wenn er nicht mehr benötigt wird. Wir können dies durch Hinzufügen der API-Funktion tun EventKillTimer () zu funktionieren OnDeinit ()die wir im vorherigen Abschnitt erstellt haben und die von der Plattform als Erinnerung aufgerufen werden, wenn unsere Anwendung geschlossen wird. Lassen Sie uns die Funktion ändern OnDeinit ()Lass es aussehen wie die Funktion unten.

ungültig OnDeinit(const int Grund)
{
 
Przycisku_bye_bye ();
 
EventKillTimer ();
}
MQL4-Code

Sie können die Anwendung hier starten und sehen, wie der Algorithmus durch Drücken einer Taste reagiert [Shift].

Wir beobachten jede Bewegung

Es ist an der Zeit, über die Positionsschließfunktion nachzudenken. Um dies zu tun, müssen wir den Moment erkennen, in dem die Schaltfläche angeklickt wird. Die API-Funktion hilft uns dabei ungültig OnChartEvent(const int Identifikation const long & lParam const double & dparam, const string & SPAR).

Funktion OnChartEvent (...) Es wird von der Plattform aufgerufen, wenn ein Ereignis in der Grafik auftritt, das für die Programmoperation relevant sein kann, z. B. der Benutzer klickt auf das Objekt oder bewegt die Maus. Schreiben wir die entsprechende Funktion.

ungültig OnChartEvent(const int Identifikation const long & lParam const double & dparam, const string & SPAR)
{
 
}
MQL4-Code

Plattform, aufrufende Funktion OnChartEvent (...) Es stellt zusätzliche Informationen über Parameter zur Verfügung id, lParam, dparamoraz Spat. Auf diese Weise können wir erkennen, was passiert ist, und die Art des Ereignisses wird in der Variablen gespeichert idwelche Art ist intist eine ganze Zahl. Wort const Wenn der Variablentyp bedeutet, dass eine bestimmte Variable nicht geändert werden kann und nur zum Lesen von Informationen verwendet wird.

Lassen Sie uns unsere Funktion um ein anderes Element erweitern.

ungültig OnChartEvent(const int Identifikation const long & lParam const double & dparam, const string & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
}
 
}
MQL4-Code

Verwendung des Bedieners if Wir prüfen ob die Variable oben ist id ist gleich == Der in der Variablen definierte Wert wird automatisch durch den Namen generiert CHARTEVENT_OBJECT_CLICK. In diesem Fall sind wir sicher, dass der Benutzer in der Grafik ein nicht angegebenes Objekt angeklickt hat, auf das unser Algorithmus angewendet wird.

Wir wissen bereits, dass der Operator einen bedingten Ausdruck hat if Es ist logisch wahr, dass der Code zwischen den geschweiften Klammern erstellt wird {} zu diesem Betreiber gehören. Fügen wir unserem Code hinzu, was passieren soll, wenn der Graph auf ein Objekt klickt.

ungültig OnChartEvent(const int Identifikation const long & lParam const double & dparam, const string & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == was immer dies auch sein sollte.)
{
 
}
 
}
 
}
MQL4-Code

Der obige Code prüft, ob unsere Schaltfläche mit der Funktion angeklickt wurde bool Przycisku_czy_jestes_klikniety (Schnur object_name)das kommt aus der importierten Bibliothek. Die Funktion als Parameter nimmt eine Variable mit Datentyp an SchnurDies ist eine Textvariable, die den Namen des Objekts enthalten sollte, auf das der Benutzer geklickt hat. Die Funktion vergleicht den empfangenen Wert mit dem Namen des grafischen Elements der Schaltfläche, und die Antwort auf die Frage, ob auf unsere Schaltfläche geklickt wurde, antwortet mit dem Typwert booloder Wert was immer dies auch sein sollte. oder falsch.

Woher wissen wir den Namen des Objekts, auf das geklickt wurde? Funktion OnChartEvent (...) erhält von der Plattform den Namen des zuletzt mit dem Parameter angeklickten Objekts Schnur genannt Spatdass wir direkt als Parameter für unsere Funktion übergeben können, oh ja Przycisku_czy_jestes_klikniety (SPAR).

Wir erledigen die anvertraute Aufgabe [Konkrety]

Wann funktionButton_or_jestes_klikniety (...) gibt den Wert zurück was immer dies auch sein sollte. Wir werden wissen, dass es keine Witze gibt, man muss die Situation retten.

Fügen wir unserem Code eine Funktion hinzu, die die Hauptaufgabe unseres Algorithmus erfüllt, dh die Position auf dem Konto schließen. Die Funktion hat folgende Deklaration:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument),

In der Praxis setzen wir es in den Code wie in das Feld unten.

ungültig OnChartEvent(const int Identifikation const long & lParam const double & dparam, const string & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == was immer dies auch sein sollte.)
{
 
Zamknij_pozycje_i_zlecenia (Tylko_ten_instrument);
 
}
 
}
 
}
MQL4-Code

Funktion Close_positions_and_commissions (...) nimmt eine Typvariable als Argument booldie Informationen enthalten sollte, was immer dies auch sein sollte. oder falschsollten wir nur die Positionen des Instruments schließen, auf dem der Algorithmus arbeitet. Sie erinnern sich an den Parameter Tylko_ten_instrument aus dem Einstellungsbereich im ersten Teil? Wir haben uns gerade als nützlich erwiesen. Abhängig von unserer Auswahl in den Einstellungen schließt das Programm Elemente, die mit dem ausgewählten Diagramm oder allen Elementen im Konto kompatibel sind.


Fachberater


Wir erstellen die Hauptfunktion

Wir beginnen die Datei zu bearbeiten "Nützliche_Funktionen.mqh" aus dem Verzeichnis MQL4 \ Include \ Panic Button \

Bisher haben wir nur Funktionen verwendet, die von der MQL-API stammen oder aus der Bibliothek importiert werden Biblioteka_panic_button.ex4. In der Praxis erfordert das Programmieren jedoch, dass wir die Mehrzahl der Funktionen selbst erstellen und dabei das gesamte Spektrum an fertigen Lösungen unterstützen. Funktion Close_positions_and_commissions (...) , von dem wir das oben genannte verwenden, finden Sie in der Datei Przydatne_funkcje.mqh, was im vorherigen Teil wir haben in den katalog gestellt MQL4 \ Include \ Panic Button \ und wir haben den Code mit dem Schlüsselwort eingegeben #einschließen. Öffnen Sie die Datei in MetaEditor, weil die Funktion, mit der die Einträge geschlossen werden, bereits in der Datei enthalten ist, aber wir müssen ihr immer noch Inhalt geben.

Funktionsdefinition

Nach dem Öffnen der Datei Przydatne_funkcje.mqh Sie werden sehen, dass er drin ist Definition Positionsschließfunktion. Es sieht genauso aus wie die Funktionen, die wir bisher verwendet haben, mit dem Unterschied, dass es unsere eigene ist, und wir können ihr geben, welche Art von Seele der Name, der Typ und die Menge der Parameter benötigen wird. Ihre Funktion sollte ungefähr so ​​aussehen wie die unten stehende Funktion:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
Rückkehr was immer dies auch sein sollte.;
}
MQL4-Code

Also in Kopfzeile haben wir eine Funktion namens definiert Zamknij_pozycje_i_zlecenia Rückgabe des Datentyps bool und einen benannten Parameter nehmen tylko_ten_instrument auch über die Art der Daten bool.

Der Inhalt der Funktion

Alles, was wir zwischen Zahnspangen legen {} Nach dem Funktionsheader besteht er aus seinem Inhalt. Also bereichern wir unseren Inhalt mit dem ersten Code.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(IsConnected() == falsch) Rückkehr falsch;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) Rückkehr was immer dies auch sein sollte.;
bool Ergebnis = was immer dies auch sein sollte.;
Rückkehr zur Folge haben;
}
MQL4-Code

Oben zuerst ifprüfen wir, ob wir über die API-Funktion mit dem Server verbunden sind IsConnected() Bei Problemen verlassen wir die Funktion mit Hilfe des Bedieners Rückkehr während der Wert zurückgegeben wird falschSie wissen zu lassen, dass etwas nicht stimmt. Das ist gleich danach if Es gibt keine geschweiften Klammern, da wir einen gekürzten Datensatz verwenden, der in Situationen möglich ist, in denen nach dem Bedingungsausdruck nur eine Operation ausgeführt werden soll.

Wenn wir online sind, geht der Algorithmus weiter und erstellt zwei Variablen int über Namen i oraz liczba_pozycji_i_zlecen durch Zuweisung zum ersten Wert 0und der zweite Wert aus der API-Funktion OrdersTotal(), die Sie über die Anzahl der offenen Positionen und Aufträge in Ihrem Konto informiert.

Ein anderer Betreiber if prüft, ob manchmal alle Elemente nicht mehr geschlossen sind, und der Benutzer klickt die Schaltfläche nur zum Spaß oder zur Zuneigung, was dazu führt, dass die Funktion mit der Wertübertragung verlassen wird was immer dies auch sein sollte.weil alles in ordnung ist.

Wenn eine Funktion noch etwas zu tun hat, wird eine Variable erstellt bool genannt Ergebnis, die später dazu dient, Informationen darüber zu liefern, ob alle Elemente ordnungsgemäß mit dem Endoperator geschlossen wurden Rückkehrwas wir in diesem Schritt leicht modifiziert haben.

Für Schleife

Operator für, was in seiner Popularität wahrscheinlich nur dem Betreiber nachgibt if, wird verwendet, um eine bestimmte Anzahl von Operationen mit einer bestimmten Anzahl von Wiederholungen auszuführen. Ideal für Situationen wie die unsere, da wir für jeden Auftrag einen Abschlussvorgang durchführen müssen. Fügen wir unserer Funktion eine Schleife hinzu für.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(IsConnected() == falsch) Rückkehr falsch;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) Rückkehr was immer dies auch sein sollte.;
bool Ergebnis = was immer dies auch sein sollte.;
für(i = Anzahl_der_Elemente_i_ Bestellungen - 1; i> = 0; i--)
{
 
}
Rückkehr zur Folge haben;
}
MQL4-Code

W Kopfzeilenach dem Betreiber für Wir sehen eine mysteriöse Platte: (i = Anzahl_der_Elemente_i_ Bestellungen - 1; i> = 0; i--) .

Der Datensatz bedeutet, dass die Schleife mit der zuvor erstellten Variablen beginnt i gleich der Variable liczba_pozycji_i_zlecen minus eins und wiederholt den Vorgang zwischen den Klammern {} solange variabel i ist größer oder gleich null [i> = 0], und nach dem Ende jedes Zyklus wird die Variable reduziert i um eins [i--] damit die Schleife irgendwann enden kann. Einfach, unkompliziert und angenehm zu lesen.

In der Sprache der Menschen sprechen, die Schleife für führt die Operation in Klammern aus {} so oft wie wir offene Positionen haben.

Fügen wir der Schleife Inhalt hinzu.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(IsConnected() == falsch) Rückkehr falsch;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) Rückkehr was immer dies auch sein sollte.;
bool Ergebnis = was immer dies auch sein sollte.;
für(i = Anzahl_der_Elemente_i_ Bestellungen - 1; i> = 0; i--)
{
if(OrderSelect(Und, SELECT_BY_POS) == falsch)
{
Ergebnis = falsch; fortsetzen;
}
if(only_ten_instrument == was immer dies auch sein sollte. && OrderSymbol()! = Symbol()) fortsetzen;
if(Auftragsart() == OP_BUY || Auftragsart() == OP_SELL)
{
if(BestellenSchließen(OrderTicket() OrderLots() OrderClosePrice() 0) == falsch)
{
Ergebnis = falsch; fortsetzen;
}
}
Sonst wenn(OrderDelete(OrderTicket()) == falsch) result = falsch;
}
Rückkehr zur Folge haben;
}
MQL4-Code

Raketenphysik

Lassen Sie uns Schritt für Schritt analysieren, was in unserer Schleife passiert fürdie wir in der vorherigen Etappe tapfer geschrieben haben.

Im ersten Schritt mit der API-Funktion OrderSelect(...) Wir wählen einen Auftrag vom Terminal anhand der Nummer seiner Position in der Auftragsliste aus (Die erste Reihenfolge in der Liste hat die Nummer Null). Wir haben eine Variable für diesen Zweck idas ändert den Wert mit jeder Schleife. Im Fehlerfall schreiben wir den Fehler in die Variable Ergebnis und informieren Sie die Schleife für mit dem Operator fortsetzendass sie an diesem Punkt aufhören und einen neuen Zyklus mit einer Variablen beginnen soll i minus eins [i--]

Wenn alles gut geht, ein anderer Operator if wird verwenden, Neuheit, logische Operation "und" &&das gibt einen Wert zurück was immer dies auch sein sollte. Nur wenn beide Ausdrücke auf jeder Seite einen Wert zurückgeben was immer dies auch sein sollte.. Wenn also das Instrument der ausgewählten Reihenfolge [OrderSymbol()] antwortet nicht [!=] ein Chartinstrument [Symbol()] und variabel tylko_ten_instrument hat einen Wert was immer dies auch sein sollte.ignorieren wir die angegebene Reihenfolge und verwenden den Operator fortsetzen Wir gehen zum nächsten Zyklus der Schleife für. In allen anderen Fällen geht der Algorithmus darunter.

Dann prüft unser Programm, in welcher Reihenfolge wir das Vergnügen haben, und verwendet dazu die API-Funktion Auftragsart() und logische Operation"oder" ||das gibt einen Wert zurück was immer dies auch sein sollte.wenn mindestens einer der Ausdrücke auf jeder seiner Seiten einen Wert zurückgibt was immer dies auch sein sollte.. Andernfalls beim logischen Ausdruck des Operators if als Ganzes wird der Wert zurückgegeben falsch Der Operator wird ausgeführt Sonst wenndas funktioniert beim ersten if'em und dient ihm als Plan B, wenn er seinem eigenen logischen Ausdruck nicht zustimmen kann.

Je nach Art der Bestellung zuerst if beim Umgang mit einer Market-Buy-Order [OP_BUY] oder Markt verkaufen [OP_SELL] schließt die Position mit der API-Funktion BestellenSchließen(...)und der andere ifeigentlich Sonst wenn bricht ausstehende Bestellungen mit der Funktion ab OrderDelete(...).

Ich verneige mich, das Programm ist fertig!

Wir speichern Änderungen an der Datei Przydatne_funkcje.mqhkehren wir zum Hauptanwendungscode zurück Panic Button.mq4 und enthusiastisch, voller Energie und Neugier, die aus der Bereitschaft resultieren, eine neue Arbeit zu testen, drücken Sie ... kompilieren! Dann korrigieren wir die Fehler und bis nächste Woche! 🙂

LADEN SIE EINEN SATZ VON MMS-DATEIEN HERUNTER

Was denken Sie?
Ich mag es
95%
interessant
8%
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.