backtrader-quik
backtrader-quik — устанавливаемая Python-библиотека для получения данных и
торговли из стратегий Backtrader
через терминал QUIK. QuikPy и Lua-коннектор входят в репозиторий: отдельное
копирование Python-модулей QuikPy больше не требуется.
Текущая версия: 1.0.0.
Проект является функциональной заменой удалённой библиотеки Игоря Чечета
BackTraderQuik и переименован в backtrader_quik, чтобы не смешиваться с ней.
Библиотека прошла локальные regression-тесты и полный тестовый цикл заявок на QUIK Junior 11.4.1.3 для
QJSIM.GAZPиSPBFUT.RIU6. Это не заменяет проверку у конкретного брокера и не является допуском к торговле реальными деньгами.
Возможности
- свечная история и live-бары через
QKData; - несколько DataFeed и несколько тайм-фреймов в одном
Cerebro; - фондовые и срочные счета с явным выбором
account_id; - Market, Limit, Stop, StopLimit, отмена, OCO и bracket orders;
- позиции, денежные лимиты, стоимость портфеля и комиссии;
- callbacks QUIK с очередью между сетевым потоком и потоком Backtrader;
- fan-out одной подписки на несколько DataFeed;
- reconnect request/callback sockets;
- polling fallback для свечей и Market-сделок при пропущенном callback;
- корректное завершение и повторный запуск процесса;
- встроенный Lua-коннектор для QUIK/QUIK Junior.
Что изменилось
В 1.0.0 — первый стабильный релиз и публикация на PyPI. Проект переименован в
backtrader-quik (импорт backtrader_quik), чтобы исключить путаницу с
удалённой библиотекой BackTraderQuik Игоря Чечета. Функциональных изменений кода
относительно проверенной на QUIK Junior сборки нет.
Ранее:
- callback-сокет запускается до первоначальных запросов к QUIK;
- Lua-коннектор переподключается и корректно очищает DataSource;
- добавлен резервный опрос свечей, если
SetUpdateCallbackне работает; - Market-сделка восстанавливается по точному
order_num, если QUIK Junior не прислалOnTrade; дубликаты по-прежнему отсекаются; - неисполненная неактивная Market-заявка согласуется как
Canceled; - срочная сделка принимается, когда QUIK Junior записал торговый счёт в
client_code; - фондовая Stop-заявка получает положительную защитную цену вместо
PRICE=0; - финальные cash/value кэшируются до закрытия QuikPy;
- добавлены регрессионные проверки этих сценариев.
Подробности: CHANGELOG.md, VALIDATION.md и результаты QUIK Junior.
Требования
- Windows 10/11;
- Python 3.10;
- Backtrader 1.9.78.123 (установится автоматически);
- QUIK или QUIK Junior с разрешённым запуском Lua-скриптов;
- свободные локальные порты 34130 и 34131.
Установка
Из PyPI:
python -m pip install backtrader-quik
Из локального клона:
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e .
Из собранного wheel:
python -m pip install .\dist\backtrader_quik-1.0.0-py3-none-any.whl
Скопируйте содержимое QUIK/lua и QUIK/socket в каталог, из которого QUIK
может запускать QuikSharp.lua, затем запустите Lua-скрипт в терминале.
Пошаговая инструкция находится в docs/INSTALL_QUIK.md.
Быстрый старт
Сначала получите список счетов без отправки заявок:
python .\Examples\list_accounts.py
Минимальная схема подключения:
import backtrader as bt
from backtrader_quik import QKStore
store = QKStore()
broker = store.getbroker(account_id=0)
cerebro = bt.Cerebro(stdstats=False, quicknotify=True)
cerebro.setbroker(broker)
fast = store.getdata(
dataname="QJSIM.GAZP",
timeframe=bt.TimeFrame.Minutes,
compression=1,
live_bars=True,
)
cerebro.adddata(fast, name="GAZP-1m")
cerebro.resampledata(fast, timeframe=bt.TimeFrame.Minutes,
compression=5, name="GAZP-5m")
cerebro.addstrategy(MyStrategy)
cerebro.run(preload=False, runonce=False)
Один QKBroker обслуживает один счёт. Для другого счёта или независимого
робота используйте отдельный процесс и отдельный комплект портов.
Размер заявки и цены
- Для фондового инструмента
sizeзадаётся в бумагах и должен быть кратен размеру лота. Библиотека не округляет неверный размер молча. - Для фьючерса
sizeзадаётся в контрактах. - Market-заявка на срочном рынке QUIK реализуется с защитной ценой. Параметр
slippage_stepsзадаёт ширину в шагах цены; значение по умолчанию — 10. В тестовом QUIK Junior дляRIU6использовалось 100 шагов из-за особенностей симулятора. Подбирать это значение нужно под инструмент и риск.
broker = store.getbroker(account_id=2, slippage_steps=100)
Безопасность эксплуатации
- Сначала запускайте только данные и сверяйте статусы
LIVE/DELAYED. - Затем тестируйте единичные заявки в QUIK Junior.
- Перед каждым запуском сверяйте счёт, класс, код контракта, срок экспирации, позиции и активные заявки.
- Не запускайте два процесса на одном комплекте портов.
- После аварии сверяйте фактическое состояние в QUIK; локальный объект Order не является источником истины для уже принятой биржей заявки.
Разработка и проверка
python -m pip install -r requirements-dev.txt
python -m pytest -q
python -m build
CI проверяет Windows/Linux и Python 3.10. Реальная интеграционная проверка QUIK выполняется вручную: GitHub-hosted runner не имеет терминала и счёта.
Правила участия: CONTRIBUTING.md. Сообщение об уязвимости: SECURITY.md.
Происхождение и лицензирование
Проект развивает идеи и код исторического BackTraderQuik Игоря Чечета (репозиторий удалён автором) и QuikPy, а также практический опыт BacktraderQuikJunior. Сохранены указания на Игоря Чечета и проект «Финансовая Лаборатория».
Унаследованный код Игоря Чечета распространяется на его условиях: бесплатно, с обязательной атрибуцией автору и проекту «Финансовая Лаборатория», и не переводится под MIT/Apache/BSD. Новый вклад этого репозитория (новый код, тесты, документация) распространяется под лицензией MIT. Точные условия и происхождение файлов: LICENSE.md и THIRD_PARTY_NOTICES.md.
Отказ от гарантий
Программное обеспечение предоставляется для разработки и тестирования. Автор и участники не гарантируют исполнение заявок, доступность соединения, совместимость с конкретной версией QUIK или пригодность для торговли реальными средствами.
Release files for backtrader-quik 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| backtrader_quik-1.0.0.tar.gz | 116.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| backtrader_quik-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 215.0 kB
Release files / backtrader_quik-1.0.0.tar.gz
| Download URL | backtrader_quik-1.0.0.tar.gz |
|---|---|
| Size | 116.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1c9d1b3a0c982ef3083ad1316c400790ceb46cd4127f79571901a27c0a5d2797
|
|
BLAKE2b-256 checksum How to use checksums |
1151c731b7022fa750f4503c4af8b171cbdb834b272369bb859a644abdd46086
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.13
|
Release files / backtrader_quik-1.0.0-py3-none-any.whl
| Download URL | backtrader_quik-1.0.0-py3-none-any.whl |
|---|---|
| Size | 98.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
156c129062c3ab2088f0a0af1cf88668bf9149a39b8e0194e0cda8c9ac009bd7
|
|
BLAKE2b-256 checksum How to use checksums |
eef8d2efca094d157701c0140d0be1bb0af69c18399b5a9481586d6664fef83e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.13
|