MetaTrader 4脚本如何“标准化”时间?

时间:2016-02-17 07:25:19

标签: c# mt4

我尝试理解 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);

1 个答案:

答案 0 :(得分:0)

考虑以下事项:

  • 在C#中,10mil到1秒。所以,它不应该是/ 1800。我们应该使用var sec1 = x.Ticks / (1800 * TimeSpan.TicksPerSecond);
  • C#中的BASE日期时间值为01.01.0001,而在MQL4中,它是 01-01-1970。
  • 当我们转换日期时间值时,这是非常重要的区别 到整数。
  • 如果我们选择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}的sec值它。