Ligne verticale. - page 4

 

Je suis encore en train d'apprendre les subtilités des indicateurs et j'ai des questions. Je réinitialise le tampon de l'indicateur dans OnInit(), mais pour une raison quelconque, les tampons ne sont pas réinitialisés pendant la compilation de l'indicateur. Pour la logique, il devrait y avoir une cellule pleine pour chaque tampon après la compilation, mais dans l'image vous pouvez voir qu'il y en a beaucoup (je pense que ce sont les cellules des tampons précédents). Où est-ce que je fais une erreur ?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
Dossiers :
 
Nauris Zukas:

Je suis encore en train d'apprendre les subtilités des indicateurs et j'ai des questions. Je réinitialise le tampon de l'indicateur dans OnInit(), mais pour une raison quelconque, les tampons ne sont pas réinitialisés pendant la compilation de l'indicateur. Pour la logique, il devrait y avoir une cellule pleine pour chaque tampon après la compilation, mais dans l'image vous pouvez voir qu'il y en a beaucoup (je pense que ce sont les cellules des tampons précédents). Où est-ce que je fais une erreur ?

Dans OnInit, les tampons indicateurs ont une longueur nulle.


C'est pour ça qu'ils peuvent faire tout ce que vous voulez, ça leur semble être le travail d'un homme mort.

Et lorsque l'exécution du code passe à OnCalculate, la taille devient immédiatement égale à rates_total.

et il y a des "déchets" dans toutes les cellules du tableau. Il peut aussi y avoir des restes d'un ancien calcul d'indicateur.

 
Alexey Viktorov:

Dans OnInit, les tampons indicateurs ont une longueur nulle.


C'est pour ça que vous pouvez faire ce que vous voulez avec eux, ils sont très révélateurs.

Et lorsque l'exécution du code passe à OnCalculate, la taille devient immédiatement égale à rates_total.

et toutes les cellules du tableau contiennent des "déchets". Il peut y avoir des restes de l'ancien calcul de l'indicateur.

Merci beaucoup, j'ai tout compris et ça a marché ! Je l'ai fait comme ça :

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

Merci beaucoup, tout s'est arrangé ! Je l'ai fait comme ça :

Pourquoi attribuer deux fois une valeur à une variable ?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

Et une question : quel est l'intérêt de faire tout ça ? Après tout, en passant par toutes les barres dans la boucle, toutes les cellules du tableau doivent être remplies avec quelque chose de toute façon. A moins que l'indicateur ne doive montrer que la position actuelle, mais alors le tableau doit être initialisé sur chaque barre, pas seulement au début...

 
Alexey Viktorov:

Pourquoi attribuer deux fois une valeur à une variable ?

Je n'étais pas sûr que toutes les actions avec le graphe soient imitées par OnInit(), par exemple changer taimfreims. Modification de la réinitialisation de taimfreim (je viens de vérifier), mais peut-être qu'il y a autre chose, donc j'ai mis la deuxième dans OnInit() pour être sûr. Mais si ce n'est pas le cas, alors je ne le mettrai pas là.
 
Alexey Viktorov:

Et la question est : pourquoi avons-nous besoin de tout cela ? Après tout, en passant par toutes les barres de la boucle, toutes les cellules du tableau doivent être remplies de quelque chose, de toute façon. A moins que l'indicateur ne doive montrer que la position actuelle, mais alors le tableau devrait être initialisé sur chaque barre, pas seulement au début...

Dans cet exemple, je voulais juste comprendre comment réinitialiser le tampon. Mais à l'avenir (dans l'indicateur sur lequel je travaille actuellement), je devrai à la fois laisser les cellules précédentes et en ajouter de nouvelles. Et c'est sur cette base que j'ai commencé à travailler. Pour ainsi dire - les premiers tests.

 
Nauris Zukas:
Je n'étais pas sûr que toutes les actions avec le graphique soient imitées par OnInit(), par exemple le changement de taimfreims. Changement de taimfreim reset (vérifié maintenant), mais peut-être qu'il y a autre chose, donc j'ai mis le deuxième dans OnInit() pour être sûr. Mais si ce n'est pas le cas, alors je ne le mettrai pas là.

Ahh. Eh bien oui, les variables de niveau global ne sont pas initialisées lorsque la période du graphique change. Je pense... Je ne me souviens pas exactement.

Et en général, vous pouvez vous passer de cette variable bool supplémentaire.

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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

Et en général, on peut se passer de cette variable bool supplémentaire.

Oui, exactement, encore mieux, merci.

 

Pouvez-vous me dire pourquoi, si la période est supérieure à 30 minutes, il renvoie un nombre aussi étrange ?

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) PERIOD : 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERIOD : 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERIOD : 16388
 
Nauris Zukas:

Pouvez-vous me dire pourquoi si la période est supérieure à 30 minutes, il renvoie un nombre aussi étrange ?

Dans MT5, les valeurs des périodes ne sont pas égales au nombre de minutes, comme dans MT4.