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"

 

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:

  1. Internet-Zugang unterbrechen (um den Verlust der Verbindung zum Handelsserver zu simulieren)
  2. Deaktivieren Sie die Handelsoption in den EA-Einstellungen (drücken Sie F7 und deaktivieren Sie "Automatischen Handel erlauben" im Tab "Allgemein" des EA-Einstellungsfensters)
  3. Deaktivieren Sie den Autohandel im Terminal (die Schaltfläche AutoTrading)

Klicken Sie auf den Positionseröffnungs-Button im EA-Handelspanel. Der folgende Eintrag erscheint im Journal:

2019.09.26 15:07:55.582 CTrading::OpenBuy: Request rejected before being sent to server due to:
2019.09.26 15:07:55.582 1. No permission to conduct trading operations in terminal ("AutoTrading" button disabled)
2019.09.26 15:07:55.582 2. No connection to trade server
2019.09.26 15:07:55.582 3. EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")


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:

2019.09.26 15:10:36.766 CTrading::OpenBuy: Request rejected before being sent to server due to:
2019.09.26 15:10:36.766 1. No permission to conduct trading operations in terminal ("AutoTrading" button disabled)
2019.09.26 15:10:36.766 2. EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")


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:

2019.09.26 15:13:03.424 CTrading::OpenBuy: Request rejected before being sent to server due to:
2019.09.26 15:13:03.424 EA does not have permission to conduct trading operations (F7 --> Common --> "Allow Automatic Trading")


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:

2019.09.26 15:14:32.619 - Position is open: 2019.09.26 11:14:32.711 -
2019.09.26 15:14:32.619 EURUSD Opened 0.10 Buy #455179802 [0.10 Market-order Buy #455179802] at price 1.09441, Magic number 123


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

Artyom Trishkin
Artyom Trishkin
  • www.mql5.com
Profil des Traders
 

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.

 
Alexey Viktorov:

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):


 
Danke, den Rest der dummen Fragen werde ich privat stellen, um Passanten nicht zu erschrecken. ))))))
 

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...
 
Alexey Viktorov:

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);
     }
     
 
Artyom Trishkin:

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.

 
Nein, Sie müssen die Ereigniskennzeichnung zurücksetzen.
 
Artyom Trishkin:

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;
    }
 
Alexey Viktorov:

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.

 
Alexey Viktorov:

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:

Achten Sie auf die EA-Testfunktion OnDoEasyEvent() - sie verarbeitet alle Bibliotheksereignisse. Und wenn Sie Handelsereignisse mit einem Schalter verarbeiten wollen, tun Sie es dort.