Backtrader integration with QUIK using an embedded QuikPy provider
Project description
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 или пригодность для торговли реальными средствами.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file backtrader_quik-1.0.0.tar.gz.
File metadata
- Download URL: backtrader_quik-1.0.0.tar.gz
- Upload date:
- Size: 116.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c9d1b3a0c982ef3083ad1316c400790ceb46cd4127f79571901a27c0a5d2797
|
|
| MD5 |
0caaa1d641d6d83a5aba8748215efbed
|
|
| BLAKE2b-256 |
1151c731b7022fa750f4503c4af8b171cbdb834b272369bb859a644abdd46086
|
File details
Details for the file backtrader_quik-1.0.0-py3-none-any.whl.
File metadata
- Download URL: backtrader_quik-1.0.0-py3-none-any.whl
- Upload date:
- Size: 98.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
156c129062c3ab2088f0a0af1cf88668bf9149a39b8e0194e0cda8c9ac009bd7
|
|
| MD5 |
344ee46ae67ad59dae43b561b6623680
|
|
| BLAKE2b-256 |
eef8d2efca094d157701c0140d0be1bb0af69c18399b5a9481586d6664fef83e
|