错误、漏洞、问题 - 页 2821

 
Igor Makanu:

正常化不是四舍五入

我在理论上有A+的成绩,如何与双倍的工作等等。NormalizeDouble 算法包含一个错误。提出的话题只是与比较双打有间接关系。

 
fxsaber:

我重复我的问题。

图中显示了非归一化变量n和归一化变量m的值,以及它们之间的差异。但如果你想比较丁字裤,那是你的偏好。

fxsaber:

我知道理论,如何在A+的规模上与双胞胎和类似的东西一起工作。NormalizeDouble算法包含一个错误。提出的话题只是与比较双打有间接关系。

这里肯定离不开森科的解释。
 
NormalizeDouble 只是一种适用于双数的特定算法。不幸的是,这里面有一个错误。如果得到纠正,该错误将消失。所有其他的双重代表性不会有任何改变。
 
fxsaber:

NormalizeDouble算法包含一个错误。

我想A100写过这样的文章

但自MQL以来,开发人员一直坚持使用这一 "功能",唉。


fxsaber:
如果他们更正,错误就会消失。
我想其他的错误会出现,会有很多的噪音))))。
 
Igor Makanu:

我想其他的错误会出现,会有很多的噪音))))。

他们不会的,因为几乎每个人都会通过正常化来比较甚至是正常化的配音。也就是说,他们把它放在他们想要的地方。


在这种情况下,适当的归一化应该总是给出真实的结果。

关于交易、自动交易系统和策略测试的论坛

错误、漏洞、问题

fxsaber, 2020.08.10 11:37

  Print((double)(string)Norm == Norm);    // false

这是对规范化是否正确的唯一检查。如果它总是给人以真实的感觉,就不会有什么破绽。

 
fxsaber:
NormalizeDouble只是一种适用于双数的特定算法。不幸的是,这里面有一个错误。如果得到纠正,该错误将消失。所有其他的双重代表权都不会因此而改变。
我认为这不是函数的问题,而是常量没有被编译器规范化(尽管它们应该被规范化)。
这同样适用于字符串到双数的转换。
 
Alexey Navoykov:
我认为这不是函数的问题,而是常量没有被编译器规范化(尽管它们应该被规范化)。
这同样适用于字符串到双数的转换。

那么,DLL和MQL中的相同常数将不匹配。

 
fxsaber:

那么,DLL和MQL中的相同常数将不匹配。

也是如此。此外,任何归一化都是对准确性的损失,所以我可能在常数的归一化方面走得太远了。
总的来说,我认为这个问题没有一个明确的解决方案。 虽然事实上它不是这样一个问题。
 
Alexey Navoykov:
也是如此。此外,任何规范化都是对准确性的损失,所以我可能在不断地规范化方面做得过头了。
总的来说,这个问题在我看来并没有一个明确的解决方案,尽管在本质上它不是这样一个问题。

只要调整一下目前的归一化算法就可以了。

 
fxsaber:

只要调整一下目前的归一化算法就可以了。

void OnStart() {
   double d1=1.79435;
   double d2=NormalizeDouble(1.79435,5);
   Print(d1==d2);
   Print(is_equal(d1,d2,_Point/2));
}
//+------------------------------------------------------------------+
bool is_equal(double d1, double d2, double e=0.000000001) {return fabs(d1-d2)<e;}

我甚至不知道这是否是算法中的一个错误。
真的,你不能比较双打。只是一个硬性规定。
或者,如Slava所说,通过ε或通过乘法(例如1/_Point),并通过四舍五入转换为int。

只有 四舍五入没有使用标准的round(), ceil(), floor(),因为它们也是返回双数。

或者通过这些,特别是因为它们比普通的工作更快。

int Ceil (double x) {return (x-(int)x>0)?(int)x+1:(int)x;}
int Round(double x) {return (x>0)?(int)(x+0.5):(int)(x-0.5);}
int Floor(double x) {return (x>0)?(int)x:((int)x-x>0)?(int)x-1:(int)x;}

当然,更容易和更快,通过epsilon。

bool is_equal(double d1, double d2, double e=0.000000001) {return fabs(d1-d2)<e;}