Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 как найти номер бара для определенного DateTime()? Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
SlavaIv



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

СообщениеДобавлено: Ср Дек 31, 2014 5:28 pm Ответить с цитатой Вернуться к началу

Здравствуйте!

В AFL не слишком разбираюсь... Подскажите, пожалуйста, как вычислить номер бара для определенного DateTime()? (Моя задача - найти дату/время находящуюся на определенном количестве баров от конкретной даты/времени).

И так и эдак пробовал, но получаю EMPTY... Например:
Код:

Numbar = Lookup( StrToDateTime("2014-10-13 2:30"), mode = 0 );
или
Numbar = BarIndex () - valuewhen (DateTime() == StrToDateTime("2014-10-13 2:30"), BarIndex(), 1);


Может не понял чего-то из Help'а..

С уважением.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Дек 31, 2014 7:26 pm Ответить с цитатой Вернуться к началу

Так попробуй.
Код:
Numbar = ValueWhen(DateTime() >= StrToDateTime("2014-10-13 2:30") AND Ref(DateTime(), -1) < StrToDateTime("2014-10-13 2:30"), BarIndex());
Title = NumToStr(Numbar);


С НАСТУПАЮЩИМ!!!

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
SlavaIv



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

СообщениеДобавлено: Ср Дек 31, 2014 8:58 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Так попробуй.
Код:
Numbar = ValueWhen(DateTime() >= StrToDateTime("2014-10-13 2:30") AND Ref(DateTime(), -1) < StrToDateTime("2014-10-13 2:30"), BarIndex());
Title = NumToStr(Numbar);




На дневке работает. Насколько точно не знаю. На 5 минутах не работает. Думаю по следующей причине (описание DateTimeDiff):
Цитата:
It is important to understand that DateTime is not a simple number but rather bitset and two datetime values can only be reliably compared for equlity or inequality using == or != operators. Any other comparisions (less than/greater then), using normal operators > < may sometimes lead to wrong results (if one of dates compared is pre-1964), therefore to compare two datetime numbers reliably you should use DateTimeDiff.


Цитата:
С НАСТУПАЮЩИМ!!!

Спасибо! И тебе всех благ![/quote]

_________________
---
Вячеслав
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Янв 01, 2015 10:18 am Ответить с цитатой Вернуться к началу

Код:
Numbar = Lookup( BarIndex(), StrToDateTime("2014-10-13 2:30"), mode = 1 );
Title = NumToStr(Numbar);

А так?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
SlavaIv



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

СообщениеДобавлено: Чт Янв 01, 2015 11:07 am Ответить с цитатой Вернуться к началу

000 писал(а):
Код:
Numbar = Lookup( BarIndex(), StrToDateTime("2014-10-13 2:30"), mode = 1 );
Title = NumToStr(Numbar);

А так?

С подобным кодом экспериментировал. Использовал разные значения mode.

На дневке показывает число 544. На коде предыдущего твоего сообщения показывает 545.

На 5 минут показывает ноль. На коде предыдущего твоего сообщения показывает EMPTY.

На часовике аналогично 5 минутам. Внутри дня этот подход не работает.

Видимо, придется использовать функцию DateTimeDiff(). Еще не пробовал, но если она такая же тормозная, как и решение с помощью DateTimeAdd() (у меня относительно небольшой код в бактесте, на DateTimeAdd(), выполняется 1.5 секунды), то особо не пооптимизируешь...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Янв 01, 2015 11:17 am Ответить с цитатой Вернуться к началу

Стоп.
У меня все мои коды работают внутри дня.
Как говорится "Ставлю голову против пиджачной пуговицы", что у тебя ошибка раньше. Видимо когда используешь DateTimeAdd.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
SlavaIv



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

СообщениеДобавлено: Чт Янв 01, 2015 11:48 am Ответить с цитатой Вернуться к началу

000 писал(а):
Стоп.
У меня все мои коды работают внутри дня.
Как говорится "Ставлю голову против пиджачной пуговицы", что у тебя ошибка раньше. Видимо когда используешь DateTimeAdd.

Не надо пари... Smile

Я никогда не экспериментирую с элементами внутри полной стратегии. Создаю новый документ и в нем экспериментирую с элементами, проверяю на графике правильность, т.ч. логику.

Весь документ выглядит так:
Код:
//Numbar = Lookup( BarIndex(), StrToDateTime("2014-10-13 2:30"), mode = 0 );
//Numbar = Lookup( SelectedValue(BarIndex()), StrToDateTime("2014-10-13 2:35"), mode = 1 );
//Numbar_1 = ValueWhen(DateTime() == StrToDateTime("2014-10-13 2:30"), Status("quickaflfirstdatabar") + BarIndex() + 1);
//Numbar_2 = ValueWhen(DateTime() == StrToDateTime("2014-10-13 2:40"), Status("quickaflfirstdatabar") + BarIndex() + 1);
//Numbar = Numbar_2 - Numbar_1;
//BarBaseNumber = Status("quickaflfirstdatabar") + BarIndex() + 1;
//ThisIsLastBar = BarIndex() == LastValue( BarIndex() );
//Numbar = BarIndex () - valuewhen (DateTime() == StrToDateTime("2014-10-13 2:30"), BarIndex(), 1);
//Numbar = valuewhen (DateTime() == StrToDateTime("2014-10-13 2:30"), BarIndex());
//Numbar = ValueWhen(DateTime() >= StrToDateTime("2014-10-13 2:30") AND Ref(DateTime(), -1) < StrToDateTime("2014-10-13 2:30"), BarIndex());
//Numbar = ValueWhen( Ref(DateTime(), -1) == StrToDateTime("2014-10-13 2:30"), BarIndex());
//NumTimeSec = DateTimeDiff(StrToDateTime("2014-10-13 2:40"), StrToDateTime("2014-10-13 2:30"));
Numbar = Lookup( BarIndex(), StrToDateTime("2014-10-13 2:30"), mode = 1 );
Title = NumToStr(Numbar);
printf(NumToStr( Numbar, 1.1) + " , ");


Это все мои эксперименты.

Действия - делаю изменения в документе, сохраняю, вкладка "чарты", выбираю документ и "инсёрт".. В "интерпретейшн" смотрю результат.

Версия Ами 5.90.1 от 23 ноября 2014. Леченая таблеткой от 5.6.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Янв 01, 2015 12:05 pm Ответить с цитатой Вернуться к началу

Ну вот моя картинка

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
SlavaIv



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

СообщениеДобавлено: Чт Янв 01, 2015 3:25 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Ну вот моя картинка


С такой штукой из твоего кода:
Код:
SetBarsRequired(sbrall, sbrall);

и у меня заработало. Спасибо!

Что это за магия такая: sbrall?

Ничего о такой штуке не слышал...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Янв 01, 2015 3:34 pm Ответить с цитатой Вернуться к началу

Это quickAFL.
По умолчанию, для ускорения расчетов AFL смотрит не все бары, а только необходимые для расчета видимой части на графике. Поэтому, вероятно, код просто не видел на чарте участок с твоей датой и в результате возвращал 0.
SetBarsRequired(sbrall, sbrall); заставляет код рассматривать все данные.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
SlavaIv



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

СообщениеДобавлено: Чт Янв 01, 2015 4:04 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Это quickAFL.
По умолчанию, для ускорения расчетов AFL смотрит не все бары, а только необходимые для расчета видимой части на графике. Поэтому, вероятно, код просто не видел на чарте участок с твоей датой и в результате возвращал 0.
SetBarsRequired(sbrall, sbrall); заставляет код рассматривать все данные.

Понял. Огромное спасибо! Без твоей помощи не справился бы...

_________________
---
Вячеслав
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen