Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1206

 
Maxim Kuznetsov:

Alert("Разбег "+DoubleToString(delta,_Digits));

ou Alert(StringFormat("Spread %.5f",delta)) ;

en général, il faut s'y habituer, ce sont juste des représentations différentes du même nombre. Repensez à vos merveilleuses années d'école - c'est de là que ça vient.

Merci. Mais que faire si je dois utiliser la valeur delta comme un nombre et la comparer ? Par exemple.

if(delta>0.00005)
  {
   //------------
  }
Est-ce que c'est correct ?
 
prom18:

Merci. Que faire si je dois utiliser la valeur delta comme un nombre et la comparer ? Par exemple.

Est-ce correct ?

Vous pouvez comparer deux nombres réels comme ceci :

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij:

Vous pouvez comparer deux nombres réels comme ceci :

https://www.mql5.com/ru/docs/basis/types/double

Vous pouvez, si vous êtes sûr qu'ils ne peuvent pas être très proches dans leur signification. Après tout, le doux est comparé au chaud.
 
Alexey Viktorov:
Vous pouvez, si vous êtes sûr qu'ils ne peuvent pas être très proches en valeur. Après tout, le doux est comparé au chaud.

Je ne comprends pas. Par exemple. Je prends le nombre de pips que le prix a passé en un tick. Si le prix passe de plus de 20 points, alors je reçois une alerte.

Je compare la différence de prix (1.12300-1.12321=0.00021) avec la valeur maximale nécessaire (0.00020).

0.00021>0.00020.

Quel est le rapport avec la douceur et la chaleur ?

 
prom18:

Je ne comprends pas. Par exemple. Je prends le nombre de pips que le prix a passé en un tick. Si le prix passe de plus de 20 points, alors je reçois une alerte.

Je compare la différence de prix (1.12300-1.12321=0.00021) avec la valeur maximale nécessaire (0.00020).

0.00021>0.00020.

Qu'est-ce que cela a à voir avec le doux et le chaud ?

vous avez besoin de points, alors comparez les points.

et le double est comparé à epsilon (DBL_EPS si ma mémoire est bonne), sinon vous pourriez obtenir 3.0-0.2 > 2.0+0.8 (au sens figuré, les chiffres peuvent être différents)

 
Maxim Kuznetsov:

vous avez besoin de points, alors comparez les points. ce sont des entiers d'ailleurs.

alors que double est comparé à epsilon (DBL_EPS si ma mémoire est bonne), sinon vous pouvez obtenir 3.0-0.2 > 2.0+0.8 (au figuré, les chiffres peuvent être différents)

Il vaut mieux utiliser l'exemple de@fxsaber à cette fin :

int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}

script à vérifier :

//+------------------------------------------------------------------+
void OnStart()
{
   int bar1 = PriceToInteger(iClose(NULL, 0, 1), _Point);
   int bar2 = PriceToInteger(iClose(NULL, 0, 2), _Point);
   printf("bar2 - bar1 = %i point", bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
//+------------------------------------------------------------------+
 
prom18:

Je ne comprends pas. Par exemple. Je prends le nombre de pips que le prix a passé en un tick. Si le prix passe de plus de 20 points, alors je reçois une alerte.

Je compare la différence de prix (1.12300-1.12321=0.00021) avec la valeur maximale nécessaire (0.00020).

0.00021>0.00020.

Qu'est-ce que ça a à voir avec le doux et le chaud ?

Parfois, il n'est pas nécessaire de lire tout ce qui est écrit.

Vous avez pris des chiffres qui sont normalement représentés par le système. Prenez ces...

  double a=1.12328,
         b=1.12309,
         c=0.00019,
         d=a-b;

et vous obtenez

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

L'idée est a-b==c, mais l'ordinateur vous donnera de telles erreurs. Il a été beaucoup écrit à ce sujet sur le forum, cherchez et lisez.

Mais vous pouvez prendre la différence normalisée et la valeur de contrôle normalisée et les comparer.

 
Иван:
Bon temps à vous tous. Question : dans MT4, lorsque l'on travaille dans le testeur avec des crosses (paires sans quidam), comment le testeur calcule-t-il les résultats des positions fermées, si le compte, sur lequel le test est effectué, est un compte en dollars ? Pour le recalcul des totaux de position en dollars, le testeur prend-il le taux de change de la devise de base du cross par rapport au dollar au moment actuel ou au moment de l'intervalle testé ? Je soupçonne fortement que c'est le cas à l'heure actuelle. Si oui, est-il impossible de le faire calculer au moment de l'intervalle ?
Quelqu'un le sait-il ?
 
Иван:
Quelqu'un le sait-il ?

compter la MODE_TICKVALUE elle-même pour chaque tick.

 
Alexey Viktorov:
Vous pourriez, si vous êtes sûr qu'ils ne peuvent pas être très proches en valeur. Après tout, le doux est comparé au chaud.

Siprom18 a besoin de comparer deux nombres, à l'intérieur de signes de chiffres, c'est la seule méthode qui fonctionne :

double price1 = 1.23450;
double price2 = 1.23447;

if(EqualDoubles(price1, price2, ((_Digits == 4) ? 0.0100 : 0.00100)) {
  ...
}

Mais comme vous pouvez le voir, il a encore plus de variations : https://www.mql5.com/ru/forum/160683/page1205#comment_17247843. C'est pourquoi, dans l'exemple, j'ai intentionnellement réduit la précision de la comparaison de deux chiffres. Bien sûr, un tel écart entre les valeurs de prix est tout à fait inexact... Mais comment faire autrement pour comparer deux nombres dans des cas comme celui-ci... ? Si l'écart était supérieur à un chiffre, nous ne pourrions pas utiliser EqualDoubles, mais utiliser NormalizeDouble pour couper toutes les choses inutiles.

Mais vous pouvez aussi le faire comme ça :

int digits = Digits() - 2;

double price1 = NormalizeDouble(1.23450, digits);
double price2 = NormalizeDouble(1.23447, digits);

if(price1 == price2) {
  ...
}