Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement. Et puis les gens sont blessés. J'en ai marre de ce metatrader.
Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement. Et puis les gens sont blessés. J'en ai marre de ce metatrader.
Tout est comme avant.
C'est votre faute.
Conseil - apprenez à utiliser le débogueur et vous ne devrez plus faire de relecture, vous verrez toutes vos fautes d'un seul coup.
Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement. Et puis les gens sont blessés. J'en ai marre de ce metatrader.
Je n'ai pas remarqué de changement dans le calcul des indicateurs. Comme vous l'avez vu ci-dessus, Nikolay a expliqué à juste titre ce que signifient les valeurs limites calculées comme rates_total-prev_calculated.
Et ça marche depuis des années - depuis le quatrième terminal.
Nikolai Semko #: C'est là que vous avez besoin du moins un :))
L'impression montre que les dimensions sont correctes.
Utilisez la logique :
Si la limite = 0, alors un nouveau tick
Si limite = 1, cela signifie une nouvelle barre (le dernier élément du tampon rates_total est -1, et vous avez rates_total, d'où le débordement)
Si la limite > 1, il est préférable de recalculer l'ensemble de l'indicateur.
Nikolay je connais les constructions si et pour un, mais j'ai toujours travaillé avec pour, je m'y suis habitué, c'est plus pratique. Mais j'ai remarqué des choses étranges depuis longtemps et je n'ai pas cherché à les comprendre. Il fonctionnait bien avant
Étape 1 : Créez un modèle en utilisant 'MQL5 Wizard' :
Étape 2 : épellez correctement le mot "limite" et UTILISEZ le tableau de fermeture - PAS l'appel iClose ! !!
Résultat :
et il n'y a pas d'erreurs.
Merci pour l'exemple direct de i++ bien sûr. Mais le fait que j'aie une boucle inversée, vous ne l'avez pas remarqué. Et si iClose est cité en exemple, il doit être utilisé pour montrer que l'indice i sera ensuite utilisé dans d'autres fonctions.
Si limite = 1, cela signifie une nouvelle barre (le dernier élément du tampon rates_total est -1, et vous avez rates_total, d'où le débordement)
Si la limite > 1, il est préférable de recalculer l'ensemble de l'indicateur.
c'est ici que est erroné - il vaut mieux utiliser if limit != 1
Donc toute la logique est à peu près ce qu'elle est :
limit = rates_total - prev_calculated;
if (limit == 0) {..} // новый тикelseif ( limit == 1) {..} // новый барelse {..} // полный пересчет всего индикатора
Je comprends que certaines personnes vont s'indigner et dire pourquoi je devrais tout recalculer si limit == 2, mais lorsque limit n'est pas égal à 1 et n'est pas égal à 0, cela signifie qu'il s'agit de la première initialisation de l'indicateur ou que quelque chose s'est mal passé (par exemple, un échec de connexion ou un échec du serveur) De plus, j'ai souvent rencontré des situations où prev_calculated était plus grand que rates_total. Il s'agissait probablement d'un problème antérieur qui a été corrigé, mais depuis lors, j'utilise ce modèle par mesure de sécurité.
Étape 1 : Créez un modèle en utilisant 'MQL5 Wizard' :
Étape 2 : épellez "limite" correctement et UTILISEZ le tableau de fermeture - PAS l'appel iClose ! !!
Résultat :
et il n'y a pas d'erreurs.
Qui a dit que c'était le seul calcul correct de la limite et de l'indicateur ?
Nous discutons d'un autre calcul de limite et de l'indicateur lui-même - de gauche à droite - depuis le début de l'histoire jusqu'à l'époque actuelle. C'est plus simple et plus évident.
Dans une telle limite calculée (int limit = rates_total - prev_calculated ; if(limit>1) limit=rates_total-1 ;) toutes les données relatives à
s'il s'agit d'un tic actuel,
que ce soit l'ouverture d'un nouveau bar,
s'il s'agit d'un changement de données historiques.
Si le tick actuel (limite==0), alors for(int i=limite ; i>=0 ; i--) { // . } calculera l'indicateur à chaque nouveau tick, et seule la barre zéro sera recalculée.
Si nous ouvrons une nouvelle barre (limite==1), alors for(int i=limite ; i>=0 ; i--) { // ... } effectuera le calcul de la première et de la barre zéro - précédente et nouvellement ouverte.
Si cette histoire change (limite>1), alors for(int i=limite ; i>=0 ; i--) { // ... } va effectuer un recalcul complet de l'indicateur pour tout l'historique disponible (l'historique a été modifié quelque part).
Cela est dû au fait que l'IndBuff n'est pas alloué à rates_total + 1
et que ArrayResize ne lui est pas applicable.
for(int i=limit - 1;....
au minimum...
Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement.
Et puis les gens sont blessés. J'en ai marre de ce metatrader.
Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement.
Et puis les gens sont blessés. J'en ai marre de ce metatrader.
Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement.
Et puis les gens sont blessés. J'en ai marre de ce metatrader.
Je n'ai pas remarqué de changement dans le calcul des indicateurs. Comme vous l'avez vu ci-dessus, Nikolay a expliqué à juste titre ce que signifient les valeurs limites calculées comme rates_total-prev_calculated.
Et ça marche depuis des années - depuis le quatrième terminal.
C'est là que vous avez besoin du moins un :))
Nikolay je connais les constructions si et pour un,
mais j'ai toujours travaillé avec pour, je m'y suis habitué, c'est plus pratique.
Mais j'ai remarqué des choses étranges depuis longtemps et je n'ai pas cherché à les comprendre.
Il fonctionnait bien avant
pour i>=0 ticks
pour i>0 bars
Et il n'y avait pas besoin de "si".
Étape 1 : Créez un modèle en utilisant 'MQL5 Wizard' :
Étape 2 : épellez correctement "limite" et UTILISEZ le tableau de fermeture - PAS l'appel iClose ! !!
Résultat :
Et il n'y a pas d'erreurs.
Étape 1 : Créez un modèle en utilisant 'MQL5 Wizard' :
Étape 2 : épellez correctement le mot "limite" et UTILISEZ le tableau de fermeture - PAS l'appel iClose ! !!
Résultat :
et il n'y a pas d'erreurs.
Merci pour l'exemple direct de i++ bien sûr.
Mais le fait que j'aie une boucle inversée, vous ne l'avez pas remarqué.
Et si iClose est cité en exemple, il doit être utilisé pour montrer que l'indice i sera ensuite utilisé dans d'autres fonctions.
Nikolaï, je connais les constructions de si et pour un,
sinon si
c'est ici que
est erroné - il vaut mieux utiliser
if limit != 1
Donc toute la logique est à peu près ce qu'elle est :
Je comprends que certaines personnes vont s'indigner et dire pourquoi je devrais tout recalculer si limit == 2,mais lorsque limit n'est pas égal à 1 et n'est pas égal à 0, cela signifie qu'il s'agit de la première initialisation de l'indicateur ou que quelque chose s'est mal passé (par exemple, un échec de connexion ou un échec du serveur)
De plus, j'ai souvent rencontré des situations où prev_calculated était plus grand que rates_total. Il s'agissait probablement d'un problème antérieur qui a été corrigé, mais depuis lors, j'utilise ce modèle par mesure de sécurité.
si limite != 1
Étape 1 : Créez un modèle en utilisant 'MQL5 Wizard' :
Étape 2 : épellez "limite" correctement et UTILISEZ le tableau de fermeture - PAS l'appel iClose ! !!
Résultat :
et il n'y a pas d'erreurs.
Qui a dit que c'était le seul calcul correct de la limite et de l'indicateur ?
Nous discutons d'un autre calcul de limite et de l'indicateur lui-même - de gauche à droite - depuis le début de l'histoire jusqu'à l'époque actuelle. C'est plus simple et plus évident.
Dans une telle limite calculée (int limit = rates_total - prev_calculated ; if(limit>1) limit=rates_total-1 ;) toutes les données relatives à
Si le tick actuel (limite==0), alors for(int i=limite ; i>=0 ; i--) { // . } calculera l'indicateur à chaque nouveau tick, et seule la barre zéro sera recalculée.
Si nous ouvrons une nouvelle barre (limite==1), alors for(int i=limite ; i>=0 ; i--) { // ... } effectuera le calcul de la première et de la barre zéro - précédente et nouvellement ouverte.
Si cette histoire change (limite>1), alors for(int i=limite ; i>=0 ; i--) { // ... } va effectuer un recalcul complet de l'indicateur pour tout l'historique disponible (l'historique a été modifié quelque part).