Особенности языка mql4, тонкости и приёмы работы - страница 30

 
Nauris Zukas:

Здравствуйте!
Как правильно в цикле "for" использовать "double"? В справке вроде нету запрета на использование "double".

Короче мои выводы, "double" не рекомендуется использовать в цикле "for" из за отсутствие нормализовать ВыражениеЗ после каждой итерации. Это может привести как минимум к 2 проблемам:
1) Не правильное количество итерации;
2) Не правильные результаты если использовать ВыражениеЗ для расчётов в операторе.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации. могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено...
 
Nauris Zukas:

Спасибо, я понимаю почему так происходит, поэтому и пытался нормализовать. Мне не получилось. Alexey Viktorov вариант тоже не исправил положение, значения остаются не нормализованными.  Так остаётся вопрос, "double" можно использовать в цикле и получить всегда правильное количество итераций?

умножьте на 10 в нужной степени до получения целых чисел. Сперва тоже мучался, Счас даже цену привожу к целому и работаю с целыми числами или с округлениями (round) до целых. Ошибок меньше, читабельность лучше.

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

 
Valeriy Yastremskiy:

умножьте на 10 в нужной степени до получения целых чисел. Сперва тоже мучался, Счас даже цену привожу к целому и работаю с целыми числами или с округлениями (round) до целых. Ошибок меньше, читабельность лучше.

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

Спасибо, я по старинке int буду использовать, а потом уже делить для double. ;)

 
Nauris Zukas:

Спасибо, но ваш пример тоже не дал правильный результат. В printf видно что нормализация не происходит:

Извините, надо было проверить. А так получилось «Хотел как лучше, а получилось как всегда»

Результат

2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       MaxPass: 10 count: 10 i: 3.0

Правильный код

/********************Script program start function*******************/
double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
int count=0;
void OnStart()
 {
  for(i=expr1; i<=expr2; i=NormalizeDouble(i+step, 1))
   {
    count++;
    Print(" i: ", DoubleToString(i, 1), " step: ", DoubleToString(step, 1));
   }
  int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step), 0)+1;
  Print(" MaxPass: ", MaxPass, " count: ", count, " i: ", i);
 }/*******************************************************************/
 
Alexey Viktorov:

Правильный код

Осторожно, не поставьте step=0.04 ;)

 
Andrey Khatimlianskii:

Осторожно, не поставьте step=0.04 ;)

Это совет только тем кто не умеет пользоваться мозгами.)))

 
Alexey Viktorov:

Извините, надо было проверить. А так получилось «Хотел как лучше, а получилось как всегда»

Результат

Правильный код

i=NormalizeDouble(i+step, 1)

Ах, спасибо! Сам я так не додумался. Вот это как раз те тонкости, которые нам новичкам помогает в программирование! ;)

 
я ищу методы сортировки массива структур. Есть у кого то рабочие Варианты ?
 
Vladimir Pastushak:
я ищу методы сортировки массива структур. Есть у кого то рабочие Варианты ?

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.04.19
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
fxsaber:

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

Не работает...

Причина обращения: