time - MetaTrader 4 / MQL4 时间关闭 -5 小时,但仅在使用 epoc 时间时
问题描述
我正在使用在 Ubuntu 16.04 的 WINE 中运行的 MetaTrader4。我有一个简单的内联函数,可以使用这一行将时间和各种其他信息保存到文件中:
FileWrite(data_filehandle, "sys_time:" + (string)TimeLocal() + "." + StringFormat("%06lu", usec_instance) + ", sym:" + (string)Symbol() + ", tick_time:" + (string)last_tick.time + ", ask:" + (string)last_tick.ask + ", bid:" + (string)last_tick.bid);
使用指令:
#property strict
将导致它以日期时间格式输出时间。删除该指令将导致它以 epoc 格式输出时间。
当它使用日期时间格式(使用 '#property strict' )时,时间是正确的。
它输出:
sys_time:2020.01.21 07:38:02.994394, sym:EURUSD, tick_time:2020.01.21 14:38:03, ask:1.1104, bid:1.1103
这与我的系统时间正确匹配。
现在,如果我删除“#property strict”以切换到 epoc 时间
它输出:
sys_time:1579592538.630395, sym:EURUSD, tick_time:1579617738, ask:1.1105, bid:1.11041
我的当地时间是:
$ date '+%s'
1579610544
$ date '+%Z %z'
EST -0500
我的时间:1579610544 - MT4 LocalTime:1579592538 = 18006 秒(比我晚 5 小时 6 秒)
关于可能导致这种情况的任何想法?如果是 +5 小时,我可能会稍微不那么困惑,因为那是格林威治标准时间。但它是 -5 小时,这是夏威夷。另外...为什么一种格式的时间正确,而另一种格式的时间不正确?
附加信息
我使用额外的 MQL4 函数运行了更多测试。我让他们不断地将结果输出到我的文本文件中。然后我迅速将一个 BASH 脚本拼凑起来以检查结果。我发现了以下内容:
在 MT4 中使用此代码
FileWrite(data_filehandle, "TimeDaylightSavings(): " + (string)TimeDaylightSavings());
FileWrite(data_filehandle,"TimeLocal(): "+(string)TimeLocal());
FileWrite(data_filehandle,"TimeGMTOffset(): "+(string)TimeGMTOffset());
FileWrite(data_filehandle,"TimeGMT(): "+(string)TimeGMT()+"\n\n");
将此输出提供给我的文本文件(大约每秒一个新记录):
TimeDaylightSavings(): 0
TimeLocal(): 1579601184
TimeGMTOffset(): 18000
TimeGMT(): 1579619184
我启动了这个 BASH 脚本来实时扫描和检查结果:
#!/bin/bash
IFS=$'\n'$'\b';
while true
do
my_time=$(date);
my_epoc=$(date '+%s');
my_record="$( cat EURUSD_price_data.txt| dos2unix | tail -5 )";
mt4_time_local=$( echo "$my_record" | grep -w 'TimeLocal' );
echo "Reading line: $mt4_time_local";
mt4_time_local=$(echo $mt4_time_local | awk '{print $2}' );
echo "My time: $my_time -- My epoc: $my_epoc -- MT4_TimeLocal epoc: $mt4_time_local -- Difference: $(( $my_epoc - $mt4_time_local ))";
mt4_time_GMT=$( echo "$my_record" | grep -w 'TimeGMT' );
echo "Reading line: $mt4_time_GMT";
mt4_time_GMT=$(echo $mt4_time_GMT | awk '{print $2}' );
echo "My time: $my_time -- My epoc: $my_epoc -- MT4_TimeGMT epoc: $mt4_time_GMT -- Difference: $(( $my_epoc - $mt4_time_GMT ))";
echo "";
sleep 1;
done
并得到了这个结果:
Reading line: TimeLocal(): 1579601184
My time: Tue Jan 21 10:06:25 EST 2020 -- My epoc: 1579619185 -- MT4_TimeLocal epoc: 1579601184 -- Difference: 18001
Reading line: TimeGMT(): 1579619184
My time: Tue Jan 21 10:06:25 EST 2020 -- My epoc: 1579619185 -- MT4_TimeGMT epoc: 1579619184 -- Difference: 1
现在,如果我添加“#property strict”以切换回日期时间格式,我会得到:
TimeDaylightSavings(): 0
TimeLocal(): 2020.01.21 10:23:56
TimeGMTOffset(): 18000
TimeGMT(): 2020.01.21 15:23:56
我的系统时间:
$ date
Tue Jan 21 10:23:57 EST 2020
结论
由于某种原因,当获得 epoc 时间 TimeLocal() 给出了错误的时间(夏威夷时间出于某种原因),但令人惊讶的是 TimeGMT() 给出了正确的时间,即使我在 EST 时区。
使用完全相同的代码和设置,当获取日期时间格式的时间(使用“#property strict”指令)时,情况正好相反。TimeLocal() 给出了正确的时间, TimeGMT() 给出了错误的时间(但至少它给出了正确的 GMT 时间)
这是 MT4 中的错误,还是在幕后发生了一些我还没有完全理解的事情?
解决方案
问:关于可能导致此问题的任何想法?
这#property strict
是一个编译器阶段的终止开关,它改变了许多细节,在语法上正确的 MQL4 组合将如何在 { " old " | “新”}-时尚
(每次更新MT4 IDE后不阅读这部分文档可能会让您感到惊讶,所以最好在每次更新后重新阅读)
“旧” -MQL4 用于int32
内部datetime
存储,“新” -MQL4.56789... 使用int64
,因此任何翻转都更远。
FileWrite( data_filehandle, "sys_time:"
+ (string)TimeLocal() // localhost-dependent
+ "."
+ StringFormat( "%06lu", usec_instance )
+ ", sym:"
+ (string)Symbol()
+ ", tick_time:"
+ (string)last_tick.time // Fx-QUOTE-dependent
+ ", ask:"
+ (string)last_tick.ask
+ ", bid:"
+ (string)last_tick.bid
);
有关其他内置选项,请参见TimeGMT()
和。TimeGMTOffset()
推荐阅读
- python - 在linux中将csv文件加载到数据库中
- css - 从另一个css文件导入样式元素时如何排除样式元素
- javascript - 当将 elasticsearch 与 d3.js 集成时,“未捕获的类型错误:无法读取未定义的属性‘客户端’”我收到此错误
- postgresql - 我应该给 Flyway 哪些 Postgres 特权?
- php - PDO对象的最佳利用
- angular - 2个时间间隔之间的mongodb聚合
- c# - 如何使用 C# Web 应用程序使用和重定向 JWT 令牌 URL \login\login.php?token=jwt.goes.here
- bash - 如何在 awk 命令中读取和使用文本文件值(逗号分隔或行分隔)
- java - 从 Android 外部存储读取文件时出现 NullPointerException
- angular - 如何将条件片段及其值添加到Angular 5中的锚html标签