Самое главное, что никакого отношения к слову алко
это не имеет.
В течении нескольких лет я торговал в связке программы технического анализа 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. На мой взгляд она позволяла избежать переподгонки показателей под кривую истории. Оптимизация в бэк-тестере поддерживалась функцией 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 лет:
Я много изучал тему посвященную AmiBroker'у. И спрашивал там (привет Олег 000). Выкладывал примеры из бумажного журнала Technical Analysis of STOCKS & COMMODITIES.
Сейчас, в 2024 году форум недоступен, но если кто-то хочет ностальгии, то нашёл его архивную копию.
Правда архивная копия немного бесполезна, потому что самые интересные разделы открывались только после входа по логину и паролю.
2024 год, сейчас: T‑Bank Invest API + неофициальный SDK Node.JS. Описание функций торгового робота
Осенью 2024 года решил написать торгового бота, создать структуру программы которая будет работать через API брокера.
Торговый робот должен содержать:
Список бумаг - с которым он будет работать.
Условие покупки.
Условие продажи.
CSV файл учёта
Управление деньгами - процент входа.
Логирование всех действий.
Отображение информации, скорее всего через веб-сервер.
Иметь модуль бектестинга.
T‑Bank Invest API + Node.JS:
Решил пока не лезть в срочный рынок и попробовать поработать с самими оборотистыми акциями на Московской бирже. Остаётся только их найти.
В этой статья я распишу как создал два модуля на Node.js:
Взаимодействие с T‑Bank Invest API
tinkoffClient.js
Модуль, который ищет акции с самым большим оборотом за три последних месяца
searchTradingVolumes.js
Проект представлен на Гитхабе: https://github.com/empenoso/SilverFir-TradingBot.
SilverFir-TradingBot\src\grpc\tinkoffClient.js
Модуль tinkoffClient.js
— это специализированный клиент, разработанный для взаимодействия с T‑Bank Invest API, российской брокерской платформой. Основная цель этого модуля — предоставить боту на основе Node.js, доступ к финансовым данным для алгоритмической торговли или анализа рынка.
Вот его функциональность:
Основные функции:
Авторизация и настройка:
Модуль использует API-токены для аутентификации.
Он поддерживает как тестовую (песочницу), так и продовую среду, хотя по умолчанию он использует среду песочницы.
Заголовки API включают необходимый токен авторизации и тип контента для JSON-коммуникации.
Универсальный механизм вызова API:
Метод
callApi()
служит гибкой утилитой для отправки POST-запросов на конечные точки API Tinkoff.Он обрабатывает отправку полезной нагрузки и отчеты об ошибках, предоставляя подробную обратную связь по сбоям (через журналы).
Извлечение данных "японских свечей":
Метод
getCandles()
извлекает данные свечей для заданного финансового инструмента (тикера) за указанные интервалы.Он вычисляет временной диапазон на основе предоставленного интервала и извлекает серию свечей из сервиса рыночных данных. Это необходимо для анализа рынка, технических индикаторов и торговых стратегий.
Обрабатывает до 1000 свечей за запрос и обеспечивает регистрацию ошибок, если запрос не выполняется или возвращает пустые данные.
Зависимости и утилиты:
Moment.js: Используется для форматирования дат и расчета временных диапазонов, что имеет решающее значение при работе с финансовыми данными за различные периоды времени.
Axios: Обрабатывает HTTP-запросы к конечным точкам API.
Службы ведения журналов: реализует настраиваемую систему журналов для вывода файлов и консоли, помогая в отладке и отслеживании операций.
SilverFir-TradingBot\src\searchTradingVolumes.js
Модуль searchTradingVolumes.js
является частью SilverFir-TradingBot, разработан для определения акций на Московской бирже (MOEX) с наибольшими объемами торгов за последние три месяца. Нужен чтобы отбросить неликвид.
Вот подробный обзор функций модуля:
Основные функции:
Фильтрация акций с MOEX (Московской биржи):
Модуль использует T‑Bank Invest API для получения полного списка доступных акций.
Фильтрует результаты, чтобы сосредоточиться конкретно на акциях, торгуемых на REAL_EXCHANGE_MOEX, гарантируя, что будут рассмотрены только акции Мосбиржи.
Отфильтрованный список включает в себя важную информацию, такую как FIGI (глобальный идентификатор финансового инструмента), тикер, ISIN и название, которые затем регистрируются для отслеживания и анализа.
Извлечение исторических данных по объему торгов:
Для каждой акции, идентифицированной на этапе фильтрации, модуль извлекает ежедневные данные свечей (OHLCV - открытие, максимум, минимум, закрытие, объем) с помощью T‑Bank Invest API.
Он извлекает данные за последние три месяца, рассчитывая общий объем торгов за этот период.
Этот шаг имеет решающее значение для измерения рыночной активности и определения наиболее активно торгуемых акций.
Определение 15 лучших акций по объему:
После сбора данных по объему торгов модуль ранжирует все акции на основе их общего объема торгов за трехмесячный период.
Затем он выбирает 15 лучших акций, которые считаются имеющими самый высокий оборот, что делает их наиболее активными на рынке.
Ведение журнала и подготовка конфигурации:
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 г.
Комментарии (26)
Dynasaur
07.10.2024 02:57Вы сконцентрированы (по крайней мере в статье) на технике - как подключиться, как считать свечи, как дёрнуть АПИ, а единственный главный вопрос трейдинга это "покупать или продавать?". Всё остальное вторично. Нет смысла мучить АПИ, если нет понимания что дальше с этим делать. Я тоже некоторое время потратил на алготрейдинг, из питона скачивал рыночные данные. На главный вопрос должна была отвечать нейросеть, которую я пытался научить понимать ситуацию и достичь матожидания более 50%. В общем, это оказалось очень трудо- и ресурсоёмким занятием. Я застрял на чистке и предобработке данных. В одиночку обыграть рынок очень сложно. АПИ торговой площадки даже не пригодилось - нет смысла его дёргать пока не научился вырабатывать правильные сигналы.
empenoso Автор
07.10.2024 02:57Вы сосредоточены только на входе. Но у каждой позиции ещё есть выход. Это тоже параметр
Dynasaur
07.10.2024 02:57Не знаю почему вы так решили. Я был сосредоточен на прибыли. Оптимизировать собирался исключительно по этому параметру. Но не дошёл. Было интересно, поисследовал корреляции активов в поисках полезных зависимостей. Но понял, что для приемлемого результата сил, времени и вычислительных ресурсов нужно гораздо больше, чем у меня есть.
empenoso Автор
07.10.2024 02:57И мне кажется совершенно ни к чему кого-то "обыгрывать". В идеале копеечка капает и норм
Dynasaur
07.10.2024 02:57+1"обыграть" нужно как минимум того у кого вы покупаете или кому продаёте :-) а то копеечка будет капать не в ту сторону :-) Если вам капает, по поздравляю :-) Но из статьи этого не видно :-)
Femistoklov
07.10.2024 02:57Нет, главный вопрос - это "как проверить, моё покупать или продавать окажется правильным в будущем или нет".
Dynasaur
07.10.2024 02:57Вы можете формулировать как угодно, но у трейдера только две педали - "купить" и "продать" и в какой-то момент нужно нажать то или это :-)
Slav2
У меня всегда в голове крутится один вопрос. Почему алготрейдеры делают антропоморфных торговых роботов? Ведь свечи это визуальное представление изменения цены. Они нужны только для удобства чтения графиков цен человеком. А в реальности никаких свеч нету, есть изменение текущей цены от предыдущего минимума или максимума. Считается элементарно, никаких эффектов запаздывания не вносим. Не требуется даже выбирать какое-то начало на временной шкале, все для любого момента времени считаем из настоящего в прошлое. А так можно, спросите вы? А почему нет, это робот ему не важно даже как считать слева направо или справа налево. Если закономерность есть, то и результат будет всегда один, вне зависимости от ориентации графика. А попробуйте график японских свеч развернуть и что либо посчитать из настоящего в прошлое? По моему сразу все нарушится и не останется никакой ценности в этих предсказаниях :)
lrrr11
во-первых, чтобы зарабатывать на рынке, нужно уметь анализировать поведение торгующих там трейдеров. А трейдеры смотрят именно на свечи.
во-вторых, если вы знаете как правильно - подключайтесь к tinkoff invest api (это бесплатно для зарегистрированных пользователей) и покажите прибыльность своей стратегии хотя бы в тестовой песочнице :)
Zoolander
Свечи есть функция от изменений цены.
iShrimp
Скорее, это одна из форм её представления, которая скрывает от пользователя часть информации.
Можно в одну и ту же площадь экрана вывести больше полезной информации, если, к примеру, вместо одной свечи Н1 шириной 12 пикселей использовать 12 свечей М5 шириной 1 пиксель. Да, к этому нужно привыкнуть, но со временем пользователь научится видеть те детали, которых с обычными свечами не видел.
Slav2
Бот может использовать время закрытия свеч, например, но для чего ему самому строить свечи?
Смысла нет собирать крохи на бирже, когда можно грести лопатой на рынках в онлайн играх. Продажа внутриигровых денег за реал это конечно нарушение всяких EULA, но как говорится на что бизнес не пойдет ради прибыли )
2128507
потому что:
нет никакой рационально исчисляемой причинной зависимости цены в текущую секунду от цены в предыдущую секунду, а так же от величины таймстамп. Графики цены построены так, как будто это функция от времени, это неверно.
предел сложности системы, которую человек может создать руками - простейшая система с обратной связью, типа термостат.
таким образом, все многообразие решений задачи с непонятным числом переменных и входных условий, сводится к триггерам по пороговым значениям цены, т.е. реагированию на уже изменившиеся условия, которые рынок отработал уже до того, как вам прислали этот график на отрисовку. Ничего другого в принципе получиться не может, только боевой человекоподобный робот (с).
Slav2
Я не предлагал строить график цены от времени. Есть графики типа Ренко, посмотрите как они строятся.
Dynasaur
конечно же люди научились создавать гораздо более сложные системы, чем термостат :-)
Format-X22
А как вы без дескретизации поймете где минимум или максимум? Это как посчитать периметр Байкала - в разных источниках разные цифры и все они - правда. Звучит парадоксально до тех пор пока не узнаешь о единицах измерения и метрологии и том что периметр реальных физических объектов стремится к бесконечности. Также и тут - без нарезки по границам цен или времени у вас минимум и максимум будет каждые пару миллисекунд.
2128507
отвечу всем в этой ветке, мой лимит 1 коммент в сутки.
@Slav2 да хоть в фазовом пространстве, хоть через очко стройте любой график цены, зависимости нет.
@Dynasaur приведи пример физической системы, созданной человеком/людьми, сложнее чем третий уровень вот на этом рисунке:
@Format-X22ты не прочитал или не вник во второй пункт, осознание которого делает бессмысленным любые вычисления.
Slav2
А как вы тогда объясняете что цена на актив растет медленно, а вот когда падает, может валится очень быстро? Если бы не было никаких закономерностей, все было бы идеально симметрично. Боту не требуется делать долгосрочных прогнозов, успеть отреагировать на падение это 20 секунд.
Slav2
Какое то минимальное значение изменения цены выбираем, которое будет больше чем белый шум. Потом увеличиваем шаг для определения краткосрочных-среднесрочных-долгосрочных трендов, определяем веса этих сигналов. Перераспределяем портфель таким образом, чтобы не сидеть в дешевеющих активах.
Dynasaur
ну так и чего вы не сделаете как описали?
Slav2
Занимаюсь ботами для игр. Есть и торговый бот (также для игры) с прибылью 1.5-2% в день. Нельзя заниматься сразу всем, рук не хватит, приходится выбирать что прибыльнее.