Торговые сессии или насколько важно время - страница 9

 

Вот несколько полезных функций для работы со временем (можно определять, действует летнее или зимнее время на любую дату).

#property copyright "Erics"
#property link      "erics.fx@tut.by"

#define EUR 0
#define USA 1

//+------------------------------------------------------------------+
//| скрипт, демонстрирующий использование некоторых функций времени  |
//+------------------------------------------------------------------+

void start()
{
  int tl = TimeLocal();
  MessageBox("Сейчас: " + TimeToStr(tl) + ", летнее время = " + getDST(EUR, tl) +
             "\n\n20.03.2008 0:00, летнее время в Европе  = " + getDST(EUR, MTtime(DateSerial(2008,3,20))) +
             "\n20.03.2008 0:00, летнее время в Америке = " + getDST(USA, MTtime(DateSerial(2008,3,20))) +
             "\n\n1.04.2008 0:00, летнее время в Европе  = " + getDST(EUR, MTtime(DateSerial(2008,4,1))) +
             "\n1.04.2008 0:00, летнее время в Америке = " + getDST(USA, MTtime(DateSerial(2008,4,1))));
}

int MTtime(double serialTime)
{ // переводит дату/время, заданную в днях от 1900 года (Windows)
  // в дату, заданную в секундах от 1970 года (Unix)
  return(86400.*(serialTime - 25569.));
}

int DateSerial(int yyyy, int mm, int dd)
{ // возвращает дату в формате Windows (от 1.01.1900 г.)
  yyyy -= 1900; mm++;
  if (mm < 4) { mm += 12; yyyy--; }
  int res = MathFloor(365.25*yyyy) + MathFloor(30.6*mm) + dd - 62;
  return(res);
}

int getDST(int country, int time)
{ // Daylight Saving Time - возвращает 1, если на время time действует летнее время и 0 - если поясное (зимнее) время
  int DSTstarts, DSTends, y, yr = TimeYear(time);

  switch(country)
  {
    case EUR:
      // летнее время в Европе и России начинается в последнее восресенье марта, в 2 часа ночи
      y = MathFloor(1.25 * yr + 4.);
      DSTstarts = MTtime(DateSerial(yr, 3, 31 - y % 7) + 2./24.);
      // летнее время в Европе и России заканчивается в последнее восресенье октября, в 3 часа ночи
      y = MathFloor(1.25 * yr + 1.);
      DSTends   = MTtime(DateSerial(yr,10, 31 - y % 7) + 3./24.);
      break;

    case USA:
      // летнее время в США и Канаде с 2007 г. начинается во второе восресенье марта, в 3 часа ночи
      y = MathFloor(1.25 * yr + 1.);
      DSTstarts = MTtime(DateSerial(yr, 3, 14 - y % 7) + 3./24.);
      // летнее время в США и Канаде с 2007 г. заканчивается в первое восресенье ноября, в 3 часа ночи
      DSTends   = MTtime(DateSerial(yr,11, 7 - y % 7) + 3./24.);
      break;
  }  
  if (time>=DSTstarts && time<=DSTends) return(1); else return(0);
}

P.S. В Америке до 2007 переход на DST и обратно совпадал по времени с Европой. Используйте EUR при вызове.

Если кто переделает это в библиотеку, готов помочь (азия, австралия).

Файлы:
 

Я тоже делал функции DST для Европы и США, возвращают true для летнего и false для зимнего времени. Они рассчитаны на работу со временем сервера, для США только начиная с 2007 г.

//+------------------------------------------------------------------+
bool DST_EU(int CurrentTime) {
  int CurMonth = TimeMonth(CurrentTime);
  int CurDayOfWeek; 
  int CurDay; 
  if (CurMonth > 3  &&  CurMonth < 10) return(true);
  else { 
    if (CurMonth < 3  ||  CurMonth > 10) return(false);
    else {
      CurDayOfWeek = TimeDayOfWeek(CurrentTime); 
      CurDay = TimeDay(CurrentTime); 
      switch (CurMonth) {
        case  3: if (CurDay-CurDayOfWeek > 24) return(true);
                 else return(false);
                 break;
        case 10: if (CurDay-CurDayOfWeek < 25) return(true);
                 else return(false);
                 break;
      }
    }
  }
}
//+------------------------------------------------------------------+
bool DST_US(int CurrentTime) {
  int CurMonth = TimeMonth(CurrentTime);
  int CurDayOfWeek; 
  int CurDay; 
  if (CurMonth > 3  &&  CurMonth < 11) return(true);
  else { 
    if (CurMonth < 3  ||  CurMonth > 11) return(false);
    else {
      CurDayOfWeek = TimeDayOfWeek(CurrentTime); 
      CurDay = TimeDay(CurrentTime); 
      switch (CurMonth) {
        case  3: if (CurDay-CurDayOfWeek > 7) return(true);
                 else return(false); 
                 break;
        case 11: if (CurDay-CurDayOfWeek < 1) return(true);
                 else return(false); 
                 break;
      }
    }
  }
}


Erics писал (а) >>

P.S. В Америке до 2007 переход на DST и обратно совпадал по времени с Европой. Используйте EUR при вызове.

Это верно лишь наполовину, совпадало только окончание.

 
kombat писал (а) >>

10:00 - Начало работы в Европе

комбат, вы ошиблись. Европа открывается в 09:00 MSK (по летнему)

 
Вопрос к бывалым на рынке.. Есть ли у вас какие-нибудь особенно удачливые месяца в игре и наоборот? Конечно это зависит от ваших торговых тактик, потому вопрос слишком абстрактный. Но так или иначе?
 

Ну вот, как обещал, "переварил" все что смог относительно торговых сессий и переходов на летнее зимнее время. Сделан excel-евский файл с календарем переходов на летнее/зимнее время и расчет времен начала и окончания сессий по временам работы бирж.

На первом листе просто календарь переходов, никаких формул. Этот календарь используется для расчетов сессий на втором листе. На втором листе можно задавать только три параметра: текущую дату, на которую нужно все рассчитать, да две таймзоны: одна для таймзоны сервера ДЦ, а вторая - для вашего локального времени (которое у вас на наручных часах). По ним рассчитывается таблички с локальными временами времен работы бирж, а по ним - времена начала и конца (минимум и максимум) торговых сессий.

Вроде все получилось, но както мне (по привычке) не верится, что удалось все сделать без ошибок. Почему? Ну вот например австралия и сессия океании. Они же в другом полушарии и у них переход на летнее время выполняется зимой и если у нас месяцы идут так ЗЗЗЛЛЛЗЗЗ то у океании ЛЛЛЗЗЗЛЛЛ. Соответственно получаются разные формулы для расчетов: у нас ищем попадание в летнее время а у них нужно искать - в зимнее. Вобщем заморочки есть :(

По этой причине файл я выложил к себе на сайт, а не запостил в форум - по мере устранения ошибок я буду обновлять файл и по ссылке с форума будет всегда закачиваться свежая и правильная версия (об обновлениях я буду сообщать в этой теме). Файл можно загрузить здесь: http://forextools.com.ua/uploads/files/DST.zip

Выглядит все примерно так:


Если у кого будут конструктивные предложения - пишите письма. Быструю реализацию не обещаю (ввиду полной занятости на основной работе), но когда у меня будет время - все здравое и полезное обязательно будет поделано ;)

 

ForexTools, добротная работа!

Только вот блин не могу разобраться с вашими обозначениями. Объясните поконкретнее что есть "добавка" (чтобы развеять предположения) .

А насчёт TMZ сервера и TMZ локальная это всмысле??? Всмысле разница между локальным временем и временем ДЦ? там у вас цифры ещё 2 и 3 под каждым соответвенно? Что сие обозначает?

 

Там просто два абсолютно одинаковых расчета времени, просто для удобства - если время терминала не совпадает локальным временем компьютера.

Добавка - это сколько часов (с учетом летнего или зимнего времени) будет добавлено к времени в UTC чтобы перевести UTC-шное время соответствующей биржи к локальному времени выбранной таймзоны. Это поле нужно только для облегчения вычислений в экселе.

А правила расчета простейшие: определяем (в зависимости от поля Правило) и заданной даты какое сейчас время. Оно проставляется в поле Летн напротив расчетной даты. Потом ко времени работы биржи по UTC прибавляется число часов TMZ (из верхней таблички) и к нему еще добавляется поправка Летн (если летнее время - то +1) ну и +TMZ сервера ДЦ или TMZ локальная. В результате получается перевод UTC-шного времени во локальное время соотвтетсвующей TMZ.

 
Erics писал (а) >>

На форексе есть опеределенный стандарт времени. Это среднеевропейское время, CET.

Это GMT (или UTC) +1 ( +2 летом).

По идее, дневные свечи должны начинаться в полночь CET в любом ДЦ.

Это видимо не так, но большинство ДЦ используют все же время CET.

Чуть позже выложу скрипт, определяющий GMT, летнее/зимнее, даты перевода в европе и америке в любой год (в америке начиная с 2007, т.е. по новым правилам).

Поясните: если я смотрю только на часы сервера (GMT+1), время начала / окончания сессий будет постоянным?

В прграмме я использую ограничения по часам работы командой Hour(), т. е. проверяю текущий час сервера, и вхожу или не вхожу.


Если есть переход в два часа ночи, скажем, назад, то свеча часа ночи не содержит в себе двойной объём?

 
Parabellum писал (а) >>

Если есть переход в два часа ночи, скажем, назад, то свеча часа ночи не содержит в себе двойной объём?

Переход всегда осуществляется в воскресенье, когда торговые сервера (МТ-шные во всяком случае) "не торгуют" и значит там нет ни одинарных ни двойных объемов - там просто дыра в истории.

 
ForexTools писал (а) >>

Переход всегда осуществляется в воскресенье, когда торговые сервера (МТ-шные во всяком случае) "не торгуют" и значит там нет ни одинарных ни двойных объемов - там просто дыра в истории.

Понятно, спасибо.

А первый вопрос? Мне не надо знать локальное время. Мои часы - это торговый сервер. Постоянны ли времена открытия сессий по этому времени?

В программе стоит ограничение: если ( Hour()>t1 && Hout()<t2 ), то вперёд, иначе закрыть / спать; примерно так. Без каких-либо поправок.

Причина обращения: