Определение времени в ФТ (програмно)
-
- Сообщения: 14
- Зарегистрирован: Пн янв 22, 2007 11:42 am
Определение времени в ФТ (програмно)
Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз!
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз!
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Определение времени в ФТ (програмно)
Если в стратегии то установить таймфрейм 1 минута и получить Time(0) это и будет время последнего минутного бара.-=LP=- писал(а):Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз!
Asta la vista
Mike
Mike
-
- Сообщения: 14
- Зарегистрирован: Пн янв 22, 2007 11:42 am
Re: Определение времени в ФТ (програмно)
А разве каждый новый день начинается с 0 бара? И что значит "получить Time(0)"?Terranin писал(а):Если в стратегии то установить таймфрейм 1 минута и получить Time(0) это и будет время последнего минутного бара.-=LP=- писал(а):Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз!
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Определение времени в ФТ (програмно)
0й бар как и в метатрейдере это последний из доступных баров, 1й - предпоследний и т.д. Mассив Time() - это массив времени баров, Time(0) это время последнего бара. Также как Open(0) - это время открытия последнего бара. Эти значения зависят от текущего таймфрейма, если стоит таймфрейм 1 день то Time(0) покажет время начала последнего дня, если стоит таймфрейм 1 минута то Time(0) покажет время последнего бара с точностью до минуты.-=LP=- писал(а):А разве каждый новый день начинается с 0 бара? И что значит "получить Time(0)"?Terranin писал(а):Если в стратегии то установить таймфрейм 1 минута и получить Time(0) это и будет время последнего минутного бара.-=LP=- писал(а):Вопрос к знающим:
Как определить, например, время начала следующего дня? Или, допустим время 23.00 (в ФТ)? Ну, типа для того чтобы сделать что-то вроде: "если время = 12.30, то ..."
Подскажите плиз!
Asta la vista
Mike
Mike
-
- Сообщения: 14
- Зарегистрирован: Пн янв 22, 2007 11:42 am
Re: Определение времени в ФТ (програмно)
Попробовал:Terranin писал(а):0й бар как и в метатрейдере это последний из доступных баров, 1й - предпоследний и т.д. Mассив Time() - это массив времени баров, Time(0) это время последнего бара. Также как Open(0) - это время открытия последнего бара. Эти значения зависят от текущего таймфрейма, если стоит таймфрейм 1 день то Time(0) покажет время начала последнего дня, если стоит таймфрейм 1 минута то Time(0) покажет время последнего бара с точностью до минуты.
Код: Выделить всё
LastTime := Time(0);
Print(format('LAST TIME: %.4f', [LastTime]));
Так как это использовать, если мне нужно обнулить значение какой-то переменной вначале нового дня?
-
- Сообщения: 18
- Зарегистрирован: Пт дек 22, 2006 1:13 am
Re: Определение времени в ФТ (програмно)
Ну вероятно нужно проверить, является ли время на данной свече целым числом. Если да, то это и есть начало дневной свечи.-=LP=- писал(а):Таймфрейм Д1. Выдает вначале новой свечи, значение 38155,0000, следующая 38156,0000 и т. д.
Так как это использовать, если мне нужно обнулить значение какой-то переменной вначале нового дня?
А промежуточное время (в часах и минутах) задано дробной частью, т.е. какую долю от суток составляет
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Определение времени в ФТ (програмно)
Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.-=LP=- писал(а):Попробовал:Terranin писал(а):0й бар как и в метатрейдере это последний из доступных баров, 1й - предпоследний и т.д. Mассив Time() - это массив времени баров, Time(0) это время последнего бара. Также как Open(0) - это время открытия последнего бара. Эти значения зависят от текущего таймфрейма, если стоит таймфрейм 1 день то Time(0) покажет время начала последнего дня, если стоит таймфрейм 1 минута то Time(0) покажет время последнего бара с точностью до минуты.Таймфрейм Д1. Выдает вначале новой свечи, значение 38155,0000, следующая 38156,0000 и т. д.Код: Выделить всё
LastTime := Time(0); Print(format('LAST TIME: %.4f', [LastTime]));
Так как это использовать, если мне нужно обнулить значение какой-то переменной вначале нового дня?
Asta la vista
Mike
Mike
-
- Сообщения: 14
- Зарегистрирован: Пн янв 22, 2007 11:42 am
Re: Определение времени в ФТ (програмно)
Мясник писал(а):Ну вероятно нужно проверить, является ли время на данной свече целым числом. Если да, то это и есть начало дневной свечи.
А промежуточное время (в часах и минутах) задано дробной частью, т.е. какую долю от суток составляет
Ребят, спасибо! Теперь все понятно! Но вот с YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...) не могу разобраться.Terranin писал(а):Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
Пишу:
Код: Выделить всё
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.
Если можете, подскажите пожалуйста!
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Определение времени в ФТ (програмно)
Это потому что надо подключить модуль DateUtils в раздел uses.-=LP=- писал(а):Мясник писал(а):Ну вероятно нужно проверить, является ли время на данной свече целым числом. Если да, то это и есть начало дневной свечи.
А промежуточное время (в часах и минутах) задано дробной частью, т.е. какую долю от суток составляетРебят, спасибо! Теперь все понятно! Но вот с YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...) не могу разобраться.Terranin писал(а):Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
Пишу:Жму компилить, мне выдаетКод: Выделить всё
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.
Если можете, подскажите пожалуйста!
Asta la vista
Mike
Mike
-
- Сообщения: 14
- Зарегистрирован: Пн янв 22, 2007 11:42 am
Re: Определение времени в ФТ (програмно)
Урааа!! Получилось!!! Спасибо ОГРОМНОЕ!Terranin писал(а):Это потому что надо подключить модуль DateUtils в раздел uses.
-
- Сообщения: 12
- Зарегистрирован: Сб июн 30, 2007 11:54 am
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 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
Mike
-
- Сообщения: 6
- Зарегистрирован: Сб июл 19, 2008 6:15 pm
Вот такая проблемка...
Прописываю в стратегии:
if (HourOf(Time(0)) = TimeShiftParam)
and (MinuteOf(Time(0)) = 0.00)
then...
А на практике получается, что работает также как и в таком варианте (без минут):
if (HourOf(Time(0)) = TimeShiftParam)
then...
А хотелось бы определить время с точностью до минуты. Как можно это прописать?
Заранее спасибо.
Прописываю в стратегии:
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
Это зависит от таймфрейма, на часовке минуты 0го бара всегда будут равны 0. Для более точного определения нужно взять таймфрейм 1 минуту.Agronom писал(а):Вот такая проблемка...
Прописываю в стратегии:
if (HourOf(Time(0)) = TimeShiftParam)
and (MinuteOf(Time(0)) = 0.00)
then...
А на практике получается, что работает также как и в таком варианте (без минут):
if (HourOf(Time(0)) = TimeShiftParam)
then...
А хотелось бы определить время с точностью до минуты. Как можно это прописать?
Заранее спасибо.
Asta la vista
Mike
Mike
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 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
Вообще в Delphi все просто, подключается модуль DateUtils и там куча нужных функций типа: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));
}
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
Mike
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 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
C++ использует формат Unix насколько я знаю.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?
Asta la vista
Mike
Mike
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 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.
{
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
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 pm
Вот здесь справочник функций нашел - там есть много функций для работы со временем в с++
http://www.codenet.ru/progr/cpp/sprd/index.php
http://www.codenet.ru/progr/cpp/sprd/index.php
Последний раз редактировалось duh Вс окт 24, 2010 12:28 pm, всего редактировалось 1 раз.
zzz
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 pm
Разбирался тут со временем в C++, получилось все просто.
Пишу с ходу из головы без проверок, м.б. где ошибки, но идею поймете:
Еще бывает день с начала недели date_time->tm_wday и день с начала года date_time->tm_yday, при этом нумерация с 0 идет а неделя начинается с вс, еще есть показатель зимнего-летнего времени, секунды, кому надо найдут, я не помню как записывается.
Еще что бы обратно перевести из tm структуры в time_t есть специальная функция, если кому надо, то могу посмотреть есле не найдете, а потом из time_t можно переводить в формат форекс тестера с помощью указанной выше функции UnixToDateTime()
Пишу с ходу из головы без проверок, м.б. где ошибки, но идею поймете:
Код: Выделить всё
#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;
}
Еще что бы обратно перевести из tm структуры в time_t есть специальная функция, если кому надо, то могу посмотреть есле не найдете, а потом из time_t можно переводить в формат форекс тестера с помощью указанной выше функции UnixToDateTime()
Последний раз редактировалось duh Вс окт 24, 2010 12:29 pm, всего редактировалось 2 раза.
zzz
-
- Сообщения: 68
- Зарегистрирован: Сб мар 14, 2009 8:07 pm
-
- Сообщения: 3
- Зарегистрирован: Ср мар 23, 2011 9:45 am
Re: Определение времени в ФТ (програмно)
а как проверить, что оно не равно предыдущему? if time(0) <> time(1)?Terranin писал(а):-=LP=- писал(а):Terranin писал(а):
Время в формате Дельфи, целая часть - число дней от какой-то там даты, дробная - время внутри дня. Для работы используются функции, YearOf, DayOf, MonthOf, HourOf, MinuteOf и т.д. или DecodeDateTime(...). Для определения начала нового дня достаточно установить таймфрейм 1 день и проверять что новое значение Time(0) не равно предыдущему.
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm
Не совсем так, нужно запомнить предыдущее значение ведь условие Time(0) <> Time(1) будет верно всегда.
Поэтому нужно создать переменную, в которую записать значение дня, который уже обработан
после этого проверить:
Поэтому нужно создать переменную, в которую записать значение дня, который уже обработан
Код: Выделить всё
SomeStoredTimeVariable := Time(0);
Код: Выделить всё
Time(0) <> SomeStoredTimeVariable
-
- Сообщения: 329
- Зарегистрирован: Сб июл 11, 2009 3:59 pm