来自一个 "傻瓜 "的问题 - 页 69

 
rlx:

一切都能正确转换,没有错误

"MQL5参考/ 语言基础/ 数据类型/ 类型转换 "部分,提到了两件事。

1) long=>double的转换可能会导致精度的损失。

2)允许使用datetime类型而不是long类型(它们各占8个字节)。

我得出的结论是,在理想情况下,转换datetime =>double可能也会导致精度的损失。但我不能举出一个例子。

rlx

为什么不把日期时间存储在indic......or缓冲区的double类型 中?

加入了很多点,或者出现了某种参考。

在这两个词之间多加一个空格:"指标缓冲区"(两个空格),这样更方便。

 
Yedelkin:

"MQL5参考指南/语言基础知识/数据类型/类型转换"部分,提到了两件事。

1) long=>double的转换会导致精度的损失。

2)允许使用datetime类型(每个需要8个字节),而不是long类型。

我得出的结论是,在理想情况下,转换datetime =>double可能也会导致精度的损失。但我不能举例说明。

在两个词之间多加一个空格比较容易:"指标缓冲区"(两个空格)。

写一个简单的转换测试,你自己就会明白。而你可以稍后告诉我们其他人。

 
Vladix:

编写一个简单的转换测试,你自己就会明白。而你可以稍后告诉其他人。

你有一个实质性的答案吗?

rlx 已经给出了一个 "简单的转换测试"。它似乎工作正常。 基于参考材料的疑点在上面概述。如果有不正确的日期时间=>双数转换的例子,请提问。

 
Yedelkin:

是否有一个实质性的答案?

rlx 已经给出了一个 "简单的转换测试"。基于参考材料的疑虑已在上面说明。如果有一个不正确的日期时间=>双数转换的例子,请发给我。

void OnStart()
  {   
   double vDbl = 1.7976931348623158 e+308;
   datetime vTime = (datetime)vDbl;
   
   Print((double)vTime);  
  }

2011.09.25 16:24:38 test (EURUSD,H1) -9.223372036854776e+018

这是一个可能发生问题的例子,但这绝对不是你的情况。

 
Vladix:

2011.09.25 16:24:38 test (EURUSD,H1) -9.223372036854776e+018

这是一个可能发生问题的例子,但这绝对不是你的情况。

祝贺你!活到老,学到老!
 
Vladix:

2011.09.25 16:24:38 test (EURUSD,H1) -9.223372036854776e+018

这是一个可能存在问题的例子,但这绝对不是你的情况。

这不是一个非常正确的例子,因为傻瓜说,玻璃公鸡20分钟(这不是关于你,而是关于那些将使用它的人)。

当前的日期时间值是1316816136这10位数,也就是40年,尾数双数有16位。

因此,mantis double的溢出以及随后从日期时间到double的错误转换将在6*40=240年内发生。

我想我们会有时间来使用它。

 
Yedelkin:
水疗中心!你活了很久,也学了很久!

我现在专门为你整理了一个例子。输出结果如下。

数据时间类型定义到31.12.3000 23:59:59,它是32535215999

1.7976931348623158e+308 以下定义了双倍类型

事实证明,当把数据时间的最大可能值转换为双数时,在有效数字的数量上仍有允许的余地。

因此,结论是它在所有情况下都能正确工作。

Urain

这不是一个很正确的例子,因为它是对一个有玻璃小弟弟的傻瓜说的,时间是20分钟。

这不是一个好的比喻。

这只是一个例子,说明在给出类型 时需要检查数值的边界值,只是作为一个旁证。但同样,情况并非如此。

 

之前的计算我没有做对,更准确的说是在这里:使用15位数字,因为如果有第16位,就会出现转换错误

   long i,l;double d;
   for(i=0;i<999999999999999;i+=365*86400){d=(double)i;l=(long)d;if(i!=l)break;}
   Print("до ",(1970+i/(365*86400))," года datetime в double преобразуется верно");

31711762年数据时间转换为双倍数是正确的

所以我们睡得很好,直到第3100万年。

 

从ex5库中调用导入的函数

请解释一下。阅读https://www.mql5.com/ru/docs/runtime/imports

系统库(DLLs)是根据操作系统的规则加载的。如果该库已经被加载(例如,被另一个专家顾问,甚至从另一个并行运行的客户终端),则调用到已经加载的库。

ex5库是如何被加载的?如果库已经被加载(例如,被另一个专家顾问,甚至从另一个客户终端,平行运行)

为了测试,我已经创建了一个库

lib.mq5。

#property library
int      i=0;

int Get(void) export {return(i++);}

将lib.mq5编译成lib.ex5

创建专家顾问

专家.mq5

#import "lib.ex5"
  int Get(void);
#import
void OnTick()
  {
   Print(Get());
  }

编纂了它。

我把专家顾问放在欧元兑美元上。

它打印的是

0

1

2

3

4

5

将专家顾问(可选)放在英镑兑美元上

印刷品

6 ---来自欧元兑美元专家顾问

0 ---来自GBPUSD专家顾问。

7 ---来自欧元兑美元专家顾问

1 ---来自GBPUSD顾问。

8 ---来自欧元兑美元顾问

2 ---来自GBPUSD顾问。

也就是说,为GBPUSD专家顾问下载了另一份lib.ex5库。

有没有人知道如何打印

6 ---来自欧元兑美元专家顾问

7 ---来自GBPUSD专家顾问。

8 ---来自欧元兑美元专家顾问。

9 ---来自GBPUSD顾问。

10 --- 欧元兑美元顾问

11 ---来自GBPUSD顾问。

只使用MT5的功能

PS//也许我需要以特殊的方式来连接图书馆。

///// 也就是说,我需要这个ex5库被加载一次。

Документация по MQL5: Программы MQL5 / Вызов импортируемых функций
Документация по MQL5: Программы MQL5 / Вызов импортируемых функций
  • www.mql5.com
Программы MQL5 / Вызов импортируемых функций - Документация по MQL5
 

你好。能否请你告诉我。为什么订单和交易有票,而头寸却没有?

那么票据和标识符之间有什么区别呢?