Блог им. empenoso

Как я решил вернуться в алготрейдинг после 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. Синтаксис этой функции был следующий:

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

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

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

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

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

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

<code>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</code>

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

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

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

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

&lt;br&gt;

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

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

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

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

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

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

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

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

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

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

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

  1. Список бумаг — с которым он будет работать.
  2. Условие покупки.
  3. Условие продажи.
  4. CSV файл учёта
  5. Управление деньгами — процент входа.
  6. Логирование всех действий.
  7. Отображение информации, скорее всего через веб-сервер.
  8. Иметь модуль бектестинга.

T‑Bank Invest API + Node.JS:

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

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

  1. Взаимодействие с T‑Bank Invest API<code>tinkoffClient.js
Модуль, который ищет акции с самым большим оборотом за три последних месяца <code>searchTradingVolumes.js

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

SilverFir-TradingBot\src\grpc\tinkoffClient.js

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

Модуль <code>tinkoffClient.js

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

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

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

  1. Авторизация и настройка:
  • Модуль использует API-токены для аутентификации.
  • Он поддерживает как тестовую (песочницу), так и продовую среду, хотя по умолчанию он использует среду песочницы.
  • Заголовки API включают необходимый токен авторизации и тип контента для JSON-коммуникации.
  1. Универсальный механизм вызова API:
  • Метод <code>callApi()
  • служит гибкой утилитой для отправки POST-запросов на конечные точки API Tinkoff.
Он обрабатывает отправку полезной нагрузки и отчеты об ошибках, предоставляя подробную обратную связь по сбоям (через журналы).
  1. Извлечение данных «японских свечей»:
  • Метод <code>getCandles()
  • извлекает данные свечей для заданного финансового инструмента (тикера) за указанные интервалы.
Он вычисляет временной диапазон на основе предоставленного интервала и извлекает серию свечей из сервиса рыночных данных. Это необходимо для анализа рынка, технических индикаторов и торговых стратегий.Обрабатывает до 1000 свечей за запрос и обеспечивает регистрацию ошибок, если запрос не выполняется или возвращает пустые данные.

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

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

SilverFir-TradingBot\src\searchTradingVolumes.js

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

Модуль <code class="inline-code">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

<code>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</code>

Итоги

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

Модуль <code>tinkoffClient.js

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

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

7 октября 2024 г.

★2
#10 по плюсам, #2 по комментариям
17 комментариев
T-bank?!🙈 после этого да же читать дальше не стал.
avatar
Head of Algonaft'$, а вариантов прямо очень много что ли?
Михаил Шардин, да, вариантов алго очень много! В т.ч. без софта-прослойки! Да и Г_банк гавноброкер с повышенным комисом… вы точно алго или все таки акло?
avatar
Head of Algonaft'$, через квик?
Михаил Шардин, еще раз… зачем вам софт прослойка? для чего?
avatar
Head of Algonaft'$, я физ. лицо, выхожу с торговым алгоритмом на биржу, начинаю с небольших денег, не хочу платить за аренду и доступ. Какие мои варианты?
сколько лет писать будете робота?
avatar
VалиБакS, механизм уже написал — он работает. Логика самое главное.
VалиБакS, с модулями бектестинга на Node.js проблемы — не могу подобрать рабочий.
Зачем изобретать велосипед, когда уже есть готовые решения? Потратили бы лучше время непосредственно на торговую логику.
Дмитрий Овчинников, API это тоже готовое решение. А в квик через костыль.
Михаил Шардин,
API это не решение а интерфейс.
Дмитрий Овчинников, да.
Просто вы написали про готовые решения, но я не хотел пользоваться квиком. И смог найти только три АПИ от брокера.
Может быть можно как-то было выйти напрямую на биржу, но я начинаю с небольших денег и не хочу платить за аренду и доступ.
Ну и для Node.js вариантов не было. Поэтому стал писать.
Михаил Шардин,
Все верно, нюанс только в том, что вы платите временем, правда меняете его на опыт, что неплохо.
Дмитрий Овчинников, это следующий шаг.
Дмитрий Овчинников, в своё время АПИ Тинькова показалось мне просто космическим инструментом, в хорошем смысле «не имеющим аналогов»

Купить, продать, узнать статус можно банально отправив запрос через, скажем, postman. Никаких промежуточных прокладок

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

PS про autotrade впервые узнал, спасибо

PPS сам Т-АПИ сейчас не использую, хватает совсем простых инструментов, но с интересом слежу, что люди делают, например, впечатлила связка гугл-докс и т-апи, готовая табличка

avatar
Понеслась п… да по кочкам. Приехали. Баффета в топку. Примука я красную таблетку!

теги блога Михаил Шардин

....все тэги



UPDONW
Новый дизайн