Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXXIII): Ändern von Orders und Positionen unter bestimmten Bedingungen" - Seite 2

 
Artyom Trishkin:
Ja, das werden sie. Denn dort wurde der Ansatz zur Speicherung Ihrer Kontodaten geändert. Das steht am Ende des Artikels als Warnung:
-----
Zu Ihrer Information:
Da wir die Struktur des Konto-Objekts geändert haben (die Größe der uchar-Arrays zum Speichern der String-Eigenschaften des Kontos geändert und eine weitere Integer-Eigenschaft hinzugefügt), werden alle zuvor gespeicherten Dateien der Konto-Objekte nicht mehr korrekt geladen. Wenn sie sich im gemeinsamen Ordner der Terminals im Verzeichnis \Files\DoEasy\Accounts\ befinden, dann müssen sie alle vor dem Start dieses Testberaters gelöscht werden - sie werden beim Wechsel von einem Konto zu einem anderen mit einer neuen Größe der Objektstruktur neu erstellt.
-----

Ich habe alle Konto-BIN-Dateien im gemeinsamen Ordner gelöscht, um sicherzustellen, dass Ihr Code vollständig geladen wird. Er wird ohne Fehler über `CAccount::Load` geladen (aber das Hauptproblem war das falsche Ignorieren von Ereignissen und besteht immer noch)

Dann öffnete ich einige Trades manuell und schloss sie mit einem Skript so schnell wie möglich. Ich bekam wieder diesen Fehler:

CEventsCollection::CreateNewEvent, Zeile 768: Dieses Ereignis ist bereits in der Liste

Wir wissen, dass diese Ereignisse von verschiedenen Positionsschließungen in MT4 stammen, aber der "Engine"-Code kann sie nicht verstehen. Ist die Engine überhaupt in der Lage, mehrere Handelsabschlüsse/Ereignisse in kurzer Zeit zu verstehen?


Hier sind alle Log-Meldungen:

2020.08.21 21:23:50.604 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.21 21:23:50.600 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.21 19:51:47.000 -

AUDCAD Geschlossen Kauf #573142748 zu Preis 0.94405, Gewinn -0.22 USD

2020.08.21 21:23:50.368 Script CloseTradesFast4Test AUDCAD,H1: entfernt

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: uninit Grund 0

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: close #573142747 buy 0.01 AUDCAD at 0.94404 at price 0.94375

2020.08.21 21:23:50.148 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.21 21:23:50.146 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.21 19:51:47.000 -

AUDCAD Geschlossen Kauf #573142748 zu Preis 0.94405, Gewinn -0.22 USD

2020.08.21 21:23:49.942 CloseTradesFast4Test AUDCAD,H1: close #573142748 buy 0.01 AUDCAD at 0.94405 at price 0.94376

2020.08.21 21:23:49.725 mhdbzr-34 AUDCAD,H1: CEventsCollection::CreateNewEvent, Zeile 768: Dieses Ereignis ist bereits in der Liste

2020.08.21 21:23:49.520 CloseTradesFast4Test AUDCAD,H1: close #573142752 buy 0.01 AUDCAD at 0.94406 at price 0.94376

2020.08.21 21:23:49.257 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.21 21:23:49.255 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.21 19:51:52.000 -

AUDCAD Geschlossen Verkaufen #573142755 zum Preis von 0.94366, Gewinn -0.37 USD

2020.08.21 21:23:49.086 CloseTradesFast4Test AUDCAD,H1: close #573142755 sell 0.01 AUDCAD at 0.94366 at price 0.94414

2020.08.21 21:23:48.815 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.21 21:23:48.812 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.21 19:51:53.000 -

AUDCAD Geschlossen Verkaufen #573142757 zum Preis von 0.94366, Gewinn -0.37 USD

2020.08.21 21:23:48.661 CloseTradesFast4Test AUDCAD,H1: close #573142756 sell 0.01 AUDCAD at 0.94366 at price 0.94415

2020.08.21 21:23:48.352 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.21 21:23:48.350 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.21 19:51:53.000 -

AUDCAD Geschlossen Verkauf #573142757 zum Preis von 0.94366, Gewinn -0.37 USD

2020.08.21 21:23:48.237 CloseTradesFast4Test AUDCAD,H1: close #573142757 sell 0.01 AUDCAD at 0.94366 at price 0.94415

2020.08.21 21:23:47.537 CloseTradesFast4Test AUDCAD,H1: initialisiert

2020.08.21 21:23:47.520 Script CloseTradesFast4Test AUDCAD,H1: erfolgreich geladen

2020.08.21 21:23:31.762 Automatischer Handel aktiviert

 
Mohammad Bazrkar :

Ich lösche alle Account BIN-Dateien im gemeinsamen Ordner, um sicher zu sein, dass Ihr Code vollständig geladen wird. Es lädt ohne Fehler über `CAccount::Load` (aber das Hauptproblem war falsch Ereignis ignorieren und besteht immer noch)

Dann öffnete ich einige Trades manuell und schloss sie mit einem Skript so schnell wie möglich. Ich bekam wieder diesen Fehler:

CEventsCollection::CreateNewEvent, Zeile 768: Dieses Ereignis ist bereits in der Liste

Wir wissen, dass diese Ereignisse von verschiedenen Positionsschließungen im MT4 stammen, aber der "Engine"-Code kann sie nicht verstehen. Ist die Engine überhaupt in der Lage, mehrere Handelsabschlüsse/Ereignisse in kurzer Zeit zu verstehen?

Bitte beschreiben Sie Schritt für Schritt, was Sie tun, um diesen Fehler zu erhalten.

 
Artyom Trishkin:

Bitte beschreiben Sie Schritt für Schritt, was Sie tun, um diesen Fehler zu erhalten.

Ich habe Ihren EA-Code so geändert, dass er nur Ereignisse abruft. (Ich habe die geänderte Version in früheren Nachrichten beigefügt, es heißt `mhdbzr-34`)

  1. Führen Sie den EA aus, um die Überwachung zu starten.
  2. Eröffnen Sie einige Kauf-/Verkaufstransaktionen im Demokonto mit denselben Lots (durch schnelles Klicken auf die Schaltfläche "Kaufen/Verkaufen" auf dem Chart)
  3. Führen Sie ein Skript aus, um diese Geschäfte so schnell wie möglich zu schließen. (mein Skriptname ist `CloseTradesFast4Test`)
  4. Überprüfen Sie die Log-Meldungen. Sie sehen, dass die Engine einige Positionsschließungen verpasst hat, wahrscheinlich mit der roten Fehlermeldung, die ich hier geschrieben habe.
 
Mohammad Bazrkar :

Ich habe Ihren EA-Code so geändert, dass er nur Ereignisse abruft. (Ich habe die geänderte Version in früheren Nachrichten angehängt, es ist `mhdbzr-34` genannt)

  1. Führen Sie den EA aus, um die Überwachung zu starten.
  2. Eröffnen Sie einige Kauf-/Verkaufstransaktionen im Demokonto mit denselben Lots, und zwar schnell (durch schnelles Klicken auf die Schaltfläche "Kaufen/Verkaufen" auf dem Chart)
  3. Führen Sie ein Skript aus, um diese Trades so schnell wie möglich zu schließen. (mein Skriptname ist " CloseTradesFast4Test ")
  4. Überprüfen Sie die Log-Meldungen. Sie sehen, dass die Engine einige Positionsschließungen verpasst hat, wahrscheinlich mit der roten Fehlermeldung, die ich hier geschrieben habe.

Geben Sie Ihr Skript zum Schließen von Positionen.

 
Artyom Trishkin:

Geben Sie Ihr Skript an geschlossene Positionen weiter.

hier ist der Code:

void OnStart()
{
   for(int i=OrdersTotal()-1; i>-1; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ continue; }
      if(OrderSymbol()!= _Symbol){ continue;}
      //--
      RefreshRates();
      int res = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
   }
}
 

hier ist ein weiterer Test; dieses Mal hat er geschlossene Positionen nicht erkannt, er hat sie in zwei Fällen mit den vorherigen verpasst.

2020.08.27 20:30:18.880 Experte mhdbzr-34 AUDCAD,H1: entfernt

2020.08.27 20:30:18.869 mhdbzr-34 AUDCAD,H1: uninit Grund 1

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.27 18:58:03.000 - AUDCAD Closed Buy #573721560 zu Preis 0.95218, Gewinn -2.29 USD

2020.08.27 20:28:35.614 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.27 18:58:04.000 - AUDCAD Geschlossen Buy #573721562 at price 0.95218, Profit -2.29 USD

2020.08.27 20:28:35.582 Script CloseTradesFast4Test AUDCAD,H1: entfernt

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: uninit Grund 0

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: close #573721560 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.177 CloseTradesFast4Test AUDCAD,H1: close #573721562 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.161 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.27 20:28:35.158 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.27 18:58:06.000 - AUDCAD Geschlossen Verkauf #573721573 zu Preis 0.95190, Gewinn -2.06 USD

2020.08.27 20:28:34.739 CloseTradesFast4Test AUDCAD,H1: close #573721571 buy 0.10 AUDCAD at 0.95224 at price 0.95191

2020.08.27 20:28:34.695 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.27 20:28:34.691 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.27 18:58:06.000 - AUDCAD Geschlossen Verkauf #573721573 zu Preis 0.95190, Gewinn -2.06 USD

2020.08.27 20:28:34.306 CloseTradesFast4Test AUDCAD,H1: close #573721573 sell 0.10 AUDCAD at 0.95190 at price 0.95217

2020.08.27 20:28:34.180 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.27 20:28:34.177 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.27 18:58:09.000 - AUDCAD Geschlossen Verkauf #573721582 zu Preis 0.95190, Gewinn -2.14 USD

2020.08.27 20:28:33.883 CloseTradesFast4Test AUDCAD,H1: close #573721577 sell 0.10 AUDCAD bei Preis 0.95190 at price 0.95217

2020.08.27 20:28:33.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geschlossen

2020.08.27 20:28:33.660 mhdbzr-34 AUDCAD,H1: - Position geschlossen: 2020.08.27 18:58:09.000 - AUDCAD Geschlossen Verkauf #573721582 zu Preis 0.95190, Gewinn -2.14 USD

2020.08.27 20:28:33.440 CloseTradesFast4Test AUDCAD,H1: close #573721582 sell 0.10 AUDCAD at 0.95190 at price 0.95218

2020.08.27 20:28:32.946 CloseTradesFast4Test AUDCAD,H1: initialisiert

2020.08.27 20:28:32.928 Script CloseTradesFast4Test AUDCAD,H1: erfolgreich geladen

2020.08.27 20:28:09.413 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position geöffnet

2020.08.27 20:28:09.411 mhdbzr-34 AUDCAD,H1: - Position eröffnet: 2020.08.27 18:58:09.000 - AUDCAD Opened 0.10 Sell #573721582 [0.10 Market-order Sell #573721582] at price 0.95190

2020.08.27 20:28:07.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position eröffnet

2020.08.27 20:28:07.659 mhdbzr-34 AUDCAD,H1: - Position eröffnet: 2020.08.27 18:58:07.000 - AUDCAD Eröffnet 0.10 Verkaufen #573721577 [0.10 Market-order Verkaufen #573721577] zum Preis 0.95190

2020.08.27 20:28:06.755 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position eröffnet

2020.08.27 20:28:06.752 mhdbzr-34 AUDCAD,H1: - Position eröffnet: 2020.08.27 18:58:06.000 - AUDCAD Eröffnet 0.10 Verkaufen #573721573 [0.10 Market-order Verkaufen #573721573] zum Preis 0.95190

2020.08.27 20:28:05.911 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position eröffnet

2020.08.27 20:28:05.909 mhdbzr-34 AUDCAD,H1: - Position eröffnet: 2020.08.27 18:58:05.000 - AUDCAD eröffnet 0.10 Buy #573721571 [0.10 Market-order Buy #573721571] zum Preis von 0.95224

2020.08.27 20:28:04.587 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position eröffnet

2020.08.27 20:28:04.582 mhdbzr-34 AUDCAD,H1: - Position eröffnet: 2020.08.27 18:58:04.000 - AUDCAD eröffnet 0.10 Buy #573721562 [0.10 Market-order Buy #573721562] zum Preis von 0.95218

2020.08.27 20:28:04.101 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent: Position eröffnet

2020.08.27 20:28:04.099 mhdbzr-34 AUDCAD,H1: - Position eröffnet: 2020.08.27 18:58:03.000 - AUDCAD eröffnet 0.10 Buy #573721560 [0.10 Market-order Buy #573721560] zum Preis von 0.95218

2020.08.27 20:27:59.245 mhdbzr-34 AUDCAD,H1: initialisiert

2020.08.27 20:27:59.244 mhdbzr-34 AUDCAD,H1: Konto 13278180: mhdbzr test (Alpari) 5537.01 USD, 1:100, Hedge, Demokonto MetaTrader 4

2020.08.27 20:27:49.794 Expert TestDoEasy\Part34\mhdbzr-34 AUDCAD,H1: erfolgreich geladen

Ich habe diese Trades manuell auf dem Live-Markt im Demokonto eröffnet, nicht in der Testumgebung. (und mit dem Skript geschlossen, wie ich es zuvor getan habe)

(hier ist der Screenshot, um sicher zu sein, dass es passiert ist)

Dateien:
 
Mohammad Bazrkar :

hier ist ein weiterer Test; dieses Mal erkannte er geschlossene Positionen nicht, er verpasste sie mit den vorherigen in zwei Fällen.

Ich habe diese Geschäfte manuell auf dem Live-Markt im Demokonto eröffnet, nicht in der Testumgebung. (und schloss mit dem Skript, wie ich es vorher tat)

(hier ist der Screenshot, um sicher zu sein, dass es passiert ist)

Ich bin auf der Suche nach der Ursache des Problems. Es wird nicht schnell gehen. Vielen Dank für die Tests.

 
Artyom Trishkin:

Ich bin auf der Suche nach der Ursache des Problems. Es wird nicht schnell gehen. Vielen Dank für die Tests.

(hier ist meine Meinung)

Die geschlossenen Positionen sind in der gleichen Sekunde, eine von ihnen wurde in der vorherigen Tickzeit bearbeitet, so dass sie in der neuen Tickzeit `New_history_orders=1`, aber zwei Positionen in der `Liste` hat und wahrscheinlich falsch sortiert ist, weil zwei Positionen die gleiche Abschlusszeit in der Sekunde haben.

            //--- Abrufen der Liste der geschlossenen Positionen (EventsCollection.mqh Zeilen 205-230)
            CArrayObj* list=this.GetListHistoryPositions(list_history);
            if(list!=NULL)
              {
               //--- Sortieren der neuen Liste nach einer Positionsschlusszeit
               list.Sort(SORT_BY_ORDER_TIME_CLOSE);
               //--- Nimm die Anzahl der Positionen, die der Anzahl der neu geschlossenen Positionen vom Ende der Liste in einer Schleife entspricht (die letzten N Ereignisse)
               int total=list.Total(), n=new_history_orders;
               for(int i=total-1; i>WRONG_VALUE && n>0; i--,n--)
                 {
                  //--- Empfangen einer Position aus der Liste. Wenn es sich um eine Position handelt, nach Eröffnungsauftragsdaten suchen und ein Handelsereignis setzen
                  COrder* position=list.At(i);
                  if(position!=NULL && position.Status()==ORDER_STATUS_HISTORY_ORDER)
                    {
                     //--- Wenn es einen Steuerbefehl für eine geschlossene Position gibt
                     COrderControl* ctrl=this.GetOrderControlByTicket(list_control,position.Ticket());
                     if(ctrl!=NULL)
                       {
                        //--- Legen Sie (1) einen Auftragstyp fest, der zur Eröffnung einer Position geführt hat, und eine (2) Positions-ID, und erstellen Sie ein Positionsschließungsereignis
                        this.m_type_first=(ENUM_ORDER_TYPE)ctrl.TypeOrder();
                        this.m_position_id=position.Ticket();
                        this.CreateNewEvent(position,list_history,list_market,list_control);
                       }
                    }
                 }
              }

Wenn der Auftrag bereits in der Liste ist und eine Fehlermeldung auslöst, dann wird das Positionsobjekt gelöscht und die Zählung in dieser for-Schleife fortgesetzt, aber ich denke, es sollte nicht n zählen, wenn der Auftrag innerhalb derCreateNewEvent-Funktion gelöscht wurde, um die nächste gültige Position zu erfassen.

Außerdem müssen wir die kürzlich bearbeiteten Positionen verstehen, um falsch sortierte Aufträge zu überspringen und nicht für `n` herunterzuzählen.

 
Mohammad Bazrkar :

(hier ist meine Meinung)

diese geschlossenen Positionen sind in der gleichen Sekunde, einer von ihnen ist in der vorherigen Tick Zeit behandelt, so dass in der neuen Tick, es hat ` new_history_orders =1`, aber zwei Positionen in der ` Liste` und sortiert wahrscheinlich falsch, weil zwei Positionen haben die gleiche Zeit in der zweiten schließen.

Wenn der Auftrag bereits in der Liste ist und eine Fehlermeldung auslöst, dann wird das Positionsobjekt gelöscht und die Zählung in dieser for-Schleife fortgesetzt, aber ich denke, es sollte nicht n zählen, wenn der Auftrag innerhalb der CreateNewEvent-Funktion gelöscht wurde, um die nächste gültige Position zu erfassen.

Außerdem müssen wir die kürzlich bearbeiteten Positionen verstehen, um falsch sortierte Aufträge zu überspringen und nicht für `n` herunterzuzählen.

Danke, ich werde es herausfinden.

 

Hallo Artyom, ich erinnere mich, dass du diese zukünftige grafische Shell erwähnt hast, als ich diese Artikel vor einigen Wochen zum ersten Mal gelesen habe... Kannst du uns mehr Details über deine Vision für diese Shell geben und was sie uns in der Praxis ermöglichen wird?