0

我尝试理解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:002013/11/20 07:00符合我预期的结果

更多详情:

如果我PeriodConverter.mq4从 MT4 运行脚本说我想使用 1FSTE100小时数据并且我想要的周期乘数是 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 是如何获得04:0007: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);
4

1 回答 1

0

考虑以下几点:

  • 在 C# 中,100 万滴答为 1 秒。所以,不应该/ 1800。我们应该使用var sec1 = x.Ticks / (1800 * TimeSpan.TicksPerSecond);
  • BASE 日期时间值在 C# 中为 01.01.0001,而在 MQL4 中为 01-01-1970。
  • 当我们将日期时间值转换为整数时,这是非常重要的区别。
  • 如果我们取integer viTime = TimeCurrent(),viTime 是自 1970 年 1 月 1 日以来 ELAPSED 的秒数。
  • 这个非常重要; vs C# 的 Tick,它是自 01-01-0001 12:00:00 以来经过的 100 纳秒间隔的值。
  • 要在 C# 中获取相同的 MQL4 integer viTime = TimeCurrent(),您需要获取secC# 中的值,然后从中减去sec01-01-1970 的值。
于 2016-02-20T08:59:45.303 回答