我尝试理解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
符合我预期的结果
更多详情:
如果我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: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);