MT5 build 1455
Indicateur pour le test :
#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.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 ?
MT5 build 1455
Indicateur pour le test :
#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.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 historique si la somme de contrôle a changé (c'est une réponse approximative de servicedesk).
Je vois. Merci. Alors, au charpentier...
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 ?
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 :
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.
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 :
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.
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 :
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.
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 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.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation