Questions des débutants MQL5 MT5 MetaTrader 5 - page 1468

 

Je n'arrive pas à comprendre ce que signifient rates_total et prev_calculated au final.

La documentation dit : Le premier paramètre rates_total contient le nombre de barres disponibles pour l'indicateur pour le calcul, et correspond au nombre de barres disponibles sur le graphique.

Par exemple MA5, moyenne de 5 barres, définie pour afficher 100 barres. Alors l'indicateur calculera de la 104ème à la 100ème barre et commencera à tracer la ligne à partir de la 100ème barre. Alors taux_publicité5, ou 100, ou 104 ?

 
Novichokkk nombre de barres disponibles pour l'indicateur pour le calcul et correspond au nombre de barres disponibles sur le graphique.

Par exemple MA5, moyenne de 5 barres, définie pour afficher 100 barres. Alors l'indicateur calculera de la 104ème à la 100ème barre et commencera à tracer la ligne à partir de la 100ème barre. Alors taux_publicité5, ou 100, ou 104 ?

Taux_total est le nombre de barres du graphique disponibles pour le calcul. En d'autres termes, c'est Bars().

prev_calculated est le nombre de barres que l'indicateur a calculé lors de l'appel précédent de OnCalculate(). Il est nécessaire pour organiser des calculs économiques.

Si prev_calculated est égal à rates_total, cela signifie que rien n'a encore été calculé et qu'il est nécessaire d'initialiser les tampons de l'indicateur et d'effectuer un calcul complet de tout l'historique.

En général, on peut utiliser la construction suivante :

//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      // Присваиваем limit значение количества доступных баров-1
      limit=rates_total-1;
      // Вот тут нужно инициализировать все буферы пустыми значениями
      ArrayInitialize(Buffer0,EMPTY_VALUE);
      ArrayInitialize(Buffer1,0);
      ArrayInitialize(Buffer2,clrNONE);
      // ... и т.д.
     }
//--- Экономный просчёт индикатора
   for(int i=limit;i>=0;i--)
     {
      Buffer0[i]=(/*что-то там*/);
     }
 
Artyom Trishkin #:

rates_total est le nombre de barres du graphique disponibles pour le calcul. En d'autres termes, c'est Bars().

prev_calculated est le nombre de barres que l'indicateur a calculé lors de l'appel précédent OnCalculate(). Il est nécessaire d'organiser des calculs économiques.

Si prev_calculated est égal à rates_total, cela signifie que rien n'a encore été calculé et qu'il est nécessaire d'initialiser les tampons de l'indicateur et d'effectuer un calcul complet de tout l'historique.

En général, on peut utiliser la construction suivante :

Pourquoi ne pas écrire à la place de rates_total - Bars()?

int limit=Bars()-prev_calculated;

Désolé, bien sûr, d'être un lamer. Je suis en train de fouiller dans la documentation, plusieurs livres sur MKL5. Toutes les nuances ne sont pas expliquées. Pas dans les livres non plus. Par ailleurs, le langage utilisé dans les livres est clair. Comment les constructions sont assemblées - caput, what from where and for what.... Je commence à m'y intéresser. Beaucoup de vérifications et de doubles vérifications. J'ai ouvert un simple code mashki, et il y a tellement de lignes. Et il m'a semblé qu'il suffisait de décharger un tableau (ou d'y accéder), de calculer pour une valeur de tel indice dans le tableau à tel autre, et de passer par une fenêtre coulissante avec ces calculs sur le tableau en indiquant par des indices d'où à où. Oui pour afficher la ligne à l'écran. Non.
 
Novichokkk #:

Pourquoi ne pas écrire Bars() au lieu de rates_total ?

Désolé, bien sûr, d'être un lamer. Je suis en train de fouiller dans la documentation, plusieurs livres sur MKL5. Toutes les nuances ne sont pas expliquées. Dans les livres aussi. Par ailleurs, le langage utilisé dans les livres est clair. Comment les constructions sont assemblées - caput, what from where and for what.... Je commence à m'y intéresser. Beaucoup de vérifications et de doubles vérifications. J'ai ouvert un simple code mashki, et il y a tellement de lignes. Et il m'a semblé qu'il suffisait de décharger un tableau (ou d'y accéder), de calculer pour une valeur de tel indice dans le tableau à tel autre, et de passer par une fenêtre coulissante avec ces calculs sur le tableau en indiquant par des indices d'où à où. Oui pour afficher la ligne à l'écran. Et non.

Vous pouvez également utiliser une telle construction. Mais pourquoi ? Quand il y a déjà des variables prédéfinies dans les paramètres du handler...

Bars() doit être utilisé lorsque vous en avez vraiment besoin - pour obtenir le nombre de barres disponibles pour un autre symbole/horodatage.

 
Artyom Trishkin #:

Vous pouvez également utiliser ce modèle. Mais pourquoi ? Lorsqu'il existe déjà des variables prédéfinies dans les paramètres du gestionnaire...

Bars() doit être utilisé lorsque c'est vraiment nécessaire - pour obtenir le nombre de barres disponibles pour un autre symbole ou une autre période.

Artyom, il arrive que l'on soit fatigué et que l'on fasse des erreurs. Ne le prenez pas comme une critique, mais rates_total - Bars() sera toujours zéro...

En général, il est très difficile d'expliquer à ce personnage. Une victime de l'USE...

 
Alexey Viktorov #:

Artyom, il arrive à tout le monde d'être fatigué et de faire des erreurs. Ne le prenez pas comme une critique, mais rates_total - Bars() sera toujours zéro...

En général, il est très difficile d'expliquer à ce personnage. Une victime de l'USE...

Oui, vous avez raison. Je ne pensais pas que quelqu'un déciderait de calculer ainsi. J'ai vu du coin de l'œil Bars dans le calcul et j'ai pensé que c'était à la place de rates_total.

Cela arrive, merci.

 
Artyom Trishkin #:
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      // Присваиваем limit значение количества доступных баров-1
      limit=rates_total-1;
      // Вот тут нужно инициализировать все буферы пустыми значениями
      ArrayInitialize(Buffer0,EMPTY_VALUE);
      ArrayInitialize(Buffer1,0);
      ArrayInitialize(Buffer2,clrNONE);
      // ... и т.д.
     }
//--- Экономный просчёт индикатора
   for(int i=limit;i>=0;i--)
     {
      Buffer0[i]=(/*что-то там*/);
     }

Je comprends que vous vouliez aider la personne, mais apparemment, par erreur, vous n'avez fait que l'embrouiller.

Dans ce cas, l'erreur de calcul économique est un peu différente.

for(int i=limit;i<rates_total;i++)
 
Aleksandr Slavskii #:

Je comprends que vous vouliez aider la personne, mais apparemment par erreur, vous n'avez fait qu'embrouiller les choses.

Dans ce cas, l'erreur de calcul économique est un peu différente.

Selon vous, qu'est-ce que j'ai mal écrit ? Justifiez-le, s'il vous plaît.

Quelle est la limite et d'où viendra la boucle dans mon exemple et dans le vôtre.

 
Novichokkk #:

Pourquoi ne pas écrire Bars() au lieu de rates_total ?

Par essence, rates_total et Bars() sont la même chose, sauf queBars() est une fonction, donc son appel coûtera plus cher en termes de temps d'exécution que la lecture de la valeur de la variable rates_total.

 
Artyom Trishkin #:

Qu'est-ce que j'ai mal écrit, selon vous ? Justifiez-le, s'il vous plaît.

Quelle est la limite et d'où viendra la boucle dans mon exemple et le vôtre.

Oups))))))

Je n'ai pas bien vu

if(limit>1)

Je n'ai pas du tout compris ce que vous avez écrit.

Je m'en excuse.