Questions des débutants MQL5 MT5 MetaTrader 5 - page 154

 
paladin800:
C'est-à-dire que vous devez convertir 1.33182 en 1.3318 ? Il suffit de couper le 5e chiffre après la virgule ou de l'arrondir au 4e chiffre, par exemple, on obtient 1,3318 ou 1,3319 à partir de 1,33186 ?

Ma question est de savoir s'il y a un bug ou non. Lors de la conversion de double en int dans mon exemple, le résultat est un de moins. Veuillez le vérifier vous-même.

   double max=NormalizeDouble(1.33182,4);  
   //double max=1.3318;
   Alert(int(max*10000));
L'alerte devrait donner 13318, mais elle donne 13317. S'il n'est pas arrondi à l'entier, il donnera 13318.0 correctement.
 

Dites-moi s'il y a une différence dans les expressions :

if(bufferclose[1]<=MaxLine(1)-m_open_bar_error*ticksize && bufferopen[1]<=MaxLine(1)-m_open_bar_error*ticksize)

и

if(( bufferclose[1]<=MaxLine(1)-m_open_bar_error*ticksize) && ( bufferopen[1]<=MaxLine(1)-m_open_bar_error*ticksize))
 
sgreen:

Dites-moi s'il y a une différence dans les expressions :

и

Si vous avez le sentiment que quelque chose n'est pas normal, faites-le savoir :

if(bufferclose[1]<= (  MaxLine(1)-m_open_bar_error*ticksize ) && bufferopen[1]<= (  MaxLine(1)-m_open_bar_error*ticksize ) )
 
Rorschach:

Ma question est de savoir s'il y a un bug ou non. Lors de la conversion de double en int dans mon exemple, le résultat est un de moins. Vérifiez par vous-même.

L'alerte devrait donner 13318, mais donne 13317. Ainsi, s'il n'est pas possible de réduire à l'infini, alors on obtient correctement 13318.0
L'alerte ne donne pas d'erreur. Le fait est que la normalisation conduit le nombre à la forme binaire, qui est la plus proche de l'analogue décimal demandé, tout en pouvant ne pas coïncider avec lui en plus ou en moins (dans votre cas). Puisque ce qui est exprimé par une fraction décimale finie, ne peut pas toujours être exprimé par une fraction binaire finie . Expression
int(max*10000)

élimine la partie fractionnaire au lieu de l'arrondir (similaire à MathFloor() plutôt qu'à MathRound()), et dans votre cas, le nombre normalisé pourrait bien être égal à 13318 exactement, mais plutôt à 13317,999999999999997.

qui, lors de la sortie sous forme fractionnaire avec un nombre limité de chiffres, provoque l'arrondi au résultat correct (attendu), et lorsque la partie fractionnaire de.... est rejetée. vous verrez par vous-même.

J'espère avoir été clair.

 
pronych:
existe-t-il un analogue du partiel de Sharp ? ou comment le faire ?

il n'y a pas d'analogue. vous pouvez intégrer un morceau de définition en utilisant #include <partial_class_code.mqh>.

Certaines personnes imitent même l'héritage multiple de cette façon. // Je ne le fais pas, j'ai pris l'habitude de m'en passer. :)

 
paladin800:

Si vous soupçonnez que quelque chose ne va pas, faites-le savoir :

Je l'ai déjà fait. Simple curiosité.
 
sgreen:
Je l'ai déjà fait. Simple curiosité.

Je vois. Pour en revenir à votre question précédente, l'essentiel du disque peut être tiré de cette comparaison :

if (A<=B && C<=D)     // 1
if ((A<=B) && (C<=D)) // 2

Il n'y a aucune différence entre ces entrées. En même temps, je vous recommande de mettre entre parenthèses les calculs mathématiques à l'intérieur des if-os :

if (A<=(B1+B2*B3) && C<=(D1-D2*D3))
Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network
 
MetaDriver:
L'alerte ne produit pas d'erreur. Le point est que la normalisation conduit un nombre à une forme binaire, qui est la plus proche de l'analogue décimal demandé, alors qu'elle peut ne pas coïncider avec lui dans une direction plus grande ou plus petite (dans votre cas). Puisque ce qui est exprimé par une fraction décimale finie, peut ne pas toujours être exprimé par une fraction binaire finie . Expression

entraîne l'élimination de la partie fractionnaire plutôt que l'arrondi (c'est-à-dire qu'elle ressemble plus à MathFloor() qu'à MathRound()), et dans votre cas, le nombre normalisé pourrait bien être 13317.999999999999997 plutôt que 13318 exactement.

qui, lors de la sortie sous forme fractionnaire avec un nombre limité de chiffres, provoque l'arrondi au résultat correct (attendu), et lorsque la partie fractionnaire de.... est rejetée. vous verrez par vous-même.

J'espère l'avoir expliqué clairement.

Merci, je vois.

Autre question, comment lutter contre cela si je ne peux pas me passer de la conversion en int ?

 
Pouvez-vous me dire comment prendre en compte la commission du courtier lors du test d'un EA?
 
Rorschach:

Merci, je vois.

Autre question, comment faire face à cette situation si vous ne pouvez pas vous passer du transfert vers l'int ?

et vous ajoutez quelques epsilons.

DBL_EPSILON

Le plus petit nombre pour lequel la condition 1.0+DBL_EPSILON != 1.0 est remplie.


Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Константы числовых типов - Документация по MQL5