Как я решил вернуться в алготрейдинг после 10 летнего перерыва

Самое главное, что никакого отношения к слову алко это не имеет.
В течении нескольких лет я торговал в связке программы технического анализа AmiBroker + торговый терминал QUIK через .tri и .trr файлы в основном на фьючерсах на срочном рынке.
Не могу сказать что это было неудачным опытом, но со временем я узнал про распределение активов (Asset allocation) и понял что очень сложно соревноваться с бенчмарком в виде фондового индекса.

В теории это означает что можно купить индекс и забыть об этом, заниматься своими делами, бизнесом, семьёй -, а индекс растёт (ну или падает, смотря какое время) и для этого не нужно прикладывать никаких действий.
А за связкой AmiBroker + QUIK постоянно нужно было присматривать, следить не отвалился ли адаптер импорта через .tri файл. А ещё иметь несколько виртуальных машин с установленными копиями Windows на каждой виртуалке на одном физическом компьютере для разных брокеров. Возможна была установка только одной пары AmiBroker + QUIK на одну винду. Всё это мне не особо нравилось.

В 2024 году захотелось что-то лёгкое — без Windows и современное — через API интерфейс. Желательно бесплатное для пользователя. Несколько лет назад я уже пытался узнать появились ли у российских брокеров API для работы с ними, но так и не собрался. Этой осенью я стал активно искать информацию — какой брокер имеет АПИ для работы с физлицами. Не смог найти никакой сводной таблицы и нашёл только три варианта:

По субъективным причинам я выбрать работать с T‑Bank Invest API (это бывший Тинькофф) через среду выполнения JavaScript Node.JS.

Немного моей истории, 2008–2012 годы: AmiBroker + QUIK

AmiBroker — это платформа для технического анализа, которая позволяет пользователям создавать свои собственные индикаторы и скрипты. Она также может интегрироваться с другими программами, такими как MetaTrader, NinjaTrader и даже с торговыми терминалами, включая QUIK.

AmiBroker 3D Optimization Chart

AmiBroker 3D Optimization Chart

В AmiBroker’е мне очень нравилась его функция 3D Optimization Chart. На мой взгляд она позволяла избежать переподгонки показателей под кривую истории. Оптимизация в бэк-тестере поддерживалась функцией optimize. Синтаксис этой функции был следующий:

переменная = optimize("Описание", default , min , max , step );

переменная — это обычная переменная их языка AFL, которой присваивается значение, возвращаемое функцией оптимизации.
В режиме оптимизации функция optimize возвращает последовательные значения от минимума до максимума (включительно) с пошагово.
"Описание" — это строка, которая используется для идентификации переменной оптимизации и отображается как имя столбца в списке результатов оптимизации.
default — это значение по умолчанию, которое оптимизирует возврат функции в режимах исследования, индикатора, комментария, сканирования и обычного бэктеста.
min — минимальное значение оптимизируемой переменной
max — максимальное значение оптимизируемой переменной
шаг — это интервал, используемый для увеличения значения от минимума до максимума.

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

Когда AmiBroker подключался к QUIK, он получал данные в реальном времени от торговой системы QUIK и использовал их для построения графиков, создания индикаторов и выполнения других аналитических задач. Пользователь мог также настроить систему так, чтобы она автоматически исполняла сделки через QUIK на основе определенных условий.

Для подключения AmiBroker к QUIK необходимо было установить соответствующий плагин или модуль. Это позволяло платформе AmiBroker получать данные от QUIK и обрабатывать их для дальнейшей работы.

Пример логов работы:

09.10.2009 11:00:31: [2208:2212] Получено уведомление о выполнении транзакции ,   TRANS_ID=807263520;CLASSCODE=SPBFUT;ACTION=NEW_ORDER;SECCODE=GMZ9;ACCOUNT=SPBFUT0087W;PRICE=37692;QUANTITY=2;OPERATION=S;CLIENT_CODE=48560/48560;TYPE=L;EXECUTION_CONDITION=;CHECK_LIMITS=;MARKET_MAKER_ORDER=;STATUS=3;TRANS_NAME="Ввод заявки"; DESCRIPTION="[FORTS] Заявка N 761722396 успешно зарегистрирована"; ORDER_NUMBER=761722396;
09.10.2009 14:04:30: [2208:1172] Получено уведомление об отправке транзакции ,   TRANS_ID=2087816784;CLASSCODE=SPBFUT;ACTION=NEW_ORDER;SECCODE=VBZ9;ACCOUNT=SPBFUT0087W;PRICE=6333;QUANTITY=12;OPERATION=S;CLIENT_CODE=48560/48560;TYPE=L;EXECUTION_CONDITION=;CHECK_LIMITS=;MARKET_MAKER_ORDER=;STATUS=0;TRANS_NAME="Ввод заявки"; DESCRIPTION="Отправлена транзакция";
09.10.2009 14:04:30: [2208:2212] Получено уведомление о выполнении транзакции ,   TRANS_ID=2087816784;CLASSCODE=SPBFUT;ACTION=NEW_ORDER;SECCODE=VBZ9;ACCOUNT=SPBFUT0087W;PRICE=6333;QUANTITY=12;OPERATION=S;CLIENT_CODE=48560/48560;TYPE=L;EXECUTION_CONDITION=;CHECK_LIMITS=;MARKET_MAKER_ORDER=;STATUS=3;TRANS_NAME="Ввод заявки"; DESCRIPTION="[FORTS] Заявка N 763167846 успешно зарегистрирована"; ORDER_NUMBER=763167846;
09.10.2009 15:10:10: [2208:1172] Завершен процесс отправления транзакций из файла ,   Входной файл-"C:\Program Files\Quik5\MTS\input.tri", Выходной файл-"C:\Program Files\Quik5\MTS\output.tro", Файл с журналом-"C:\Program Files\Quik5\MTS\log.trr", отправлено транзакций-3, выполнено транзакций-3

Насколько я понимаю AmiBroker (создан в Польше) уже несколько лет не обновляется: последний выпуск в 2015 году, а обновления в 2017 году.

QUIKом я уже очень давно не пользовался, но по скриншотам на сайте я понял что программа внешне за последние годы не особенно изменилась.

Ещё немного моей истории, 2008–2012 годы: КБ ПАУК и Technical Analysis of STOCKS & COMMODITIES

Раньше я был активным пользователем форума КБ ПАУК. Вот даже нашёл файл HTML файл с интересующей меня темой, который пролежал 20 лет:

Форум форекс кб паук http://forex.kbpauk.ru/ (в 2024 уже не работает)

Я много изучал тему посвященную AmiBroker’у. И спрашивал там (привет Олег 000). Выкладывал примеры из бумажного журнала Technical Analysis of STOCKS & COMMODITIES.

Сейчас, в 2024 году форум недоступен, но если кто-то хочет ностальгии, то нашёл его архивную копию.

Форум форекс кб паук http://forex.kbpauk.ru/ (в 2024 уже не работает)

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

2024 год, сейчас: T‑Bank Invest API + неофициальный SDK Node.JS. Описание функций торгового робота

Примерная структура робота

Примерная структура робота

Осенью 2024 года решил написать торгового бота, создать структуру программы которая будет работать через API брокера.

Торговый робот должен содержать:

  1. Список бумаг — с которым он будет работать.

  2. Условие покупки.

  3. Условие продажи.

  4. CSV файл учёта

  5. Управление деньгами — процент входа.

  6. Логирование всех действий.

  7. Отображение информации, скорее всего через веб-сервер.

  8. Иметь модуль бектестинга.

T‑Bank Invest API + Node.JS:

Решил пока не лезть в срочный рынок и попробовать поработать с самими оборотистыми акциями на Московской бирже. Остаётся только их найти.

В этой статья я распишу как создал два модуля на Node.js:

  1. Взаимодействие с T‑Bank Invest APItinkoffClient.js

  2. Модуль, который ищет акции с самым большим оборотом за три последних месяца searchTradingVolumes.js

Проект представлен на Гитхабе: https://github.com/empenoso/SilverFir-TradingBot.

SilverFir-TradingBot\src\grpc\tinkoffClient.js

5b678a513c0d89d80bb787d1879745a0.png

Модуль tinkoffClient.js — это специализированный клиент, разработанный для взаимодействия с T‑Bank Invest API, российской брокерской платформой. Основная цель этого модуля — предоставить боту на основе Node.js, доступ к финансовым данным для алгоритмической торговли или анализа рынка.

Вот его функциональность:

Основные функции:

  1. Авторизация и настройка:

  • Модуль использует API-токены для аутентификации.

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

  • Заголовки API включают необходимый токен авторизации и тип контента для JSON-коммуникации.

  1. Универсальный механизм вызова API:

  • Метод callApi() служит гибкой утилитой для отправки POST-запросов на конечные точки API Tinkoff.

  • Он обрабатывает отправку полезной нагрузки и отчеты об ошибках, предоставляя подробную обратную связь по сбоям (через журналы).

  1. Извлечение данных «японских свечей»:

  • Метод getCandles() извлекает данные свечей для заданного финансового инструмента (тикера) за указанные интервалы.

  • Он вычисляет временной диапазон на основе предоставленного интервала и извлекает серию свечей из сервиса рыночных данных. Это необходимо для анализа рынка, технических индикаторов и торговых стратегий.

  • Обрабатывает до 1000 свечей за запрос и обеспечивает регистрацию ошибок, если запрос не выполняется или возвращает пустые данные.

Зависимости и утилиты:

  • Moment.js: Используется для форматирования дат и расчета временных диапазонов, что имеет решающее значение при работе с финансовыми данными за различные периоды времени.

  • Axios: Обрабатывает HTTP-запросы к конечным точкам API.

  • Службы ведения журналов: реализует настраиваемую систему журналов для вывода файлов и консоли, помогая в отладке и отслеживании операций.

SilverFir-TradingBot\src\searchTradingVolumes.js

45864a8ea4950766801ee05494daf32b.png

Модуль searchTradingVolumes.js является частью SilverFir-TradingBot, разработан для определения акций на Московской бирже (MOEX) с наибольшими объемами торгов за последние три месяца. Нужен чтобы отбросить неликвид.

Вот подробный обзор функций модуля:

Основные функции:

  1. Фильтрация акций с MOEX (Московской биржи):

  • Модуль использует T‑Bank Invest API для получения полного списка доступных акций.

  • Фильтрует результаты, чтобы сосредоточиться конкретно на акциях, торгуемых на REAL_EXCHANGE_MOEX, гарантируя, что будут рассмотрены только акции Мосбиржи.

  • Отфильтрованный список включает в себя важную информацию, такую ​​как FIGI (глобальный идентификатор финансового инструмента), тикер, ISIN и название, которые затем регистрируются для отслеживания и анализа.

  1. Извлечение исторических данных по объему торгов:

  • Для каждой акции, идентифицированной на этапе фильтрации, модуль извлекает ежедневные данные свечей (OHLCV — открытие, максимум, минимум, закрытие, объем) с помощью T‑Bank Invest API.

  • Он извлекает данные за последние три месяца, рассчитывая общий объем торгов за этот период.

  • Этот шаг имеет решающее значение для измерения рыночной активности и определения наиболее активно торгуемых акций.

  1. Определение 15 лучших акций по объему:

  • После сбора данных по объему торгов модуль ранжирует все акции на основе их общего объема торгов за трехмесячный период.

  • Затем он выбирает 15 лучших акций, которые считаются имеющими самый высокий оборот, что делает их наиболее активными на рынке.

  1. Ведение журнала и подготовка конфигурации:

  • 15 лучших акций регистрируются с соответствующими тикерами и идентификаторами FIGI для дальнейшего использования.

  • Эти данные также подготавливаются для включения в конфигурацию бота, что позволяет легко интегрировать их в другие части торговой стратегии.

Зависимости и утилиты:

  • Moment.js: используется для манипулирования датами, в частности для генерации временных диапазонов (три месяца) для запросов исторических данных.

  • TinkoffClient: это выделенный клиент бота для взаимодействия с API Tinkoff Invest, облегчающий коммуникацию, необходимую для получения данных по акциям и свечам.

  • Служба пользовательского ведения журнала: модуль использует систему ведения журнала, которая регистрирует информацию как в консоли, так и во внешних файлах, помогая отслеживать фильтрацию акций, расчеты объема и любые ошибки, возникающие во время взаимодействия с API.

Результат выполнения скрипта searchTradingVolumes.js

2024-10-06 07:25:48 [INFO]: Отфильтрованных акций 170 штук.
2024-10-06 07:25:50 [INFO]: Топ 15 акций по объему за последние три месяца: [
  {
    "ticker": "GRNT",
    "figi": "TCS10A0JV532",
    "totalVolume": 7092179306
  },
  {
    "ticker": "VTBR",
    "figi": "BBG004730ZJ9",
    "totalVolume": 5906896857
  },
  {
    "ticker": "MTLR",
    "figi": "BBG004S68598",
    "totalVolume": 5047115732
  },
  {
    "ticker": "UWGN",
    "figi": "BBG008HD3V85",
    "totalVolume": 4423660125
  },
  {
    "ticker": "RNFT",
    "figi": "BBG00F9XX7H4",
    "totalVolume": 1775061013
  },
  {
    "ticker": "EUTR",
    "figi": "TCS00A1002V2",
    "totalVolume": 1270913208
  },
  {
    "ticker": "SNGSP",
    "figi": "BBG004S681M2",
    "totalVolume": 1092911599
  },
  {
    "ticker": "GAZP",
    "figi": "BBG004730RP0",
    "totalVolume": 1027429605
  },
  {
    "ticker": "ROSN",
    "figi": "BBG004731354",
    "totalVolume": 983187493
  },
  {
    "ticker": "SBER",
    "figi": "BBG004730N88",
    "totalVolume": 940111321
  },
  {
    "ticker": "SGZH",
    "figi": "BBG0100R9963",
    "totalVolume": 929574444
  },
  {
    "ticker": "AFLT",
    "figi": "BBG004S683W7",
    "totalVolume": 632806638
  },
  {
    "ticker": "VKCO",
    "figi": "TCS00A106YF0",
    "totalVolume": 595704137
  },
  {
    "ticker": "RUAL",
    "figi": "BBG008F2T3T2",
    "totalVolume": 542242519
  },
  {
    "ticker": "TATN",
    "figi": "BBG004RVFFC0",
    "totalVolume": 538004844
  }
]
2024-10-06 07:25:50 [INFO]: 

Вставка в config.js:

2024-10-06 07:25:50 [INFO]: 
securitiesToMonitorTikerArray: ["GRNT","VTBR","MTLR","UWGN","RNFT","EUTR","SNGSP","GAZP","ROSN","SBER","SGZH","AFLT","VKCO","RUAL","TATN"]
2024-10-06 07:25:50 [INFO]: 
securitiesToMonitorFigiArray: ["TCS10A0JV532","BBG004730ZJ9","BBG004S68598","BBG008HD3V85","BBG00F9XX7H4","TCS00A1002V2","BBG004S681M2","BBG004730RP0","BBG004731354","BBG004730N88","BBG0100R9963","BBG004S683W7","TCS00A106YF0","BBG008F2T3T2","BBG004RVFFC0"]
2024-10-06 07:25:50 [INFO]: 

Для использования в скрипте download_md.sh в одну колонку:
TCS10A0JV532
BBG004730ZJ9
BBG004S68598
BBG008HD3V85
BBG00F9XX7H4
TCS00A1002V2
BBG004S681M2
BBG004730RP0
BBG004731354
BBG004730N88
BBG0100R9963
BBG004S683W7
TCS00A106YF0
BBG008F2T3T2
BBG004RVFFC0

Итоги

Проект представлен на Гитхабе: https://github.com/empenoso/SilverFir-TradingBot. Новые модули будут загружаться по мере написания и тестирования.

Модуль tinkoffClient.js для T‑Bank Invest API представлен пока только частично.

Автор: Михаил Шардин

7 октября 2024 г.

© Habrahabr.ru