MetaTrader 4 脚本 'normalize' 如何计算时间?
How does MetaTrader 4 script 'normalize' time?
我试图理解 MetaTrader 4 脚本语言(并将几个脚本转换为 C#),所以我从 PeriodConverter.mq4
(它附带MT4 安装 ).
以下是脚本的值:
periodseconds == 1800
Time[start_pos] == 2013/11/20 07:00
这是我无法理解的脚本部分:
//--- normalize open time
rate.time=Time[start_pos]/periodseconds;
rate.time*=periodseconds;
这给了我 2013/11/20 04:00
的结果,而不是我预期的 2013/11/20 07:00
更多详情:
如果我 运行 来自 MT4 的 PeriodConverter.mq4
脚本说我想使用 FSTE100
1 小时数据并且我想要的周期乘数是 5 小时,这将给出 periodseconds
18000
的值(请参阅下面脚本的摘录)。
int i,start_pos,periodseconds;
// Period() == 60 because I'm using a 1hour chart
// InpPeriodMultiplier == 5 because I want 5 hour increments
int i_period=Period()*InpPeriodMultiplier;
periodseconds=i_period*60;
所以,60 * 5 * 60 == 18000
。
如果我现在 运行 使用以下数据的脚本:
2013.11.20,07:00,6669.3,6677.5,6669.3,6674.2,456
rate.time
将是 04:00
但是它是如何得到这个值的呢?我尝试将其转换为 C# 以查看是否可以复制结果
var x = new DateTime(2013, 11, 20, 7, 0, 0);
var ticks1 = x.Ticks / 18000;
var ticks2 = ticks1 * 18000;
DateTime myDateTime = new DateTime(ticks2);
但这给了我与开始时相同的价值 2013/11/20 07:00
那么MT4是如何从07:00
得到04:00
的呢?是否可以在 C# 中复制它?
提前致谢。
在约瑟夫的帮助下,问题已经解决!
这是我的工作测试代码,供任何需要它的人使用
// working with seconds
var x = new DateTime(2013, 11, 20, 7, 0, 0);
// number of seconds since 12:00:00, 01-01-0001
var sec1 = x.Ticks / TimeSpan.TicksPerSecond;
// number of seconds since 12:00:00, 01-01-1970
var sec2 = sec1 - (new DateTime(1970, 1, 1, 0, 0, 0).Ticks / TimeSpan.TicksPerSecond);
// rate.time=Time[start_pos]/periodseconds
var newRateTimeInSeconds = sec2 / 18000;
newRateTimeInSeconds *= 18000;
DateTime myDateTime = new DateTime((newRateTimeInSeconds * TimeSpan.TicksPerSecond) + new DateTime(1970, 1, 1, 0, 0, 0).Ticks);
考虑以下几点:
- 在 C# 中,1000 万滴答为 1 秒。所以,不应该是
/ 1800
。我们应该使用 var sec1 = x.Ticks / (1800 * TimeSpan.TicksPerSecond);
- BASE 日期时间值在 C# 中为 01.01.0001,而在 MQL4 中为
1970 年 1 月 1 日。
- 当我们转换日期时间值时,这是非常重要的区别
到整数。
- 如果我们取
integer viTime = TimeCurrent()
,viTime就是
自 01-01-1970 以来经过的秒数。
- 这非常重要; vs C#的Tick,这是值
自 12:00:00 以来经过的 100 纳秒间隔,
01-01-0001.
- 要在 C# 中获得相同的 MQL4 的
integer viTime = TimeCurrent()
,您需要在 C# 中获得 sec
值,然后从中减去 01-01-1970 的 sec
值。
我试图理解 MetaTrader 4 脚本语言(并将几个脚本转换为 C#),所以我从 PeriodConverter.mq4
(它附带MT4 安装 ).
以下是脚本的值:
periodseconds == 1800
Time[start_pos] == 2013/11/20 07:00
这是我无法理解的脚本部分:
//--- normalize open time
rate.time=Time[start_pos]/periodseconds;
rate.time*=periodseconds;
这给了我 2013/11/20 04:00
的结果,而不是我预期的 2013/11/20 07:00
更多详情:
如果我 运行 来自 MT4 的 PeriodConverter.mq4
脚本说我想使用 FSTE100
1 小时数据并且我想要的周期乘数是 5 小时,这将给出 periodseconds
18000
的值(请参阅下面脚本的摘录)。
int i,start_pos,periodseconds;
// Period() == 60 because I'm using a 1hour chart
// InpPeriodMultiplier == 5 because I want 5 hour increments
int i_period=Period()*InpPeriodMultiplier;
periodseconds=i_period*60;
所以,60 * 5 * 60 == 18000
。
如果我现在 运行 使用以下数据的脚本:
2013.11.20,07:00,6669.3,6677.5,6669.3,6674.2,456
rate.time
将是 04:00
但是它是如何得到这个值的呢?我尝试将其转换为 C# 以查看是否可以复制结果
var x = new DateTime(2013, 11, 20, 7, 0, 0);
var ticks1 = x.Ticks / 18000;
var ticks2 = ticks1 * 18000;
DateTime myDateTime = new DateTime(ticks2);
但这给了我与开始时相同的价值 2013/11/20 07:00
那么MT4是如何从07:00
得到04:00
的呢?是否可以在 C# 中复制它?
提前致谢。
在约瑟夫的帮助下,问题已经解决!
这是我的工作测试代码,供任何需要它的人使用
// working with seconds
var x = new DateTime(2013, 11, 20, 7, 0, 0);
// number of seconds since 12:00:00, 01-01-0001
var sec1 = x.Ticks / TimeSpan.TicksPerSecond;
// number of seconds since 12:00:00, 01-01-1970
var sec2 = sec1 - (new DateTime(1970, 1, 1, 0, 0, 0).Ticks / TimeSpan.TicksPerSecond);
// rate.time=Time[start_pos]/periodseconds
var newRateTimeInSeconds = sec2 / 18000;
newRateTimeInSeconds *= 18000;
DateTime myDateTime = new DateTime((newRateTimeInSeconds * TimeSpan.TicksPerSecond) + new DateTime(1970, 1, 1, 0, 0, 0).Ticks);
考虑以下几点:
- 在 C# 中,1000 万滴答为 1 秒。所以,不应该是
/ 1800
。我们应该使用var sec1 = x.Ticks / (1800 * TimeSpan.TicksPerSecond);
- BASE 日期时间值在 C# 中为 01.01.0001,而在 MQL4 中为 1970 年 1 月 1 日。
- 当我们转换日期时间值时,这是非常重要的区别 到整数。
- 如果我们取
integer viTime = TimeCurrent()
,viTime就是 自 01-01-1970 以来经过的秒数。 - 这非常重要; vs C#的Tick,这是值 自 12:00:00 以来经过的 100 纳秒间隔, 01-01-0001.
- 要在 C# 中获得相同的 MQL4 的
integer viTime = TimeCurrent()
,您需要在 C# 中获得sec
值,然后从中减去 01-01-1970 的sec
值。