prev_calculé

 
Les commentaires sans rapport avec "Bugs, bugs, problèmes" ont été déplacés vers ce fil de discussion.
 

MT5 build 1455

Indicateur pour le test :

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Mise en place de l'indicateur sur le graphique

2. Fermer le terminal

3. borne ouverte

Journal :

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

J'ai raté quelque chose ou il est impossible de faire confiance à la variable prev_calculated, je dois craquer la béquille ?

 
Alexander Puzanov:

MT5 build 1455

Indicateur pour le test :

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Mise en place de l'indicateur sur le graphique

2. Fermer le terminal

3. borne ouverte

Journal :

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

J'ai raté quelque chose ou il est impossible de faire confiance à la variable prev_calculated, je dois craquer la béquille ?

La variable prev_calculated peut être remise à 0 même sans pagination de l'historique si la somme de contrôle a changé (c'est une réponse approximative de servicedesk).
 
Alexey Kozitsyn:
La variable prev_calculated peut être remise à 0 même sans pagination historique si la somme de contrôle a changé (c'est une réponse approximative de servicedesk).
Je l'ai. Merci. Alors, au charpentier...
 
Alexander Puzanov:
Je vois. Merci. Alors, au charpentier...
Il n'est pas nécessaire d'exagérer - le retour nul de prev_calculate est un événement très courant. La tâche du programmeur est d'attraper un tel événement et de remplir correctement les tampons indicateurs dans un tel cas. Ni plus ni moins.
 
Ilyas:

Ajout des opérateurs *(Dereference/Inderection) et &(Address-of), aucun changement linguistique supplémentaire ne sera effectué/prévu.

Veuillez clarifier ce qui suit :

* obtenir une variable par référence - s'applique uniquement à :

1. les objets de classe

2. les objets de la structure

3. Types fondamentaux

Dans ce contexte, s'agit-il seulement de rlvalue ou aussi de lvalue ?

 
Karputov Vladimir:
La tâche du programmeur est d'attraper un tel événement.

Je ne suis donc pas un programmeur - mes tâches sont différentes. Charpentier, je suppose - je vais "prendre la béquille" et penser que je "prends l'événement".

Et je n'exagère pas, car le but déclaré de cette variable :

prev_calculated  // обработано баров на предыдущем вызове

En plus de cet objectif, il est également censé être un indicateur de changement dans l'historique, et il est censé suivre certains autres changements. Tout ceci est utile mais nous ne pouvons pas l'utiliser pour son objectif direct - montrer combien de "barres ont été traitées lors de l'appel précédent" - prev_calculated.

 
Alexander Puzanov:

Je ne suis donc pas un programmeur - mes tâches sont différentes. Charpentier, je suppose - je vais "prendre la béquille" et penser que je "prends l'événement".

Et je n'exagère pas, car l'objectif déclaré de cette variable :

prev_calculated  // обработано баров на предыдущем вызове

En plus de cet objectif, il est également censé être un drapeau de changement dans l'historique, plus quelques autres changements pour garder une trace. Tout cela est utile mais vous ne pouvez pas l'utiliser pour son objectif direct - montrer combien de "barres ont été traitées lors de l'appel précédent" - prev_calculated.

Et si nous recalculons simplement l'ensemble de l'indicateur lorsque 0 ? Cela me semble être la meilleure solution.
 
Alexander Puzanov:

Je ne suis donc pas un programmeur - mes tâches sont différentes. Charpentier, je suppose - je vais "prendre la béquille" et penser que je "prends l'événement".

Et je n'exagère pas, car l'objectif déclaré de cette variable :

prev_calculated  // обработано баров на предыдущем вызове

En plus de cet objectif, il est également censé être un indicateur de changement dans l'historique, et il est censé suivre certains autres changements. Tout ceci est utile mais nous ne pouvons pas l'utiliser pour son objectif direct - montrer combien de barres ont été "traitées lors de l'appel précédent" - prev_calculated.

Si prev_calculated=0, cela signifie qu'un recalcul complet doit être effectué. Tous les indicateurs standard sont entièrement recalculés dans ce cas.

Qu'est-ce qui n'est pas clair ?

Il est dit que la somme de contrôle a changé au cours de l'histoire. Il serait moins coûteux de recalculer l'indicateur que de chercher à savoir pourquoi la somme de contrôle a changé.

La documentation mentionne explicitement que

Notez le lien entre la valeur de retour de OnCalculate() et le deuxième paramètre d'entrée prev_calculated. Le paramètre prev_calculated de l'appel de fonction contient une valeur renvoyée par OnCalculate() lors de l'appel précédent.Cela permet d'utiliser des algorithmes économiques pour calculer l'indicateur personnalisé afin d'éviter des calculs répétés pour les barres qui n'ont pas changé depuis l'appel précédent de cette fonction.

Pour cela, il suffit généralement de renvoyer la valeur du paramètre rates_total, qui contient le nombre de barres dans l'appel de fonction actuel. Si depuis le dernier appel de OnCalculate() les données de prix ont changé (un historique plus profond a été pompé ou les blancs de l'historique ont été remplis), alors la valeur du paramètre d'entrée prev_calculated sera mise à zéro par le terminal.

 
Alexey Kozitsyn:
Pourquoi ne pas simplement recalculer l'ensemble de l'indicateur lorsqu'il est à 0 ? A mon avis, la meilleure solution.
C'est exactement ce que vous devez faire : lorsque vous obtenez prev_calculate==0, vous devez recalculer l'ensemble de l'indicateur. Puisque rev_calculate==0 est généralement un échange d'historique. Et si l'historique est interverti, cela signifie qu'il peut y avoir de nouvelles barres qui ont été manquées ou qui n'ont pas été calculées auparavant - c'est-à-dire que les lectures de l'indicateur seront déjà fausses.
 
Karputov Vladimir:
C'est exactement ce que vous devez faire : lorsque prev_calculate==0 est reçu, vous devez recalculer l'indicateur ENTIER. Puisque rev_calculate==0 est généralement un échange d'historique. Et si l'historique est interverti, cela signifie qu'il peut y avoir de nouvelles barres qui ont été manquées ou qui n'ont pas été calculées auparavant - c'est-à-dire que les lectures de l'indicateur seront incorrectes.
:) C'est ce que je fais...
Raison: