126 lines
12 KiB
Python
126 lines
12 KiB
Python
from QuikPy import QuikPy # Работа с Quik из Python через LUA скрипты QuikSharp
|
||
|
||
|
||
def GetAllAccounts():
|
||
"""Получение всех торговых счетов"""
|
||
classCodes = qpProvider.GetClassesList()['data'] # Список классов
|
||
classCodesList = classCodes[:-1].split(',') # Удаляем последнюю запятую, разбиваем значения по запятой
|
||
tradeAccounts = qpProvider.GetTradeAccounts()['data'] # Все торговые счета
|
||
moneyLimits = qpProvider.GetMoneyLimits()['data'] # Все денежные лимиты (остатки на счетах)
|
||
depoLimits = qpProvider.GetAllDepoLimits()['data'] # Все лимиты по бумагам (позиции по инструментам)
|
||
orders = qpProvider.GetAllOrders()['data'] # Все заявки
|
||
stopOrders = qpProvider.GetAllStopOrders()['data'] # Все стоп заявки
|
||
|
||
# Коды клиента / Фирмы / Счета
|
||
for tradeAccount in tradeAccounts: # Пробегаемся по всем счетам
|
||
firmId = tradeAccount['firmid'] # Фирма
|
||
tradeAccountId = tradeAccount['trdaccid'] # Счет
|
||
distinctClientCode = list(set([moneyLimit['client_code'] for moneyLimit in moneyLimits if moneyLimit['firmid'] == firmId])) # Уникальные коды клиента по фирме
|
||
print(f'Код клиента {distinctClientCode[0] if distinctClientCode else "не задан"}, Фирма {firmId}, Счет {tradeAccountId} ({tradeAccount["description"]})')
|
||
tradeAccountClassCodes = tradeAccount['class_codes'][1:-1].split('|') # Классы торгового счета. Удаляем последнюю вертикальную черту, разбиваем значения по вертикальной черте
|
||
intersectionClassCodes = list(set(tradeAccountClassCodes).intersection(classCodesList)) # Классы, которые есть и в списке и в торговом счете
|
||
# Классы
|
||
for classCode in intersectionClassCodes: # Пробегаемся по всем общим классам
|
||
classInfo = qpProvider.GetClassInfo(classCode)['data'] # Информация о классе
|
||
print(f'- Класс {classCode} ({classInfo["name"]}), Тикеров {classInfo["nsecs"]}')
|
||
# Инструменты. Если выводить на экран, то занимают много места. Поэтому, закомментировали
|
||
# classSecurities = qpProvider.GetClassSecurities(classCode)['data'][:-1].split(',') # Список инструментов класса. Удаляем последнюю запятую, разбиваем значения по запятой
|
||
# print(f' - Тикеры ({classSecurities})')
|
||
if firmId == 'SPBFUT': # Для фьючерсов свои расчеты
|
||
# Лимиты
|
||
print(f'- Фьючерсный лимит {qpProvider.GetFuturesLimit(firmId, tradeAccountId, 0, "SUR")["data"]["cbplimit"]} SUR')
|
||
# Позиции
|
||
futuresHoldings = qpProvider.GetFuturesHoldings()['data'] # Все фьючерсные позиции
|
||
activeFuturesHoldings = [futuresHolding for futuresHolding in futuresHoldings if futuresHolding['totalnet'] != 0] # Активные фьючерсные позиции
|
||
for activeFuturesHolding in activeFuturesHoldings:
|
||
print(f' - Фьючерсная позиция {activeFuturesHolding["sec_code"]} {activeFuturesHolding["totalnet"]} @ {activeFuturesHolding["cbplused"]}')
|
||
else: # Для остальных фирм
|
||
# Лимиты
|
||
firmMoneyLimits = [moneyLimit for moneyLimit in moneyLimits if moneyLimit['firmid'] == firmId] # Денежные лимиты по фирме
|
||
for firmMoneyLimit in firmMoneyLimits: # Пробегаемся по всем денежным лимитам
|
||
limitKind = firmMoneyLimit['limit_kind'] # День лимита
|
||
print(f'- Денежный лимит {firmMoneyLimit["tag"]} на T{limitKind}: {firmMoneyLimit["currentbal"]} {firmMoneyLimit["currcode"]}')
|
||
# Позиции
|
||
firmKindDepoLimits = [depoLimit for depoLimit in depoLimits if depoLimit['firmid'] == firmId and depoLimit['limit_kind'] == limitKind and depoLimit['currentbal'] != 0] # Берем только открытые позиции по фирме и дню
|
||
for firmKindDepoLimit in firmKindDepoLimits: # Пробегаемся по всем позициям
|
||
secCode = firmKindDepoLimit["sec_code"] # Код тикера
|
||
classCode = qpProvider.GetSecurityClass(classCodes, secCode)['data']
|
||
entryPrice = float(firmKindDepoLimit["wa_position_price"])
|
||
lastPrice = float(qpProvider.GetParamEx(classCode, secCode, 'LAST')['data']['param_value']) # Последняя цена сделки
|
||
if classCode == 'TQOB': # Для рынка облигаций
|
||
lastPrice *= 10 # Умножаем на 10
|
||
print(f' - Позиция {classCode}.{secCode} {firmKindDepoLimit["currentbal"]} @ {entryPrice:.2f}/{lastPrice:.2f}')
|
||
# Заявки
|
||
firmOrders = [order for order in orders if order['firmid'] == firmId and order['flags'] & 0b1 == 0b1] # Активные заявки по фирме
|
||
for firmOrder in firmOrders: # Пробегаемся по всем заявка
|
||
isBuy = firmOrder['flags'] & 0b100 != 0b100 # Заявка на покупку
|
||
print(f'- Заявка номер {firmOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {firmOrder["class_code"]}.{firmOrder["sec_code"]} {firmOrder["qty"]} @ {firmOrder["price"]}')
|
||
# Стоп заявки
|
||
firmStopOrders = [stopOrder for stopOrder in stopOrders if stopOrder['firmid'] == firmId and stopOrder['flags'] & 0b1 == 0b1] # Активные стоп заявки по фирме
|
||
for firmStopOrder in firmStopOrders: # Пробегаемся по всем стоп заявкам
|
||
isBuy = firmStopOrder['flags'] & 0b100 != 0b100 # Заявка на покупку
|
||
print(f'- Стоп заявка номер {firmStopOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {firmStopOrder["class_code"]}.{firmStopOrder["sec_code"]} {firmStopOrder["qty"]} @ {firmStopOrder["price"]}')
|
||
|
||
def GetAccount(ClientCode='', FirmId='SPBFUT', TradeAccountId='SPBFUT00PST', LimitKind=0, CurrencyCode='SUR'):
|
||
"""Получение торгового счета. По умолчанию, выдается счет срочного рынка"""
|
||
classCodes = qpProvider.GetClassesList()['data'] # Список классов
|
||
moneyLimits = qpProvider.GetMoneyLimits()['data'] # Все денежные лимиты (остатки на счетах)
|
||
depoLimits = qpProvider.GetAllDepoLimits()['data'] # Все лимиты по бумагам (позиции по инструментам)
|
||
orders = qpProvider.GetAllOrders()['data'] # Все заявки
|
||
stopOrders = qpProvider.GetAllStopOrders()['data'] # Все стоп заявки
|
||
|
||
print(f'Код клиента {ClientCode}, Фирма {FirmId}, Счет {TradeAccountId}, T{LimitKind}, {CurrencyCode}')
|
||
if FirmId == 'SPBFUT': # Для фьючерсов свои расчеты
|
||
print(f'- Фьючерсный лимит {qpProvider.GetFuturesLimit(FirmId, TradeAccountId, 0, "SUR")["data"]["cbplimit"]} SUR')
|
||
futuresHoldings = qpProvider.GetFuturesHoldings()['data'] # Все фьючерсные позиции
|
||
activeFuturesHoldings = [futuresHolding for futuresHolding in futuresHoldings if futuresHolding['totalnet'] != 0] # Активные фьючерсные позиции
|
||
for activeFuturesHolding in activeFuturesHoldings:
|
||
print(f'- Фьючерсная позиция {activeFuturesHolding["sec_code"]} {activeFuturesHolding["totalnet"]} @ {activeFuturesHolding["cbplused"]}')
|
||
else: # Для остальных фирм
|
||
accountMoneyLimit = [moneyLimit for moneyLimit in moneyLimits # Денежный лимит
|
||
if moneyLimit['client_code'] == ClientCode and # Выбираем по коду клиента
|
||
moneyLimit['firmid'] == FirmId and # Фирме
|
||
moneyLimit['limit_kind'] == LimitKind and # Дню лимита
|
||
moneyLimit["currcode"] == CurrencyCode][0] # Валюте
|
||
print(f'- Денежный лимит {accountMoneyLimit["currentbal"]}')
|
||
accountDepoLimits = [depoLimit for depoLimit in depoLimits # Бумажный лимит
|
||
if depoLimit['client_code'] == ClientCode and # Выбираем по коду клиента
|
||
depoLimit['firmid'] == FirmId and # Фирме
|
||
depoLimit['limit_kind'] == LimitKind and # Дню лимита
|
||
depoLimit['currentbal'] != 0] # Берем только открытые позиции по фирме и дню
|
||
for firmKindDepoLimit in accountDepoLimits: # Пробегаемся по всем позициям
|
||
secCode = firmKindDepoLimit["sec_code"] # Код тикера
|
||
entryPrice = float(firmKindDepoLimit["wa_position_price"])
|
||
classCode = qpProvider.GetSecurityClass(classCodes, secCode)['data']
|
||
lastPrice = float(qpProvider.GetParamEx(classCode, secCode, 'LAST')['data']['param_value']) # Последняя цена сделки
|
||
if classCode == 'TQOB': # Для рынка облигаций
|
||
lastPrice *= 10 # Умножаем на 10
|
||
print(f'- Позиция {classCode}.{secCode} {firmKindDepoLimit["currentbal"]} @ {entryPrice:.2f}/{lastPrice:.2f}')
|
||
accountOrders = [order for order in orders # Заявки
|
||
if (order['client_code'] == ClientCode or ClientCode == '') and # Выбираем по коду клиента
|
||
order['firmid'] == FirmId and # Фирме
|
||
order['account'] == TradeAccountId and # Счету
|
||
order['flags'] & 0b1 == 0b1] # Активные заявки
|
||
for accountOrder in accountOrders: # Пробегаемся по всем заявка
|
||
isBuy = accountOrder['flags'] & 0b100 != 0b100 # Заявка на покупку
|
||
print(f'- Заявка номер {accountOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {accountOrder["class_code"]}.{accountOrder["sec_code"]} {accountOrder["qty"]} @ {accountOrder["price"]}')
|
||
accountStopOrders = [stopOrder for stopOrder in stopOrders # Стоп заявки
|
||
if (stopOrder['client_code'] == ClientCode or ClientCode == '') and # Выбираем по коду клиента
|
||
stopOrder['firmid'] == FirmId and # Фирме
|
||
stopOrder['account'] == TradeAccountId and # Счету
|
||
stopOrder['flags'] & 0b1 == 0b1] # Активные стоп заявки
|
||
for accountStopOrder in accountStopOrders: # Пробегаемся по всем стоп заявкам
|
||
isBuy = accountStopOrder['flags'] & 0b100 != 0b100 # Заявка на покупку
|
||
print(f'- Стоп заявка номер {accountStopOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {accountStopOrder["class_code"]}.{accountStopOrder["sec_code"]} {accountStopOrder["qty"]} @ {accountStopOrder["price"]}')
|
||
|
||
if __name__ == '__main__': # Точка входа при запуске этого скрипта
|
||
# qpProvider = QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK
|
||
qpProvider = QuikPy(Host='192.168.1.7') # Вызываем конструктор QuikPy с подключением к удаленному компьютеру с QUIK
|
||
|
||
GetAllAccounts() # Получаем все счета. По ним можно будет сформировать список счетов для торговли
|
||
print()
|
||
GetAccount() # Российские фьючерсы и опционы (счет по умолчанию)
|
||
|
||
# Выход
|
||
qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра
|