Объёмы покупок и продаж
В последнее время стала весьма популярной тема анализа состояния рынка путём разделения объёма торгов на объём покупки и объём продаж. Такой заказ поступил и мне.
Для того чтобы произошла сделка, необходима последовательность из двух событий. Первое событие состоит в помещении заявки одним трейдером в очередь. Заявка должна в ней оставаться вплоть до второго события, когда иной трейдер отправит в торговую систему встречную заявку по той же (или лучшей) цене, что и первая. В этом случае произойдет сделка, один из трейдеров продаст какой-то актив, второй его купит. Взависимости от направления первой заявки сделка может трактоваться как сделка купли либо как сделка продажи. Существует тезис, что исходя из соотношения объёмов покупок и объёмов продаж в моменте а также динамике этого соотношения можно прогнозировать поведение рынка.
Для торговли на основании этого предположения необходим инструмент, позволяющий разделять объём на покупки и продажи и визуализировать полученные результаты в удобном и понятном для пользователя виде.
Собственно, техническое задание было коротко и очень конкретно:
Рассчитать объёмы покупок и продаж по произвольному инструменту и создать индикатор для Амиброкера, функционально полностью аналогичный встроенному индикатору объёмов. Заказчик подразумевает, что индикатор должен правильно работать во всех режимах программы Amibroker, включая нестандартные таймфреймы.
Задача выглядит классической. Однако её реализация оказалась сложной. Причина - в невозможности получения исходных данных стандартным способом (через плагин).
Единственным полноценным источником данных для построения индикатора объёмов покупки и продажи в терминале QUIK является таблица всех сделок. Это упорядоченный по времени список сделок за торговый день без каких-либо возможностей интервального структурирования. Для решения задачи необходимо в реальном времени просчитывать всю таблицу. Однако взависимости от анализируемого инструмента размер этого списка может оказаться весьма большим. К примеру, количество сделок фьючерса на индекс РТС за торговый день находится в пределах от миллиона до двух. Если же брать таблицу сделок, где собраны сделки по всем инструментам без фильтрации, то размер таблицы вырастает многократно. Становится очевидно, что обработка всей таблицы сделок ликвидного инструмента в реальном времени есть задача непосильная - количество сделок в секунду может достигать десятков, а в некоторые моменты даже сотен.
Поэтому необходим какой-то более интеллектуальный подход (а не простой цикл по строкам таблицы всех сделок) с кешированием результатов, когда результаты предыдущих расчетов сохраняются и используются в дальнейшем. Такой подход позволяет резко сократить расходы процессорного времени и программа становится в состоянии обрабатывать всю поступающую информацию в реальном времени.
Однако ничто не даётся даром. В таком подходе возникают дополнительные технические сложности, кроме самого алгоритма кэширования результата.
- Первая сложность. Амиброкер не имеет такого понятия как "список возможных теймфреймов". Кроме общепринятых, таких как 1 тик, 1 минута, 5 минут, 15 минут, 1 час, дневной, недельный и им подобных Амиброкер позволяет оперировать любыми иными, на вкус пользователя. Можно использовать как любые регулярные промежутки времени (2 сек, 13 минут, 5 часов, 4 дня и т.п.), так и синтетику типа 2 тика или 13 тиков. Пользователь может конструировать таймфреймы исходя из собственных нужд. Поэтому нет возможности заранее рассчитать все данные для всех возможных таймфреймов - алгоритм кэширования должен учитывать возможность использования пользователем произвольного таймфрейма, а также возможность его (таймфрейма) изменения во время работы в любое время. Алгоритм становится весьма сложным.
- Вторая сложность состоит в том, что источник данных предоставляет информацию исключительно за текущий торговый день. Это означает, что для показа истории за предудущие дни результаты кэширования должны сохраняться не только в оперативной памяти, но и где-то на жестком диске. И это при том, что заранее никогда неизвестно, на каком таймфрейме пользователь будет эксплуатировать индикатор. Таким образом, при переключении таймфрейма графика необходим перерасчет всей истории. Задача перестаёт быть томной из-за требований к её универсальности и производительности.
Конечно, напрашивается сохранение данных в базе данных самого амиброкера. Зачем изобретать что-то с нуля, если можно воспользоваться готовым. Именно такой путь и был в результате использован. Результаты кэширования данных сохраняются в базе амиброкера в виде композитных символов и доступ к ним осуществляется стандартным (и потому очень быстрым) способом.
Пришлось помучиться, но результат оказался даже лучше ожиданий. Индикатор работает с любым инструментом, любым размером таблицы всех сделок, любым таймфреймом. Можно запустить произвольное количество таких индикаторов - реальную нагрузку на процессор индикатор практически не создаёт. Пересчет всей истории индикатора при смене одного таймфрейма на любой другой (включая нестандартные) занимает около одной секунды, а обновление происходит в реальном времени. Все описанные сложности удалось преодолеть и реализовать требуемый индикатор абсолютно стандартного вида и стандартного интерфейса.
Полученный индикатор для самого амиброкера ничем не отличается от стандартного. Пользователь имеет возможность строить любые индикаторы технического анализа на основании объёмов продаж и объёмов покупок. В частности, на одном из скриншотов видно, как на объемы покупок и объемы продаж независимо наложены по одной скользящей средней.
По просьбе Заказчика дополнительно на график выводятся два горизонтальных уровня, показывающих в реальном времени текущее состояние окна котировок (стакана) выбранного инструмента и дающих пользователю дополнительную информацию о текущем моментальном состоянии рынка.
Еще по теме:
Мне недостаточной той информации, что Вы привели, для полного понимания Вашей задачи и оценки её стоимости. Давайте свяжемся посредством скайпа (mikemsk), чтобы осознать подробности.
Задача, описанная Вами, требует совершенно иного подхода. Здесь происходит анализ таблицы всех сделок. То, о чем пишете Вы, требует анализа стакана котировок. Тоже возможно.
Эта задача решаема путем написания скрипта на языке lua. Надо сказать, что он будет довольно сложным, если его делать аккуратно и надежно.
Встроенными средствами терминала построить этот индикатор невозможно.
Его придется изготавливать дополнительно (см. несколько постов выше)
Она есть на этом сайте: www.bot4sale.ru/.../bs-volume.html
RSS лента комментариев этой записи