Erreurs, bugs, questions - page 2728

 
Sergey Dzyublik:

Le bogue MT5 (build 2390) compte incorrectement les accolades dans la description de la structure de la classe.

Merci pour le post, corrigé

 

c'est comme ça que ça marche :

   ObjectSetDouble (0,name,OBJPROP_ANGLE,direction==0?0:direction>0?30:-30);

donc non (toujours 0)

   ObjectSetDouble (0,name,OBJPROP_ANGLE,direction*30);

direction -1 ; +1 ; 0

 
Igor Zakharov:

c'est comme ça que ça marche :

donc non (toujours 0)

direction -1 ; +1 ; 0

Et donc

ObjectSetDouble (0,name,OBJPROP_ANGLE,( direction==0?0:direction>0?30:-30));
 
Alexey Viktorov:

Et par là.

fonctionne également, la deuxième option ne fonctionne pas.

 
   ObjectSetDouble (0,name,OBJPROP_ANGLE,direction*30.0);
que vous avez déclaré comme int. C'est ce que vous obtenez. Ces derniers temps, de nombreuses fonctions sont devenues assez pointilleuses sur les valeurs. Il est préférable de sécuriser avec une conversion.
J'ai moi-même été confronté à de tels problèmes récemment. Je n'avais aucun problème auparavant. Mais on m'a demandé de corriger le code et il ne voulait pas fonctionner correctement jusqu'à ce que je le mette en double.
 
Konstantin Nikitin:
Vous avez déclaré la direction comme int. C'est ce que vous obtenez. Ces derniers temps, de nombreuses fonctions sont devenues assez pointilleuses sur les valeurs. Il est préférable de s'occuper de la conversion.
J'ai moi-même été confronté à de tels problèmes récemment. Je n'avais aucun problème auparavant. Mais on m'a demandé de corriger le code et il ne voulait pas fonctionner correctement jusqu'à ce que je l'amène en double.

Oui, int. Mais c'est une multiplication - dans les entiers, c'est aussi 30*1=30. Je suis sûr à 100% qu'il y a quelques constructions, cela fonctionnait bien dans la deuxième variante également, puisque ces 30 étaient déterminés par le choix...

On dirait une autre "fonctionnalité" de MT5... Au moins le bloc est décoratif, mais si quelque part comme autolot ou stoploss - la tristesse peut arriver - j'inverse souvent en multipliant par -1...

Merci, je vais utiliser une autre béquille...

 
Igor Zakharov:

fonctionne également, la deuxième option ne fonctionne pas.

Ah. J'ai copié par inadvertance le mauvais code.

Konstantin a raison, pourquoi mettre int là où double est attendu... Ce n'est pas une caractéristique de mql5, il s'agit juste de quelques tentatives pour s'habituer à la commande.

 

Aidez-moi, s'il vous plaît.

L'indicateur émet une erreur de type "array out of the range".

Dans le code, j'ai défini les tampons

#property indicator_buffers 2

#property indicator_color1 Red

#property indicator_width1 1

#property indicator_plots  1 // количество графических построений

#property indicator_type1   DRAW_ARROW


Variables globales déclarées

double Buf1[];

double Buf2[];

Dans Init() j'ai défini les propriétés

    PlotIndexSetInteger(0,PLOT_ARROW,code); 

//--- установим пустое значение 

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   SetIndexBuffer(0,Buf1,INDICATOR_DATA);

   PlotIndexSetString(0, PLOT_LABEL, "Break");



//----

   PlotIndexSetInteger(1,PLOT_ARROW,code);  

//--- установим пустое значение 

   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);

   SetIndexBuffer(1,Buf2,INDICATOR_CALCULATIONS);

   PlotIndexSetString(1, PLOT_LABEL, "Break");


Dans OnCalculate(), le code définit une condition - la variable up.

Si c'est vrai, alors le code suivant est exécuté

  i=nPoint1; BreakUp=false; BreakDn=false;
  
while(i>=0 && BreakUp==false && BreakDn==false)
  {              Print("i  ",i);                 tmp=iHigh(NULL,0,nPoint1)-Speed*(nPoint1-i);        tmp1=iHigh(NULL,0,nPoint1)-Speed*(nPoint1-i)-resultL;        if(NormalizeDouble(iLow(NULL,0,i),Digits())<NormalizeDouble(tmp1,Digits()) && NormalizeDouble(iHigh(NULL,0,i),Digits())>NormalizeDouble(tmp,Digits()))         {          size=ArraySize(Buf1);          Print("size ",size);                   BreakUp=true;          if(channelbreak) Buf1[i]=tmp;          Comm="\nПробой вверх на уровне " + DoubleToString(tmp,Digits());         }        else        if(NormalizeDouble(iLow(NULL,0,i),Digits())<NormalizeDouble(tmp1,Digits()))         {          size=ArraySize(Buf1);          Print("size ",size);                          BreakDn=true;          if(channelbreak) Buf1[i]=tmp1;          Comm="\nПробой вниз на уровне "+DoubleToString(tmp1,Digits());         }        else        if(NormalizeDouble(iHigh(NULL,0,i),Digits())>NormalizeDouble(tmp,Digits()))         {          size=ArraySize(Buf1);          Print("size ",size);                   BreakUp=true;          if(channelbreak) Buf1[i]=tmp;          Comm="\nПробой вверх на уровне "+DoubleToString(tmp,Digits());         }        else Comm="\nПробоя канала нет";        //i--;       }     } Ошибка происходит при входе в цикл while при присвоении значения переменной значению буфера. Проверка на размер массива буфера выдает ноль. Т.е. буфер не инициализируется. Всю голову сломал, не могу понять почему. В чем затык?
nPoint1 - это индекс бара (сдвиг от нулевого).
 
Ilyas:

Veuillez préciser s'il est normal que pendant le débogage de l'indicateur, les valeurs de cet indicateur ne soient pas visibles sur le graphique ouvert? C'est-à-dire que, par exemple, nous ouvrons MACD dans le débogueur. Nous fixons un point d'arrêt dans le cycle d'écriture des valeurs dans les tampons. Après l'écriture de la valeur, ChartRedraw(). Je m'attends à voir cette valeur sur le graphique immédiatement après l'écriture de la valeur, mais je ne vois qu'une fenêtre vide.

Build 2380 x64.

 
Alexey Viktorov:

Ce n'est pas une fonctionnalité de mql5, c'est juste une tentative d'enseigner l'ordre.

l'accoutumance à l'ordre, c'est quand le compilateur donne un avertissement (ou une erreur). la conversion d'entiers en fractions renvoie 0 - c'est un non-sens, pas un ordre. 90% des vieux codes se cassent de cette façon.

et remarquez, la variante qui fonctionne est toujours avec int ! c'est-à-dire que le problème n'est pas la conversion de type à l'étape de substitution, mais à l'étape de calcul.

AJOUTÉ : passage à MQ-demo, mise à jour du terminal de travail. Il n'a pas ce problème.

Raison: