MT5 et la vitesse en action - page 88

 
fxsaber:

Un seul suffit.

int CTickSeriesCollection::IndexTickSeries(const string symbol)
  {
   const CTickSeries *obj=new CTickSeries(symbol==NULL || symbol=="" ? ::Symbol() : symbol);
   ...
   ...
   ...
  }

En outre, je vérifie la présence de "". Pour ma part, j'utilise toujours NULL lorsque j'appelle des méthodes pour le caractère courant.

 
Artyom Trishkin:

Votre code ne donnera pas d'accélération.

 
fxsaber:
Je trouve difficile d'expliquer des choses évidentes. Il est possible d'accélérer GetMarketWatchTick dans ce code.
const MqlTick GetMarketWatchTick( const string &Symb )
{
  MqlTick Tick = {0};

  SymbolInfoTick(Symb, Tick);

  return(Tick);
}

void OnTick()
{
  MqlTick Ticks[1];
  
  Ticks[0] = GetMarketWatchTick(_Symbol);
  ArrayPrint(Ticks);
}

Pensez-vous que même si _Symbol est passé comme paramètre Symbol, une chaîne de caractères sera passée à SymbolInfoTick()?

Je ne pense pas qu'il n'y ait pas de vérification dans les fonctions standard de l'égalité des chaînes de caractères avec le symbole courant, et de tels paramètres explicites commencent à vérifier "à toute vitesse" si un cache pour le symbole courant est à portée de main.

 

L'accélération a lieu au moment de la compilation, et non au moment de l'exécution.

Le compilateur effectue cette substitution :

SymbolInfoTick(_Symbol, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(NULL, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(::Symbol(), Tick) -> SymbolInfoTickInside(Tick);

Dans tous les autres cas, aucune substitution n'est effectuée.

 
fxsaber:

L'accélération a lieu au moment de la compilation, et non au moment de l'exécution.

Le compilateur effectue cette substitution :

Dans tous les autres cas, aucune substitution n'est effectuée.

Bien. C'est ce dont je parle - votre code n'accélérera PAS la fonction régulière pour le caractère NON courant. Elle n'accélérera pas non plus le caractère actuel.

Et la mienne ne le fera pas. Et ça n'a jamais été le cas. Je ne me faisais pas d'illusions non plus. Mais j'utilise toujours Symbol() ou NULL lorsque j'appelle des fonctions régulières si ma fonction reçoit NULL ou "". Cela appelle un code rapide de fonction régulière - où les données sont prises dans le cache pour le symbole actuel.
Si l'appel de ma fonction utilise Symbol() ou _Symbol, n'est-il PAS vérifié dans la fonction standard s'il coïncide avec le symbole actuel ? Exécutera-t-il vraiment le code avec des contrôles complets du symbole courant ? Je ne peux pas le croire...

 
Artyom Trishkin:

Bien. C'est ce dont je parle - votre code n'accélérera PAS la fonction régulière pour le caractère NON courant. Elle n'accélérera pas non plus le caractère actuel.

Peut-être que quelqu'un pourra vous l'expliquer plus clairement. Ça n'a pas marché pour moi.

 
fxsaber:

Peut-être quelqu'un pourra-t-il vous l'expliquer plus clairement. Je n'ai pas compris.

Qu'est-ce que tu fais comme sorcellerie pour accélérer les fonctions régulières ?

Vous utilisez la substitution de la valeur du caractère courant lorsque vous la passez à la fonction staff pour qu'elle utilise les données du cache pour le caractère courant. Cela n'accélère PAS la fonction normale, elle utilise sa vitesse pour le personnage actuel.

Vous NE POUVEZ PAS accélérer quelque chose dont vous n'avez pas accès à la source. Vous utilisez la technique standard pour appeler la fonction correctement. Mais je ne suis pas sûr, si Symbol est spécifié par une chaîne comme "EURUSD" quand on travaille sur EURUSD, c'est-à-dire qu'on utilise le symbole actuel, alors la fonction staff ne vérifiera pas si la chaîne "EURUSD" est égale à Symbol() et n'utilisera pas les données du cache, mais commencera à vérifier le symbole à pleine vitesse.

Alors, où se trouve l'accélération de la fonction régulière ? S'il en existe une, elle est plus qu'intéressante et utile.

 
fxsaber:

Est-ce que c'est la même chose dans MT4 ? Et dans MT5-Tester, comment ça se passe ?

Est-ce la même chose avec les CopyTicks ?

 
fxsaber:

Peut-être quelqu'un pourra-t-il vous l'expliquer plus clairement. Je n'ai pas compris.

Il est plus probable que vous n'ayez pas compris ma question. Je l'ai répété plusieurs fois (et cette question ne portait PAS sur "l'accélération de la fonction régulière").

 
Slava:

Si un paramètre normal de type chaîne de caractères est spécifié au lieu de Symbol(), _Symbol ou NULL, des vérifications complètes sont effectuées et les propriétés sont également interrogées.

Pour une raison quelconque, cette explication ne dit pas que si le paramètre de la chaîne est le même que le caractère courant, alors aucune vérification n'est faite par rapport au programme complet.