我尝试理解 MetaTrader 4 脚本语言(并将几个脚本转换为C#),所以我开始使用PeriodConverter.mq4
(它随MT4安装一起提供)。 / p>
以下是脚本的值:
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
{1}}(参见下面脚本摘录)。
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如何从04:00
获得07: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);
答案 0 :(得分:0)
考虑以下事项:
/ 1800
。我们应该使用var sec1 = x.Ticks / (1800 * TimeSpan.TicksPerSecond);
integer viTime = TimeCurrent()
,则viTime是数字
自01-01-1970以来已经过了几秒钟。integer viTime = TimeCurrent()
,您需要在C#中获取sec
值,然后从中删除{01}的sec
值它。