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

 
Vladimir Karputov:

数据 窗口中的时间是否相同?

是的。

 
Andrey Khatimlianskii:

是的。

我明白了,所以这真的是酒吧的时间。我只是对"精确的时间线"参数有一个怀疑。

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

你好!
在 "for "循环中使用 "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 "的正确方法是什么?似乎没有禁止在帮助中使用 "双倍"。我明白我必须将 "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 "的正确方法是什么?似乎没有禁止在帮助中使用 "双倍"。我明白,我必须把 "i "规范化,但这对我来说并不奏效。

如果 "expr2=2.6",那么所有的9次迭代都是正常的,但是当 "expr2=2.8 "显示的9次迭代不正确(正确的是10次)。

在这里你可以找到,阅读Nikolay的帖子,非常详细和非常有质量的双https://www.mql5.com/ru/forum/1111/page2623#comment_14473837 的描述。

如果你不能吸收第一遍的材料,试着在你的代码中用printf()代替Print(),输出的双数至少要达到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.00000000000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.19999999999999999955591079014993738305473327636718750000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.399999999999991111182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.599999999999999998667732370449812151491164199829101562500000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 1.79999999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.99999999999997779553950749686919152736638618359375000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.1999999999999997335464740899624302983283996582031250000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.399999999999999999119182158029987476766109466552734375000000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 2.60000000000000888178419700125233890533447265625000000000
0 10:29:31595 Test_Double_For EURCHF,H4: MaxPass: 10 count: 9
0 10:29:31.595 Test_Double_For EURCHF,H4: Last i = 2.8000000000026645259100375697016716003417968750000000

 
Igor Makanu:

在这里,请阅读Nikolay的帖子,他非常详细地描述了双倍的工作,而且质量很好,https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

如果你不能消化第一遍的材料,试着用printf()代替Print(),输出的双数至少要达到15位https://www.mql5.com/ru/forum/1111/page2623#comment_14474138。

也许那时你会明白为什么会这样。

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

 
Nauris Zukas:

所以问题仍然存在,"double "可以在循环中使用

可以

Nauris Zukas:

并总是得到正确的迭代次数?

double的值总是正确的,但它并不对应于你想看到或得到的位置小数系统

Nauris Zukas:

谢谢,我明白为什么会发生这种情况,这就是为什么我试图正常化。这对我来说并不奏效。Alexey Viktorov的选项也没有解决这个问题,数值仍然没有被规范化。

任何带有双重转换的操作都会有局限性,我怀疑这个问题是否能像你的例子那样得到解决。

做一个可靠的解决方案:在循环中使用int和公式来计算双倍的结果值,在循环的迭代过程中不要使用双倍的加法作为结果--再次看看我与尼古拉耶夫对话中的例子吧

原因: