2016-02-17 1 views
0

Я пытаюсь понять язык сценариев 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); 

ответ

0

Рассмотрим следующее:

  • В C#, 10mil клещей на 1 секунду. Таким образом, это не должно быть / 1800. Мы должны использовать var sec1 = x.Ticks/(1800 * TimeSpan.TicksPerSecond);
  • Значение даты и времени BASE 01.01.0001 в C#, а на MQL4 - 01-01-1970.
  • Это очень важное отличие, когда мы преобразуем значение datetime в целое число.
  • Если мы возьмем integer viTime = TimeCurrent(), viTime - это номер секунд ELAPSED с 01-01-1970.
  • Это ОЧЕНЬ важно; vs C#, который представляет собой значение 100-наносекундные интервалы, прошедшие с 12:00:00, 01-01-0001.
  • Чтобы получить тот же MQL в C#, вам нужно получить значение sec в C#, а затем вычесть из него значение sec 01-01-19708.
+0

Это отсортировано! – DavidO

Смежные вопросы