首页 > 解决方案 > 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 中的错误,还是在幕后发生了一些我还没有完全理解的事情?

标签: timeepochmql4metatrader4

解决方案


关于可能导致此问题的任何想法?

#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()


推荐阅读