Для алготрейдеров, работающаих с QUIK, связка «QUIK + Lua» всегда была одновременно и благословением, и проклятием. Мощно — но на малопопулярном в трейдинге языке.
Решения вроде QUIKSharp (.NET) стали шагом к более распространённым экосистемам, но что насчёт многомиллионного сообщества Python?
Новый проект QUIK-python портирует нативный QUIK Lua API прямо в Python — с сохранением всей гибкости оригинала и удобством современного async-кода.
Ключевые особенности и преимущества
- Полностью асинхронный клиент — коллбеки данных из стаканов, сделок и свечей не блокируют основную логику.
- Прямой доступ к API QUIK — вызывайте функции Lua напрямую из Python-кода.
- Событийная модель — подписывайтесь на стаканы, свечи и сделки, получая события прямо в Python.
— 🐍 Нативный Python-код — всё, от коллбеков до торговой логики, пишется на чистом Python с доступом к его экосистеме (NumPy, Pandas, asyncio и др.).
- Работа с объектами — вместо Lua-таблиц вы получаете удобные Python-объекты с автодополнением и проверкой типов.
- Современная разработка — используйте IDE (VSCode, PyCharm) с отладкой, подсветкой и автокомплитом.
<code>import logging
import asyncio
from quik_python import Quik, LuaException
from quik_python.data_structures import CandleInterval, Candle, InfoParams
CLASS_CODE = "TQBR"
# CLASS_CODE = "QJSIM" ## for Demo Quik Junior Connection
async def main():
"""
Пример использования QuikPython API
"""
# Создаем подключение к QUIK
# async with Quik(host="192.168.10.128") as quik:
async with Quik(host="localhost") as quik:
try:
await quik.initialize()
# Работа с QUIK
except Exception as e:
print(f"Ошибка подключения: {e}")
return
try:
# Проверяем подключение
if not quik.is_service_alive():
print("Не удалось подключиться к QUIK")
return
if not await quik.service.is_connected():
print("Quik не подключен к торгам")
print("Подключение к QUIK успешно!")
await test_candle(quik=quik)
except LuaException as e:
print(f"QUIK Lua error: {e}")
except Exception as e:
print(f"Error: {e}")
### test candle
async def test_candle(quik:Quik):
received_candles = []
def on_new_candle(candle: Candle):
"""Callback for new candle events"""
if (candle.sec_code == "SBER" and candle.interval == CandleInterval.M1):
print(f"New candle - Sec:{candle.sec_code}, Open:{candle.open}, "
f"Close:{candle.close}, Volume:{candle.volume}")
received_candles.append(candle)
try:
# Проверяем подключение
if not await quik.service.is_connected():
print("QUIK не подключен к торгам")
return
print("QUIK service is connected")
v = await quik.candles.get_last_candles(CLASS_CODE, "SBER", CandleInterval.M1, 10)
print(f"Last candles: {v}")
# Subscribe to new candle events
quik.candles.add_new_candle_handler(on_new_candle)
# Check if already subscribed and unsubscribe if needed
is_subscribed = await quik.candles.is_subscribed(CLASS_CODE, "SBER", CandleInterval.M1)
print(f"Is subscribed: {is_subscribed}")
if is_subscribed:
await quik.candles.unsubscribe(CLASS_CODE, "SBER", CandleInterval.M1)
# Subscribe to minute candles
await quik.candles.subscribe(CLASS_CODE, "SBER", CandleInterval.M1)
# Verify subscribed
is_subscribed = await quik.candles.is_subscribed(CLASS_CODE, "SBER", CandleInterval.M1)
print(f"Is subscribed: {is_subscribed}")
# Wait a bit for potential candles (but don't wait too long in tests)
await asyncio.sleep(120) ## wait 180sec
# Unsubscribe
await quik.candles.unsubscribe(CLASS_CODE, "SBER", CandleInterval.M1)
print(f"Received {len(received_candles)} candles during test")
except Exception as e:
print(f"Candle test error: {e}")
if __name__ == "__main__":
# Настройка логирования
logging.basicConfig(
level=logging.DEBUG, # Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Формат сообщений
datefmt='%Y-%m-%d %H:%M:%S' # Формат времени
)
print("QuikPython API Example")
print("===========================")
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\nStopped by user")
except Exception as e:
print(f"Main example error: {e}")</code>
Репозиторий проекта: github.com/Alex-Shur/quik_python
есть же QuikPy — (https://github.com/cia76/QuikPy) такая же обертка. может туда бы лучше присоединились бы? глюков еще хватает и там, но в принципе процесс идет. А тут у вас совсем новый проект и полный дубль?
Petr S, нет пусть не присоединяется!
QuikPy выглядит как студенческая поделка слепленая на скорую руку, к тому же с багами которые видно невооруженным глазом!![]()
Ни в коем случае не присодиняйся!
Тем более там все сделано человеком которые торгует в основном одни облиги либо акции которые покупает раз в месяц. Это в слышал в одном из его инфоцыганских видео!
Пусть выживет Сильнейший !
Да можно, dll такие же как и для QUIKSharp
Небольшие отличия есть только в Lua скриптах там где идет подписка на получение свечей и получение свечей.
Дак на эти свечи, вон пишет Красаучег, еще и подписка нужна…
Может еще и платная? )))
github.com/finsight/QuikSharp
C QUIK 12.6.0.53 работает, DLL из 54_MT не требует загрузки и установки дополнительных библиотек с сайта Microsoft
---
Lua DLL DLL 54_MT скомпилирована с использованием статических библиотек MS VC, флаг компиляции /MT
QUIK самая распространенная торговая платформа, есть у всех брокеров
Даже QPILE был бы вполне себе хорош, если бы надежность терминала и получаемых с него данных была гарантирована… а так увы( как не изгаляйся, но из говна не сделать конфетку).
Пример ситуации: буквально пару недель назад на двух параллельно торгуемых счетах случилось капец какое расхождение из-за того что один терминал по какой-то магической причине затупил и решил не отображать наличие позиций по RI. В итоге автоматическая система приведения к состоянию продолжала продавать позиции пока позволяли средства. В итоге минут через 15 мы сидели с позициями по одному счету +2 контракта и -8 по второму счету. И чем тут PYTON поможет?
ИМХО единственный вариант это писать новый терминал пользуясь опытом лучших мировых вариантов.
Но не суть. Не стоит приписывать своему проекту то, чего в нем нет. Это не добавит ему популярности. Обман рано или поздно вскроется и сыграет против Вас.
Я вот про это:API QUIK был и остается закрытым, и открывать его разработчики не планируют (их об этом много раз просили).
Честно говоря, давно не интересовался данной темой, так что мог сильно отстать в своих познаниях.
По поводуУмный поймет что это написано про доступ к Qlua функциям в QUIK.
ИИ сделал каркас, который потом допиливался руками.
В общем, ежели вы такой умный, то попробуйте повторить с помощью ИИ и сделать тоже самое из оригинала, и мы посмотрим что у вас получится.
Давайте, очень ждём ВАШЕГО результата на github !
Тут хочется сказать немного измененными словами Антона Павловича Чехова «Учиться нам нужно, учиться и учиться, а с глубокими программистскими обобщениями погодим: мы ещё не доросли до них и, по совести, ничего в них не понимаем».