MT5 et la vitesse en action - page 56

 
Renat Akhtyamov:
Messieurs du prog...
Lisez d'abord ce qu'est l'allocation de mémoire dans l'ordinateur, puis comment et par quels moyens elle se fait, ensuite comment nettoyer et lire depuis et vers n'est pas difficile. Au moins, il est possible de faire des suggestions plus raisonnables aux développeurs.

Vous ne le sauriez pas sur mt4 ?
Vous utilisez vous-même l'offre d'achat prédéfinie ?
Dans mt5 pour lastructure entièrede MqlTick ils sont manquants pour une raison quelconque.
Appelez la fonction, remplissez la structure, et seulement ensuite obtenez la valeur.
Ou obtenir immédiatement la valeur, y a-t-il une différence ?

Ou bien ce n'est pas dans ma direction ?
Vous devriez au moins indiquer à qui vous écrivez ;))

 
Roman:

Des variables prédéfinies, pour le tick actuel, seraient probablement meilleures.

Les développeurs ont précédemment expliqué qu'il existe une limitation fondamentale à l'accès direct.

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

et en général, t1 n'est pas égal à t2. De plus, les valeurs des champs dans t1 et t2 peuvent se référer à des ticks différents.

 
A100:

Les développeurs ont précédemment expliqué qu'il existe une limitation fondamentale à l'accès direct.

et en général, t1 n'est pas égal à t2. De plus, les valeurs des champs dans t1 et t2 peuvent se référer à des ticks différents, même s'il s'agit de champs liés (ils devraient se référer au même tick).

Brr, quelle est la limite fondamentale ?
La structure dans votre exemple est inutile, elle n'a pas besoin d'être remplie.

Une valeur provient du socket et est écrite dans la variable _Ask, _Bid, etc. selon la structure.
_Ask != _Ask à votre avis ?
Une restriction survient si vous remplissez la structure, ce qui prend un certain temps.
Vous n'avez pas besoin de le remplir, mais donnez directement_Ask, _Bid etc.

 
Roman:

Brr, quelle est la limitation de principe ?
La structure de votre exemple est inutile ici, elle n'a pas besoin d'être remplie.

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

Vous pouvez le réécrire sans structure. Dans le cas général, la demande 1 n'est pas égale à la demande 2.

 
A100:

Vous pouvez également le réécrire sans la structure. Dans le cas général, la demande 1 n'est pas égale à la demande 2.

C'est-à-dire qu'il s'agit de demandes adressées à l'environnement non synchrone, et la réponse est reçue par l'état actuel de l'environnement ? Et OnTick attrape le tick actuel et fait fonctionner l'EA, mais en même temps les demandes par la structure de tick quand l'EA travaille peuvent obtenir des réponses des prochains ticks ?

 
A100:

Vous pouvez également le réécrire sans la structure. En général, la demande 1 n'est pas égale à la demande 2.

Ainsi, vous ne devez pas utiliser 100500 chiffres, où le dernier chiffre d'un nombre réel diffère de 0,0000000000000000000001
. Pour chaque variable, un chiffre différent, pour prix double maximum 8.

 
Renat Fatkhullin:

Sortie de la bêta 2652, d'importance :

  • amélioration des interruptions de compilation (de 22%)
  • un accès beaucoup plus rapide à SymbolInfoTick.

22% bon.

SymbolInfoTick - sur mon ordinateur personnel, j'ai remarqué à l'œil qu'il n'y avait pas d'alertes. Cependant, en filtrant ces alertes dans le journal, j'ai constaté qu'il y en avait beaucoup plus que les 2 650 émises au cours de la même période il y a vingt-quatre heures.

J'ai envoyé les deux journaux au PM.

 
Valeriy Yastremskiy:

C'est-à-dire qu'il s'agit de demandes adressées à un environnement non synchrone, et que la réponse est basée sur l'état actuel de l'environnement ? Et OnTick attrape le tick actuel et fait fonctionner l'EA, mais les demandes par la structure de tick quand l'EA travaille peuvent obtenir des réponses des prochains ticks ?

Oui.

 
Renat Fatkhullin:

Pour un travail de tic-tac en masse, mettez plus de mémoire.

4 Go (prix 20 €), c'est loin d'être suffisant en 2020 pour les analyses et les recherches.

Nous parlons d'un appel unique à CopyTicks. Cela permet d'effectuer un backtest virtuel sur ces ticks dans OnInit, puis de le poursuivre en temps réel, en n'alimentant que des ticks frais.

Comme compromis, je propose de libérer la mémoire dans le Terminal immédiatement après le CopyTicks appelé dans OnInit. Nous n'avons donc pas besoin d'introduire une fonction de refroidissement forcé pour les CopyTicks.

Pour l'instant, la version sommeil du refroidissement est très peu pratique. Mais j'ai montré plus haut comment cette béquille permet d'économiser de la mémoire.


Il s'avère maintenant que 20 Expert Advisors fonctionnent rapidement même sur un VPS lent. Mais leur mise en route pose un sérieux problème.


Voici un conseiller expert qui montre le problème.

// Демонстрация 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);
}


Résultat.

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% - bien.

SymbolInfoTick - sur l'ordinateur personnel, j'ai remarqué à l'œil qu'il n'y avait pas d'alertes. Cependant, en filtrant ces alertes dans le journal, j'ai constaté qu'il y en avait beaucoup plus que les 2 650 émises au cours de la même période il y a vingt-quatre heures.

J'ai envoyé les deux journaux au PM.

Accélération d'un facteur dix en cas d'accès parallèle massif.

Dans les autres cas, seule la mise à niveau du processeur, de la mémoire et du système d'exploitation est possible.

Raison: