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

 
Vladimir Karputov:

А в окне "Окно данных" время такое же?

Да.

 
Andrey Khatimlianskii:

Да.

Ясно. Значит это действительно время бара. Просто у меня было подозрение на параметр "Точная шкала времени".

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

Здравствуйте!
Как правильно в цикле "for" использовать "double"? В справке вроде нету запрета на использование "double". Я так понимаю что надо нормализовать " i ", но мне не получается.

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

Если "expr2=2.6 ", то ещё всё нормально 9 итераций, но уже при "expr2=2.8" показывает не правильно 9 итераций (правильно 10).

 
Nauris Zukas:

Здравствуйте!
Как правильно в цикле "for" использовать "double"? В справке вроде нету запрета на использование "double". Я так понимаю что надо нормализовать " i ", но мне не получается.

Если "expr2=2.6 ", то ещё всё нормально 9 итераций, но уже при "expr2=2.8" показывает не правильно 9 итераций (правильно 10).

Вероятно надо нормализовать значения.

 
Alexey Viktorov:

Вероятно надо нормализовать значения.

Если имели в виду таким образом, то тоже не помогло:

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); i+=NormalizeDouble(step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
 
Nauris Zukas:

Если имели в виду таким образом, то тоже не помогло:

Нет. Как минимум надо оптимизировать это

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

ведь именно это даёт неверное значение. А остальные может и не обязательно.

 
Nauris Zukas:

Здравствуйте!
Как правильно в цикле "for" использовать "double"? В справке вроде нету запрета на использование "double". Я так понимаю что надо нормализовать " i ", но мне не получается.

Если "expr2=2.6 ", то ещё всё нормально 9 итераций, но уже при "expr2=2.8" показывает не правильно 9 итераций (правильно 10).

вот нашел, почитайте пост Николая, очень подробно и очень качественно описал работу с double https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

если материал не усвоится с первого раза, то попробуйте в свой код заменить Print() на printf() с выводом double хотя бы до 15-го знака https://www.mql5.com/ru/forum/1111/page2623#comment_14474138

может быть тогда увидите почему так получается

 
Alexey Viktorov:

Нет. Как минимум надо оптимизировать это

ведь именно это даёт неверное значение. А остальные может и не обязательно.

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

0    10:29:31.595    Test_Double_For EURCHF,H4: i = 1.000000000000000000000000000000000000000000000000000000000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 1.199999999999999955591079014993738383054733276367187500000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 1.399999999999999911182158029987476766109466552734375000000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 1.599999999999999866773237044981215149164199829101562500000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 1.799999999999999822364316059974953532218933105468750000000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 1.999999999999999777955395074968691915273666381835937500000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 2.199999999999999733546474089962430298328399658203125000000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 2.399999999999999911182158029987476766109466552734375000000000
0    10:29:31.595    Test_Double_For EURCHF,H4: i = 2.600000000000000088817841970012523233890533447265625000000000
0    10:29:31.595    Test_Double_For EURCHF,H4:  MaxPass: 10 count: 9
0    10:29:31.595    Test_Double_For EURCHF,H4:  Last i = 2.800000000000000266453525910037569701671600341796875000000000

 
Igor Makanu:

вот нашел, почитайте пост Николая, очень подробно и очень качественно описал работу с double https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

если материал не усвоится с первого раза, то попробуйте в свой код заменить Print() на printf() с выводом double хотя бы до 15-го знака https://www.mql5.com/ru/forum/1111/page2623#comment_14474138

может быть тогда увидите почему так получается

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

 
Nauris Zukas:

 Так остаётся вопрос, "double" можно использовать в цикле 

можно

Nauris Zukas:

и получить всегда правильное количество итераций?

значение double всегда правильное, но оно не соответствует позиционной десятичной системе, которую Вы хотели бы видеть или получить

Nauris Zukas:

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

любые манипуляции с преобразованием double всегда будут иметь ограничения, сомневаюсь, что  эта задача решается в таком виде как в Ваших примерах

делайте надежное решение: в цикле используйте int и формулу по которой будете рассчитывать значение результата double и не используйте сложение double в качестве результата при итерациях в цикле - еще раз посмотрите мой пример в диалоге с Николаем