Блог им. vkcoda982 |Пишу MarketScanner. 07.05.2016

Постепенно пишу код, ответственный за визуализацию графиков в своем сканере рынка. Оказалось, что рисование разных чартов — это сложная задача, завершение которой требует решения многих отдельных подзадач. Поборол проблемы пиксельной точности при рисовании шейдерами, добавил нормализацию видимых элементов, реализовал несколько видов чартов (candlestick, OHLC, bar). Сейчас главной проблемой остаётся выстраивание грамотной архитектуры классов, в которую можно было бы безболезненно добавлять новые типы чартов. Это достаточно сложно, особенно если ранее опыта построения таких иерархий не было. Кстати, считаю хорошей задачей для собеседования на вакансию программиста — набросать на бумаге иерархию классов для системы чартов.

Для собственного понимания, как это все должно рисоваться, я смотрел в google images существующие варианты разных графических представлений чартов. Можно было бы реализовать самый примитивный рендер, но мне хочется чтобы было «красиво-багато». Планируется, что у чартов могут быть «скины», которые по-разному будут отображать одни и те же финансовые данные. Настраиваться будет все через XML-конфиг.

Пишу MarketScanner. 07.05.2016

Блог им. vkcoda982 |Пишу MarketScanner. 10.04.2016

По-быстрому набросал скелет отрисовщика графиков. И наконец-то я увидел воочию те данные, которые качал мой фетчер последние два месяца. Все рисуется через Direct3D, + реализовал простейшую нормализацию свечей по высоте области вывода. Свечи могут быть пустыми и закрашенными, с разными цветами. Поиск в гугле показал, что наиболее популярны красно-зелёные свечи, но встречаются и другие раскраски. Для пробы реализовал парочку.

AMZN:
Пишу MarketScanner. 10.04.2016

( Читать дальше )

Блог им. vkcoda982 |Пишу MarketScanner. 09.04.2016

Прошло уже три месяца, как я начал писать свой собственный сканер рынка. Недавно купил лицензию на Windows 10 и тестирую программу уже на этой ОС. Пишу в свободное от основной работы время — мне понравилось писать код для новой сферы деятельности, никак не связанной с основной профессией. В последнее время код уже не меняется сколь-нибудь кардинально, а это значит, что разработка фетчера подходит к логическому концу.

Фетчер данных — это консольное приложение, написанное на С++11, которое является клиентом платформы TWS и общается с ней через IB API. Предполагается, что оно может работать непрерывно, а в случае разрыва связи или закрытия — ждать восстановления соединения или перезапускаться и продолжать работу с того места, где остановилось в прошлый раз. Перезапуск осуществляется через отдельную программу-монитор, которая следит за процессом в памяти, и если необходимо, запускает его заново.

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

( Читать дальше )

Блог им. vkcoda982 |Пишу MarketScanner. 28.02.2016

Продолжаю в свободное время писать сканер рынка.

В первую очередь оказалось, что ответы на запросы к TWS приходят асинхронно, поэтому линейно работать затруднительно. Это проявлялось в том, что некоторые ответы прилетали позже и терялись, т. к. я уже переходил к следующему тикеру в случае каких-либо ошибок. Поэтому я разделил программу на два потока — один из них регулярно делает запросы, а второй ждёт когда появятся ответы и записывает данные на диск. Собственно такая архитектура поддерживается API IB, т. к. при получении данных вам передаётся request id, по которому можно сориентироваться, куда записывать пришедшие данные, и этот id может быть ответом не на последний запрос, а например, на предпоследний.

Изменил вывод текста в консоль. Решил, что хорошая идея не выводить вперемешку в общий output сообщения из разных потоков, а разделить консольный вывод на две части, и привязать к каждой из них соответствующий поток. Пришлось отказаться от стандартных функций POSIX по выводу строк в консоль, и написать свой собственный класс консоли, который управляет выводом в screen buffer. Выглядит это примерно так:

( Читать дальше )

Блог им. vkcoda982 |Пишу MarketScanner. 21.02.2016

Продолжаю писать в свободное от работы время собственный market scanner.

Решено, что сканер будет состоять из двух программ, работающих независимо:
1) Database, которая будет вытягивать исторические данные через IB TWS, формировать из них базу данных.
2) Scanner + Visualizer, собственно поиск паттернов, отображение чартов, подача сигналов, выставление ордеров и т. д.
Предполагается, что работать они будут параллельно и круглосуточно, скачивая и сканируя весь рынок на предмет точек входа.
 
Торговые данные будут храниться на диске в виде XML-файлов — текстовый формат более удобен для ручной инспекции, он расширяем, может читаться разными парсерами и т. д. Для работы с XML я подключил библиотеку TinyXML: https://sourceforge.net/projects/tinyxml/

Тестовый код работает следующим образом: в XML-файле хранится список тикеров, по которым нужно получить исторические данные. Для простоты я начал с компаний из списка S&P 500. Программа идёт по списку и вытягивает исторические данные за последний год для каждого тикера. Полученные данные записываются в соответствующий XML-файл, который имеет такое же символьное сокращение как и у тикера.

( Читать дальше )

Блог им. vkcoda982 |Пишу MarketScanner

Многие пишут роботов, даже Мартыныч бросился изучать C# что бы что-нибудь этакое написать. Поскольку я программист, то решил не отставать и тоже написать — но нет, не робота, а сканер рынка. Идея простая — сканер должен вытягивать с сервера брокера исторические данные по всем торгуемым на NYSE ценным бумагам и искать по заданным алгоритмам фигуры теханализа. Наблюдая за рынком на протяжении последнего года, я заметил некоторые фигуры в действии — они действительно имеют место быть:
IBM оттолкнулась от линии поддержки

Сканер должен обрабатывать скачиваемые исторические данные, таймфрейм — недели/месяцы. Если определяется какая-либо интересная фигура TA, то программа сообщает об этом мне, а я уже дальше в ручном режиме просматриваю бумагу и принимаю решение торговать её или нет. На биржах США торгуется несколько тысяч ценных бумаг эмитентов, по задумке время от времени где-то что-то будет вырисовываться. Вручную за таким кол-вом тикеров уследить невозможно — поэтому нужен сканер.

Я работаю с InteractiveBrokers, у них есть API для всех основных платформ (Win/Mac/Unix) и языков — Java/C++/C#:
www.interactivebrokers.com/en/software/api/api.htm
Также быстро разобраться в нюансах помог сайт Richard-а Holowczak-а: 
holowczak.com/ib-api-socket-csharp-historical

А вот консольный вывод скачанных исторических данных:

Пишу MarketScanner
По сути сканер будет формировать некую базу данных, скачивая котировки в непрерывном режиме, постоянно отыскивая в их движении закономерности. Я планирую написать визуализатор для котировок, так что я мог бы просматривать свечки и линии поддержки-сопротивления без участия основного терминала.

....все тэги
UPDONW
Новый дизайн