Releases: Tim55667757/TKSBrokerAPI
release-1.6
Release notes (in english)
Issues included in the release
PyPI: v1.6.268
Docker: tim55667757/tksbrokerapi:1.6.268
Дайджест
Добавлен быстрый алгоритм оценки вероятности достижения целевой цены на основе волатильности и доходности. Модель учитывает дрейф, использует Байесовскую агрегацию и корректируется по фазе и хаосу, позволяя фильтровать сигналы по степени доверия.
Реализована быстрая фильтрация аномалий методом Хампеля с ускоренной функцией и примерами использования. Добавлена нечёткая шкала для интерпретации вероятностей в терминах {Min, Low, Med, High, Max}, что упрощает отбор сигналов.
Существенно улучшена инфраструктура: появилась многопоточная загрузка истории с докачкой, автообновление по крону --history-auto-updater, реализован централизованный Rate Limiter в SendAPIRequest() и CI/CD-сборка Docker-образов. Это ускорило работу с брокером и повысило стабильность.
Новая функциональность
- #119 Реализован новый пример использования платформы TKSBrokerAPI: Anomaly Volumes Detector — это простой Телеграм бот для поиска и анализа аномалий в объёмах спроса и предложения покупателей и продавцов.
- #111 В модуль TradeRoutines добавлен метод
CalculateLotsForDeal(). Он помогает определить нужное количество лотов инструмента при открытии позиции. - #112 В модуль TradeRoutines добавлен метод
HampelFilter(). Он позволяет обнаружить аномалию ("выброс", нестандартное значение, отклонение от нормы) среди значений любого числового ряда, используя функцию фильтрации Хампеля. Фильтр Хампеля обнаруживает аномалии на основе скользящего окна и подсчёта разницы между медианными значениями и входными значениями числового ряда. - #113 В модуль TradeRoutines добавлен метод
HampelAnomalyDetection(), который использует фильтр Хампеля. Эта функция возвращает минимальный индекс элемента в списке найденных аномалий или индекс первого максимального элемента во входном ряду, если этот индекс меньше индекса аномального элемента. - #114 Были добавлены примеры фильтрации методом Хампеля: 1) Jupyter Notebook с теорией и практикой (русская и английская версии); 2) пример скрипта на Python; 3) статья: "Как быстро найти аномалии в числовых рядах с помощью метода Хампеля" (русская и английская версии).
- #117 Правила открытия/закрытия позиций в зависимости от нечётких уровней Риска/Достижимости были добавлены в виде матриц
OPENING_RULESиCLOSING_RULESс логическими значениями. МетодыCanOpen()иCanCloseявляются функциями-фильтрами и могут проверять правила открытия/закрытия позиций, опираясь на эти матрицы и нечёткие значения Риска/Достижимости. - #118 Добавлены методы для вычисления уровней нечёткого риска и нечёткой достижимости:
RiskLong(),RiskShort(),ReachLong()иReachShort(). - #14 Реализован "Установщик сетки ордеров". Этот скрипт позволяет настроить сетку ордеров (лимитных или стоп-ордеров, на покупку или на продажу) с заданными шагами и лотностью для множества инструментов по их тикерам в конвейерном параллельном режиме работы.
- #140 Реализовано CI/CD на GitHub Actions.
- #145 Реализована оценка вероятности достижимости ценой целевых уровней.
- #152 Добавлен централизованный троттлинг с кооперативным ожиданием в
SendAPIRequest(). - #154 Добавлены модели оценки хаоса (Hurst, SampEn, DFA) и фазовая фильтрация в метод
EstimateTargetReachability(). Реализованы доверительные коэффициенты, агрегация вероятности, расширенные тесты и оптимизация производительности. - #78 Добавлена многопоточная загрузка истории свечей с поддержкой частичной докачки (
--only-missing). - #57 Добавлен режим
--history-auto-updater: параллельная закачка истории тикеров по крону с сохранением в отдельные CSV-файлы. - #141 Добавлена сборка и публикация Docker-образа TKSBrokerAPI через GitHub Actions с поддержкой версий
devиrelease.
Улучшения
- #92 Блокировка мьютекса была реализована для метода
SendAPIRequest(), чтобы избежать проблем с недоступным ресурсом при мультипроцессной работе платформы TKSBrokerAPI. - #89 Если вы запускаете несколько экземпляров платформы TKSBrokerAPI в параллельном режиме, можно использовать дополнительный тег для упрощения отладки и идентификации экземпляров в логах. Тег добавляется ключом
--tag. - #99 Нарисован логотип и баннер TKSBrokerAPI и добавлен во все шаблоны HTML-отчётов.
- #98 Новое поле со значением непокрытой позиции было добавлено в раздел отчёта о состоянии маржинальной торговли (ключ
--user-info). - #96 Был реализован метод
UpdateClassFields()и написаны позитивные и негативные юнит-тесты на него. Он получает настройки как словарь (например, загруженный из YAML файла) и применяет к полям и значениям указанного инстанса некоторого класса паруkey: value. - #100 Теперь в методах
CloseAllByTicker()иCloseAllByTicker()ордеры закрываются до закрытия основной позиции по инструменту, чтобы минимизировать число заблокированных лотов. - #104 Выполняется попытка определить
self.figi, чтобы избежать лишних предупреждений в методеOverview(), если FIGI пустой. - #106 Реализован метод
SeparateByEqualParts(). Этот метод получает на вход лист элементов и пытается разделить его на список списков равных по количеству элементов. - #27 Try...except блок и негативные юнит-тексты были добавлены для метода
NanoToFloat(). - #28 Try...except блок и негативные юнит-тексты были добавлены для метода
FloatToNano(). - #30 Try...except блок и негативные юнит-тексты были добавлены для метода
GetDatesAsString(). - #33 Try...except блок и негативные юнит-тексты были добавлены для метода
_ParseJSON(). - #107
onlyFilesпараметр был добавлен к некоторым методам, где был параметрshow:OverviewUserInfo(),OverviewAccounts(),OverviewLimits(),Deals(),Overview(),ShowListOfPrices(),GetListOfPrices(),SearchInstruments(),ShowInstrumentsInfo()иShowInstrumentInfo(). Он позволяет генерировать только файлы отчётов, без отображения информации в консоли. - #116 API-документация на модули
TKSBrokerAPIтеперь с тёмной темой. - #126 Счетчик типов операций был обновлён в отчёте по сделкам.
- #138 Патч для np.NaN.
- #146 В сотни раз ускорена работа метода
HampelFilter(), особенно это заметно для длинных рядов, содержащих более 1 млн. значений. - #148 Реализована оптимизированная и ускоренная версия
FastBBands(), вместо аналогичной медленной функции из pandas_ta. - #149 Реализована оптимизированная и ускоренная версия
FastPSAR(), вместо аналогичной медленной функции из pandas_ta. - #144 Реализована функция
CalculateAdaptiveCacheReserve()для адаптивного динамического управления объёмом ликвидности. - #150 Улучшена базовая функция
SendAPIRequest(): безопасные повторы, разбор ошибок, полные тесты; повышена стабильность клиента. - #151...
release-1.5.120
Release notes (in english)
Issues included in the release
PyPI: 1.5.120 (2022-11-21)
Дайджест
В очередной версии TKSBrokerAPI в отчётах появилась новая секция с календарём платежей по облигациям. Он строится автоматически, если в портфеле пользователя есть хотя бы одна облигация (ключ --overview-calendar). Был добавлен ключ --html для сохранения любых пользовательских отчётов в HTML формат. Кроме того, появилась возможность закрывать позицию и все ордера по ключу --close-all для одного инструмента, заданного через --ticker или --figi.
Торговый сценарий ./docs/examples/scenario1.py был переписан в парадигме ООП: ./docs/examples/scenario1a.py. Теперь это полноценный торговый шаблон на базе платформы TKSBrokerAPI. Его можно использовать за основу для разработки собственных сценариев.
Пофикшен обидный баг при торговле "по рынку" (ключ --trade), когда TP/SL ордеры открывались даже если основная заявка не была исполнена. Теперь при любых ошибках TP/SL ордеры не выставляются. А также, для удобства отладки теперь можно указывать ключ --more вместе с любой другой командой. В логах появится больше информации, например, сетевые запросы, сетевые ответы и их заголовки.
Новая функциональность
- #62 В отчёт о состоянии портфеля пользователя добавлена секция с календарём платежей по облигациям, который строится автоматически, если хотя бы одна облигация присутствует в портфеле (метод
Overview(details="calendar"), ключ--overview-calendar). - #80 Пример торгового сценария ./docs/examples/scenario1.py дополнительно переписан в парадигме ООП: ./docs/examples/scenario1a.py. Эти шаблоны можно брать за основу для разработки собственных торговых сценариев, на базе платформы TKSBrokerAPI.
- #48 Если ключ
--close-allбудет указан совместно с одним из ключей--tickerили--figi, тогда будут закрыты все незаблокированные объёмы открытой позиции, отложенные лимитные и стоп ордеры для выбранного инструмента. Для поддержки этой фичи были реализованы дополнительные методы:CloseAllByTicker()— для закрытия всех позиций и ордеров по инструменту заданному тикером,CloseAllByFIGI()— для закрытия всех позиций и ордеров по инструменту заданному FIGI идентификатором,IsInLimitOrders()— функция, которая возвращаетTrueилиFalse, при наличии или отсутствии открытых отложенных лимитных ордеров,GetLimitOrderIDs()— функция, которая возвращает список открытых отложенных лимитных ордеров,IsInStopOrders()— функция, которая возвращаетTrueилиFalse, при наличии или отсутствии открытых стоп ордеров иGetStopOrderIDs()— функция, которая возвращает список открытых стоп ордеров для инструмента. - #83 Теперь можно указывать ключ
--htmlдля генерации дополнительных отчётов из Markdown-файлов в HTML формат. Рендеринг HTML и ключ--htmlбыли реализованы для отчётов, создаваемых командами--list,--info,--search,--prices,--deals,--limits,--calendar,--account,--user-info,--overview,--overview-digest,--overview-positions,--overview-orders,--overview-analyticsи--overview-calendar. HTML-генератор основан на Mako Templates library. - #67 Теперь можно указывать ключ
--moreвместе с любой командой. Он включает во всех методах TKSBrokerAPI больше отладочной информации и выводит её в логи. Например, сохраняются фактические сетевые запросы, ответы на них и заголовки.
Улучшения
- #74 Улучшен CI/CD скрипт
.travis.yml. Теперь при запуске сборки из пулл-реквеста выполняются только шаги запуска юнит-тестов и сборки пакета. Выкладка пакета в PyPI не происходит. Публикация в PyPI теперь запускается только при сборке напрямую из ветки или после принятия пулл-реквеста. - #39 Теперь все операции закрытия позиций или ордеров (наборы ключей
--close-***) поддерживают возможность указания инструментов не только через тикеры, но и через FIGI идентификаторы. - #60 Теперь ключи
--tickerи--figi— регистронезависимые. Можно указывать в консоли их значения в любом регистре, а внутри платформы TKSBrokerAPI они будут автоматически приведены к верхнему регистру. - #75 Если при запуске с ключом
--limitsокажется, что нет доступных для вывода лимитов денежных средств, то теперь пустая таблица отображаться не будет. - #68 В отчёт по акции (метод
ShowInstrumentInfo(), ключ--info) добавлена информация про тип акции: обыкновенная, привилегированная, американские депозитарные расписки, глобальные депозитарные расписки, товарищество с ограниченной ответственностью, акции из реестра Нью-Йорка, закрытый инвестиционный фонд или траст недвижимости. - #35 В таблице "Summary" с отчетом по операциям (ключ
--deals) упрощены заголовки. - #51 Константа
NANO, методыNanoToFloat()иFloatToNano()вынесены в новый модульTradeRoutines. Это библиотека с набором функций для упрощения реализации торговых стратегий на базе платформы TKSBrokerAPI. - #52 Метод
GetDatesAsString()также перенесён в модульTradeRoutines.
Баг-фиксы
- #66 Исправлен баг в методе
Trade()(ключ--trade). Теперь, в случае если основной рыночный ордер по инструменту не был исполнен, то TP/SL ордеры также не выставляются для этого инструмента. В предыдущих версиях TP/SL ордеры открывались даже в случае ошибок при открытии рыночного ордера, к которому они привязаны, что нарушало логику торговых сценариев. - #84 Исправлен баг в методе
Overview()(ключ--overview), который появился после решения задачи #17. В секциях лимитных и стоп ордеров в отчёте о состоянии портфеля пользователя отображались только первые ордеры в списке. Сейчас снова отображаются все открытые ордеры. Кроме того, улучшена производительность: теперь для ордеров по одному и тому же инструменту цена запрашивается только один раз, что критично, в случае большого числа открытых ордеров. - #81 Исправлено отображение дробных чисел при печати биржевого стакана.
release-1.4.90
Release notes (in english)
Issues included in the release
PyPI: 1.4.90 (2022-11-07)
Дайджест
Теперь можно обогащать сырые данные по облигациям большим числом полей и значений, выгружать их в XLSX-формате и pandas dataframe! Это пригодится датасайнтистам и биржевым аналитикам (смотрите описание ключа --bonds-xlsx). С помощью этих данных можно построить полный календарь выплат по облигациям (ключ --calendar).
Для скачиваемых с сервера или загружаемых из файла исторических свечей теперь можно построить интерактивные или простые графики (ключ --render-chart). Если вам нужны сырые данные с сервера по всем инструментам, их можно сохранить в формате XLSX с ключом --list-xlsx.
| Интерактивный график | Статический график |
|---|---|
![]() |
![]() |
А также, теперь можно узнать: все данные по своему аккаунту, включая accounId (команда --user-info или --account) и лимиты на вывод доступных средств (команда --limits).
$ tksbrokerapi --accounts --output user-accounts.md
# User accounts
* **Actual date:** [2022-10-23 21:09:47 UTC]
| Account ID | Type | Status | Name |
|--------------|---------------------------|---------------------------|--------------------------------|
| ********** | Tinkoff brokerage account | Opened and active account | Testing - ********** |
| ********** | Tinkoff brokerage account | Opened and active account | Personal - ********** |
| ********** | Tinkoff brokerage account | New, open in progress... | Account ********** |
$ tksbrokerapi --limits --output my-limits.md
# Withdrawal limits
* **Actual date:** [2022-10-07 13:59:56 UTC]
* **Account ID:** [**********]
| Currencies | Total | Available for withdrawal | Blocked for trade | Futures guarantee |
|------------|---------------|--------------------------|-------------------|-------------------|
| [rub] | 2136.61 | 1135.25 | 1001.36 | — |
| [eur] | 0.29 | 0.29 | — | — |
| [cny] | 1.42 | 1.42 | — | — |
| [chf] | 1.00 | 1.00 | — | — |
| [try] | 10.00 | 10.00 | — | — |
| [usd] | 0.68 | 0.68 | — | — |
| [hkd] | 2.41 | 2.41 | — | — |
Новая функциональность
- #15 Реализованы методы:
RequestLimits()для запроса сырых данных по лимитам для пользователя на вывод средств,OverviewLimits()для отображения табличных данных и ключ--limits(--withdrawal-limits,-w) для запроса и отображения лимитов в консоли. - #6 При запуске с ключом
--historyдобавлена возможность указать дополнительный ключ--render-chartи сгенерировать интерактивный или не интерактивный свечные графики, при помощи библиотекиPriceGenerator. Аналогично можно построить графики для ранее сохранённых csv-файлов с историей свечей. Для этого нужно указать ключ--render-chartвместе с новым ключом для загрузки данных из файла:--load-history. - #46 Реализован ключ
--list-xlsx(или-x), который возвращает необработанные данные по всем доступным для данного аккаунта инструментам, аналогичные данным изdump.json, но сохраненные в формате XLSX, для дальнейшего использования дата-сайнтистами или биржевыми аналитиками, по умолчанию используетсяdump.xlsx. Также был разработан новый методDumpInstrumentsAsXLSX()который конвертирует сырые данные по инструментам в формат XLSX. - #11 Добавлен ключ
--user-info(-u), который выводит данные, связанные с аккаунтом, привязанным к текущему токену: доступную информацию о пользователе и его аккаунтах, права на операции, лимиты для маржинальной торговли. Также добавлен ключ--account(--accounts,-a), который выводит простую табличку, содержащую только аккаунты пользователя. - #10 При запросе информации об облигациях (с ключом
--infoили-i), теперь рассчитывается и отображается больше данных: график выплат по облигациям, общее количество выплат и уже погашенные купоны, купонный доход в процентах годовых (средняя купонная ежедневная доходность * 365), текущая доходность в процентах годовых (зависит от цены и количества оставшихся невыплаченных купонов, считается как средняя текущая ежедневная доходность * 365), НКД и размер купона. Для запроса нужной информации реализованы методыRequestBondCoupons()(возвращает словарь обработанных данных, полученных с сервера) иExtendBondsData()(возвращает обогащённый pandas dataframe, содержащий больше информации об облигациях). МетодShowInstrumentInfo()был доработан, для отображения большего количества информации по облигациям и календаря выплат. Для выгрузки обогащённых данных по облигациям в формат XLSX-файла (по умолчаниюext-bonds.xlsx), теперь можно использовать ключ"--bonds-xlsx(-b). - #63 Реализован метод
CreateBondsCalendar(), генерирующий pandas dataframe с общим календарём выплат по указанным или всем облигациям. МетодShowBondsCalendar()отображает календарь в консоли и сохраняет в файл,calendar.mdпо умолчанию в формате markdown. Для запроса календаря выплат нужно использовать ключ--calendar(-c), при этом также сохраняется таблица в формате XLSX, в файл по умолчаниюcalendar.xlsx. В случае, если календарь строится более чем для одной облигации, то платежи в один и тот же месяц группируются.
Улучшения
- #59 TKSBrokerAPI билд-номер теперь печатается в логах, а также его можно узнать набрав команду
--version(или--ver). - #47
iListполе более неактуально из-за использования локального дампаdump.json, в котором автоматически обновляется список доступных для торговли инструментов, поэтому поле удалено из классаTinkoffBrokerServer(). - #9 В метод
ShowInstrumentInfo()добавлена информация о текущем статусе торгов по запрашиваемому инструменту. Реализован дополнительный методRequestTradingStatus()для запроса статуса торгов по инструменту. Добавлены флаги:buyAvailableFlag,sellAvailableFlag,shortEnabledFlag,limitOrderAvailableFlag,marketOrderAvailableFlagиapiTradeAvailableFlag. В рамках этой же задачи реализована задача #37: добавлена возможность сохранения информации по инструменту в файл, заданный ключом--output, по умолчаниюinfo.md. - #64 ВНИМАНИЕ! Выполнен рефакторинг во многих методах. Все параметры, которые отвечают за отображение дополнительной информации в консоли:
showPrice,showPrices,printInfo,showInfo,showInstruments,showResults,showStatistics,printDeals,printCandles,showLimits,showAccounts— были заменены переменной с простым именемshow. - #65 ВНИМАНИЕ! Выполнен рефакторинг во многих методах. Все
overviewпараметры заменены переменнойportfolio. - Отключены повторы для 4xx сетевых ошибок, повторы оставлены только для 5xx ошибок. Это связано с тем, что нет смысла ожидать появления отсутствующих данных на сервере, например, в случае неверного указания ресурса.
- Теперь при запуске метода
SendAPIRequest(debug=True)в логи выводится больше отладочной информации, например, параметры запроса и ответа сервера, а также их хедеры. - Добавлено ожидание между сетевыми запросами, в случае достижения лимита по количеству запросов. Лимит определяется по значению заголовка ответа
"x-ratelimit-remaining": "0", а количество секунд ожидания определяется значением заголовкаx-ratelimit-reset, например,"x-ratelimit-reset": "15", что означает ожидание 15 секунд до следующего запроса. Это позволило значительно уменьшить количество сетевых ошибок, связанных с ожиданием для большого числа запросов к API сервера. - Хедер
"x-app-name": "Tim55667757.TKSBrokerAPI"был добавлен к каждому API-запросу, для идентификации фреймворка TKSBrokerAPI.
Баг-фиксы
- Исправлена ошибка
NoneType object has no attribute ...в случае, если ключ--historyиспользовался без указания каких-либо параметров. - #71 Пришлось сделать быстрый хак, чтобы избежать проблем в секциях статистики
Portfolio distribution by currenciesиPortfolio distribution by countries: принудительно добавлена валютаrubи страна"[RU] Российская Федерация", перед расчётом статистики.
release-1.3.70
Release notes (in english)
Issues included in the release
PyPI: 1.3.70 (2022-09-07)
Новая функциональность
- #5 Добавлена возможность скачивания истории цен по инструменту с поддержкой докачки по ключу
--history. Также ключ--intervalпозволяет указать временной интервал для скачиваемых ценовых свечей в формате OHLCV. Ключ--only-missingпозволяет докачать только последние свечи, сохранённые в файле, заданном через--output. Ключ--csv-sepзадаёт разделитель между данными в csv-файлах. History returned between two given dates:startandend.1970-01-01минимальная дата в прошлом, начиная с которой брокер даёт скачать историю. Внимание! Брокер использует ISO UTC формат времени.
Улучшения
- #17 Оптимизирован запрос цен для инструментов и убраны повторные запросы цены для одного и того же инструмента при запуске с ключом
--pricesили вызове методаOverview(). За счёт удаления дублирующих запросов немного повысилась скорость работы. - #43 Добавлены новые ключи для уменьшения информации в методе
Overview(): ключ--overview-positionsпоказывает только открытые позиции, без всего остального, ключ--overview-digestпоказывает короткий дайджест состояния портфеля, ключ--overview-analyticsпоказывает только раздел аналитики и распределения портфеля по различным категориям, ключ--overview-ordersпоказывает только секцию открытых лимитных и стоп ордеров. - #44 Все markdown-таблицы приведены к стандартному виду, включая отрисовку правой части таблиц.
Баг-фиксы
- #18 Добавлена обработка ошибки
raise JSONDecodeError("Expecting value", s, err.value) from None. Теперь отображается сообщение:Check you Internet connection! Failed to establish a new connection to broker server!и выводится путь до файла с дебажными логами. - #16 Исправлено отображение дробных чисел с первым нулём после десятичной точки, в случаях, когда вместо
1.0выводилось1.. - #38 Исправлено отображение дробной части цен при запросе ETF.
release-1.2.62
Release notes (in english)
Issues included in the release
PyPI: 1.2.62 (2022-08-23)
Новая функциональность
- #13 Для уменьшения количества запросов к серверу, добавлена возможность кэширования данных по биржевым инструментам. Кэш используется по умолчанию при первичной инициализации класса
TinkoffBrokerServer, но это действие можно отменить через переменную классаuseCache=Falseили используя ключ--no-cacheв консоли. Добавлен методDumpInstruments(), с помощью которого можно создать дамп данных с сервера. В классTinkoffBrokerServerтакже добавлена переменнаяiListDumpFile(путь до кэша, по умолчаниюdump.json). Кэш автоматически обновляется, если идёт другой день, чем день последнего изменения файлаdump.json. Примечание: все даты используются в UTC-формате. - #7 Добавлена возможность поиска инструмента по части названия, тикера или FIGI с помощью ключа
--search(или-s). Реализован метод для поискаSearchInstruments(), которому на вход можно передать поисковый паттерн: часть слова или строку с регулярным выражением. В качестве результата метод возвращает словарь словарей, похожий на переменнуюiList, но содержащий только найденные инструменты (примеры). - Был добавлен новый метод
IsInPortfolio(). Он проверяет на наличие инструмента в портфеле пользователя. Инструмент должен быть задан черезself.ticker(приоритетно) или черезself.figi. Метод возвращаетTrue, если портфель содержит открытую позицию по инструменту, в противном случае возвращаетFalse. - Был добавлен новый метод
GetInstrumentFromPortfolio(). Он возвращает данные по инструменту, если он есть в портфеле пользователя. Инструмент должен быть задан черезself.ticker(приоритетно) или черезself.figi.
Улучшения
- #12 В общую информацию о состоянии портфеля (ключ
--overviewили-o), добавлен раздел "Распределение портфеля по странам" (пример). - #8 Добавлен ключ
--no-cancelledи переменнаяshowCancelledв методеDeals(), чтобы регулировать отображение информации об отменённых операциях при использовании ключа--deals(или-d). Изменено имя файла с отчётом по умолчанию: вместоreport.mdтеперь используетсяdeals.md. - #42 Добавлен пример реализации абстрактного торгового сценария.
- В секцию
statрезультатов, выдаваемых методомOverview(), было добавлено полеfunds. Теперь в нём хранится словарь доступных для торговли средств по каждой валюте (всего средств - заблокированные средства), например,{"rub": {"total": 10000.99, "totalCostRUB": 10000.99, "free": 1234.56, "freeCostRUB": 1234.56}, "usd": {"total": 250.55, "totalCostRUB": 15375.80, "free": 125.05, "freeCostRUB": 7687.50}}.
Баг-фиксы
- Исправлен тип данных для облигаций (неправильно:
iJSON["type"] == "Bond", правильно:iJSON["type"] == "Bonds"). - Исправлена ошибка с JSON-декодером:
TypeError: JSONDecoder.__init__() got an unexpected keyword argument 'encoding'. Ошибка была из-за изменений в Python 3.9: аргументencodingбыл удалён. Смотрите: https://docs.python.org/3/library/json.html#json.loads - Исправлена ошибка с неверным расчётом оставшихся свободных средств в рублях:
Overview()["stat"]["funds"]["rub"].
release-1.1.48
Release notes (in english)
Issues included in the release
PyPI: 1.1.48 (2022-07-28)
Новая функциональность
- Лицензия изменена с MIT на Apache-2.0.
- Важно! Восстановлена функциональность большей части методов, входящих в
TKSBrokerAPIv1.0, кроме открытия сетки ордеров и скачивания исторических данных (будут добавлены в следующих релизах). Теперь все методы работают с новым Open API: https://tinkoff.github.io/investAPI/swagger-ui/ - Важно! модуль
TKSBrokerAPIвынесен в опенсорс, дальнейшая разработка продолжается только там: https://github.com/Tim55667757/TKSBrokerAPI (анонсы и релиз-ноты — там же). - Важно! Версия Tinkoff Invest API, поддерживаемая библиотекой
TKSBrokerAPI, теперь v2 и без обратной совместимости. - Важно! Все внутренние переменные времени переведены в ISO UTC формат с
Z(Zulu time) на конце строки. Пример:1961-04-12T06:07:00.123456Z. Локальное время больше не используется. Это нужно для избежания путаницы со временем Tinkoff Invest API, которое использует UTС Z-нотацию. - #1 Добавлены основные разделы документации в
README.mdи примеры работы в консоли, а также API-документация на модульTKSBrokerAPI. - #2 Добавлен шаг
PDocBuilderдля автоматической сборки документации на базеpdocдля методов модуляTKSBrokerAPI. - #3 Настроен базовый CI для релизного цикла: шаг запуска юнит-тестов и запуск сборки пакета. Реализован CD для релизного цикла: для фича-веток собираются dev-сборки, из релизных веток и master — собираются релизные пакеты, которые затем публикуются в PyPI. Пример успешной сборки: tksbrokerapi-1.2.dev39 и PyPI-пакет.
- #4 Добавлены простейшие юнит-тесты на некоторые методы, либо заглушки.
- Добавлен раздел аналитики в
Overview()метод. Показывается распределение инструментов по классам, компаниям, секторам и валютам активов. - Показывается расширенная информация по инструменту для ключа
--infoв зависимости от типа инструмента (валюта, акция, облигация, фонд или фьючерс). - Добавлены ключи
--close-order,--close-orders,--close-tradeи--close-trades. При их помощи можно отменить один или несколько ордеров по ID или закрыть сделки по инструментам, зная их тикеры. - Реализованы методы закрытия ордеров и позиций:
ClosePositions(),CloseAllPositions(),CloseOrders(),CloseAllOrders()иCloseAll(). - Реализованы методы открытия лимитных и стоп-ордеров:
Order(),BuyLimit(),BuyStop(),SellLimit()иSellStop(). - Реализованы методы открытия и закрытия позиций по инструментам:
Trade(),CloseTrades(),CloseAllTrades(),Buy(),Sell()и исправлен методCloseAll()при закрытии инструментов.
Улучшения
- Важно! За счет оптимизации алгоритмов, рефакторинга кода и использования модуля
multiprocessingудалось ускорить скачивание инструментов при их первичном листинге на 40-60%. - Важно! Включено логирование с ротацией от 5Мб в файл по-умолчанию
TKSBrokerAPI.log. Оптимизирован модуль логирования. Уменьшено количество ненужных оповещений. По умолчанию debug-логи печатаются только в лог-файл, а в консоль выводятся info-логи. Изменить уровень логирования можно ключами:--debug-level,--verbosityили-v. - Все перечислимые типы данных и константы вынесены в файл
TKSEnums.py. - Добавлены алиасы для USD, EUR, GBP, CHF, CNY, HKD, TRY — теперь их можно использовать вместо тикеров.
- Портфолио клиента, информация по отдельному инструменту, список доступных инструментов для торговли и история клиентских операций теперь отображаются в markdown-формате.
- Для класса
TinkoffBrokerServer()теперь можно задавать параметрtokenкак через переменную при инициализации класса, так и при установке переменной окруженияTKS_API_TOKEN. Если параметрtokenзадан при инициализации класса, то он считается приоритетным. - Для класса
TinkoffBrokerServer()теперь можно задавать параметрaccountIdкак через переменную при инициализации класса, так и при установке переменной окруженияTKS_ACCOUNT_ID. Если параметрaccountIdзадан при инициализации класса, то он считается приоритетным. Узнать номер своего аккаунта можно в любом брокерском отчёте, там будет указан номер договора, он же является вашимaccountId. - Обновлены все методы, связанные с отображением в консоли данных с биржи, после перехода у брокера Tinkoff Invest API на версию v2.
- Метод
Overview()теперь показывает больше информации по отложенным и стоп-ордерам. - Метод
SendAPIRequest()теперь показывает в логах информацию от сервера при всех 4xx и 5xx ошибках. - Из метода
Overview()вынесены в отдельные методыRequestPortfolio(),RequestPositions(),RequestPendingOrdersиRequestStopOrders()— операции по запросу портфеля, открытых позиций и ордеров пользователя. - При помощи метода
CloseOrders()теперь можно закрывать и биржевые отложенные (pending) ордера, и стоп-ордера. Достаточно указать ID или список ID. - Добавлено отображение разницы в % между предыдущей и текущей ценой закрытия инструмента во все таблицы, где это востребовано.
- #22 Ключи
--open-tradeи--open-orderзаменены ключами--tradeи--order, потому что у них были слишком длинные имена. МетодыOpenOrder()иOpenTrade()заменены методамиOrder()иTrade(). - Статический метод
GetDatesAsString()вынесен за пределы классаTinkoffBrokerServer(). - Переменная
instrumentsListдля простоты переименована вiList. - Метод
MDInfo()переименован вShowInstrumentInfo()(по аналогии с уже имеющимсяShowInstrumentsInfo()).
Баг-фиксы
- Важно! Проведён рефакторинг и исправлено множество ошибок в методах, связанные с переходом Tinkoff Invest API на версию v2 и сменой типов данных.
- Исправлен счётчик в логе в строке "Pairs (tickers, timeframes) count: [XXX]"
- Исправлена ошибка в методе
Deals(): в случае, когда конечная дата не указана теперь берётся текущая дата. - Исправлен баг с отображением истории операций, если за указанный период были дивидендные выплаты.
- Исправлен баг, когда сервер возвращал пустую комиссию.
- #26 Исправлена ошибка с неправильным результатом для дробных чисел:
FloatToNano(number=0.05). - #34 Исправлена ошибка с
KeyError: 'asks', когда от сервера не приходит ответ с данными по текущим ценам. - #32 Исправлены ошибки при попытке закрытия всех ордеров с ключом
--close-all orders. Ошибка возникла из-за неправильной обработки формата входной строки в одном из отладочных сообщений. Убраны лишние сообщения, а вместе с ними и ошибка форматирования.
release-1.0.1
1.0.1 (2020-05 - 2022-07) — устаревшая версия, неработоспособная с новым Tinkoff Open API REST-протоколом
Ретроспектива
Первый прототип TKSBrokerAPI — python API над REST-протоколом для Tinkoff Invest API — включал в себя основные возможности для работы с биржей:
- получать цены в стакане (DOM — Depth of Market) для выбранного инструмента;
- получать список всех инструментов, их названий, тикеров и FIGI;
- просматривать текущее состояние портфеля и его стоимость;
- получать полную брокерскую информацию по инструменту, зная его тикер или FIGI;
- получать таблицу текущих цен для списка инструментов;
- получать информацию по историческим ценам инструментов, доступных через Tinkoff Broker, и сохранять их в csv-файлы;
- загружать исторические ценовые данные из csv-файлов и отображать их на интерактивном графике или в консоли;
- открывать и закрывать лимитные ордера (биржевые заявки или однодневные ордера, отображающиеся в стакане DOM);
- создавать биржевые заявки (рыночные ордера исполняющиеся по текущим ценам в стакане DOM);
- открывать сетку лимитных ордеров с некоторым шагом;
- закрывать все ордера и активные заявки сразу или только определённого типа: акции, облигации, фонды;
- создавать отчёт по операциям за указанный период.
Затем, примерно с середины и до конца 2021 года, разработчики Tinkoff активно изменяли свой REST-протокол. Модуль TKSBrokerAPI стал неработоспособным. Но в течение весны-лета 2022 года удалось восстановить и даже расширить большинство его функций, переписать код на работу с новым Tinkoff Open API REST-протоколом, выложить библиотеку в опенсорс и настроить релизный цикл её выпуска.



