MT5 und Geschwindigkeit in Aktion - Seite 23

 
Renat Fatkhullin:

Für den Fall, dass jemand es nicht versteht, es ist die fxsaber-Bibliothek, die das Bremsen verursacht, wenn sie im Code eines anderen angewendet wird.

Anstatt ausdrücklich darauf hinzuweisen, fing er an, das Spiel mit dem Bremsen von Plattformen und dem Ausrutschen selbstmörderischer Beispiele zu spielen. Und als sich die Gelegenheit bot, zur wahren Ursache vorzudringen und die Angelegenheit zu bereinigen, hat er sie nicht genutzt.

Aus Gründen der lokalen Optimierung wurde der Verlaufscache für die Hauptanwendung vergiftet.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

fxsaber, 2020.09.02 00:02

Es gab einen sauberen MQL5-Code, der von vielen reproduziert werden konnte. Die Chronologie des Threads erste Studie, anstatt spielen Verschwörungstheorie, dass jemand braucht Sie so sehr, dass er bereit ist, seine Zeit auf Sie für Schlammschlacht zu verbringen.

Du machst einen tollen Job als Truthahn. Es gab keine Diskussion über Bibliotheken hier in diesem Thread, da sie nicht konstruktiv ist.

Der Punkt ist, dass jemand, der es wagt, gemeinsam genutzte Bibliotheken zu verwenden, bei denen der from-input-Parameter nicht übereinstimmt, gebremst werden wird. Dies wird in der Dokumentation nirgends erwähnt. Wenigstens wurde etwas davon mit einer Zange aus Ihnen herausgeholt. Und als das erledigt war, beschuldigten sie Sie des Betrugs.


Diese Funktion von MQL sollte in die Dokumentation und den Funktionszweig aufgenommen werden. Führen Sie die sauberen MQL5-Skripte aus diesem Zweig auf den Builds aus, die dem Datum ihrer Erstellung entsprechen. Offenbar wurden so viele Korrekturen blindlings vorgenommen, nur für den Fall der Fälle.

 
fxsaber:

Sie machen einen großartigen Job als Indie. Hier im Thread wurden keine Bibliotheken ausdrücklich erwähnt, weil das nicht konstruktiv ist.

Denn Sie haben Ihr Bestes getan, um nicht über Ihre Bibliotheken zu plaudern. In Anwesenheit dieser Bibliotheken. Mit dem ständigen Einwand "meins ist schneller". Sie haben also die Selbstschussanlage geschickt verdeckt, indem Sie darauf hingewiesen haben, wie langsam sie ist.


Der Punkt ist, dass es zu Verzögerungen kommt, wenn man es wagt, Bibliotheken zusammen zu verwenden, bei denen der "from-input"-Parameter nicht derselbe ist. Dies wird in der Dokumentation nirgends erwähnt. Wenigstens wurde Ihnen mit der Kneifzange etwas zu diesem Thema entlockt. Und als das erledigt war, beschuldigten sie Sie des Betrugs.


Diese Funktion von MQL sollte in die Dokumentation und den Funktionszweig aufgenommen werden. Führen Sie die sauberen MQL5-Skripte aus diesem Zweig auf den Builds aus, die dem Datum ihrer Erstellung entsprechen. Offenbar wurden so viele Korrekturen blindlings vorgenommen, nur für den Fall der Fälle.

In der HistorySelect-Dokumentation ist eindeutig festgelegt:

Die Funktion HistorySelect() erstellt eine Liste von Aufträgen und eine Liste von Geschäften im Programm mql5, um die Elemente der Liste mit den entsprechenden Funktionen weiter zu referenzieren. Die Größe der Geschäftsliste kann mit dem Befehl HistoryDealsTotal() ermittelt werden, und die Größe der Auftragsliste in der Historie kann mit dem Befehl HistoryOrdersTotal() ermittelt werden. Die Aufzählung der Elemente in der Liste der Bestellungen erfolgt am besten mit dem Befehl HistoryOrderGetTicket(), für die Elemente der Geschäftsliste ist der Befehl HistoryDealGetTicket() geeignet.

Nach der Verwendung der Funktion HistoryOrderSelect() wird die Liste der Bestellungen in der Historie, die dem mql5-Programm zur Verfügung steht, zurückgesetzt und neu mit der Bestellung gefüllt, wenn die Suche der Bestellung nach Ticket erfolgreich abgeschlossen wurde. Gleiches gilt für die Liste der Angebote, die für das mql5-Programm zur Verfügung stehen - sie wird mit der Funktion HistoryDealSelect() zurückgesetzt und neu gefüllt, wenn ein Angebot erfolgreich über die Ticketnummer bezogen wird.


Wenn Sie mit großen Volumina arbeiten (und Sie haben nicht umsonst Tausende und Zehntausende von Geschäften in der Historie gezeigt), die einen atomaren/Snapshot-Zugriff erfordern, müssen Sie deren Kosten verstehen.

Zumal ich die technischen Details dieser Caches in diesem Thread sehr ausführlich erläutert habe.


Haben Sie umsonst versucht, jede Probe zu randomisieren und den Cache so weit wie möglich zu vergiften? Ist um Ihrer Position willen ein Selbstschuss in Ordnung?

 
Renat Fatkhullin:

Weil Sie alles getan haben, um Ihre Bibliotheken geheim zu halten. Deshalb haben Sie die selbstverschuldeten Fehler geschickt überdeckt, indem Sie damit prahlten, "wie langsam es ist".

99 % der Fehler werden auf diese Weise gefunden. Zunächst ist das seltsame Verhalten im großen Code zu finden. Dann findet die Lokalisierung die Ursache. Ich habe mir mehr Sorgen um die Bremsen gemacht.

Handelsfunktionen. Die Probleme sind fast überall.

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...
Der Mann beschloss zu helfen und führte einen sauberen MQL5-Code auf seinem Rechner aus. Eine kleine Auswahl oben. Lesen Sie die Namen der Funktionen oben.


In der HistorySelect-Dokumentation wird ausdrücklich darauf hingewiesen:

Die Funktion HistorySelect() erstellt eine Liste von Aufträgen und eine Liste von Geschäften im Programm mql5, um dann mit den entsprechenden Funktionen auf die Elemente in der Liste zuzugreifen. Die Größe der Geschäftsliste kann mit dem Befehl HistoryDealsTotal() ermittelt werden, und die Größe der Auftragsliste in der Historie kann mit dem Befehl HistoryOrdersTotal() ermittelt werden. Die Aufzählung der Elemente in der Liste der Bestellungen erfolgt am besten mit dem Befehl HistoryOrderGetTicket(), für die Elemente der Geschäftsliste ist der Befehl HistoryDealGetTicket() geeignet.

Nach der Verwendung der Funktion HistoryOrderSelect() wird die Liste der Bestellungen in der Historie, die dem mql5-Programm zur Verfügung steht, zurückgesetzt und neu mit der Bestellung gefüllt, wenn die Suche der Bestellung nach Ticket erfolgreich abgeschlossen wurde. Gleiches gilt für die Liste der Angebote, die für das mql5-Programm zur Verfügung stehen - sie wird mit der Funktion HistoryDealSelect() zurückgesetzt und neu gefüllt, wenn ein Angebot erfolgreich über die Ticketnummer bezogen wurde.

Ich frage mich, wer in diesem Text etwas zwischen den Zeilen gesehen hat? Ich persönlich habe es so verstanden (vor diesem Zweig), dass HistoryDealSelect und HistoryOrderSelect so geschrieben werden müssen.

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

Andernfalls sind Verzögerungen vorprogrammiert.

Wenn Sie mit großen Volumina arbeiten, die einen atomaren/Snapshot-Zugriff erfordern, müssen Sie sich über deren Kosten im Klaren sein.

Dies gilt umso mehr, als ich die technischen Einzelheiten dieser Caches in diesem Thread ausführlich erläutert habe.

Ich habe die notwendigen Informationen in diesem Thread gesammelt.

 
Renat Fatkhullin:

Haben Sie umsonst versucht, jede Probe zu randomisieren und den Cache so weit wie möglich zu vergiften? Ist um Ihrer Position willen ein Selbstschuss in Ordnung?

Sie können alles chronologisch in diesem Thread sehen. Das Problem wurde ursprünglich ohne Randomisierung dargestellt.

Dieser Thread ist ein großartiger Beweis dafür, wie man die Worte des Gegners verdrehen kann. Alle Quellen und ihre Ergebnisse werden hier gespeichert.

 

Warum kann das Terminal nicht einfach den Zwischenspeicher vergrößern, wenn der vollständige Verlauf erneut angefordert wird, und den fehlenden Bereich abrufen und zwischenspeichern? Damit scheint das Problem gelöst zu sein. Schließlich werden bei der Anforderung von Barren/Fahrscheinen fehlende Datenpakete zurückgegeben, so dass es einen Mechanismus dafür gibt.

 
Aleksey Vyazmikin:

Warum kann das Terminal nicht einfach den Cache erhöhen, wenn der vollständige Verlauf erneut angefordert wird, und den fehlenden Bereich abrufen und zwischenspeichern?

Dies ist bereits geschehen.

Wenn aber zwischen HistorySelect( 0, INT_MAX ) AufrufenHistorySelect( andere_Zeit, ... ), wird der Cache ab der anderen_Zeit neu aufgebaut und die nächsteHistorySelect( 0,... ) Anfrage führt zu einem neuen Cacheaufbau (wird langsamer sein).

 
Andrey Khatimlianskii:

Dies ist bereits geschehen.

Wenn jedoch zwischen den Aufrufen von HistorySelect( 0, INT_MAX )HistorySelect( andere_Zeit, ... ) aufgerufen wird, wird der Cache ab der anderen_Zeit neu aufgebaut, und die nächsteHistorySelect( 0,... )-Anforderung führt zu einem neuen Cache-Aufbau (der langsamer ist).

Wenn Sie es getan haben, ist es gut, die einzige Frage ist dann die nach der Bequemlichkeit der Arbeit mit den empfangenen Daten, vorausgesetzt, der Cache ist aufgebaut.

Ich habe die Handelsoperationen nicht so genau verstanden, aber wenn sich der Abfragebereich ändert, gibt es dann keine Möglichkeit, Daten innerhalb der Historie schnell und ohne rohe Gewalt zu suchen?

 
Aleksey Vyazmikin:

Ich bin nicht so tief in den Handel, aber wenn der Bereich der Abfrage ändert, dann gibt es keine Möglichkeit, schnell für Daten innerhalb der Geschichte ohne eine vollständige Aufzählung zu suchen?

Was nützt Ihnen dieses Wissen, wenn Sie es nicht nutzen?

Kein praktisches Problem = keine Frage.

 
Renat Fatkhullin:

OrderExist und PositionExist sind spezielle optimierte Funktionen, die das stupide Durchlaufen aller Aufträge oder Positionen auf der Suche nach Einträgen nach Symbol, Transaktionsart und Medzhik vermeiden.

Das Ergebnis ist eine Reihe von Tickets.


Mit diesen Funktionen können die Programme eine Menge Geld sparen. Vor allem, wenn offene Positionen und Aufträge massenhaft, ständig und wiederholt in Überschreitungsschleifen aufgerufen werden.

Wir werden in Zukunft effektivere Funktionen für den Zugriff auf umfangreiche Handelsdaten einführen.

Darüber hinaus wird die Sprache erheblich gestärkt und vereinfacht und mit leistungsfähigeren Funktionen ausgestattet.

"OrderExist und PositionExist" - nicht in der Dokumentation gefunden, wo kann ich sie nachlesen?
 
HimOrik:
"OrderExist und PositionExist" - nicht in der Dokumentation gefunden, wo kann man sie nachlesen?

Höchstwahrscheinlich nach der nächsten Version (jetzt im Beta-Stadium)