Автор |
Сообщение |
SlavaIv
Зарегистрирован: 01.01.2011
Сообщения: 23
|
Здравствуйте!
В 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
|
Так попробуй.
Код: |
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
|
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
|
Код: |
Numbar = Lookup( BarIndex(), StrToDateTime("2014-10-13 2:30"), mode = 1 );
Title = NumToStr(Numbar); |
А так? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SlavaIv
Зарегистрирован: 01.01.2011
Сообщения: 23
|
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
|
Стоп.
У меня все мои коды работают внутри дня.
Как говорится "Ставлю голову против пиджачной пуговицы", что у тебя ошибка раньше. Видимо когда используешь DateTimeAdd. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SlavaIv
Зарегистрирован: 01.01.2011
Сообщения: 23
|
000 писал(а): |
Стоп.
У меня все мои коды работают внутри дня.
Как говорится "Ставлю голову против пиджачной пуговицы", что у тебя ошибка раньше. Видимо когда используешь DateTimeAdd. |
Не надо пари...
Я никогда не экспериментирую с элементами внутри полной стратегии. Создаю новый документ и в нем экспериментирую с элементами, проверяю на графике правильность, т.ч. логику.
Весь документ выглядит так:
Код: |
//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
|
Ну вот моя картинка |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SlavaIv
Зарегистрирован: 01.01.2011
Сообщения: 23
|
000 писал(а): |
Ну вот моя картинка |
С такой штукой из твоего кода:
Код: |
SetBarsRequired(sbrall, sbrall); |
и у меня заработало. Спасибо!
Что это за магия такая: sbrall?
Ничего о такой штуке не слышал... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Это quickAFL.
По умолчанию, для ускорения расчетов AFL смотрит не все бары, а только необходимые для расчета видимой части на графике. Поэтому, вероятно, код просто не видел на чарте участок с твоей датой и в результате возвращал 0.
SetBarsRequired(sbrall, sbrall); заставляет код рассматривать все данные. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SlavaIv
Зарегистрирован: 01.01.2011
Сообщения: 23
|
000 писал(а): |
Это quickAFL.
По умолчанию, для ускорения расчетов AFL смотрит не все бары, а только необходимые для расчета видимой части на графике. Поэтому, вероятно, код просто не видел на чарте участок с твоей датой и в результате возвращал 0.
SetBarsRequired(sbrall, sbrall); заставляет код рассматривать все данные. |
Понял. Огромное спасибо! Без твоей помощи не справился бы... |
_________________ ---
Вячеслав |
|
Посмотреть профиль Отправить личное сообщение |
|
|