错误、漏洞、问题 - 页 1932

 
Комбинатор:

一般来说,十进制类型会很有用,这是一个很方便的东西。

是的,从MT开始,它在与价格有关的软件中的缺席至少可以说是令人困惑的。

PS。现在,随着OOP语言的存在,MQ可能认为那些愿意的人可以为自己写一个类。只是你不能在事后把它放到一个简单的结构 中--你必须把它序列化/反序列化成像ulong这样简单的东西。
 
Slava:

我确实非常感谢你如此详细的回答。归一化被用来生成交易请求

// Point = 0.001, Digits = 3
OrderSend(8274 * Point);
OrderSend(NormalizeDouble(8274 * Point, Digits));

在这个例子中,似乎在这两个OrderSend中发送了不同的价格。

一直以来,人们都认为整数乘以点不需要额外的规范化(例如,SL和TP就是这样设定的)。

那么,这两行中哪一行会导致错误?

 
Stanislav Korotky:

是的,至少可以说,自MT诞生之初,在与价格有关的软件中就没有它的身影,这是很尴尬的。

不可能是没有人在SD中写作
 
fxsaber:

我确实非常感谢你如此详细的回答。归一化被用来生成交易请求

在这个例子中,似乎在这两个OrderSend中发送了不同的价格。

一直以来,人们都认为整数乘以点不需要额外的规范化(例如,SL和TP就是这样设定的)。

那么,这两行中的哪一行会导致错误?

#include <MT4Orders.mqh>

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);  
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
  
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Num, 0, 0, 0);
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Norm, 0, 0, 0);
}

结果

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

这两个查询的价格不同,但执行起来没有问题,价格相同。怎么说呢?

 
fxsaber:

结果

这两个查询的价格不同,但在同一价格下执行起来没有问题。这怎么可能呢?

很简单,从double的角度来看,这些数字是相同的,因为double存储了52位尾数或15位小数。后续位的正负之差不算数。这里有一篇关于hubra的文章

 
Stanislav Korotky:

很简单,从double的角度来看,这些数字是一样的,因为double存储了52位的尾数或15位小数。后面数字的正负之差不计算在内。这里有一篇关于hubra的文章

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber, 2017.07.19 13:00

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}

И?

 

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

虫子,虫子,问题

fxsaber, 2017.07.17 21:49

如果你在一次运行中点击 "停止",OnDeinit和析构器不会被调用。

这是一个缺陷还是一个错误?

现在,按下 "停止 "按钮会导致与代理的硬断开连接。难到不等完成一次运行就不可能看到报告。

在MT4中,你可以随时看到未完成的单笔交易的交易历史。但在MT5中,没有办法。

是否有可能不硬性终止连接,而是向Agent发送一个标志,该标志可以被捕获并执行OnDeinit?

 
Stanislav Korotky:

И?

斯坦尼斯拉夫-科罗茨基

很简单,从double的角度来看,这些数字是一样的,因为double存储了52位的尾数或15位小数后续位的正负之差不计算在内。这里有一篇关于hubra的文章

差异大于1e-15。此外,Num != Norm。它们是不同的数字,不是同一个。
 
Stanislav Korotky:

И?

实际上我同意,如果我们设置一个字头,那么它的双倍表示法被字头中的数字数规范化是合乎逻辑的。