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

 

有一个矩阵,充满了大的,大约10e60,和小的,如1e-40的值。而有一个代码是这样的

      for(k=-16;k<=16;++k)
      {
        double Tmp1=(double)(DoubleToString(Matrix[i][j],k));
        double Tmp2=(double)((string)Matrix[i][j]);
        if(Tmp1==Tmp2)
          break;
      }
在大约27%的情况下,k=-15。在其他情况下,k=-16。因此,有一个问题:是否有办法用更严格的转换函数取代(字符串)Matrix[i][j] 操作?或者,也许有一个函数可以截断一些小数位?NormalizeDouble 是不对的,它将把1.12345678e-40截断为0,我希望它在小数点后截断。或者转换为(字符串)有自己的生命,不能通过函数表达?谢谢你。
 
traveller00:

差异的模数。

 
fxsaber:

差异的模数。

你能不能说得更具体一点?也许有一个代码例子?什么和什么之间的区别?

关键是这样的双数转换(double)((string)Matrix[i][j]);; 会在小数点之后截断不可控的字符数。我想保持这种截断=一方面能够重复,另一方面能够控制这个字符数。

 
traveller00:

你能不能说得更具体一点?也许有一个代码例子?什么和什么之间的差异?

if (MathAbs(Value1 - Value2) < Epsilon)
 

啊,我明白你的意思了。不,这个问题有点不同。这里的比较只是作为一个例子来说明,我们不能通过(double)((string)Matrix[i][j]); 来代替通过DoubleToString 的转换。事实上,眼下的任务不是比较。确切地说,是通过这种双重转换,对准确性进行了一定的重置。一方面,我想通过(string) 来重复剪裁,另一方面,我希望能够像DoubleToString 那样控制剪裁的精度。

而作为一个附带的问题,会不会是这些皈依者的做法不同,过着各自不相干的生活?

 
traveller00:

啊,我明白你的意思了。不,这个问题有点不同。这里的比较只是作为一个例子来说明,我们不能通过(double)((string)Matrix[i][j]); 来代替通过DoubleToString 的转换。事实上,眼下的任务不是比较。确切地说,是通过这种双重转换,对准确性进行了一定的重置。一方面,我想通过(string) 来重复剪裁,另一方面,我希望能够像DoubleToString 那样控制剪裁的精度。

顺便说一句,我想知道这些转换是否以不同的方式进行,并过着各自不相关的生活。

我不明白为什么NormalizeDoubleDoubleToString不能满足,它们有你想要的任何精度,或者你想要一些精度,但你不知道它是什么?

 

我同意,这项任务并不完全透明。因为我正试图把某种测试的拐杖放在一起。

说有一个数字1.0123456789e-50。我需要对它进行精确的四舍五入,以便。

1.默认情况下,它通过(字符串) 进行双重转换

2.如果需要,可以控制精度。

因此,NormalizeDouble 是不合适的,它将直接使这个数字无效。而DoubleToString 不允许重复步骤1的结果。

问题是由下一个问题发展而来的。正如我在上面写的,有一个矩阵。该矩阵的逆值被计算出来。有时(也许是由于double的精度限制造成的错误),矩阵变成了退化的,无法计算出逆值。但如果你把精度降低一些,你仍然能够计算出反数。这就是为什么我想进行一些测试,并得到一些统计数字,以确定结果与真实的结果相似的程度。在大多数情况下,通过(字符串) 的双重转换可以解决这个问题。但有时这还不够,我希望能够控制切割的精度。而DoubleToString,即使精度为-16到16,在大多数情况下也不能解决问题。

 

你能告诉我吗,请告诉我。

在指标中,系列的顺序,例如close[],是由ArraySetAsSeries() 设置一次还是以其他方式设置?

是在OnCalculate()还是在OnInit()中完成?

我遇到了一个令人困惑的情况。

close[]中的订单,在第一个tick上被AS_SERIES设置,在下一个tick上自发地改变为正常的,即!AS_SERIES。

我在代码中没有发现任何这样做的理由。

 
Yurixx:

你能告诉我吗,请告诉我。

在指标中,系列的顺序,例如close[],是由ArraySetAsSeries()设置一次还是以其他方式设置?

是在OnCalculate()还是在OnInit()中完成?

我遇到了一个令人困惑的情况。

close[]中的订单,在第一个tick上被AS_SERIES设置,在下一个tick上自发地改变为正常的,即!AS_SERIES。

我没有在代码中找到这个原因。

而且你不会在OnInit()中看到close[] 数组。而其他预定义的OnCalculate()参数 则没有。

因此,结论是--只在OnCalculate()中。

 
Artyom Trishkin:

而在OnInit()中,你不会看到close[] 数组。而其他预定义的OnCalculate()参数都没有。

因此,结论是--只在OnCalculate()中。

我得出了同样的结论。)))

设置一次这个命令就够了,还是应该在每一次交易 中都这样做,还有待观察。