#include <MT4Orders.mqh>
voidOnStart()
{
constdouble Num = 8.274;
constdouble Norm = NormalizeDouble(Num, 3);
Print(Num); // 8.273999999999999Print(Norm); // 8.274000000000001Print((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
一般来说,十进制类型会很有用,这是一个很方便的东西。
是的,从MT开始,它在与价格有关的软件中的缺席至少可以说是令人困惑的。
PS。现在,随着OOP语言的存在,MQ可能认为那些愿意的人可以为自己写一个类。只是你不能在事后把它放到一个简单的结构 中--你必须把它序列化/反序列化成像ulong这样简单的东西。我确实非常感谢你如此详细的回答。归一化被用来生成交易请求。
在这个例子中,似乎在这两个OrderSend中发送了不同的价格。
一直以来,人们都认为整数乘以点不需要额外的规范化(例如,SL和TP就是这样设定的)。
那么,这两行中哪一行会导致错误?
是的,至少可以说,自MT诞生之初,在与价格有关的软件中就没有它的身影,这是很尴尬的。
我确实非常感谢你如此详细的回答。归一化被用来生成交易请求。
在这个例子中,似乎在这两个OrderSend中发送了不同的价格。
一直以来,人们都认为整数乘以点不需要额外的规范化(例如,SL和TP就是这样设定的)。
那么,这两行中的哪一行会导致错误?
酷
结果
这两个查询的价格不同,但执行起来没有问题,价格相同。怎么说呢?
酷
结果
这两个查询的价格不同,但在同一价格下执行起来没有问题。这怎么可能呢?
很简单,从double的角度来看,这些数字是相同的,因为double存储了52位尾数或15位小数。后续位的正负之差不算数。这里有一篇关于hubra的文章。
很简单,从double的角度来看,这些数字是一样的,因为double存储了52位的尾数或15位小数。后面数字的正负之差不计算在内。这里有一篇关于hubra的文章。
fxsaber, 2017.07.19 13:00
И?
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
fxsaber, 2017.07.17 21:49
如果你在一次运行中点击 "停止",OnDeinit和析构器不会被调用。
这是一个缺陷还是一个错误?
现在,按下 "停止 "按钮会导致与代理的硬断开连接。难到不等完成一次运行就不可能看到报告。
在MT4中,你可以随时看到未完成的单笔交易的交易历史。但在MT5中,没有办法。
是否有可能不硬性终止连接,而是向Agent发送一个标志,该标志可以被捕获并执行OnDeinit?
И?
很简单,从double的角度来看,这些数字是一样的,因为double存储了52位的尾数或15位小数。后续位的正负之差不计算在内。这里有一篇关于hubra的文章。
И?
实际上我同意,如果我们设置一个字头,那么它的双倍表示法被字头中的数字数规范化是合乎逻辑的。