MT5 und Geschwindigkeit in Aktion - Seite 7

 
fxsaber:

Du verstehst gar nichts. Wenn wir zurückkehren, geben wir die On-Funktionen der erzeugten Warteschlange ein. Dadurch kann eine Pause entstehen, die verhindert, dass der erste OrderSend den korrekten zweiten sendet.

Worin besteht die Pause/Verzögerung? Beim Kopieren von 3 Strukturen?

OnTradeTransaction( параметры )
{
        поместить параметры в очередь
        OnMain();
}

Sie schlagen vor, die Warteschlange zu akkumulieren, indem Sie alle On-Funktionen nach der Rückkehr speichern und auf die On-Funktion warten, die besagt, dass der erste OrderSend beendet ist. Und dann erst den zweiten OrderSend senden.

Es ist nicht notwendig, alle Ereignisse zu kumulieren. Warten Sie nicht darauf, dass das nächste Ereignis kopiert wird - Sie können Ereignisse vor der Rückkehr verarbeiten und den zweiten OrderSend senden, sobald die Voraussetzungen dafür erfüllt sind

Sie wissen auch nicht, dass die Take-Position während des ersten OrderSend ausgeführt werden kann, aber ihre OnTradeTransaction wird später in der Warteschlange sein (in derselben Mikrosekunde, aber später) als die endgültige OnTradeTransaction aus dem ersten OrderSend.

Und wie hilft es Ihnen in einer solchen Situation?

bool HandleNextEvent(ENUM_EVENT_TYPE);

Es wird sowohl hier als auch dort das letzte sein

 
fxsaber:

Du verstehst gar nichts. Wenn wir zurückkehren, geben wir die On-Funktionen der erzeugten Warteschlange ein. Dadurch kann eine Pause entstehen, die verhindert, dass der erste OrderSend den korrekten zweiten unmittelbar nach dem ersten sendet.

Sie schlagen vor, die Warteschlange zu akkumulieren, indem Sie alle On-Funktionen nach der Rückkehr speichern und auf die On-Funktion warten, in der eine Meldung über das Ende des ersten OrderSend enthalten ist. Und dann erst den zweiten OrderSend senden.

Gleichzeitig verstehen Sie nicht, dass die Take-Position während des ersten OrderSend ausgeführt werden kann, aber ihre OnTradeTransaction wird in der Warteschlange später sein (in der gleichen Mikrosekunde, aber später) als die abschließende OnTradeTransaction vom ersten OrderSend.

Es gibt keine Warteschlange. Das neue Ereignis wird nach dem aktuellen Ereignis verarbeitet, und alle Ereignisse, die in diesem Zeitraum aufgetreten sind, werden ignoriert.

 
Die Warteschlange bzw. der Stapel wird von Ihnen gebildet, MQ tut dies nicht.
 

Meiner Meinung nach wäre die Lösung des Problems die Möglichkeit, einen Auftrag zu "abonnieren". Das heißt, dass das Terminal ein Ereignis erzeugt, wenn eine Transaktion für einen Auftrag stattfindet.

Aber das sollte von den Entwicklern umgesetzt werden, nicht von uns. Alle unsere Lösungen werden auf die eine oder andere Weise auf die Geschichte der Geschäfte zurückgehen. Ich habe nicht so eine Mikrosekunden-Kritik, aber es ist wirklich

Aber es ist wirklich lästig, komplexe Bikes zu schreiben, um herauszufinden, ob ein Geschäft bestanden oder nicht bestanden ist, ob Levels ausgelöst wurden oder ob jemand eine Position im Terminal korrigiert hat.

Obwohl es eine einfache Sache zu sein scheint - ein Ereignis bei einem Handel mit einer Position - und alles wäre viel einfacher.

 
Maksim Emeliashin:

Aber es liegt an den Entwicklern, dies umzusetzen, nicht an uns.

Die Entwickler sollten nur die Werkzeuge bereitstellen. MQL ist im Wesentlichen eine Low-Level-Programmiersprache (genau wie C++). Sie verwenden es nicht für Aufgaben, sondern für Berechnungen. Und Sie treffen alle Entscheidungen auf höchster Ebene selbst. Ihnen fehlen vielleicht Werkzeuge, aber keine fertigen Lösungen

 
A100:

Wie lang ist die Pause? Beim Kopieren von 3 Strukturen?

Bei der Bearbeitung einer Warteschlange von verschiedenen Ereignissen.

Wie würde es Ihnen in einer solchen Situation helfen?

Es wird der letzte hier oder dort sein.

Ich werde mich über den Abschluss der Aufnahme informieren.

 
Алексей Тарабанов:

Es gibt keine Warteschlange. Das neue Ereignis wird nach dem aktuellen Ereignis verarbeitet und alle Ereignisse, die in diesem Zeitraum aufgetreten sind, werden ignoriert.

Inkompetent.

 
fxsaber:

In der Warteschlange befinden sich verschiedene Ereignisse in Bearbeitung.

Ich werde auf die Nähe zum Abschlag achten.

Bleiben wir bei der Tatsache stehen, dass ich wirklich (ohne Code mitHandleNextEvent ) elementare Dinge nicht verstehe.

Als letzte Anmerkung, der Unterschied zwischen der vorgeschlagenenHandleNextEvent und was ich schrieb ist, dass es über Rekursion und ich habe es über eine Schleife. Außerdem wird die Warteschlange zu Beginn gebildet und Sie können sie verwalten ... Sie können einige Ereignisse auf einmal bearbeiten und sie auf einen anderen Zeitpunkt verschieben, Sie haben völlige Freiheit.

 
Was ist der Grund dafür, dass dieser EA nicht alarmiert?
const MqlTick GetMarketWatchTick( void )
{
  MqlTick Tick = {0};
  
  ::SymbolInfoTick(_Symbol, Tick);
  
  return(Tick);
}

const MqlTick GetLastHistoryTick()
{
  MqlTick Tick[1];
  
  ::CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1);
  
  return(Tick[0]);
}

void OnTick()
{
  if (GetMarketWatchTick().time_msc > GetLastHistoryTick().time_msc) // Тик из Обзора рынка свежее, чем последний тик из истории.
    Alert("Hello!");
}


Zur gleichen Zeit, den gleichen Scheck, genäht in den Kampf Handel Berater auf dem gleichen Terminal, Alert. Was könnte der Grund dafür sein?

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

Anton, 2020.05.29 16:21

Skript zum Testen der maximalen und durchschnittlichen Zeit:

2474.

        Last tick time. Selected orders: 0; max time: 0.187 ms; avr time: 0.022 ms; 100000 iterations
        Last 3 days. Selected orders: 1956; max time: 1.832 ms; avr time: 0.301 ms; 100000 iterations
        Orders total: 56561

Es ist sehr gut geworden. Wenn Sie sie geändert haben - Danke. Ich werde die Leistung im Kampfmodus im Auge behalten.


PS Im Kampfmodus verzögert sich der Handel fast immer (nur bei Ausgaben von mehr als 5 Millisekunden).

2020.06.03 13:57:27.895 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 14 ms.
2020.06.03 13:57:47.780 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 5 ms.
2020.06.03 14:03:49.844 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 9 ms.
2020.06.03 14:03:51.063 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.06.03 14:03:55.115 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.
2020.06.03 14:03:56.935 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 6 ms.

Ansonsten scheint sie viel besser zu sein als die 2470.