向MQL4大师们提问。还是关于双倍比较。 - 页 2

 
再一次。

价格、地段、金钱--固定的精度。
指标是浮动的。

这种差异在本质上是,虽然双倍被用来代表这两种情况。它实际上决定了你所谓的 "编程风格"。
同样,每个人的 "正确性 "标准是不同的。例如,根据我的理解,NormalizeDouble()是一个效率低得可笑的函数,因此也是绝对不必要的。
 
komposter:
//--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal( double value1, double value2, int precision = 8 )
{
    return( nd( abs( nd( value1, precision ) - nd( value2, precision ) ), precision ) < nd( MathPow( 0.1, precision ), precision ) );
}
代码很清晰,你的例子也很说明问题!而这一次是一个小插曲。
nd( MathPow( 0.1, precision ), precision )
把它改为
//--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal( double value1, double value2, int precision = 8 )
{
    return( nd(nd( abs( nd( value1, precision ) - nd( value2, precision ) ), precision )), precision ) == 0.0 );
}
还是错了?
 
Irtron:
将数字与双精度进行比较的问题很牵强,来自于对数学的基本无知。
但以令人羡慕的毅力,它在论坛上出现了。
要么给出如何解决这个 "问题 "的明确指示,要么二者之一=)

Irtron
但会有性能问题。
有什么建议吗(用户级别,不是MT开发者级别)?
 
komposter:
有什么建议吗(用户级别,不是MT开发者级别)?
例如,对于价格。出价,有,询问,停止。
int ComparePrice(double a, double b)
{
    a -= b;
    b = Point / 2.;
    if (a > b)
        return (1);
    if (a < -b)
        return (-1);
    return (0);
}
通常情况下,用整数进行所有批次和级别的计算会更好。原则上要快很多倍,而且没有采样误差。
 
Irtron:
再一次。

价格、地段、金钱--固定的精度。
指标是浮动的。

这种差异在本质上是,虽然双倍被用来代表这两种情况。它实际上决定了你所谓的 "编程风格"。
同样,每个人的 "正确性 "标准是不同的。例如,根据我的理解,NormalizeDouble()是一个效率低得可笑的函数,因此也是绝对不必要的。
最近,在某个主题中(我不记得具体内容),一个人在抱怨专家顾问的奇怪操作。而事实证明,即使是为他的订单从服务器上取下的价格,也仍然需要进行规范化处理!
此后,我简单地将NormalizeDouble()作为一个强制性程序。我确实还没有很好地理解代码有时是如何工作的,这就是为什么我对应该如何做感兴趣。
你建议用什么方法来代替NormalizeDouble()?
 
Irtron:
康帕斯
有什么建议吗(在用户层面,而不是MT开发者层面)?
例如,对于价格。出价,有,询问,停止。
int ComparePrice(double a, double b)
{
    a -= b;
    b = Point / 2.;
    if (a > b)
        return (1);
    if (a < -b)
        return (-1);
    return (0);
}
通常情况下,用整数进行所有批次和级别的计算会更好。原则上要快很多倍,而且没有采样误差。
我同意,在欧米茄,一切都在INT中。你是否建议先将MT中的所有内容转换为INT,然后再进行计算?
P.S. 而你的ComparePrice是一个非常有趣的解决方案,我甚至没有马上得到它。
ComparePriceComparePrice
 
Irtron:
再一次。

价格、地段、金钱--固定的精度。
指标是浮动的。

这种差异在本质上是,虽然双倍被用来代表这两种情况。它实际上决定了你所谓的 "编程风格"。
同样,每个人的 "正确性 "标准是不同的。例如,根据我的理解,NormalizeDouble()是一个效率低得可笑的函数,因此也是绝对不必要的。

首先,在自己的订单上写几个专家顾问,感受一下客户的风吹草动,止损突然变成了1个点的错误。然后向他们解释NormalizeDouble()函数的荒谬之处,我想知道它对你来说会有什么效果=)
 
VBAG:
而事实证明,即使是从你的订单中从服务器中提取的价格也仍然需要规范化!!。
不太可能(c)。MT的内脏几乎不可能正常化。
过去和现在都有很多人在谈论,当用不理解的历史数据进行测试时,该EA的表现令人难以理解。
 
Irtron:
例如,对于价格。出价,有,询问,停止。
这已经很了不起了。越来越具体了;)
如果你采取价格比较,你不需要像我这样的超载函数。

而在简化的形式下,它的工作速度与ComparePrice一样快。
int start()
{
    double a = 1.23450001, b = 1.23449999;
    int start1 = GetTickCount(), c1;
    for ( c1 = 0; c1 < 100000000; c1 ++ ) ComparePrice( a, b );
    int end1 = GetTickCount();
    
    int start2 = GetTickCount(), c2;
    for ( c2 = 0; c2 < 100000000; c2 ++ ) equal( a, b );
    int end2 = GetTickCount();
 
    Print( "ComparePrice: ", (end1-start1), ", equal: ", (end2-start2) );
 
    return(0);
}
 
int ComparePrice(double a, double b)
{
    a -= b;
    b = Point / 2.;
    if (a > b)
        return (1);
    if (a < -b)
        return (-1);
    return (0);
}
 
bool equal( double a, double b )
{
    return( MathAbs( a - b ) < Point );
}
2007.09.10 03:19:24 CheckCompareDoubleSpeed GBPUSD,Daily: ComparePrice:20922, equal:20453
 
Integer:

首先,在自己的订单上写几个专家顾问,感受一下客户的风暴,因为止损突然变成了1个点的错误......然后向他们解释NormalizeDouble()函数的荒谬性,我想知道它对你来说会有什么效果=)

让我告诉你一个秘密。
我已经写了许多定制的专家顾问,比开始需要的还要多。 我从来没有感觉到购买它们的冲动,因为我从来没有给过任何理由这样做。我的程序中的止损保证在(而不是 "出现")它应该在的位置。相应地,我不需要向客户解释任何东西,特别是关于一些非常具体的功能。在我看来,编写EA的全部意义在于为客户摆脱这种问题和解释。