【发布时间】:2020-05-07 13:14:06
【问题描述】:
我正在使用在 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 中的错误,还是我还没有完全理解的幕后发生的事情?
【问题讨论】:
标签: time epoch mql4 metatrader4