(A+B)!=(A+B)

 
TP=Ev.L+minhl/2;
Print(ccount," sell ",DoubleToString(Bid,5)," TP= ", DoubleToString(Ev.L,5)," + ",DoubleToString(minhl/2,5)," = ",DoubleToString(TP,5));
Print(ccount," sell ",DoubleToString(Bid,5)," TP= ", DoubleToString(Ev.L,5)," + ",DoubleToString(minhl/2,5)," = ",DoubleToString(Ev.L+minhl/2,5));

печатает:
620 sell 1.05812 TP= 1.05739 + 0.00025 = 1.05814
620 sell 1.05812 TP= 1.05739 + 0.00025 = 1.05764
                        

Пытаюсь перейти на МТ5, но что-то у меня из всех щелей лезет не пойму что. Не знаю имеет ли это значение, но на всякий случай уточняю: тестирую в тестере стратегий, в режиме "Каждый тик на основе реальных".

первая Печать печатает неверное значение вещественной ТР, полученной сложением вещественных:

TP=Ev.L+minhl/2;

а вторая Печать печатает верное  значение величины  (Ev.L+minhl/2).

Естественно, что с подобными расчетами даже когда не  [Invalid stops], то все равно стопы не такие, как задумано.

Я конечно могу вместо ТП везде поставить (Ev.L+minhl/2), но ведь у меня в коде полно и других  арифметических выражений. 

Что это? баг? или я в синтаксисе что-то не понимаю?

 

Срочно нужно почитать про вещественные числа в языке программирования.

Срочно нужно почитать про то, какие параметры передавать в структуру для открытия/модификации позиций, чтобы не было invalid stops.

Не обижайтесь, но тут проблема не в MT5, а в слабых знаниях в программировании.

 
Leonids Drics:

Пытаюсь перейти на МТ5, но что-то у меня из всех щелей лезет не пойму что. Не знаю имеет ли это значение, но на всякий случай уточняю: тестирую в тестере стратегий, в режиме "Каждый тик на основе реальных".

первая Печать печатает неверное значение вещественной ТР, полученной сложением вещественных:

а вторая Печать печатает верное  значение величины  (Ev.L+minhl/2).

Естественно, что с подобными расчетами даже когда не  [Invalid stops], то все равно стопы не такие, как задумано.

Я конечно могу вместо ТП везде поставить (Ev.L+minhl/2), но ведь у меня в коде полно и других  арифметических выражений. 

Что это? баг? или я в синтаксисе что-то не понимаю?

Отличие ровно в 0,00050 - такое ощущение, что где то еще minhl прибавилось...

 
Leonids Drics:

Пытаюсь перейти на МТ5, но что-то у меня из всех щелей лезет не пойму что. Не знаю имеет ли это значение, но на всякий случай уточняю: тестирую в тестере стратегий, в режиме "Каждый тик на основе реальных".

первая Печать печатает неверное значение вещественной ТР, полученной сложением вещественных:

а вторая Печать печатает верное  значение величины  (Ev.L+minhl/2).

Естественно, что с подобными расчетами даже когда не  [Invalid stops], то все равно стопы не такие, как задумано.

Я конечно могу вместо ТП везде поставить (Ev.L+minhl/2), но ведь у меня в коде полно и других  арифметических выражений. 

Что это? баг? или я в синтаксисе что-то не понимаю?

все используемые переменные точно double ? 

и повысьте точность при отладочной печати, DoubleToString(xxx,8)

 
Leonids Drics:

Что это? баг? или я в синтаксисе что-то не понимаю?

Приведение типов при вычислении ТР.

TP=Ev.L+minhl/2;
// заменить на
TP=Ev.L+minhl/2.0;
// или на
TP=Ev.L+(double)minhl/2;
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Код:

int OnInit()
{
   double EV    = 50.0000099;
   double minhl =  0.0000001;
   double Bid =  199.999995;
   double tp = EV + minhl / 2;
   
   int digits = 5;

   Print(digits, " TP: sell ", DoubleToString(Bid, digits), " TP= ", DoubleToString(EV, digits), " + ", DoubleToString(minhl / 2, digits), " = ", DoubleToString(tp, digits));
   Print(digits, " CALC: sell ", DoubleToString(Bid, digits), " TP= ", DoubleToString(EV, digits), " + ", DoubleToString(minhl / 2, digits), " = ", DoubleToString(EV + minhl / 2, digits));

   digits = 8;

   Print(digits, " TP: sell ", DoubleToString(Bid, digits), " TP= ", DoubleToString(EV, digits), " + ", DoubleToString(minhl / 2, digits), " = ", DoubleToString(tp, digits));
   Print(digits, " CALC: sell ", DoubleToString(Bid, digits), " TP= ", DoubleToString(EV, digits), " + ", DoubleToString(minhl / 2, digits), " = ", DoubleToString(EV + minhl / 2, digits));

   return(INIT_SUCCEEDED);
}


Результат:


2023.04.01 17:52:37.354 PriceChange (AUDCADrfd,H1)      5 TP: sell 200.00000 TP= 50.00001 + 0.00000 = 50.00001
2023.04.01 17:52:37.354 PriceChange (AUDCADrfd,H1)      5 CALC: sell 200.00000 TP= 50.00001 + 0.00000 = 50.00001
2023.04.01 17:52:37.354 PriceChange (AUDCADrfd,H1)      8 TP: sell 199.99999500 TP= 50.00000990 + 0.00000005 = 50.00000995
2023.04.01 17:52:37.354 PriceChange (AUDCADrfd,H1)      8 CALC: sell 199.99999500 TP= 50.00000990 + 0.00000005 = 50.00000995


Вывод:

ТС привел не весь код, а вырезал что-то, вставил что-то. Гадание на магическом шаре не дало точного ответа, почему у автора получились разные значения.

 
Forester #:

Отличие ровно в 0,00050 - такое ощущение, что где то еще minhl прибавилось...

Нет, отличия  самые разные, вот несколько примеров, причем последний,  2256-ой - правильно подсчитано




CO      0       18:17:46.583    Core 1  2023.03.01 02:02:28   1 sell 1.05733 TP= 1.05713 + 0.00025 = 0.00000
IS      0       18:17:46.583    Core 1  2023.03.01 02:02:28   1 sell 1.05733 TP= 1.05713 + 0.00025 = 1.05738

IH      0       18:17:46.583    Core 1  2023.03.02 12:02:11   13 sell 1.06218 TP= 1.06191 + 0.00025 = 1.05704
FL      0       18:17:46.583    Core 1  2023.03.02 12:02:11   13 sell 1.06218 TP= 1.06191 + 0.00025 = 1.06216

HO      0       18:18:17.105    Core 1  2023.03.28 09:45:32   2556 sell 1.08081 TP= 1.07133 + 0.00025 = 1.07158
LL      0       18:18:17.105    Core 1  2023.03.28 09:45:32   2556 sell 1.08081 TP= 1.07133 + 0.00025 = 1.07158
 
Alexander Sevastyanov #:

Приведение типов при вычислении ТР.

попробовал ваши варианты, результат идентичный:

ER      0       14:58:34.804    Core 1  2023.03.02 12:02:11   13 sell 1.06218 TP= 1.06191 + 0.00025 = 1.05704
JF      0       14:58:34.804    Core 1  2023.03.02 12:02:11   13 sell 1.06218 TP= 1.06191 + 0.00025 = 1.06216

 
Maxim Kuznetsov #:

все используемые переменные точно double ? 

и повысьте точность при отладочной печати, DoubleToString(xxx,8)

да, все double, и чем мне поможет 8 знак, когда уже в третьем ошибка?

 
Leonids Drics #:

да, все double, и чем мне поможет 8 знак, когда уже в третьем ошибка?

на 2 не надо делить

делите на 2.0

убедитесь, это не одно и то же
 
Leonids Drics:

Пытаюсь перейти на МТ5, но что-то у меня из всех щелей лезет не пойму что. Не знаю имеет ли это значение, но на всякий случай уточняю: тестирую в тестере стратегий, в режиме "Каждый тик на основе реальных".

первая Печать печатает неверное значение вещественной ТР, полученной сложением вещественных:

а вторая Печать печатает верное  значение величины  (Ev.L+minhl/2).

Естественно, что с подобными расчетами даже когда не  [Invalid stops], то все равно стопы не такие, как задумано.

Я конечно могу вместо ТП везде поставить (Ev.L+minhl/2), но ведь у меня в коде полно и других  арифметических выражений. 

Что это? баг? или я в синтаксисе что-то не понимаю?

Попробуй получение значения в переменную Ev.L получать перед выражением TP=.....
Есть подозрение что в этой переменной происходит подмена значения пока выполняются функции приведения и принта.
Причина обращения: