Как получить цену от 5 секунд назад? - страница 2

 
Maksim Emeliashin #:

Простой алгоритм.

На каждый тик делаешь простую операцию:

1. если данных нет - сохраняешь цену и сохраняешь время, когда ты ее сохранил.

2. если данные есть - проверяешь, прошло ли 5 секунд со времени сохранения. Если прошло - вот и твоя цена 5 сек назад.

3. если прошло 5 сек и более сохраняешь новую цену и новую дату.


Для получения только последней цены каждые 5 секунд - достаточно пары переменных - дата и цена.

Если нужна история 5 секундных цен - придется использовать массивы.

Реализовывать лень.

Добавляем каждый тик в новый элемент к массиву структур.

Получение цены: бежим в цикле по этому массиву и находим самый древний тик, время которого > (TimeCurrent() - 5). Тик слева от него (предыдущий) будет хранить нужную нам цену.

Ну и останется всего лишь как-то память освобождать - подчищать массив от неактуальных тиков. Каким способом - вопрос. Меняем индексацию, ресайзим до какого-то там размера, меняем индексацию?...
"Какой-то там размер" требует алгоритма его определения. Или отслеживания и обработки переполнений, если массив не динамический.

Реализовать в отдельном индикаторе, который будет заниматься только этим (что бы не пропускать тики), передавать данные в эксперта, который будет по ним торговать.


Не сильно простой алгоритм...

 
Vladislav Boyko #:

Добавляем каждый тик в новый элемент к массиву структур.

Получение цены: бежим в цикле по этому массиву и находим самый древний тик, время которого > (TimeCurrent() - 5). Тик слева от него (предыдущий) будет хранить нужную нам цену.

Ну и останется всего лишь как-то память освобождать - подчищать массив от неактуальных тиков. Каким способом - вопрос. Меняем индексацию, ресайзим до какого-то там размера, меняем индексацию?...

Реализовать в отдельном индикаторе, который будет заниматься только этим (что бы не пропускать тики), передавать данные в эксперта, который будет по ним торговать.


Не сильно простой алгоритм...

Все зависит от конкретной задачи, для чего нужна цена. Если важно получить очень быстро данные, которые были 5 сек назад, то любые запросы тиковой истории и/или любой перебор накопленных тиков в цикле - это очень дорогие по времени операции.

Если нужно просто сравнить текущую цену с той, что была 5 сек назад, то самый быстрый вариант это просто хранить эту цену в переменной и обновлять ее по прошествии 5 секунд. Да, возможны ситуации, когда можно пропустить какую-то из цен (либо, получить ее слишком поздно: через 6-9 секунд) из-за сбоя в потоке тиков, но,опять же, всё определяет конкретная задача - важно очень быстро, или важно очень точно.

 
Maksim Emeliashin #:
Все зависит от конкретной задачи, для чего нужна цена. Если важно получить очень быстро данные, которые были 5 сек назад, то любые запросы тиковой истории и/или любой перебор накопленных тиков в цикле - это очень дорогие по времени операции.

Если нужно просто сравнить текущую цену с той, что была 5 сек назад, то самый быстрый вариант это просто хранить эту цену в переменной и обновлять ее по прошествии 5 секунд. Да, возможны ситуации, когда можно пропустить какую-то из цен (либо, получить ее слишком поздно: через 6-9 секунд) из-за сбоя в потоке тиков, но,опять же, всё определяет конкретная задача - важно очень быстро, или важно очень точно.

Я немного вас не понимаю. Вы хотите обновлять цену каждые 5 секунд. Ну вот обновляете вы ее к примеру на 0й, 5й, 10й, 15й и т.д. секунде. Необходимость получать возникает, к примеру на 1й, 8й, 12й, 19й секунде. В место 5ти секунд получается 1, 3, 2 и 4 соответственно. Это без учета пропусков цен и прочих "проскальзывание".

Да, все зависит от поставленной задачи. Если стоит задача "при необходимости (по запросу) получить цену, которая была 5 секунд назад", то метод "обновлять переменную раз в 5 секунд" абсолютно ее не выполняет. Такое решение подойдет только если вы строго каждые 5 секунд хотите знать, какая была цена ровно 5 секунд назад и собираетесь использовать ее для сравнения с текущей ценой. И то, точность все равно будет желать лучшего.

Я считаю, что затраты времени выполнения на копание в тиковой истории дадут гораздо меньшую погрешность, нежели любой другой из упомянутых в этой теме способов.*
* Решая задачу получения цены x секунд назад. А не "каждые 5 секунд узнать, что было 5 секунд назад" - читай на предыдущем выполнении OnTimer()

 
Vladislav Boyko #:

Я немного вас не понимаю. Вы хотите обновлять цену каждые 5 секунд. Ну вот обновляете вы ее к примеру на 0й, 5й, 10й, 15й и т.д. секунде. Необходимость получать возникает, к примеру на 1й, 8й, 12й, 19й секунде. В место 5ти секунд получается 1, 3, 2 и 4 соответственно. Это без учета пропусков цен и прочих "проскальзывание".

Да, все зависит от поставленной задачи. Если стоит задача "при необходимости (по запросу) получить цену, которая была 5 секунд назад", то метод "обновлять переменную раз в 5 секунд" абсолютно ее не выполняет. Такое решение подойдет только если вы строго каждые 5 секунд хотите знать, какая была цена ровно 5 секунд назад и собираетесь использовать ее для сравнения с текущей ценой. И то, точность все равно будет желать лучшего. Как по мне, дешевле уже заплатить за дорогие по времени операции - погрешность меньше будет (да и не такие уж они дорогие).

Если в переменной хранится цена, которая была не далее 5 секунд от текущей, то задача решена. Если от сохранения цены прошла 1-2-3-4 секунды, то мы просто ее игнорируем, как только прошло 5 (или более секунд) - вызываем обработчик, который принимает какое-либо решение (сравнивает текущую цену с ценой, которая была 5 секунд назад). Отслеживать можно каждый тик, там будет простое сравнение - прошло 5 секунд или нет от момента, как мы первый раз зафиксировали цену.

Т.е. принятие решения происходит, когда у нас есть текущая цена, и цена, которая была >= 5 секунд назад. Сразу после обработчика запоминаем новую цену и новую дату.

Какая разница, какое будет смещение. Ну запустил робота в 14:00:00. А первое решение он примет в 14:00:05, когда у него будут обе цены - текущая и прошлая.

 

Всем доброго доброго утра и хорошего настроения!

УВАЖАЕМЫЕ УЧАСТНИКИ ДАННОЙ ТЕМЫ! ВЕРОЯТНО ВЫ НЕ СДЕЛАЛИ САМОГО ГЛАВНОГО - НЕ ПРОЧИТАЛИ ПЕРВЫЙ ПОСТ АВТОРА ТЕМЫ!

Автор данной темы уже второй раз обращается с просьбой, цитирую: "... если бы кто-нибудь мог дать мне совет, как получить цену от 5 секунд назад, независимо от свечи и желательно без использования массива (если это возможно)!".

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

С уважением, Владимир.

 
MrBrooklin #:

Всем доброго доброго утра и хорошего настроения!

УВАЖАЕМЫЕ УЧАСТНИКИ ДАННОЙ ТЕМЫ! ВЕРОЯТНО ВЫ НЕ СДЕЛАЛИ САМОГО ГЛАВНОГО - НЕ ПРОЧИТАЛИ ПЕРВЫЙ ПОСТ АВТОРА ТЕМЫ!

Автор данной темы уже второй раз обращается с просьбой, цитирую: "... если бы кто-нибудь мог дать мне совет, как получить цену от 5 секунд назад, независимо от свечи и желательно без использования массива (если это возможно)!".

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

С уважением, Владимир.

:)

А почему все думают что в течение 5 сек. цена должна меняться хоть один раз. Она может не меняться и в течение минуты. 

И поэтому самый простой и быстрый вариант предлагал Ivan Butko  2022.11.10 04:46  

 
MrBrooklin #:

Всем доброго доброго утра и хорошего настроения!

УВАЖАЕМЫЕ УЧАСТНИКИ ДАННОЙ ТЕМЫ! ВЕРОЯТНО ВЫ НЕ СДЕЛАЛИ САМОГО ГЛАВНОГО - НЕ ПРОЧИТАЛИ ПЕРВЫЙ ПОСТ АВТОРА ТЕМЫ!

Автор данной темы уже второй раз обращается с просьбой, цитирую: "... если бы кто-нибудь мог дать мне совет, как получить цену от 5 секунд назад, независимо от свечи и желательно без использования массива (если это возможно)!".

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

С уважением, Владимир.

У автора ошибка в постановке задачи. Нет цены ровно 5 секунд назад относительно последнего тика, если последняя цена до 5 секунд и первая цена после 5 секунд назад.

Без массива можно, можно в глобальные переменные все засунуть)))

К тому же, что делать, если тиков нет более 6 секунд. Задача не описана полностью, автор не понимает до конца условий, в которых ставится задача. И задача где то там в 5 секундном отставании запоминать все тики и сравнивать их со временем прихода новых, а это без четких условий времени прихода тиков сложная задача. Простая она если тики приходят раз или чуть чаще в секунду. А если гораздо реже или гораздо чаще, то все сложнее, и когда чаще тяжелее по ресурсам.

 
Petros Shatakhtsyan #:

:)

А почему все думают что в течение 5 сек. цена должна меняться хоть один раз. Она может не меняться и в течение минуты. 

И поэтому самый простой и быстрый вариант предлагал Ivan Butko  2022.11.10 04:46  

Давать советы не соответствующие запросу все горазды и очень часто так и происходит.

Владимир прав. Чтобы было более понятно, я попробую перефразировать задачу:

Включили терминал. Запустили скрипт. Соответственно пока ещё нет ничего, ни цены ни времени в прошлом. И в этот момент надо получить цену которая была 5 секунд взад. Да ещё и не используя массив.

 
Valeriy Yastremskiy #:

У автора ошибка в постановке задачи. Нет цены ровно 5 секунд назад относительно последнего тика, если последняя цена до 5 секунд и первая цена после 5 секунд назад.

Без массива можно, можно в глобальные переменные все засунуть)))

К тому же, что делать, если тиков нет более 6 секунд. Задача не описана полностью, автор не понимает до конца условий, в которых ставится задача. И задача где то там в 5 секундном отставании запоминать все тики и сравнивать их со временем прихода новых, а это без четких условий времени прихода тиков сложная задача. Простая она если тики приходят раз или чуть чаще в секунду. А если гораздо реже или гораздо чаще, то все сложнее, и когда чаще тяжелее по ресурсам.

Валерий, зачем фантазировать? Не изменилась цена, ну и флаг ей с попутным ветром. Нет цены, то-же самое. Вопрос не в том, что делать получив цену, а просто получить.

 
Alexey Viktorov #:

Валерий, зачем фантазировать? Не изменилась цена, ну и флаг ей с попутным ветром. Нет цены, то-же самое. Вопрос не в том, что делать получив цену, а просто получить.

Не знаю, тики шли 6 секунд назад и 4 секунды назад, между ними тиков не было, какой. Или между 5.01 и 4.99 было 100 или 1000 тиков с волатильностью 100 спредов, с какой точностью нужна цена и какая, вопрос тот же, до 5 секунд или после))))

В общем то копирование структуры тиков в 5 секундном диапазоне дубовое, но верное решение.))) Но красивей было бы на каждом тике получать всего лишь 2 цены, до 5 секунд и после и это легкое решение, но это сложнее в реализации, к тому для всех условий (часто редко) одинаково легких решений нет, как по мне.

Причина обращения: