Erreurs, bugs, questions - page 1393

 
Erreur de compilation :'a' - n'est pas un membre statique
class A     { int a; };
class B : A { void a(); };
void B::a() {}
sinon
class A     { int a; };
class B : A { void a() {} };
est bien. Quelle est la différence ?
 

MT5 1159. Incohérence de l'échelle horizontale si la police moyenne ou grande est définie dans "personnalisation". Win7, 32b

 

Comment MT5 met-il à l'échelle automatique les indicateurs dans une fenêtre séparée ?

Indicateur dans une fenêtre séparée

Le terminal atteint le maximum de 0,5603, alors que la valeur maximale réelle de tout indicateur tampon sur l'ensemble de l'historique est de 0,0605. Inutile de dire que ces problèmes n'existent pas dans MT4.

 
Ilya Malev:

Comment MT5 met-il à l'échelle automatique les indicateurs dans une fenêtre séparée ?


Le terminal atteint le maximum de 0,5603, alors que la valeur maximale réelle de tout indicateur tampon sur l'ensemble de l'historique est de 0,0605. Inutile de dire que ces problèmes n'existent pas dans MT4.

Vérifiez les valeurs que vous avez dans le tampon de l'indicateur. Vous pouvez le faire manuellement avec "Crosshair", vous pouvez le faire avec MQL5.
 
Karputov Vladimir:
Vérifiez les valeurs que vous avez dans le tampon de l'indicateur. Vous pouvez le faire manuellement avec "Crosshair", vous pouvez le faire avec MQL5.

Je vous ai dit que le maximum sur toute l'histoire est de 0.0605. Vérifié dans OnCalculate en comparant la valeur maximale de chaque tampon sur chaque barre.

P.S. En fait, j'ai déjà trouvé quel est le problème. Algorithme différent pour le calcul des maxima dans MT4 et MT5. J'aimerais comprendre le bien-fondé de la modification de cet algorithme, mais il s'agit d'une question rhétorique.

Le problème se posait dans MT4 - les valeurs de la mémoire tampon de l'indicateur affichées dans la fenêtre de données affectent l'échelle d'une fenêtre d'indicateur séparée, même si leur affichage sur le graphique est désactivé (style DRAW_NONE). J'ai résolu le problème en les rendant négatifs et en fixant le minimum à 0. Tout s'est affiché parfaitement, car seules les valeurs de l'indicateur supérieures au minimum fixé (0) ont participé au calcul de l'échelle. Désormais, les valeurs inférieures au minimum fixé participent au calcul de l'échelle. En d'autres termes, ils n'ont pas ajouté la possibilité de supprimer les valeurs tampons du calcul de l'échelle (ou je ne l'ai pas encore compris), mais ils ont supprimé la possibilité de les exclure de l'échelle en les plaçant sous le minimum ou le maximum. (tout ceci s'applique aux tampons DRAW_NONE non affichés)

 
Ilya Malev:

Je vous ai dit que le maximum sur toute l'histoire est de 0.0605. Vérifié dans OnCalculate en comparant la valeur maximale de chaque tampon sur chaque barre.

P.S. En fait, j'ai déjà trouvé quel est le problème. Algorithme différent pour le calcul des maxima dans MT4 et MT5. J'aimerais comprendre le bien-fondé de la modification de cet algorithme, mais il s'agit d'une question rhétorique.

Les valeurs que vous transmettez au tampon de l'indicateur seront les mêmes. Autre variante : au début du démarrage, vous n'analysez pas chaque élément du tampon de l'indicateur et obtenez en conséquence des valeurs aléatoires dans le tampon.

Donc, vous ne pouvez pas faire sans regarder le code.

 
Karputov Vladimir:

Autre possibilité : au début du démarrage, vous ne comptez pas chaque élément du tampon de l'indicateur et vous vous retrouvez avec des valeurs aléatoires dans le tampon.

Je l'ai déjà compris. D'ailleurs, c'était aussi une surprise inattendue de MT5 :)
 
Karputov Vladimir:

De toute façon, vous ne pouvez pas vous passer de regarder le code ici.

OK, voici le code

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_minimum 0
#property  indicator_color1 clrRed
#property  indicator_type1 DRAW_LINE
#property  indicator_label1 "Стд.Откл."

double buffer1[], buffer2[];

int i_std=INVALID_HANDLE;

void OnInit(){
   SetIndexBuffer(0, buffer1);
   SetIndexBuffer(1, buffer2);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_NONE);
   PlotIndexSetInteger(1, PLOT_SHOW_DATA, true);
   ArraySetAsSeries(buffer1, true);
   ArraySetAsSeries(buffer2, true);
   i_std=iStdDev(Symbol(), Period(), 20, 0, MODE_SMA, PRICE_CLOSE);
}

void OnDeinit(const int reason){
   if(i_std!=INVALID_HANDLE)  IndicatorRelease(i_std);
}

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[]){

   for(int i=rates_total-MathMax(1, prev_calculated); i>=0; i--){
      buffer1[i]=_ind(i_std, 0, i);
      buffer2[i]=-MathRand()%5;
   }
   return(rates_total);
}

double _ind(int hnd, int buf, int index){
   if(index < 0) return(EMPTY_VALUE);
   double Arr[];
   return(CopyBuffer(hnd, buf, index, 1, Arr)==1?Arr[0]:EMPTY_VALUE);
}
 

Je ne sais pas s'il s'agit d'un bug ou d'un comportement étrange mais dans le testeur de stratégie MT4, les tampons des indicateurs sont d'environ 1000 +/- 3 cellules.

Avec les autres types de tests - démo ou réels - le nombre de cellules dans le tampon est à peu près le même que le nombre de barres autorisées dans les paramètres du terminal.

Je veux savoir si c'est un bug ou si je pensais comme ça, j'ai aussi remarqué que les indicateurs peuvent être modifiés pendant le test sans arrêter le testeur. Je n'ai pas encore lu d'informations sur les EAs, mais merci pour cela !

 
Ilya Malev:

OK, voici le code

Je ne suis pas vraiment bon avec les indicateurs, mais cette ligne est douteuse.

return(CopyBuffer(hnd, buf, index, 1, Arr)==1?Arr[0]:EMPTY_VALUE);

Valeur de retour

Le nombre d'éléments du tableau copié ou -1 en cas d'erreur.

S'il n'y a qu'un seul élément copié, la fonction renvoie sa valeur. S'il n'y a aucun élément ou s'il y en a plus d'un, la fonction renvoie EMPTY_VALUE.

Peut-être que ce serait mieux ?

return(CopyBuffer(hnd, buf, index, 1, Arr)>=1?Arr[0]:EMPTY_VALUE);
Raison: