Fehler, Irrtümer, Fragen - Seite 480

 
papaklass:
Jetzt aktualisiert und versucht, es wieder herauszufinden. Ich habe auf fast jeder Zeile Abdrücke angebracht. Ich werde über die Ergebnisse berichten.

Hier ist der Lauf mit Ihrem Einsatz, in dem Moment, in dem der Stop-Loss festgelegt wurde:

2011.08.09 00:41:08 Kern 1 2011.01.14 01:41:27 Zu schließende Long-Position von EURUSD von stop-loss
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 -----------------Deal #63 sl 1.33328
2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27 oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 CSampleExpert::Trade
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 Auftrag ausgeführt sell 0.15 at 1.33328 [#63 sell 0.15 EURUSD bei 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal performed [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 stop loss triggered buy 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 sell 0.15 EURUSD bei 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 Long-Position von EURUSD zu ändern trailing
 
Offensichtlich ist das unterschiedliche Ergebnis die unterschiedliche Verarbeitung in OnTrade, ich suche nur nach Trades, nur die interessieren mich, Sie hingegen, so wie ich es verstehe, verarbeiten alle Ereignisse, klassifizieren sie und haben hier irgendwo etwas durcheinander gebracht.
 
Ich nehme an, dass der Markt für Terminwetten auch eine Demo ist? Nahm die Wette von der MMVB real, die Lose stimmen nicht überein.
 
papaklass:

Ich erteile schwebende Aufträge mit einer Laufzeit von 1 Stunde. Nach einer Stunde werden die nicht aktivierten Aufträge bis zum Ablauf der Auftragszeit geschlossen. Wenn mehrere Aufträge gleichzeitig geschlossen werden und die Funktion HistoryOrdersTotal() vor dem Schließen einen Wert ungleich Null hatte, dann gehen einige Aufträge verloren. Zum Beispiel hatte die Funktion vor der Schließung von 8 Aufträgen einen Wert von 4, aber nach der Schließung hat sie einen Wert von 10. Zwei Aufträge sind verloren gegangen.


Was meinen Sie mit "Die Aufträge gingen verloren"? Es ist zu bedenken, dass Nachrichten, die an OnTrade() gehen, Informationen über mehr als ein Handelsereignis enthalten können. Wenn mehrere Nachrichten gleichzeitig gesendet werden, kann es außerdem vorkommen, dass sich bei der Verarbeitung der ersten Nachricht der historische Cache bereits geändert hat und Sie das Gefühl haben, dass "Ereignisse verloren gehen".

Bitte lesen Sie den Artikel Handelsereignisse in MetaTrader 5:

Schlussfolgerung

Alle Vorgänge auf der MetaTrader 5-Handelsplattform sind asynchron, und das Versenden von Nachrichten über alle Änderungen auf dem Handelskonto erfolgt unabhängig voneinander, so dass Sie nicht versuchen sollten, ein einzelnes Ereignis nach der Regel "Eine Anfrage - ein Handelsereignis" zu verfolgen. Wenn Sie genau feststellen wollen, was sich nach dem Trade-Ereignis geändert hat, müssen Sie alle Geschäfte, Positionen und Orders bei jedem Aufruf des Handlers OnTrade analysieren und mit dem Zustand vor dem Auftreten des Ereignisses vergleichen.
 
papaklass:
Ich habe speziell den Wert HistoryOrdersTotal() angefordert, der gleich 4 war, bevor ich die Aufträge geschlossen habe. Nach dem Abschluss von 8 Aufträgen hätte der Wert von HistoryOrdersTotal() gleich 12 (4 + 8) sein müssen, aber er war gleich 10. Ich habe eine Protokolldatei beigefügt, in der ähnliche Situationen mehr als einmal zu sehen sind. Ich habe auch den Expert Advisor beigefügt, mit dem dies erreicht wird. Machen Sie es selbst und Sie werden alles sehen.

Versuchen Sie, die Funktion zu ändern, was wird passieren?

void OnTrade(){
//---
   HistorySelect(dayStart,TimeTradeServer());      
   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",HistoryOrdersTotal(),"   ",TimeTradeServer()); 
}
     
 
Der HTML-Bericht des Testlaufs wird nicht immer in einer Datei gespeichert?!
 
zigan:
Der HTML-Bericht des Testlaufs wird nicht immer in einer Datei gespeichert!

Beschreiben Sie genauer. Unter welchen Umständen?

 
alexvd:

Beschreiben Sie genauer. Unter welchen Umständen?

Selten, etwa bei einem von 20-30 Testläufen - Registerkarte "Ergebnisse" öffnen

Klicken Sie auf XML-Bericht speichern - ich erhalte die Berichtsdatei, alles ist in Ordnung!

Klicken Sie auf "HTML-Bericht speichern" - das Fenster zum Speichern der Datei öffnet sich, bleibt eine Weile (kurz) mit leerem Fortschrittsbalken hängen, dann füllt sich der Fortschrittsbalken schnell und das Fenster schließt sich... Es wird jedoch keine Berichtsdatei erstellt!

Ich kann kein Muster angeben, wann genau dies geschieht.

 
Rosh:

Versuchen Sie, die Funktion zu ändern, was wird passieren?

Ich glaube nicht, dass das helfen würde. OnTrade kann prinzipiell nicht so funktionieren wie papaklass.

Der Schlüssel ist: "Sie müssen alle Trades, Positionen und Aufträge bei jedem Aufruf des OnTrade-Handlers analysieren und mit dem Zustand vor dem Aufruf vergleichen" . In dem von uns betrachteten Beispiel , mit ausstehenden Aufträgen, gilt dies nur für Aufträge in der Historie. Um den Verlust von Aufträgen zu vermeiden, würde ich den Code folgendermaßen ändern:

Führen Sie eine globale Variable int oldHistoryOrders ein ; und in Ontrade etwas wie dieses:

//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade(){
//---
   Print(__FUNCTION__);
   HistorySelect(0,TimeCurrent()+1);      
   int newHistoryOrders=HistoryOrdersTotal();
   if(oldHistoryOrders==newHistoryOrders) return;
   Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders);
   for(int i=oldHistoryOrders;i<newHistoryOrders;i++)
      Print("Order ",i," #",HistoryOrderGetTicket(i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
Dateien:
 
papaklass:

Das ist nicht die Art und Weise, wie ich mit OnTrade() arbeite, wie Sie es beschrieben haben. In meinem beigefügten Code habe ich alles entfernt und nur den Teil übrig gelassen, der den Fehler der Funktion hervorhebt. Ich habe praktisch keine Schleifen in meinem EA. Der EA behandelt ein einzelnes Symbol auf einem einzigen Tick. Deshalb brauche ich keine Fahrräder. Ich verarbeite alle Symbole innerhalb von 12 Ticks.

PS: OnTrade() informiert mich über ein Handelsereignis, und welches Ereignis eingetreten ist, wird durch meine Funktionen ohne Schleifen definiert.

Nun gut, ich habe mich nur auf Ihr Beispiel bezogen, das angeblich den Verlust von Aufträgen durch die OnTrade-Funktion beweist. OnTrade arbeitet asynchron und nicht nach Ticks, daher ist es egal, wie viele Symbole Sie in einem Tick verarbeiten. Sie haben eine Reihe von leeren Aufträgen, die auf einmal ablaufen, so dass Sie auf die Umgehung nicht verzichten können. Ich habe Ihren Code geändert, um zu zeigen, dass OnTrade nichts vermisst. Ich habe es sogar im Testgerät laufen lassen, und es scheint alles an seinem Platz zu sein. Die Ticker aller gelöschtenAufträge, die der Drucker von OnTrade gedruckt hat, sind im Protokoll enthalten. Haben Sie meine Version ausprobiert?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5