Здравствуйте дорогие хабровчане, в этом посте я покажу, как написать свой биржевой индекс наподобие S&P 500 или Nasdaq.  О том, как мне это пришло в голову можно прочитать в моей предыдущей статье: Как я решил стать трейдером и проигрался, а потом отыгрался, потому, что я программист. Мой опыт. Здесь будет рассмотрена только техническая сторона. В силу того, что прошлая статья получила большой отклик у хабровчян, я решил сделать техническое описание кода приложения. Не работаю в Тинькофф и мне не заплатили за рекламу. Конечно, была попытка добавить эту статью в корпоративный блог Тинькова хоть за символическую плату, но не тут то было. Меня просто месяц динамили, а потом сказали, дескать блог только исключительно для сотрудников компании (должно быть это месть за критику службы поддержки в прошлой статье).  В предыдущей статье было описано, как мне удалось рассчитать и использовать индекс чистой стоимости фонда и как я к этому пришёл. Этот индекс был написан на старом api, на тот момент единственном. Из-за этого возникло множество проблем, главная из которых большая задержка в обновлении данных. Чтобы уменьшить эту задержку (которая в итоге составила 5,5 секунд!), мне пришлось использовать два токена доступа, которые чередовались для каждого запроса. Также я вынужден был выбрать строго ограниченное количество компаний, для которых проводился расчёт. Бутылочным горлышком являлось отсутствие возможности получать данные по нескольким компаниям в одном запросе. Например, чтобы получить текущие цены акций десяти компаний нужно было десять запросов. Если не укладывался в лимит, а количество запросов было ограничено в минуту, api возвращал ошибки на последующие обращения. Однако, в начале 2022 года тинькофф выкатил новый api, в котором эти проблемы были решены. Теперь можно в одном запросе получать все текущие цены на акции. Сам микросервис написан на Python 3 и упакован в Docker-контейнер, клиент — на JavaScript, график TradingView. Микросервис и клиент общаются при помощи api реализованном на FastApi.  Репозиторий с исходным кодом — на GitHub.  custom_index.py: У каждой компании, торгующейся на бирже, кроме названия, есть свой тикер. Однако, для того, чтобы получить данные по компании необходимо знать её figi код. Чтобы его получить необходимо сопоставить тикер и figi код. Это происходит в конструкторе класса CustomIndex. В нём скачиваются figi для всех акций и сопоставляются с нужными мне тикерами. Здесь нет ничего сложного. Метод get_tinkoff_candles получает исторические данные по figi коду. Исходя из ограничений api на интервалах 1, 5 и 15 минут можно получить только один день. Так же было и в старом api. То есть, чем больше исторических данных мне нужно, тем больше нужно запросов (ограничение запросов в минуту никуда не делось). Любопытно было бы узнать, из каких соображений данные ограничили одним днём. Ну и главное отличие от старого api я с удовольствием использовал в методе get_tinkoff_last_prices. В нём обновляются все последние цены для всех акций за один запрос. tinkoff-microservice.py: Через этот микросервис поставляются данные клиенту. Основные параметры для настройки находятся в начале файла.  В функции historical_candles формируются исторические данные. Для их расчёта группируются все цены каждого тикера, т.е. цены open, high, low и close рассчитываются отдельно друг от друга. На выходе получаются исторические данные рассчитанного индекса. Функция currient_candle формирует текущую свечку графика и рассчитывает индекс исходя из текущих цен на акции. index.html: Файл index.html совсем простой, содержит в себе переключатель 'radio' для изменения интервала графика 1, 5 и 15 минут, также div контейнер custom_chart для самого графика. Здесь же подключены скрипты TradingView. index.js: В файле index.js функция getHistory получает исторические данные из микросервиса и отображает график. Обновление текущей цены происходит в планировщике вызова setInterval, здесь же обновляются исторические данные, если поменять интервал свечей графика. Dockerfile: Упакованный в Docker-контейнер микросервис очень удобно использовать и портировать. docker-compose.yml: Микросервис и клиент общаются между собой через порт 8000, клиент доступен на localhost:8080  Примечание: для работы приложения нужен docker-compose и браузер. Чтобы запустить микросервис необходимо добавить свой токен от тиньков api в файл token.txt, который находится в папке microservice. Выполнить в корневой папке проекта docker-compose up --build и открыть в браузере http://localhost:8080/. Как и было отмечено в предыдущей статье, подобный индекс вполне себе рабочий инструмент. Однако есть несколько недочетов, которые не удалось решить (возможное решение это stream-соединения в тинькофф api): Спасибо за внимание.