MT5 und Geschwindigkeit in Aktion - Seite 56

 
Renat Akhtyamov:
Die Herren der Prog...
Lesen Sie zunächst über die Zuweisung von Speicherplatz im Computer, dann wie und mit welchen Mitteln dies geschieht, und dann, wie man ihn säubert und wie man ihn ausliest. Zumindest sind vernünftigere Vorschläge an die Entwickler möglich

Sie würden nicht wissen, über sie auf mt4 ?
Sie verwenden das vordefinierte Ask Bid selbst?
In mt5 für die gesamteMqlTick-Struktur sind sie aus irgendeinem Grund fehlen.
Rufen Sie die Funktion auf, füllen Sie die Struktur, und holen Sie erst dann den Wert ab.
Oder sofort den Wert erhalten, ist das ein Unterschied?

Oder liegt sie nicht in meiner Richtung?
Sie sollten zumindest angeben, an wen Sie schreiben ))

 
Roman:

Vordefinierte Variablen für den aktuellen Tick wären wahrscheinlich besser.

Die Entwickler haben bereits erklärt, dass es eine grundlegende Einschränkung für den direkten Zugang gibt

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

und im Allgemeinen ist t1 nicht gleich t2. Außerdem können sich die Feldwerte in t1 und t2 auf unterschiedliche Ticks beziehen

 
A100:

Die Entwickler haben bereits erklärt, dass es eine grundlegende Einschränkung für den direkten Zugang gibt

und im Allgemeinen ist t1 nicht gleich t2. Außerdem können sich die Feldwerte in t1 und t2 auf unterschiedliche Ticks beziehen, obwohl sie miteinander verknüpft sind (sie sollten sich auf denselben Tick beziehen).

Brr, was ist die grundlegende Einschränkung?
Die Struktur in Ihrem Beispiel ist unnötig, sie muss nicht ausgefüllt werden.

Ein Wert kam vom Socket und wurde entsprechend der Struktur in die Variablen _Ask, _Bid, etc. geschrieben.
_Ask != _Ask Ihrer Meinung nach?
Eine Einschränkung entsteht, wenn Sie die Struktur füllen, was einige Zeit in Anspruch nimmt.
Sie brauchen es nicht auszufüllen, sondern geben direkt_Ask, _Bid usw. an.

 
Roman:

Brr, was ist die grundsätzliche Einschränkung?
Die Struktur in Ihrem Beispiel ist hier unnötig, sie muss nicht ausgefüllt werden.

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

Sie können ihn ohne Struktur umschreiben. Im allgemeinen Fall ist ask1 nicht gleich ask2

 
A100:

Sie können ihn auch ohne die Struktur umschreiben. Im allgemeinen Fall ist ask1 nicht gleich ask2

D.h. es handelt sich um Anfragen an die nicht-synchrone Umgebung, und die Antwort wird vom aktuellen Zustand der Umgebung empfangen? Und OnTick ist fangen die aktuelle Tick und arbeiten die EA, aber zur gleichen Zeit Anfragen durch die Tick-Struktur, wenn die EA arbeitet, kann Antworten aus den nächsten Ticks erhalten?

 
A100:

Sie können ihn auch ohne die Struktur umschreiben. Im Allgemeinen ist ask1 nicht gleich ask2

So müssen Sie nicht 100500 Ziffern verwenden, wobei die letzte Ziffer einer reellen Zahl 0,0000000000000000000001
Für jede Variable eine andere Ziffer, für Preis double maximal 8.

 
Renat Fatkhullin:

Freigegebene Beta 2652, von Bedeutung:

  • verbesserte Kompilierunterbrechungen (um 22%)
  • Deutlich schnellerer Zugriff auf SymbolInfoTick.

22% gut.

SymbolInfoTick - auf meinem Heimcomputer habe ich mit bloßem Auge festgestellt, dass es keine Warnungen gibt. Ich habe jedoch diese Meldungen im Protokoll gefiltert und festgestellt, dass es viel mehr als die 2650 waren, die im gleichen Zeitraum vor vierundzwanzig Stunden ausgegeben wurden.

Ich habe beide Protokolle an die PM geschickt.

 
Valeriy Yastremskiy:

D.h. es handelt sich um Anfragen an eine nicht-synchrone Umgebung, und die Antwort basiert auf dem aktuellen Zustand der Umgebung? Und OnTick ist fangen die aktuelle Tick und arbeiten die EA, aber die Anfragen durch die Tick-Struktur, wenn die EA arbeitet aus den nächsten Ticks Antworten erhalten kann?

Ja.

 
Renat Fatkhullin:

Für die Arbeit mit Massentickern sollten Sie mehr Speicherplatz einrichten.

4 GB (Preis 20 €) sind im Jahr 2020 bei weitem nicht mehr ausreichend, wenn es um Analysen und Forschung geht.

Es handelt sich um einen einmaligen Aufruf von CopyTicks. Dies geschieht, um einen virtuellen Backtest mit diesen Ticks in OnInit durchzuführen und ihn dann in Echtzeit fortzusetzen, wobei nur frische Ticks eingespeist werden.

Als Kompromiss schlage ich vor, den Speicher im Terminal unmittelbar nach dem Aufruf von CopyTicks in OnInit freizugeben. Dann müssen wir keine Zwangsabkühlungsfunktion für CopyTicks einführen.

Momentan ist die Sleep-Version der Kühlung sehr hinderlich. Aber ich habe oben gezeigt, wie diese Krücke Speicherplatz spart.


Jetzt stellt sich heraus, dass 20 Expert Advisors auch auf langsamen VPS schnell laufen. Aber sie zu starten ist ein ernsthaftes Problem.


Hier ist ein Expert Advisor, der das Problem zeigt.

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.06.01'; // С какой даты анализировать историю

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


Ergebnis.

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22% - gut.

SymbolInfoTick - auf dem Heimcomputer habe ich mit bloßem Auge festgestellt, dass es keine Warnmeldungen gab. Ich habe jedoch diese Meldungen im Protokoll gefiltert und festgestellt, dass es viel mehr als die 2650 waren, die im gleichen Zeitraum vor vierundzwanzig Stunden ausgegeben wurden.

Ich habe beide Protokolle an die PM geschickt.

Beschleunigung um das Zehnfache bei massenhaftem parallelem Zugriff.

In anderen Fällen werden nur Prozessor, Speicher und Betriebssystem aufgerüstet.

Grund der Beschwerde: