mql4语言的特点、微妙之处以及技巧 - 页 30

 
Nauris Zukas:

你好!
在 "for "循环中使用 "double "的正确方法是什么?似乎没有禁止在帮助中使用 "双倍"。

总之,我的结论是,在"for"循环中不推荐使用 "double",因为每次迭代后ExpressionZ缺乏正常化。这至少会导致2个问题:
1)错误的迭代次数;
2)如果你在语句中使用ExpressionZ进行计算,会导致错误的结果。

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

谢谢你,我明白为什么会发生这种情况,这就是为什么我试图正常化。这对我来说并不奏效。Alexey Viktorov的选项也没有解决这个问题,数值仍然是非标准化的。 所以问题仍然存在,"double "可以在一个循环中使用,并且总是得到正确的迭代次数吗?

用10乘以合适的度数,直到你得到整数。起初我也很纠结,现在我甚至把价格转换为整数,用整数或四舍五入的方法来工作。我有更少的错误,更好的可读性。

一般来说,正如一位程序员在收到交换器的摘要后说的那样,我不明白为什么某位数容量的数字要用实数表示,而不是整数。这在逻辑上是不正确的。))))

 
Valeriy Yastremskiy:

用10乘以合适的度数,直到你得到整数。起初我也很纠结,但现在我甚至把价格转换为整数,并以整数或四舍五入的方式工作。我有更少的错误,更好的可读性。

一般来说,正如一位程序员在收到交换器的摘要后说的那样,我不明白为什么某位数容量的数字要用实数表示,而不是整数。这在逻辑上是不正确的。))))

谢谢,我将用老方法使用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:

正确的代码

注意不要把步骤=0.04;)

 
Andrey Khatimlianskii:

注意不要把步骤=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

它不起作用...

原因: