Wodurch soll OnTradeTransaction() in mql4 ersetzt werden? - Seite 4

 

Erfassung aller Ereignisse pro Tick, Vergleich mit zuvor aufgezeichneten Daten.

Alles in Arrays.

Manchmal gibt es sogar Bremsen, wenn es sehr viele Zecken gibt. Deshalb habe ich eine Verzögerung zwischen den Prüfungen von 1 Sekunde festgelegt.

Es geht um die Überwachung vieler Positionen.

Und wenn Sie nur Positionen eines bestimmten Roboters überwachen, ist es natürlich einfacher.

 

Ich habe eine einfache Aufgabe, und es sind nicht mehr als zwei oder drei Dutzend Aufträge in Arbeit.

Und deshalb werde ich einen Timer verwenden, um zu überprüfen, was in OrdersTotal() steht, und bei jeder Iteration die Mengen in neue und alte Variablen mit Substitution schreiben, und wenn sich die Menge geändert hat - weitere Schritte unternehmen.

 
Aleksandr Volotko:

Ich habe eine einfache Aufgabe, und es sind nicht mehr als zwei oder drei Dutzend Aufträge in Arbeit.

Und deshalb werde ich einen Timer verwenden, um zu überprüfen, was in OrdersTotal() steht, und bei jeder Iteration die Mengen in neue und alte Variablen mit Substitution schreiben, und wenn sich die Menge geändert hat - weitere Schritte unternehmen.

Das Volumen ändert sich nicht, wenn ein schwebender Auftrag ausgelöst wird.

 
Artyom Trishkin:

Das Volumen wird sich nicht ändern, wenn der schwebende Auftrag ausgelöst wird.

Nun, ich filtere die Aufträge in der Schleife nach Typ und berechne das Volumen der offenen kumulativen Position.

Es macht mich traurig, dass ich Ressourcen und Zeit verschwenden muss, während man im MT5 einfach auf ein bestimmtes Ereignis warten kann, ohne Stress zu haben.

 
Aleksandr Volotko:

Nun, ich filtere die Aufträge in der Schleife nach Typ und berechne das Volumen der offenen kumulativen Position.

Es ist traurig, dass man auf diese Weise trainieren und Ressourcen verschwenden muss, während man in MT5 einfach auf ein bestimmtes Ereignis warten kann, ohne Stress zu haben.

Nun, mt5 ist um eine Größenordnung höher als mt4.

Dies gilt auch für andere Funktionen.

 
In meiner speziellen Situation, mit Transaktionen einmal pro Tag, und das Ereignis einmal pro Tag wird 60*60*24=86.400 zusätzliche Gesten begangen werden. Und es gibt noch keine andere Möglichkeit, dies zu tun.

 
Aleksandr Volotko:
In meiner speziellen Situation, wenn wir einmal am Tag handeln und einmal am Tag ein Ereignis bekommen, haben wir 60*60*24=86.400 zusätzliche Bemühungen. Und es gibt noch keinen anderen Weg.

Das hängt von der jeweiligen Aufgabe ab.

Wenn wir das Öffnen/Schließen (nicht teilweise) einer Position und das Setzen/Löschen eines Auftrags erfassen wollen, müssen wir die Liste nicht jedes Mal in einer Schleife durchgehen.

Wir können einfach die aktuellen und vorherigen Werte von OrdersTotal() überprüfen. Wenn wir einen Unterschied feststellen, haben wir ein Ereignis, und dann schauen wir uns den Wert an.

Ich habe alles mit der Hash-Summe der Ordnungs- und Positionseigenschaften gemacht. Sobald sich etwas verändert hat - wir haben ein Ereignis - dann schauen wir, was sich dort genau verändert hat.

Aber ich hatte eine Aufgabe, um alles und alle Änderungen zu verfolgen.

 
Aleksandr Volotko:
In meinem konkreten Fall, wenn die Geschäfte einmal pro Tag ausgeführt werden und ein Ereignis einmal pro Tag stattfindet, müssen wir 60*60*24=86.400 zusätzliche Anstrengungen unternehmen. Und es gibt keinen anderen Weg.

Es gibt auch diesen Ansatz (wenn das Erscheinen eines neuen Auftrags nur von der EA-Seite aus möglich ist):

  1. Beim Start des EA wird ein Array seiner Aufträge erzeugt, indem alle Aufträge auf der Liste umgangen werden.
  2. Bei jedem neuen Tick wird das Vorhandensein des Auftrags überprüft, indem

if (OrderSelect(nTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)

Wenn der Auftrag vorhanden ist, aktualisieren Sie seine Daten, falls erforderlich. Dies ist der Fall, wenn eine Überwachung von SL/TP/Volumen erforderlich ist. Wenn es nicht erforderlich ist, machen wir gar nichts anderes.

Wenn der Auftrag in der Liste der geschlossenen Aufträge gefunden wird (OrderCloseTime() > 0), dann wird er aus dem Array gelöscht. Das Array wird erst wieder aufgefüllt, wenn der Auftrag von einem EA geöffnet wird.

So müssen wir nicht bei jedem Tick die gesamte Liste der Aufträge durchgehen. Operationen sind nur mit einem eigenen Array möglich.

 

Ich werde versuchen, die OrdersTotal()-Werte zu vergleichen (dank @Artyom Trishkin), das sollte reichen. Ich werde keine Teilverschlüsse haben.

Während der Initialisierung werde ich dem alten Auftrag den Wert -1 zuweisen, so dass beim Start immer die vollständige Prüfung durchgeführt wird, unabhängig vom Vorhandensein von Aufträgen auf dem Markt.

Danach erscheint entweder ein neuer Auftrag (Ereignis) oder der alte wird gelöscht (Ereignis), und selbst das Symbol spielt keine Rolle - wir können alles komplett überprüfen, es ist immer noch um ein Vielfaches weniger häufig als endloses Herumfummeln.

 
Aleksandr Volotko:

Ich werde versuchen, die OrdersTotal()-Werte zu vergleichen (dank @Artyom Trishkin), das sollte reichen. Ich werde keine Teilverschlüsse haben.

Während der Initialisierung werde ich dem alten Auftrag den Wert -1 zuweisen, so dass beim Start immer die vollständige Prüfung durchgeführt wird, unabhängig vom Vorhandensein von Aufträgen auf dem Markt.

Danach erscheint entweder die neue Bestellung (Ereignis) oder die alte wird gelöscht (Ereignis), und selbst das Symbol spielt keine Rolle - wir können eine vollständige Überprüfung aller Bestellungen durchführen, das ist immer noch um ein Vielfaches weniger häufig als endloses Herumstochern.

Aber es muss vorsichtig gehandhabt werden, heute stand ich vor dem Problem, dass eine Position geschlossen und die andere auf einer anderen eröffnet wurde, und zwar fast zur gleichen Zeit zwischen den Ticks.

Am Ende blieb OrdersTotal() 8. Die Logik des Expert Advisors ist durcheinander geraten - er hat die neuen Daten nicht neu berechnet