MT5 et la vitesse en action - page 87

 
fxsaber:

Plus vite.

Il fait la même chose - il renvoie la valeur de la fonction. Mais il effectue également des contrôles préalables.
À l'intérieur de la fonction elle-même, il y a également des contrôles pour la valeur passée du nom du symbole, et à partir de celui-ci - ou "si un simple paramètre de chaîne au lieu de Symbol(), _Symbol ou NULL, alors des contrôles pour le programme complet et plus de demande de propriété", ou utilise les valeurs du symbole actuel à partir du cache sans contrôles supplémentaires.
Pourquoi les refaire et continuer à prétendre que cela accélère la récupération des données ? Je ne comprends pas la logique d'un tel raisonnement.

D'ailleurs, je le fais toujours dans mes fonctions, mais je ne pense pas que cela accélère la récupération des données, mais plutôt que cela la ralentit à cause des vérifications de la valeur du nom du symbole passé dans ma fonction.

 
Artyom Trishkin:

Pourquoi les refaire, et pourtant vous prétendez que ça accélère les données ?

Vous avez vous-même cité l'explication.

 
Slava:

Les entrées Symbol(), _Symbol sont équivalentes à NULL (lorsque NULL est autorisé à la place du nom du symbole).

Est-ce que c'est la même chose dans MT4 ? Et dans le Testeur MT5, qu'en est-il ?

 
Artyom Trishkin:

Au fait, je fais toujours ça dans mes fonctions.

Montrez-moi s'il vous plaît.

 
fxsaber:

Vous avez vous-même cité l'explication.

Exactement - tout est fait à l'intérieur de la fonction régulière. Pourquoi le dupliquer à l'extérieur aussi ?

 
Artyom Trishkin:

Exactement - tout est fait à l'intérieur de la fonction régulière. Pourquoi le dupliquer à l'extérieur aussi ?

Alors vous n'avez pas compris l'explication. La vitesse des deux appels est différente.

void OnTick()
{
  static const string Symb = _Symbol;
  MqlTick Tick;
  
  SymbolInfoTick(_Symbol, Tick);
  SymbolInfoTick(Symb, Tick);  
}
 
fxsaber:

S'il vous plaît, montrez-moi.

Toutes les fonctions et méthodes où cela se fait avec moi ?

Il y en a trop.

 
Artyom Trishkin:

Toutes les fonctions et méthodes où je le fais ?

Un seul suffit.

 
fxsaber:

Alors vous n'avez pas compris l'explication. La vitesse des deux appels est différente.

Il semble que j'aie tout compris. Bien sûr, c'est différent. Alors comment avez-vous accéléré les choses ? Vous passez une valeur qui n'est pas le symbole courant à la fonction dans un seul cas - si elle est not_Symbol.

Ici, dans le cas où vous passez la valeur ci-dessus à la fonction, la fonction n'effectue pas de contrôles et prend la valeur du symbole actuel dans le cache.

Dans d'autres cas, il interroge les données du symbole spécifié avec un contrôle "programme complet" + sa présence dans l'aperçu du marché. Votre fonction "rapide" ne se débarrasse pas de ces contrôles lorsqu'elle demande des données à un symbole non natif. Alors où est l'accélération ?

bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Deux options seulement dans votre fonction lorsqu'elle est appelée if(SymbolInfoTickFast(Symbol(), tick_array)) {}

  1. obtenir les données du symbole actuel - appeler SymbolInfoTick avec le paramètre _Symbol (rapide)
  2. récupérer un autre symbole - appeler SymbolInfoTick avec un paramètre chaîne (lent)

Autre chose, si vous (dans votre habitude de définir tout ce qui bouge) créez une variable de type chaîne pour le symbole actuel, alors oui - vous devez faire des vérifications ici et remplacer votre substitution de macro par une variable prédéfinie, ou appeler Symbol()

 
Artyom Trishkin:

Comment l'avez-vous accéléré ?

C'est difficile pour moi d'expliquer l'évidence.
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);
}
Dans ce code, il est possible d'accélérer le GetMarketWatchTick.
Raison: