Автоматизация торговли на финансовых рынках Автоматизация торговли на финансовых рынках

 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Функции даты и времени

 
Начать новую тему   Ответить на тему    Список форумов Автоматизация торговли на финансовых рынках -> Программирование в MQL4
Предыдущая тема :: Следующая тема  
Автор Сообщение
KimIV
Admin


Зарегистрирован: 24.01.2006
Сообщения: 958
Откуда: Кунгур

СообщениеДобавлено: Ср Фев 15, 2006 10:29 am    Заголовок сообщения: Функции даты и времени Ответить с цитатой

Функции даты и времени:
decDateOnDay - Уменьшение даты на один день
DateToStr - Преобразование типа datetime в строку формата DD.MM.YYYY
StrToDate - Преобразование строки формата DD.MM.YYYY в тип DATETIME
incDateOnDay - Увеличение даты на один день
GetWeekBounds - Получение границ недели по дню (необходимы функции decDateOnDay и incDateOnDay)

_________________
Ещё вчера я себе казался умным и пытался изменить мир, а сегодня я стал мудрым и пытаюсь изменить себя...


Последний раз редактировалось: KimIV (Ср Мар 08, 2006 3:57 pm), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора Yahoo Messenger
KimIV
Admin


Зарегистрирован: 24.01.2006
Сообщения: 958
Откуда: Кунгур

СообщениеДобавлено: Вт Фев 28, 2006 5:00 pm    Заголовок сообщения: Уменьшение даты на один день Ответить с цитатой

Код:
//+------------------------------------------------------------------+
//| Уменьшение даты на один день                                     |
//| Параметры:                                                       |
//|   dt - дата                                                      |
//+------------------------------------------------------------------+
datetime decDateOnDay (datetime dt) {
  int ty=TimeYear(dt);
  int tm=TimeMonth(dt);
  int td=TimeDay(dt);
  int th=TimeHour(dt);
  int ti=TimeMinute(dt);

  td--;
  if (td==0) {
    tm--;
    if (tm==0) {
      ty--;
      tm=12;
    }
    if (tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) td=31;
    if (tm==2) if (MathMod(ty, 4)==0) td=29; else td=28;
    if (tm==4 || tm==6 || tm==9 || tm==11) td=30;
  }
  return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}


Посмотреть использование этой функции можно в:
Индикатор торговых сессий
Рабочее время Парамона
Правда, там она называется decDateTradeDay() Smile.

_________________
Ещё вчера я себе казался умным и пытался изменить мир, а сегодня я стал мудрым и пытаюсь изменить себя...


Последний раз редактировалось: KimIV (Ср Мар 08, 2006 3:56 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора Yahoo Messenger
KimIV
Admin


Зарегистрирован: 24.01.2006
Сообщения: 958
Откуда: Кунгур

СообщениеДобавлено: Вт Фев 28, 2006 5:03 pm    Заголовок сообщения: Ответить с цитатой

Код:
//+------------------------------------------------------------------+
//| Преобразование типа datetime в строку формата DD.MM.YYYY         |
//+------------------------------------------------------------------+
string DateToStr(datetime dt)
{
  string sm="", sd="";

  if (TimeDay(dt)<10) sd="0"+TimeDay(dt); else sd=TimeDay(dt);
  if (TimeMonth(dt)<10) sm="0"+TimeMonth(dt); else sm=TimeMonth(dt);

  return(""+sd+"."+sm+"."+TimeYear(dt));
}

_________________
Ещё вчера я себе казался умным и пытался изменить мир, а сегодня я стал мудрым и пытаюсь изменить себя...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора Yahoo Messenger
KimIV
Admin


Зарегистрирован: 24.01.2006
Сообщения: 958
Откуда: Кунгур

СообщениеДобавлено: Чт Мар 02, 2006 2:38 pm    Заголовок сообщения: Ответить с цитатой

Код:
//+------------------------------------------------------------------+
//| Преобразование строки формата DD.MM.YYYY в тип DATETIME.         |
//+------------------------------------------------------------------+
datetime StrToDate(string sDate)
{
  datetime dt;
  string   sd=StringSubstr(sDate, 0, 2);
  string   sm=StringSubstr(sDate, 3, 2);
  string   sy=StringSubstr(sDate, 6, 4);

  dt=StrToTime(sy+"."+sm+"."+sd);

  return(dt);
}

_________________
Ещё вчера я себе казался умным и пытался изменить мир, а сегодня я стал мудрым и пытаюсь изменить себя...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора Yahoo Messenger
alextur



Зарегистрирован: 14.02.2006
Сообщения: 103
Откуда: Минск

СообщениеДобавлено: Ср Мар 08, 2006 3:50 pm    Заголовок сообщения: Ответить с цитатой

Код:
//+------------------------------------------------------------------+
//| увеличение даты на один день                                     |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//+------------------------------------------------------------------+
datetime incDateOnDay (datetime dt) {
   int ty=TimeYear(dt);
   int tm=TimeMonth(dt);
   int td=TimeDay(dt);
   int th=TimeHour(dt);
   int ti=TimeMinute(dt);

   td++;   
   if ((tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) && td==32) {td=1; tm++;}
   if (tm==2) if (MathMod(ty, 4)==0 && td==30) {td=1; tm++;}
   if (tm==2) if (MathMod(ty, 4)!=0 && td==29) {td=1; tm++;}
   if ((tm==4 || tm==6 || tm==9 || tm==11) && td==31) {td=1; tm++;}
   
   if (tm==13) {tm=1;ty++;}
     
   return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alextur



Зарегистрирован: 14.02.2006
Сообщения: 103
Откуда: Минск

СообщениеДобавлено: Вт Апр 11, 2006 6:51 pm    Заголовок сообщения: Ответить с цитатой

Код:
//+------------------------------------------------------------------+
//| Получения границ недели по дню                                   |
//| Параметры:                                                       |
//|   date    - дата                                                 |
//|   dest[0] - дата начала недели                                   |
//|   dest[1] - дата конца недели                                    |
//+------------------------------------------------------------------+
string GetWeekBounds(datetime date, datetime& dest[2])
{
   int i;
   int wd = TimeDayOfWeek(date);
   if (wd==0) wd=7;
   dest[0] = date;
   dest[1] = date;
   for (i=wd; i>1; i--) {
      dest[0] = decDateOnDay(dest[0]);
   }
   for (i=wd; i<7; i++) {
      dest[1] = incDateOnDay(dest[1]);
   }
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GSB



Зарегистрирован: 07.08.2006
Сообщения: 8
Откуда: СПб

СообщениеДобавлено: Чт Сен 07, 2006 2:15 am    Заголовок сообщения: Ответить с цитатой

Игорь, alextur, спасибо огромное за очень нужные функции. Они мне очень пригодились и как раз во время. А то сидел и никак не мог придумать преобразовать считанную из файла стрококу и преобразовать ее в тип DATETIME.

У меня файл сигналов формируется МТС в Метастоке вот в таком формате:

<YYYYMMDD> <HHMMSS> <Sig>
20060815,101500,1//Buy
20060815,103000,1
.....................................
20060815,150000,-1//Sell
20060815,151500,-1//

т.е. сформирован непрерывный меандр сигналов на каждый бар.

Привожу код скрипта чтения из файла и преобразования строковых переменных в формат DATETIME с последующим выводом считанных и преобразованных данных на вкладку эксперт (для проверки).
Возможно окажется полезным кому то.
Использовались публикации Rosh http://www.alpari-idc.ru/ru/experts/articles/ и функции описанные выше в данном разделе.

Видимо наиболее интересна функция
datetime StrToDateHour(string sDate, string sHour)
преобразования двух частей строки в одну переменную с полным форматом времени YYYYMMDD HHMMSS

Код:
//+------------------------------------------------------------------+
//|                                          ReadFile&&Transform.mq4 |
//+------------------------------------------------------------------+
#property copyright "GSB"
//+------------------------------------------------------------------+
//|   Формат читаемого файла
//|   YYYYMMDD,HHMMSSS,Signal
//|   20060815,1430000,1
//|   20060815,1445000,1
//|   20060815,1500000,-1
//|
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int FileHandle;
   string FileName="TM2_CO_CHF15.txt";
   int values;
   int stroki;
   string curString;
   
   FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ,";");
   if (FileHandle==-1)   Print("Ошибка=",GetLastError());
   Print("FileHandle=",FileHandle);
   if (FileHandle>0)
      {
      Print("Файл открыт");
      while(!FileIsEnding(FileHandle))
         {
         string text = FileReadString(FileHandle);//считывается вся строка
         string ymd = StringSubstr(text, 0, 8);   //1часть строки YYYYMMDD
         string hhmmss = StringSubstr(text, 9, 6);//2часть строки HHMMSS
         string sig = StringSubstr(text, 17, 0);  //3часть строки Signal
         datetime dt=StrToDate(ymd);              //преобразование YYYYMMDD в datetime
         datetime ht=StrToHour(hhmmss);           //преобразование HHMMSS в datetime
         string td=DateToStr(dt);                 //обратные преобразования для проверки
         string th=HourToStr(ht);                 //правильности вычислений при выводе в лог
         
         datetime ymdhms=StrToDateHour(ymd,hhmmss);//преобразование полного формата YYYYMMDD  HHMMSS в datetime
         string full_ymd= TimeToStr(ymdhms,TIME_DATE|TIME_DATE);   // в стринг для вывода
         string full_hms= TimeToStr(ymdhms,TIME_DATE|TIME_SECONDS);
         
         
         curString=ymd+" "+hhmmss+" "+sig;//считанная из файла строка после преобразований разделенная на дату время и сам сигнал

         Print("Прочитали <",curString," | ",td,"  ",th," | ",full_ymd," | ",full_hms,">");//читаем что получилось во вкладке эксперт
         if (FileIsLineEnding(FileHandle)) stroki++;
         values++;
         }
      }
   Print("Прочитано ",stroki," строк и ",values," значений");   
//----

//--------------------------
   return(0);
  }
 
//+------------------------------------------------------------------+
//| Преобразование строки формата YYYYMMDD в тип DATETIME.           |
//+------------------------------------------------------------------+
datetime StrToDate(string sDate)
{
  datetime dt;
  string   sd=StringSubstr(sDate, 6, 2);
  string   sm=StringSubstr(sDate, 4, 2);
  string   sy=StringSubstr(sDate, 0, 4);

  dt=StrToTime(sy+"."+sm+"."+sd);

  return(dt);
}

//+------------------------------------------------------------------+
//| Преобразование типа datetime в строку формата DD.MM.YYYY         |
//+------------------------------------------------------------------+
string DateToStr(datetime dt)
{
  string sm="", sd="";

  if (TimeDay(dt)<10) sd="0"+TimeDay(dt); else sd=TimeDay(dt);
  if (TimeMonth(dt)<10) sm="0"+TimeMonth(dt); else sm=TimeMonth(dt);

  return(""+sd+"."+sm+"."+TimeYear(dt));
}
//+----------------------------------------------------------+
//| Преобразование строки формата HHMMSS в тип DATETIME.     |
//+----------------------------------------------------------+
datetime StrToHour(string sHour)
{
  datetime ht;
  string   hh=StringSubstr(sHour, 0, 2);
  string   mm=StringSubstr(sHour, 2, 2);
  string   ss=StringSubstr(sHour, 4, 2);

  ht=StrToTime(hh+":"+mm+":"+ss);

  return(ht);
}
//+----------------------------------------------------------+
//| Преобразование типа datetime в строку формата HH.MM.SS   |
//+----------------------------------------------------------+
string HourToStr(datetime ht)
{
  string hh="", mm="", ss="";

  if (TimeHour(ht)<10) hh="0"+TimeHour(ht); else hh=TimeHour(ht);
  if (TimeMinute(ht)<10) mm="0"+TimeMinute(ht); else mm=TimeMinute(ht);
  if (TimeSeconds(ht)<10) ss="0"+TimeSeconds(ht); else ss=TimeSeconds(ht);
 
  return(hh+":"+mm+":"+ss);
}
 
//+----------------------------------------------+
//| Преобразование строки формата YYYYMMDD       |
//| и строки формата HHMMSS в тип DATETIME       |
//+----------------------------------------------+
datetime StrToDateHour(string sDate, string sHour)
{
  datetime ydhms;
  string   sd=StringSubstr(sDate, 6, 2);
  string   sm=StringSubstr(sDate, 4, 2);
  string   sy=StringSubstr(sDate, 0, 4);

  string   hh=StringSubstr(sHour, 0, 2);
  string   mm=StringSubstr(sHour, 2, 2);
  string   ss=StringSubstr(sHour, 4, 2);
 
 
  ydhms=StrToTime(sy+"."+sm+"."+sd+" "+hh+":"+mm+":"+ss);

  return(ydhms);
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
BabyBear



Зарегистрирован: 01.01.2007
Сообщения: 20
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Янв 04, 2007 8:57 am    Заголовок сообщения: Ответить с цитатой

Как написано в справке. Время, это целое число секунд с некоей даты. Поэтому, чтобы вычесть сутки достаточно вычесть из datetime 24*60*60.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
KimIV
Admin


Зарегистрирован: 24.01.2006
Сообщения: 958
Откуда: Кунгур

СообщениеДобавлено: Чт Янв 04, 2007 9:22 am    Заголовок сообщения: Ответить с цитатой

BabyBear писал(а):
...чтобы вычесть сутки достаточно вычесть из datetime 24*60*60.

Да, Вы правы... это работает... я проверил скриптом
Код:
void start() {
  Comment(
    TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS),"  ",
    TimeToStr(TimeCurrent()-24*60*60, TIME_DATE|TIME_SECONDS)
  );
}

_________________
Ещё вчера я себе казался умным и пытался изменить мир, а сегодня я стал мудрым и пытаюсь изменить себя...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора Yahoo Messenger
rmax



Зарегистрирован: 24.01.2007
Сообщения: 6

СообщениеДобавлено: Ср Янв 24, 2007 7:03 pm    Заголовок сообщения: Функция изменения даты Ответить с цитатой

Код:

//+----------------------------------------------------------
//| Изменение даты                                          |
//| Параметры:                                              |
//|   dt - исходная дата                                    |
//|   diff - кол-во единиц, на которые нужно изменить дату. |
//|         diff > 0 - добавляем к дате (будущее)           |
//|         diff < 0 - отнимаем от даты (прошлое)           |
//|   datePart - определяет часть даты, которую меняем      |
//|      может принимать значения:                          |
//|         1 - изменяем день                               |
//|         2 - изменяем месяц                              |
//|         3 - изменяем год                                |
//|         4 - изменяем часы                               |
//|         5 - изменяем минуты                             |
//|   Возвращаемое значение:                                |
//|         измененная дата                                 |
//+----------------------------------------------------------

datetime AddDate(datetime dt, int diff, int datePart)
{
   switch (datePart)
   {
      case 1:
         return(dt + diff*60*60*24);
         break;
      case 2:
         int years = diff / 12;
         int months = diff % 12;
         
         if (months == 0)
            return(StrToTime((TimeYear(dt)+years) + "." + (TimeMonth(dt)) + "." + TimeDay(dt) + " " + TimeHour(dt) + ":" + TimeMinute(dt)));
         if (TimeMonth(dt) > MathAbs(months) && months < 0)
            return(StrToTime((TimeYear(dt)+years) + "." + (TimeMonth(dt)+months) + "." + TimeDay(dt) + " " + TimeHour(dt) + ":" + TimeMinute(dt)));
         if (TimeMonth(dt) <= MathAbs(months) && months < 0)
            return(StrToTime((TimeYear(dt)+years-1) + "." + (TimeMonth(dt)+months+12) + "." + TimeDay(dt) + " " + TimeHour(dt) + ":" + TimeMinute(dt)));
         if (TimeMonth(dt) + MathAbs(months) >= 12 && months > 0)
            return(StrToTime((TimeYear(dt)+years+1) + "." + (TimeMonth(dt)+months-12) + "." + TimeDay(dt) + " " + TimeHour(dt) + ":" + TimeMinute(dt)));
         if (TimeMonth(dt) + MathAbs(months) < 12 && months > 0)
            return(StrToTime((TimeYear(dt)+years) + "." + (TimeMonth(dt)+months) + "." + TimeDay(dt) + " " + TimeHour(dt) + ":" + TimeMinute(dt)));   
         break;
      case 3:
         return(StrToTime((TimeYear(dt)+diff) + "." + TimeMonth(dt) + "." + TimeDay(dt) + " " + TimeHour(dt) + ":" + TimeMinute(dt)));
         break;
      case 4:
         return(dt + diff*60*60);
        break;
      case 5:
         return(dt + diff*60);
     
   }
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alexander Piechotta



Зарегистрирован: 27.01.2006
Сообщения: 55
Откуда: Germany

СообщениеДобавлено: Чт Июл 12, 2007 6:23 pm    Заголовок сообщения: Ответить с цитатой

Торговая вереница времени содержит всегда пару времен, отделенных с "-". Многократные пары времени могут быть введены, отделяя каждую пару с ";". Пример: "00:00-06:59; 22:00-23:59"

bool IsInTradingTime(string )


Код:

bool IsInTradingTime(string TRADE_TIME)
{
  int i;
  string s;
 
  int ipc;
  datetime dtStart[100];  datetime dtEnd[100];
  string strLocalDate;
 
  bool bRet;
 
  //========
 
  // First, we eliminate each invalid character from the time string.
  s="";
  for (i=0;i<StringLen(TRADE_TIME);i++)
   if (((StringGetChar(TRADE_TIME,i)>='0') && (StringGetChar(TRADE_TIME,i)<='9')) ||
      (StringSubstr(TRADE_TIME,i,1)=="-") ||
      (StringSubstr(TRADE_TIME,i,1)==":") ||
      (StringSubstr(TRADE_TIME,i,1)==";"))
     s=s+StringSubstr(TRADE_TIME,i,1);
 
  TRADE_TIME=s;
 
  // The trading time string contains always a pair of times,
  // separated with "-". Multiple time pairs can be entered by
  // separating each pair with ";".
  //
  // Example: "00:00-06:59;22:00-23:59"

  // First, get the current local date.
  strLocalDate=TimeToStr(LocalTime(),TIME_DATE);
 
  // Parse the string.
  i=0;
  ipc=0;
  while (true)
  {
   // Get start time.
   s="";
   while ((StringSubstr(TRADE_TIME,i,1)!="-") && (i<StringLen(TRADE_TIME)))
   {
     s=s+StringSubstr(TRADE_TIME,i,1);
     i++;
   }
   // Create the full date/time and add it to the start time list.
   dtStart[ipc]=StrToTime(strLocalDate+" "+s);
   
   i++;

   // Get end time.
   s="";
   while ((StringSubstr(TRADE_TIME,i,1)!=";") && (i<StringLen(TRADE_TIME)))
   {
     s=s+StringSubstr(TRADE_TIME,i,1);
     i++;
   }
   // Create the full date/time and add it to the end time list.
   dtEnd[ipc]=StrToTime(strLocalDate+" "+s);
   
   i++;

   // Next pair.
   ipc++; 

   if (i>=StringLen(TRADE_TIME))
     break;
  }

  // Now, compare the current time against our list and return
  // result.
  bRet=true;
  for (i=0;i<ipc;i++)
  {
   if ((LocalTime()>=dtStart[i]) && (LocalTime()<=dtEnd[i]))
     bRet=false;

   /* 
   Alert("Start=",TimeToStr(dtStart[i]));
   Alert("End  =",TimeToStr(dtEnd[i]));
   Alert("Local=",TimeToStr(LocalTime()));
   Alert("Result=",bRet);
   */
  }
 
  return (bRet);
}




Beispiel
Код:

extern string DONT_TRADE_TIME="00:00-06:59;22:00-23:59";

int start()
{
if (IsInTradingTime(DONT_TRADE_TIME) ) return(0);
}

_________________
Извинение мой русский язык не хорошо но я учусь
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Tramloyr



Зарегистрирован: 12.02.2014
Сообщения: 6

СообщениеДобавлено: Чт Мар 13, 2014 11:14 am    Заголовок сообщения: Ответить с цитатой

Может кому интересно будет, у себя в советнике использую вот такую функцию работы по дням недели

extern string T11 = "Дни недели работы советника";
extern bool Trade_in_Monday =true; //Торговать в Понедельник
extern bool Trade_in_Tuesday =true; //Торговать в Вторник
extern bool Trade_in_Wednesday=true;//Торговать в Среду
extern bool Trade_in_Thursday=true; //Торговать в Четверг
extern bool Trade_in_Friday =true; //Торговать в Пятницу

//==========================================
bool TimeFilter(){
if(((Trade_in_Monday==true) && (TimeDayOfWeek(Time[0]) == 1)) ||
((Trade_in_Tuesday==true) && (TimeDayOfWeek(Time[0]) == 2)) ||
((Trade_in_Wednesday==true) && (TimeDayOfWeek(Time[0]) == 3)) ||
((Trade_in_Thursday==true) && (TimeDayOfWeek(Time[0]) == 4)) ||
((Trade_in_Friday==true) && (TimeDayOfWeek(Time[0]) == 5)))
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Автоматизация торговли на финансовых рынках -> Программирование в MQL4 Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять вложения в этом форуме
Вы не можете просматривать вложения в этом форуме
Рейтинг@Mail.ru


Powered by phpBB © 2001, 2005 phpBB Group