Определение времени в ФТ (програмно)

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Определение времени в ФТ (програмно)

#1 Сообщение -=LP=- » Вт янв 30, 2007 6:53 pm

Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз! :roll:

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Определение времени в ФТ (програмно)

#2 Сообщение Terranin » Вт янв 30, 2007 10:31 pm

-=LP=- писал(а):Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз! :roll:
Если в стратегии то установить таймфрейм 1 минута и получить Time(0) это и будет время последнего минутного бара.
Asta la vista
Mike

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Re: Определение времени в ФТ (програмно)

#3 Сообщение -=LP=- » Вт янв 30, 2007 10:52 pm

Terranin писал(а):
-=LP=- писал(а):Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз! :roll:
Если в стратегии то установить таймфрейм 1 минута и получить Time(0) это и будет время последнего минутного бара.
А разве каждый новый день начинается с 0 бара? И что значит "получить Time(0)"? :oops:

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Определение времени в ФТ (програмно)

#4 Сообщение Terranin » Вт янв 30, 2007 11:34 pm

-=LP=- писал(а):
Terranin писал(а):
-=LP=- писал(а):Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз! :roll:
Если в стратегии то установить таймфрейм 1 минута и получить Time(0) это и будет время последнего минутного бара.
А разве каждый новый день начинается с 0 бара? И что значит "получить Time(0)"? :oops:
0й бар как и в метатрейдере это последний из доступных баров, 1й - предпоследний и т.д. Mассив Time() - это массив времени баров, Time(0) это время последнего бара. Также как Open(0) - это время открытия последнего бара. Эти значения зависят от текущего таймфрейма, если стоит таймфрейм 1 день то Time(0) покажет время начала последнего дня, если стоит таймфрейм 1 минута то Time(0) покажет время последнего бара с точностью до минуты.
Asta la vista
Mike

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Re: Определение времени в ФТ (програмно)

#5 Сообщение -=LP=- » Вт янв 30, 2007 11:50 pm

Terranin писал(а):0й бар как и в метатрейдере это последний из доступных баров, 1й - предпоследний и т.д. Mассив Time() - это массив времени баров, Time(0) это время последнего бара. Также как Open(0) - это время открытия последнего бара. Эти значения зависят от текущего таймфрейма, если стоит таймфрейм 1 день то Time(0) покажет время начала последнего дня, если стоит таймфрейм 1 минута то Time(0) покажет время последнего бара с точностью до минуты.
Попробовал:

Код: Выделить всё

LastTime := Time(0);
Print(format('LAST TIME: %.4f', [LastTime]));
Таймфрейм Д1. Выдает вначале новой свечи, значение 38155,0000, следующая 38156,0000 и т. д.
Так как это использовать, если мне нужно обнулить значение какой-то переменной вначале нового дня? :cry:

Мясник
Сообщения: 18
Зарегистрирован: Пт дек 22, 2006 1:13 am

Re: Определение времени в ФТ (програмно)

#6 Сообщение Мясник » Пт фев 02, 2007 2:00 am

-=LP=- писал(а):Таймфрейм Д1. Выдает вначале новой свечи, значение 38155,0000, следующая 38156,0000 и т. д.
Так как это использовать, если мне нужно обнулить значение какой-то переменной вначале нового дня? :cry:
Ну вероятно нужно проверить, является ли время на данной свече целым числом. Если да, то это и есть начало дневной свечи.
А промежуточное время (в часах и минутах) задано дробной частью, т.е. какую долю от суток составляет

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Определение времени в ФТ (програмно)

#7 Сообщение Terranin » Пт фев 02, 2007 3:26 am

-=LP=- писал(а):
Terranin писал(а):0й бар как и в метатрейдере это последний из доступных баров, 1й - предпоследний и т.д. Mассив Time() - это массив времени баров, Time(0) это время последнего бара. Также как Open(0) - это время открытия последнего бара. Эти значения зависят от текущего таймфрейма, если стоит таймфрейм 1 день то Time(0) покажет время начала последнего дня, если стоит таймфрейм 1 минута то Time(0) покажет время последнего бара с точностью до минуты.
Попробовал:

Код: Выделить всё

LastTime := Time(0);
Print(format('LAST TIME: %.4f', [LastTime]));
Таймфрейм Д1. Выдает вначале новой свечи, значение 38155,0000, следующая 38156,0000 и т. д.
Так как это использовать, если мне нужно обнулить значение какой-то переменной вначале нового дня? :cry:
Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
Asta la vista
Mike

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Re: Определение времени в ФТ (програмно)

#8 Сообщение -=LP=- » Пт фев 02, 2007 4:31 pm

Мясник писал(а):Ну вероятно нужно проверить, является ли время на данной свече целым числом. Если да, то это и есть начало дневной свечи.
А промежуточное время (в часах и минутах) задано дробной частью, т.е. какую долю от суток составляет
Terranin писал(а):Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
Ребят, спасибо! Теперь все понятно! :D Но вот с YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...) не могу разобраться. :?
Пишу:

Код: Выделить всё

if HourOf(Time(0)) = 23 then ...
Жму компилить, мне выдает
[Error] Fractals.dpr(145): Undeclared identifier: 'HourOf'
[Warning] Fractals.dpr(145): Comparing signed and unsigned types - widened both operands.
Если можете, подскажите пожалуйста! :wink:

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Определение времени в ФТ (програмно)

#9 Сообщение Terranin » Пт фев 02, 2007 5:10 pm

-=LP=- писал(а):
Мясник писал(а):Ну вероятно нужно проверить, является ли время на данной свече целым числом. Если да, то это и есть начало дневной свечи.
А промежуточное время (в часах и минутах) задано дробной частью, т.е. какую долю от суток составляет
Terranin писал(а):Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
Ребят, спасибо! Теперь все понятно! :D Но вот с YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...) не могу разобраться. :?
Пишу:

Код: Выделить всё

if HourOf(Time(0)) = 23 then ...
Жму компилить, мне выдает
[Error] Fractals.dpr(145): Undeclared identifier: 'HourOf'
[Warning] Fractals.dpr(145): Comparing signed and unsigned types - widened both operands.
Если можете, подскажите пожалуйста! :wink:
Это потому что надо подключить модуль DateUtils в раздел uses.
Asta la vista
Mike

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

Re: Определение времени в ФТ (програмно)

#10 Сообщение -=LP=- » Пт фев 02, 2007 5:27 pm

Terranin писал(а):Это потому что надо подключить модуль DateUtils в раздел uses.
Урааа!! :lol: Получилось!!! Спасибо ОГРОМНОЕ! :)

Тагир
Сообщения: 12
Зарегистрирован: Сб июн 30, 2007 11:54 am

#11 Сообщение Тагир » Вс апр 06, 2008 11:05 am

Подскажите что надо подключить, для работы со временем, если работаю на С++?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#12 Сообщение Terranin » Вс апр 06, 2008 3:23 pm

Тагир писал(а):Подскажите что надо подключить, для работы со временем, если работаю на С++?
Для С надо перевести время в его формат. С использует другой тип даты, я точно не в курсе а то что сейчас использует форекс тестер вот:

Delphi syntax:

type TDateTime = type Double;

The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates and times:

0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am
Asta la vista
Mike

Agronom
Сообщения: 6
Зарегистрирован: Сб июл 19, 2008 6:15 pm

#13 Сообщение Agronom » Сб авг 02, 2008 5:14 pm

Вот такая проблемка...
Прописываю в стратегии:
if (HourOf(Time(0)) = TimeShiftParam)
and (MinuteOf(Time(0)) = 0.00)
then...
А на практике получается, что работает также как и в таком варианте (без минут):
if (HourOf(Time(0)) = TimeShiftParam)
then...

А хотелось бы определить время с точностью до минуты. Как можно это прописать?
Заранее спасибо.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#14 Сообщение Terranin » Сб авг 02, 2008 5:49 pm

Agronom писал(а):Вот такая проблемка...
Прописываю в стратегии:
if (HourOf(Time(0)) = TimeShiftParam)
and (MinuteOf(Time(0)) = 0.00)
then...
А на практике получается, что работает также как и в таком варианте (без минут):
if (HourOf(Time(0)) = TimeShiftParam)
then...

А хотелось бы определить время с точностью до минуты. Как можно это прописать?
Заранее спасибо.
Это зависит от таймфрейма, на часовке минуты 0го бара всегда будут равны 0. Для более точного определения нужно взять таймфрейм 1 минуту.
Asta la vista
Mike

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#15 Сообщение duh » Сб апр 11, 2009 2:49 pm

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

#include <math.h>
// По времени в формате x.y вернет время в формате h:m
// tid - время в формате x.y
// hint, mint - время в формате h:m
void GetMyTime(double tid, int& hint, int& mint);

void GetMyTime(double tid, int& hint, int& mint)
{
double ti = 0.0, td = 0.0, ci = 0.0, cd = 0.0, ccd = 0.00625, ccm = 9.0, prec = 0.0000001, mm = 0.0, mplus = 0.0;
ti = floor(tid + prec);
td = tid - ti;
if(td < prec) td = 0.0;
ci = floor((td + prec) / ccd);
cd = (td / ccd) - ci;
if(cd < (prec / ccd)) cd = 0.0;
mplus = floor((cd + (prec / ccd)) * ccm);
mm = (ci * ccm) + mplus;
hint = floor((mm + (prec * ccm / ccd)) / double(60));
mint = floor((mm + (prec * ccm / ccd)) - double(hint * 60));
}
Последний раз редактировалось duh Вс окт 24, 2010 12:27 pm, всего редактировалось 2 раза.
zzz

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#16 Сообщение Terranin » Сб апр 11, 2009 3:26 pm

duh писал(а):
Тагир писал(а):Подскажите что надо подключить, для работы со временем, если работаю на С++?
Понадобилось время по минутам и часам выделять - ничего толкового найти не получилось (вообще я не программист, поэтому даже толком не знаю что и где искать) ну и решил сам функцию написать - вот скидываю, м.б. кому пригодиться

#include <math.h>
// По времени в формате x.y вернет время в формате h:m
// tid - время в формате x.y
// hint, mint - время в формате h:m
void GetMyTime(double tid, int& hint, int& mint);

void GetMyTime(double tid, int& hint, int& mint)
{
double ti = 0.0, td = 0.0, ci = 0.0, cd = 0.0, ccd = 0.00625, ccm = 9.0, prec = 0.0000001, mm = 0.0, mplus = 0.0;
ti = floor(tid + prec);
td = tid - ti;
if(td < prec) td = 0.0;
ci = floor((td + prec) / ccd);
cd = (td / ccd) - ci;
if(cd < (prec / ccd)) cd = 0.0;
mplus = floor((cd + (prec / ccd)) * ccm);
mm = (ci * ccm) + mplus;
hint = floor((mm + (prec * ccm / ccd)) / double(60));
mint = floor((mm + (prec * ccm / ccd)) - double(hint * 60));
}
Вообще в Delphi все просто, подключается модуль DateUtils и там куча нужных функций типа:
MinuteOf(date)
HourOf(date)
DayOf(date)
и т.д.

Для С++ можно перевести дату в формат С и обратно функциями:

Код: Выделить всё

unsigned int UnixStartDate = 25569;

unsigned int DateTimeToUnix(double ConvDate)
{
  return((unsigned int)((ConvDate - UnixStartDate) * 86400.0));
}

double UnixToDateTime(unsigned int USec)
{
  return((Usec/86400.0) + UnixStartDate);
}
а там уже в С должны быть свои процедуры для работы со временем.
Asta la vista
Mike

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#17 Сообщение duh » Сб апр 11, 2009 4:08 pm

Terranin писал(а):
Вообще в Delphi все просто, подключается модуль DateUtils и там куча нужных функций типа:
MinuteOf(date)
HourOf(date)
DayOf(date)
и т.д.

Для С++ можно перевести дату в формат С и обратно функциями:

Код: Выделить всё

unsigned int UnixStartDate = 25569;

unsigned int DateTimeToUnix(double ConvDate)
{
  return((unsigned int)((ConvDate - UnixStartDate) * 86400.0));
}

double UnixToDateTime(unsigned int USec)
{
  return((Usec/86400.0) + UnixStartDate);
}
а там уже в С должны быть свои процедуры для работы со временем.
Как я разобрался:
- В делфи используется формат времени x.y (DateTime) где x - это день с какой-то даты.
- В unix - время (TimeStamp) это число секунд прошедшее с какой-то даты.
А в С++ в каком виде время представляется? - аналогично unix? - если нет - то зачем переводить из DateTime в unix?
Последний раз редактировалось duh Вс окт 24, 2010 12:28 pm, всего редактировалось 1 раз.
zzz

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#18 Сообщение Terranin » Сб апр 11, 2009 4:45 pm

duh писал(а):
Terranin писал(а):
Вообще в Delphi все просто, подключается модуль DateUtils и там куча нужных функций типа:
MinuteOf(date)
HourOf(date)
DayOf(date)
и т.д.

Для С++ можно перевести дату в формат С и обратно функциями:

Код: Выделить всё

unsigned int UnixStartDate = 25569;

unsigned int DateTimeToUnix(double ConvDate)
{
  return((unsigned int)((ConvDate - UnixStartDate) * 86400.0));
}

double UnixToDateTime(unsigned int USec)
{
  return((Usec/86400.0) + UnixStartDate);
}
а там уже в С должны быть свои процедуры для работы со временем.
Как я разобрался:
- В делфи используется формат времени x.y (DateTime) где x - это день с какой-то даты.
- В unix - время (TimeStamp) это число секунд прошедшее с какой-то даты.
А в С++ в каком виде время представляется? - аналогично unix? - если нет - то зачем переводить из DateTime в unix?
C++ использует формат Unix насколько я знаю.
Asta la vista
Mike

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#19 Сообщение duh » Сб апр 11, 2009 5:51 pm

Если с++ использует unix - то это замечательно, так как с unix-oм все понятно - секунды они и в африке секунды. Правда написанная мною функция теперь без всякого unix-а нужные мне часы и минуты выдает :) вот еще аналогичный код нашел (на делфи), там указана привязка к дате (скопирую сюда что бы не потерять):


{
Sometimes you want to communicate with mySQL or other databases using
the unix timestamp. To solve this difference you may want to convert your
TDateTime to the unix timestamp format and vice versa.

}

unit unix_utils;

interface

implementation

const
// Sets UnixStartDate to TDateTime of 01/01/1970
UnixStartDate: TDateTime = 25569.0;

function DateTimeToUnix(ConvDate: TDateTime): Longint;
begin
//example: DateTimeToUnix(now);
Result := Round((ConvDate - UnixStartDate) * 86400);
end;

function UnixToDateTime(USec: Longint): TDateTime;
begin
//Example: UnixToDateTime(1003187418);
Result := (Usec / 86400) + UnixStartDate;
end;

end.
Последний раз редактировалось duh Вс окт 24, 2010 12:28 pm, всего редактировалось 1 раз.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#20 Сообщение duh » Сб апр 11, 2009 6:10 pm

Вот здесь справочник функций нашел - там есть много функций для работы со временем в с++

http://www.codenet.ru/progr/cpp/sprd/index.php
Последний раз редактировалось duh Вс окт 24, 2010 12:28 pm, всего редактировалось 1 раз.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#21 Сообщение duh » Чт дек 03, 2009 7:16 pm

Разбирался тут со временем в C++, получилось все просто.
Пишу с ходу из головы без проверок, м.б. где ошибки, но идею поймете:

Код: Выделить всё


#include <ctime> // Модуль с функциям времени

unsigned int UnixStartDate = 25569;
 
// функция преобразует время из формата форекстестера в юникс формат
unsigned int DateTimeToUnix(double ConvDate) 
{ 
  return((unsigned int)((ConvDate - UnixStartDate) * 86400.0)); 
} 

// Обратное преобразование при необходимости
double UnixToDateTime(unsigned int USec)
{ 
  return((Usec/86400.0) + UnixStartDate); 
}

int main()
{
   struct tm *date_time; // это стандартная структура (указатель на нее) в которую запишем  данные о времени
   time_t timer; // это время - количество секунд которые прошли с какой-то даты - в формате юникс

   timer = DateTimeToUnix('сюда время в формате форекстестера'); // Переводим из формата форекстестера в юникс формат
   date_time = localtime(&timer); // эта функция заполнит структуру разложив все по полочкам

   // Далее все нужные данные извлекаются из структуры
   // Например
   int m, h, d; // минуты, часы, день месяца
   m = date_time->tm_min;
   h = date_time->tm_hour;
   d = date_time->tm_mday;
}

Еще бывает день с начала недели date_time->tm_wday и день с начала года date_time->tm_yday, при этом нумерация с 0 идет а неделя начинается с вс, еще есть показатель зимнего-летнего времени, секунды, кому надо найдут, я не помню как записывается.

Еще что бы обратно перевести из tm структуры в time_t есть специальная функция, если кому надо, то могу посмотреть есле не найдете, а потом из time_t можно переводить в формат форекс тестера с помощью указанной выше функции UnixToDateTime()
Последний раз редактировалось duh Вс окт 24, 2010 12:29 pm, всего редактировалось 2 раза.
zzz

duh
Сообщения: 68
Зарегистрирован: Сб мар 14, 2009 8:07 pm

#22 Сообщение duh » Чт дек 03, 2009 7:20 pm

Еще добавлю что номер месяца тоже можно из структуры узнать, при этом нумерация тоже с 0 - январь, декабрь - 11, еще год можно узнать, но он как-то хитро нумеруется, кажется начиная с 1900, т.е. нынешний год 2009 будт представлен как 109 - это не точно. :)
zzz

mit-alex
Сообщения: 3
Зарегистрирован: Ср мар 23, 2011 9:45 am

Re: Определение времени в ФТ (програмно)

#23 Сообщение mit-alex » Сб апр 16, 2011 2:06 pm

Terranin писал(а):
-=LP=- писал(а):
Terranin писал(а):
Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
а как проверить, что оно не равно предыдущему? if time(0) <> time(1)?

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#24 Сообщение FT Support » Сб апр 16, 2011 4:29 pm

Не совсем так, нужно запомнить предыдущее значение ведь условие Time(0) <> Time(1) будет верно всегда.

Поэтому нужно создать переменную, в которую записать значение дня, который уже обработан

Код: Выделить всё

SomeStoredTimeVariable := Time(0);
после этого проверить:

Код: Выделить всё

Time(0) <> SomeStoredTimeVariable

FT Support
Сообщения: 329
Зарегистрирован: Сб июл 11, 2009 3:59 pm

#25 Сообщение FT Support » Сб апр 16, 2011 4:35 pm

Кстати если речь идёт о новом дне, то лучше использовать "iTime(Symbol, 1440, 0)" а не "Time(0)" в этом случае код будет работать на любом таймфрейме.

Ответить