Код |
---|
# ================== 1.Параметры ==================
CLASS_CODE = "SPBFUT" # Код класса
SEC_CODE = "RIH5" # Код инструмента
# ================== 6. Определение типа коллбэка ==================
TRANS2QUIK_TRADE_STATUS_CALLBACK_TYPE = ctypes.WINFUNCTYPE(
None, # void
ctypes.c_long, # int nMode
ctypes.c_double, # double dNumber
ctypes.c_double, # double dOrderNumber
ctypes.c_char_p, # char* ClassCode
ctypes.c_char_p, # char* SecCode
ctypes.c_double, # double dPrice
ctypes.c_long, # int nQty
ctypes.c_double, # double dValue
ctypes.c_int, # int nIsSell
ctypes.c_long # void* pTradeDescriptor
)
# ================== 7. Функция обратного вызова для получения сделок ==================
def trade_status_callback(n_mode, d_number, d_order_num, class_code, sec_code, d_price, n_qty, d_value, n_is_sell, p_trade_descr):
print("Получена сделка:")
print(f" Mode: {n_mode}")
print(f" Number: {d_number}")
print(f" Order Number: {d_order_num}")
print(f" Class Code: {class_code.decode('cp1251') if class_code else ''}") # Декодируем class_code, если он есть
print(f" Security Code: {sec_code.decode('cp1251') if sec_code else ''}") # Декодируем sec_code, если он есть
print(f" Price: {d_price}")
print(f" Quantity: {n_qty}")
print(f" Value: {d_value}")
print(f" Is Sell: {n_is_sell}")
print(f" Trade Descriptor: {p_trade_descr}")
return
# ================== 7. Функция для преобразования указателя в строку ==================
def get_string(p):
if p:
return ctypes.string_at(p).decode('cp1251')
else:
return ''
# ================== 8. Подписка на сделки ==================
def subscribe_trades(dll, functions, class_code, sec_code):
"""
Подписывается на получение данных о сделках для указанных class_code и sec_code.
"""
try:
subscribe_trades_func = functions["TRANS2QUIK_SUBSCRIBE_TRADES"] # Получаем функцию из словаря
# кодируем class_code и sec_code, используя кодировку cp1251, как требует QUIK
class_code_encoded = class_code.encode('cp1251')
sec_code_encoded = sec_code.encode('cp1251')
result = subscribe_trades_func(class_code_encoded, sec_code_encoded) # Вызываем функцию скодированными параметрами
if result == 0:
print("Успешно подписались на сделки")
return True
else:
print(f"Не удалось подписаться на сделки. Код ошибки: {result}")
return False
except KeyError as e:
print(f"Функция не найдена: {e}")
return False
# ================== 3.2. Запуск получения данных о сделках ==================
def start_get_trades(dll, functions, trade_status_callback,TRANS2QUIK_TRADE_STATUS_CALLBACK_TYPE):
"""
Запускает процесс получения данных о сделках, используя функцию обратного вызова.
"""
try:
start_trades_func = functions["TRANS2QUIK_START_TRADES"] # Получаем функцию запуска обработки сделок
# Преобразуем Python-функцию обратного вызова в C-совместимый указатель
c_trade_callback = TRANS2QUIK_TRADE_STATUS_CALLBACK_TYPE(trade_status_callback)
# Вызываем функцию, передавая ей указатель на функцию обратного вызова
start_trades_func(c_trade_callback)
print("Процесс получения сделок запущен") # Выводим сообщение об успешном запуске
return True
except KeyError as e:
print(f"start_get_trades: Функция не найдена: {e}")
return False
except Exception as e:
print(f"start_get_trades: Общая ошибка: {e}")
return False
|
Испробовал все варианты. Подписка проходит успешно. Процесс получения сделок запущен, но данные по инструменту не приходят. Что забыл учесть?