Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXI): Handelsklassen - Basisklasse des Handels, Verifikation der Einschränkungen"
Artem, ich muss die Eigenschaften einer Position in mql4 abrufen, nachdem sie geöffnet oder eine Order aktiviert wurde. Ich habe herausgefunden, wie man den Ereignisindex erhält
ENUM_TRADE_EVENT engine.LastTradeEvent()
und an diesem Punkt muss ich die verfügbaren Eigenschaften abrufen.
Ich habe sogar das Enum gefunden, aber wie man... Ich kann nichts finden.
Artem, ich muss die Eigenschaften einer Position in mql4 abrufen, nachdem sie geöffnet oder eine Order aktiviert wurde. Ich habe herausgefunden, wie man den Ereignisindex erhält
und in diesem Moment muss ich die verfügbaren Eigenschaften abrufen.
Ich habe sogar das Enum gefunden, aber wie man... Ich kann nichts finden.
Wenn das letzte Ereignis das Öffnen einer Position ist? Müssen wir die zuletzt geöffnete Position und den Zugriff auf alle ihre Eigenschaften erhalten? Richtig?
Wenn ja, ist es einfach (ohne Überprüfung der Ergebnisse der immer die Liste und Objekt):

Ich komme langsam voran. Danke, sehr nützliche Bibliothek.
Nächste Frage (nicht dumm): Wir haben zwei anhängige Aufträge. Wir haben ein Ereignis bei der Aktivierung eines von ihnen erhalten, dann wurde der zweite aktiviert.... Und es gibt keine Änderung des Ereignisses. Wie kann man den Wächter nach dem Empfang des Ereignisses wieder aktivieren? Versucht
last_event = WRONG_VALUE; nach der Verarbeitung des Ereignisses, aber ich bekam einen Unsinn...
Ich komme langsam voran. Danke, sehr nützliche Bibliothek.
Nächste Frage (nicht dumm): Wir haben zwei anhängige Aufträge. Wir haben ein Ereignis bei der Aktivierung eines von ihnen erhalten, dann wurde der zweite aktiviert.... Und es gibt keine Änderung des Ereignisses. Wie kann man den Wächter nach dem Empfang des Ereignisses zurücksetzen? Ich habe versucht
nach der Verarbeitung des Ereignisses, aber ich bekam einen Unsinn...Das ist der Punkt, an dem meine Ereigniskontrolle schief läuft. Die Bibliothek fängt sie alle ab, dann prüft der Test-EA den Unterschied zwischen dem vergangenen und dem aktuellen Ereignis. Und man hat zwei identische Ereignisse.
Im Prinzip setzt die Bibliothek nach dem Senden eines Ereignisses das Ereignis selbst zurück. Versuchen Sie, das Ereignis erneut zu empfangen, nachdem Sie es empfangen haben - es sollte in die Variable geschrieben werden, dass es kein Ereignis gibt, dann sollte das nächste Ereignis abgefangen werden.
Aber ich habe schon vor langer Zeit in meinen Plänen geschrieben, dass Handelsereignisse auf die gleiche Weise wie die Ereignisse von Symbolen oder Konten behandelt werden sollten - sie geben einfach ein Flag zurück, dass ein Ereignis vorliegt. Und dann können wir im Programm sehen, was das Ereignis ist. Im Expert Advisor ist dafür schon alles vorbereitet, nur bei den Handelsereignissen hakt es in der OnDoEasyEvent()-Funktion des Expert Advisors, weil das Flag noch nicht zurückgegeben wird - ich bekomme es nicht in die Finger:
//--- Verarbeitung von Handelsereignissen else if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE) { event=EnumToString((ENUM_TRADE_EVENT)ushort(idx)); int digits=(int)SymbolInfoInteger(sparam,SYMBOL_DIGITS); }
Hier läuft die Ereignissteuerung schief. Die Bibliothek fängt sie alle ab, dann prüft der Test-EA den Unterschied zwischen dem vergangenen Ereignis und dem aktuellen. Und Sie haben zwei identische Ereignisse.
Im Prinzip setzt die Bibliothek nach dem Senden eines Ereignisses das Ereignis selbst zurück. Versuchen Sie, das Ereignis erneut zu empfangen, nachdem Sie es empfangen haben - es sollte in die Variable geschrieben werden, dass es kein Ereignis gibt, dann sollte das nächste Ereignis abgefangen werden.
Aber ich habe schon vor langer Zeit in meinen Plänen geschrieben, dass Handelsereignisse auf die gleiche Weise wie die Ereignisse von Symbolen oder Konten behandelt werden sollten - sie geben einfach ein Flag zurück, dass ein Ereignis vorliegt. Und dann können wir im Programm sehen, was das Ereignis ist. Im Expert Advisor ist dafür schon alles vorbereitet, nur bei den Handelsereignissen hakt es in der OnDoEasyEvent()-Funktion des Expert Advisors, weil das Flag noch nicht zurückgegeben wird - ich bekomme es nicht in die Finger:
Das ist sicher, der Morgen ist am Abend weiser.... Wenn ein Ereignis eintrifft, in meinem speziellen Fall, sollten wir irgendwie darauf reagieren. Insbesondere eine weitere ausstehende Bestellung aufgeben. So viel zu dem neuen Ereignis.
Hier läuft die Ereignissteuerung schief. Die Bibliothek fängt sie alle ab, dann prüft der Test-EA den Unterschied zwischen dem vergangenen Ereignis und dem aktuellen. Und Sie haben zwei identische Ereignisse.
Im Prinzip setzt die Bibliothek nach dem Senden eines Ereignisses das Ereignis selbst zurück. Versuchen Sie, das Ereignis erneut zu empfangen, nachdem Sie es empfangen haben - es sollte in die Variable geschrieben werden, dass es kein Ereignis gibt, dann sollte das nächste Ereignis abgefangen werden.
Aber ich habe schon vor langer Zeit in meinen Plänen geschrieben, dass Handelsereignisse auf die gleiche Weise wie die Ereignisse von Symbolen oder Konten behandelt werden sollten - sie geben einfach ein Flag zurück, dass ein Ereignis vorliegt. Und dann können wir im Programm sehen, was das Ereignis ist. Im Expert Advisor ist dafür schon alles vorbereitet, nur bei den Handelsereignissen hakt es in der OnDoEasyEvent()-Funktion des Expert Advisors, weil das Flag noch nicht zurückgegeben wird - ich bekomme es nicht in die Finger:
Aber event ist eine Variable, die nur in OnChartEvent zur Verfügung steht, und im Tester wird sie nicht verarbeitet.
Ich möchte etwas wie dieses in OnTick() tun:
//--- Wenn sich das letzte Handelsereignis geändert hat if(engine.LastTradeEvent() != last_event) { switch(last_event) { case TRADE_EVENT_PENDING_ORDER_PLASED : // Aufruf der entsprechenden Funktion break; case TRADE_EVENT_PENDING_ORDER_REMOVED : // Aufruf der entsprechenden Funktion break; case TRADE_EVENT_PENDING_ORDER_ACTIVATED : // Aufruf der entsprechenden Funktion break; case TRADE_EVENT_POSITION_OPENED : // Aufruf der entsprechenden Funktion break; case TRADE_EVENT_POSITION_CLOSED : // Aufruf der entsprechenden Funktion break; default : break; }
Aber event ist eine Variable, die nur in OnChartEvent verfügbar ist, und sie wird im Tester nicht verarbeitet.
Ich möchte etwas Ähnliches in OnTick() tun:
Nach der Ereignisverarbeitung - am Ende des Ereignistyp-Prüfmoduls - was steht in der Variablen last_event? Diese Variable soll im Expert Advisor zurückgesetzt werden. Anstatt die Methode zum Zurücksetzen des letzten Ereignisses der Bibliothek zwangsweise aufzurufen, ruft sie die Bibliothek selbst direkt nach dem Senden des Ereignisses an den Chart und dem Schreiben in die Ereignisliste auf.
Aber event ist eine Variable, die nur in OnChartEvent verfügbar ist, und sie wird im Tester nicht verarbeitet.
Ich möchte etwas Ähnliches in OnTick() tun:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXI): Handelsklassen - Basisklasse des Handels, Verifikation der Einschränkungen :
In diesem Artikel beginnen wir mit der Entwicklung der Bibliothek der Basisklasse des Handels und fügen die erste Überprüfung der Berechtigungen zur Durchführung von Handelsoperationen der ersten Version hinzu. Außerdem werden wir die Funktionen und Inhalte der Basishandelsklasse leicht erweitern.
Um die Arbeit der Methoden zur Überprüfung der Handelsgrenzen zu überprüfen, müssen wir diese künstlich erzeugen.
Zum Beispiel:
Klicken Sie auf den Positionseröffnungs-Button im EA-Handelspanel. Der folgende Eintrag erscheint im Journal:
Lassen Sie uns die Einschränkungen nach und nach beseitigen.
Nachdem wir die Internetverbindung aktiviert haben, erhalten wir beim Versuch, eine Position zu eröffnen, folgende Meldung:
Aktivieren Sie den Autohandel im Terminal, indem Sie auf die Schaltfläche AutoTrading klicken. Wenn wir versuchen, eine Position zu eröffnen, erhalten wir Folgendes:
Drücken Sie F7 und erlauben Sie dem EA den Handel mit seinen Einstellungen. Beim Versuch, eine Position zu eröffnen, sind wir jetzt erfolgreich:
Andere Einschränkungen können im Tester oder einem Demokonto überprüft werden, indem eine Situation geschaffen wird, in der eine der Einschränkungen aktiviert wird, z.B. eine Begrenzung durch die maximale Anzahl der ausstehenden Aufträge auf dem Konto.Autor: Artyom Trishkin