Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1206

 
Maxim Kuznetsov:

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

или Alert(StringFormat("Разбег %.5f",delta));

и вообще привыкайте, это просто разные представления одного и того-же числа. Вспомните школьные годы чудесные - это оттуда

Спасибо. А если мне нужно использовать значение delta как число и сравнивать? Например.

if(delta>0.00005)
  {
   //------------
  }
Это будет корректно?
 
prom18:

Спасибо. А если мне нужно использовать значение delta как число и сравнивать? Например.

Это будет корректно?

Можно сравнивать два вещественных числа таким образом:

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:

Можно сравнивать два вещественных числа таким образом:

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

Можно, если вы уверены что они не могут быть очень близки по значению. Ведь мягкое с тёплым сравнивают.
 
Alexey Viktorov:
Можно, если вы уверены что они не могут быть очень близки по значению. Ведь мягкое с тёплым сравнивают.

Не понял. Например. Беру количество пунктов, которое прошла цена за один тик. Если цена прошла больше 20 пунктов, то выскакивает Alert.

Получается сравниваю разницу цен (1.12300-1.12321=0.00021) с каким-либо нужным мне максимальным значением (0.00020).

0.00021>0.00020.

Причем тут мягкое с теплым?

 
prom18:

Не понял. Например. Беру количество пунктов, которое прошла цена за один тик. Если цена прошла больше 20 пунктов, то выскакивает Alert.

Получается сравниваю разницу цен (1.12300-1.12321=0.00021) с каким-либо нужным мне максимальным значением (0.00020).

0.00021>0.00020.

Причем тут мягкое с теплым?

нужны пунты, вот и сравнивайте пункты.они кстати целые.

а double сравнивают с точностью до epsilon (DBL_EPS если память не изменяет), иначе может выйти что 3.0-0.2 > 2.0+0.8 (образно, цифры могут быть другие)

 
Maxim Kuznetsov:

нужны пунты, вот и сравнивайте пункты.они кстати целые.

а double сравнивают с точностью до epsilon (DBL_EPS если память не изменяет), иначе может выйти что 3.0-0.2 > 2.0+0.8 (образно, цифры могут быть другие)

тогда лучше пример @fxsaber для этих целей использовать:

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

скрипт для проверки:

//+------------------------------------------------------------------+
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:

Не понял. Например. Беру количество пунктов, которое прошла цена за один тик. Если цена прошла больше 20 пунктов, то выскакивает Alert.

Получается сравниваю разницу цен (1.12300-1.12321=0.00021) с каким-либо нужным мне максимальным значением (0.00020).

0.00021>0.00020.

Причем тут мягкое с теплым?

Ну иногда не надо читать всё что написано.

Вы взяли числа которые нормально представлены системой. А возьмите такие

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

и получите 

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

по идее a-b==с но компьютер даст такие погрешности. Об этом много писалось на форуме, поищите и почитайте.

Но можно взять нормализованную разницу и нормализованное контрольное значение и их сравнивать.

 
Иван:
Всем доброго времени. Вопрос: в МТ4 при работе в тестере с кроссами (парами без бакса) как тестер считает результаты по закрытым позициям, если счёт, на котором идёт тестирование, долларовый? Тестер для пересчёта итога позиции в доллары берёт курс базовой валюты кросса к доллару на текущий момент или на момент исследуемого интервала? Я сильно подозреваю, что на текущий момент. Если да, то нельзя ли заставить его считать на момент интервала?
Знает кто-нибудь?
 
Иван:
Знает кто-нибудь?

считать самому MODE_TICKVALUE для каждого тика.

 
Alexey Viktorov:
Можно, если вы уверены что они не могут быть очень близки по значению. Ведь мягкое с тёплым сравнивают.

Если prom18 нужно сравнить два числа, в пределах Digits знаков, то только такой метод и подходит:

double price1 = 1.23450;
double price2 = 1.23447;

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

Но, как видно, у него разброс еще больше: https://www.mql5.com/ru/forum/160683/page1205#comment_17247843. Поэтому, в примере точность сравнения я специально уменьшил на два знака. Конечно, такой разброс в значениях цен является довольно неточным... Но как ещё сравнивать два числа в подобных случаях?... Если бы отклонение было за Digits, то тогда можно было бы и EqualDoubles не использовать, а отсечь всё лишнее с помощью NormalizeDouble.

Хотя, еще можно сделать так:

int digits = Digits() - 2;

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

if(price1 == price2) {
  ...
}
Причина обращения: