Я пытаюсь понять язык сценариев MetaTrader (и конвертировать несколько скриптов в C#), поэтому я начал с PeriodConverter.mq4
(он поставляется с установкой MT4).Как скрипт MetaTrader 4 «нормализует» время?
Ниже приведены значения для сценария:
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
скрипт из МТ4 говоря, что я хочу использовать данные 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 получить 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);
Это отсортировано! – DavidO