Technologies · Knowledge · Science
- 🇺🇸 Актуальные релиз-ноты на английском (see release notes in english here)
- 📚 Документация на модуль TKSBrokerAPI и примеры работы в консоли
- 🎁 Поддержать проект донатом на ЮМани-кошелёк: 410015019068268
1.6.* (2023-09-25) — в разработке...
Идёт подготовка к релизу...
- #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 Реализован "Установщик сетки ордеров". Этот скрипт позволяет настроить сетку ордеров (лимитных или стоп-ордеров, на покупку или на продажу) с заданными шагами и лотностью для множества инструментов по их тикерам в конвейерном параллельном режиме работы.
- #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 Счетчик типов операций был обновлён в отчёте по сделкам.
- #93 Исправлен баг:
KeyError: 'stopOrders' and KeyError: 'orders'
в методахRequestPendingOrders()
иRequestStopOrders()
. - #94 Исправлен баг в методе
Overview()
:KeyError: 'currentNkd'
, если инструмент не является облигацией. - #95 Исправлен баг со "сломанной" таблицей Overview в колонке
Lots
. - #101 Исправлен баг с неправильным расчётом доступных валют и аналитики в таблицах
Overview()
. - #102 Исправлен баг в методе
Deals()
:KeyError: 'OPERATION_STATE_PROGRESS'
. Для этого был добавлен новый статусOPERATION_STATE_PROGRESS
в константуTKS_OPERATION_STATES
. - #103 Таблицы отформатированы.
- #120 Исправлен баг в методе
History()
:KeyError: 'candles'
. Добавлена дополнительная проверка. - #121 Исправлен баг в константе
TKS_QUALIFIED_TYPES
. Некоторые новые значения в поле ответаqualified_for_work_with
были добавлены в Tinkoff REST API, но не задокументированы:foreign_bonds_russian_law
,convertible_bonds
,russian_bonds_foreign_law
,non_quoted_instruments
иoption
. Эти дополнительные значения были добавлены в текущем баг-фиксе. - #122 Для ошибки импорта вида
No module named 'Templates'
в README.md добавлена инструкция по её исправлению. - #123 Баг
ValueError
был исправлен для методовHistory()
andLoadHistory()
. Добавлены дополнительные проверки. - #124 Ошибочные вычисления исправлены:
Incorrect values in view["stat"]["funds"] record
. - #125 Был исправлен баг
KeyError: 'OPERATION_TYPE_OUT_STAMP_DUTY'
, в константеTKS_OPERATION_TYPES
не хватало значений. - #127 Был исправлен баг
KeyError: 'name'
в методеOverview()
. - #128 Был исправлен баг:
RUB000UTSTOM
FIGI отсутствует вdump.json
. С 7 марта 2023 RUB000UTSTOM FIGI перестал возвращаться брокером в списке валют через API.
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 Исправлено отображение дробных чисел при печати биржевого стакана.
1.4.90 (2022-11-07) — опубликована
Теперь можно обогащать сырые данные по облигациям большим числом полей и значений, выгружать их в XLSX-формате и pandas dataframe! Это пригодится датасайнтистам и биржевым аналитикам (смотрите описание ключа --bonds-xlsx
). С помощью этих данных можно построить полный календарь выплат по облигациям (ключ --calendar
).
Для скачиваемых с сервера или загружаемых из файла исторических свечей теперь можно построить интерактивные или простые графики (ключ --render-chart
). Если вам нужны сырые данные с сервера по всем инструментам, их можно сохранить в формате XLSX с ключом --list-xlsx
.
А также, теперь можно узнать: все данные по своему аккаунту, включая accounId
(команда --user-info
или --account
) и лимиты на вывод доступных средств (команда --limits
).
- #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] Российская Федерация"
, перед расчётом статистики.
1.3.70 (2022-09-07) — опубликована
- #5 Добавлена возможность скачивания истории цен по инструменту с поддержкой докачки по ключу
--history
. Также ключ--interval
позволяет указать временной интервал для скачиваемых ценовых свечей в формате OHLCV. Ключ--only-missing
позволяет докачать только последние свечи, сохранённые в файле, заданном через--output
. Ключ--csv-sep
задаёт разделитель между данными в csv-файлах. History returned between two given dates:start
andend
.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.
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"]
.
1.1.48 (2022-07-28) — опубликована
- Лицензия изменена с MIT на Apache-2.0.
- Важно! Восстановлена функциональность большей части методов, входящих в
TKSBrokerAPI
v1.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
. Ошибка возникла из-за неправильной обработки формата входной строки в одном из отладочных сообщений. Убраны лишние сообщения, а вместе с ними и ошибка форматирования.
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-протоколом, выложить библиотеку в опенсорс и настроить релизный цикл её выпуска.