Страница 1 из 2

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

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

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

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

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

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

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

Добавлено: Вт янв 30, 2007 11:34 pm
Terranin
-=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) покажет время последнего бара с точностью до минуты.

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

Добавлено: Вт янв 30, 2007 11:50 pm
-=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:

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

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

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

Добавлено: Пт фев 02, 2007 3:26 am
Terranin
-=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) не равно предыдущему.

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

Добавлено: Пт фев 02, 2007 4:31 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:

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

Добавлено: Пт фев 02, 2007 5:10 pm
Terranin
-=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.

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

Добавлено: Пт фев 02, 2007 5:27 pm
-=LP=-
Terranin писал(а):Это потому что надо подключить модуль DateUtils в раздел uses.
Урааа!! :lol: Получилось!!! Спасибо ОГРОМНОЕ! :)

Добавлено: Вс апр 06, 2008 11:05 am
Тагир
Подскажите что надо подключить, для работы со временем, если работаю на С++?

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

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

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

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

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

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

Добавлено: Сб апр 11, 2009 2:49 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));
}

Добавлено: Сб апр 11, 2009 3:26 pm
Terranin
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);
}
а там уже в С должны быть свои процедуры для работы со временем.

Добавлено: Сб апр 11, 2009 4:08 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?

Добавлено: Сб апр 11, 2009 4:45 pm
Terranin
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 насколько я знаю.

Добавлено: Сб апр 11, 2009 5:51 pm
duh
Если с++ использует 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.

Добавлено: Сб апр 11, 2009 6:10 pm
duh
Вот здесь справочник функций нашел - там есть много функций для работы со временем в с++

http://www.codenet.ru/progr/cpp/sprd/index.php

Добавлено: Чт дек 03, 2009 7:16 pm
duh
Разбирался тут со временем в 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()

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

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

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

Добавлено: Сб апр 16, 2011 4:29 pm
FT Support
Не совсем так, нужно запомнить предыдущее значение ведь условие Time(0) <> Time(1) будет верно всегда.

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

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

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

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

Time(0) <> SomeStoredTimeVariable

Добавлено: Сб апр 16, 2011 4:35 pm
FT Support
Кстати если речь идёт о новом дне, то лучше использовать "iTime(Symbol, 1440, 0)" а не "Time(0)" в этом случае код будет работать на любом таймфрейме.