Блог им. 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 г.

★3
#7 по плюсам, #4 по комментариям
45 комментариев
T-bank?!🙈 после этого да же читать дальше не стал.
avatar
Head of Algonaft'$, а вариантов прямо очень много что ли?
Михаил Шардин, да, вариантов алго очень много! В т.ч. без софта-прослойки! Да и Г_банк гавноброкер с повышенным комисом… вы точно алго или все таки акло?
avatar
Head of Algonaft'$, через квик?
Михаил Шардин, еще раз… зачем вам софт прослойка? для чего?
avatar
Head of Algonaft'$, я физ. лицо, выхожу с торговым алгоритмом на биржу, начинаю с небольших денег, не хочу платить за аренду и доступ. Какие мои варианты?
Михаил Шардин, я собрал каталог на коленке со сборником решений для алготрейдинга osaengine.ru/ Веду блог (сейчас в оперативной паузе — трейдинг попёр вверх)) Надеюсь подборка пригодится.
avatar
Gambler, негусто там инструментов
Михаил Шардин, так это опенс сорс, и под МосБиржу )) Другого нет

Вот еще нашел недавно один сайт algotradinglib.com/en/soft/ там более бохато, но там всё вместе.
avatar
Михаил Шардин, у Т-банка же комиссии конские, либо ваши рабочие ТЫ должны быть от дня, недели и выше. Сейчас комиссии много съедают. И да, по рынку входить не стоит. Только мейкерскими заявками.
avatar
Михаил Шардин, кстати, 3D Optimization Chart есть в Ехеле, могу скинуть
avatar
T-800, было бы интересно
сколько лет писать будете робота?
avatar
VалиБакS, механизм уже написал — он работает. Логика самое главное.
VалиБакS, с модулями бектестинга на Node.js проблемы — не могу подобрать рабочий.
Михаил Шардин, а почему Node.js? 
Среднеброд, привычнее. Хотя чат гпт часто на питоне отвечает когда сложные вопросы.
Михаил Шардин, я пробовал использовать node.js. Не понравился, JS сомнительный с точки зрения надежности язык. Питон по факту годится только для тестов или для пред/пост обработки и анализа (там классные библиотеки), но я не понимаю тех, кто на питоне пишет сложное ПО (медленный, странный параллелизм, твоя программа через две недели как чужая выглядит и т.п.). Что-то «большое и светлое», которое должно работать годами 24/7 писал всегда на C#/Java/Kotlin.
Среднеброд, больше вопрос привычки наверное.
Зачем изобретать велосипед, когда уже есть готовые решения? Потратили бы лучше время непосредственно на торговую логику.
Дмитрий Овчинников, API это тоже готовое решение. А в квик через костыль.
Михаил Шардин,
API это не решение а интерфейс.
Дмитрий Овчинников, да.
Просто вы написали про готовые решения, но я не хотел пользоваться квиком. И смог найти только три АПИ от брокера.
Может быть можно как-то было выйти напрямую на биржу, но я начинаю с небольших денег и не хочу платить за аренду и доступ.
Ну и для Node.js вариантов не было. Поэтому стал писать.
Михаил Шардин,
Все верно, нюанс только в том, что вы платите временем, правда меняете его на опыт, что неплохо.
Дмитрий Овчинников, это следующий шаг.
Дмитрий Овчинников, в своё время АПИ Тинькова показалось мне просто космическим инструментом, в хорошем смысле «не имеющим аналогов»

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

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

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

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

avatar
Дмитрий Овчинников, а чего там изобретать? Если человек умеет программировать, то это не проблема.
Среднеброд, 
алготрейдинг это не про программирование. ТС пишет, что вернулся в алго, но это не совсем так, точнее сказать совсем не так :)
Дмитрий Овчинников, ну я в курсе, но если уж за это берется программист… Я для себя не вижу проблем все вышеперечисленное переписать как мне было бы удобно. Это просто  создание удобного окружения. Я смотрел инструментарий для алготрейдинга и он мне не понравился. 

Дмитрий Овчинников, да это так. Но без механизма подачи заявок никак. Вот я его себе и создаю.

А алгоритмы чуть позже. Но чем проще тем лучше наверное. На мой взгляд вопрос именно в постоянстве механизированного исполнения.

Дмитрий Овчинников, ноксер, панда, прада, аспирант, Константин Солдатенков и др. это всё топы лчи с тысячами процентов, которые сами и писали софт и на нём зарабатывали. Поэтому не соглашусь что программирование это не про алготрейдинг, по факту как раз именно те кто сами писали код, были в топе(была официальная какая-то фиксация фактов например в лчи). Сказать что алготрейдинг это не обязательно про программирование будет корректней.
avatar
__rtx, 
это типичная ошибка выжившего, тем более давно минувших лет. сайт набит программистами и где же успешный успех?
Понеслась п… да по кочкам. Приехали. Баффета в топку. Примука я красную таблетку!

неофициальный SDK Node.JS а потом эта чешуя сольет твои апи и сама для себя все продаст и купит. 

avatar
Crogall, я обращаюсь к АПИ напрямую. Функции сам написал.
Молодец! Единственное мне кажется с брокером не угадали. Т-Банк по комису разорение всегда был. Сейчас вроде Алор API рекомендуют, тарифы гуманнее Т-Банка и вроде оно как стабильнее Финамовского. А сама реализация бота на чем пишется по мне не важна. Есть решения и на Qlua, C#, Python, R, Delphi и т.д. На чем лично легче и понятнее писать логику бота.
avatar
zam, поддержу. Если без клиентского софта брокера, то лучше посмотреть Alor API. Правда жизни, что вам придется написать свой урезанный AMI Broker. Времени на трейдинг скорее всего не останется.
avatar

yurikon, и всё таки их только три по РФ — если без клиентского софта брокер.

Вроде БКС ещё своё АПИ разрабатывает. Но на тестинг уже новых не берут.

zam, с бектестингом пока проблема. На Node.js не могу найти библиотеки.
Михаил Шардин, ТСлаб для бэктестинга вполне норм. Потом переносишь логику бота в свою платформу.
avatar
лень читать «многа букаф»))
Но плюсик, за старание)
Ништяк. Желаю удачи! 
Не понял. Чем плох Quik + Lua как инструмент торговли?
Мои 6 брокеров не берут с меня за Quik ни копейки.
Так ли нужен ли доступ к живым торгам для тестирования? Когда-то была доступна история торгов в тиках даже для очереди заявок
www.qscalp.ru/download
erinrv.qscalp.ru/
www.qscalp.ru/store/qsh.pdf
PS  Quik+Lua все «Основные функции» из статьи реализует элементарно.
«Без Windows» — это всё прямо на смартфоне? — Ну тогда да…
Хотя планшет-раскладушка с Windows не такая уж диковинка.
Rostislav Kudryashov, да ничем. Просто когда система работает через другую систем/ы/у, кол-во потенциальных проблем возрастает кратно, но это уже зависит от того важно это или нет. Мне например не очень важно но у меня и никогда ничего не отваливается, некоторые пишут что важно и у них постоянно всё отваливается но они из этого выводов не делают. Типа зарядят через 500 квиков которые ещё работают через 1000 велслабов которые дублируются на 70 виртуальных машинах и потом пытаются угнаться за отловом проблем и т.п.
avatar
Rostislav Kudryashov, «Без Windows» — это прямо на сервере. На линуксе или более вероятно в докере.

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

....все тэги



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