Initial commit

This commit is contained in:
Игорь Чечет
2021-02-14 15:47:51 +05:00
commit 87425dfe9c
16 changed files with 3512 additions and 0 deletions

125
Examples/02 - Accounts.py Normal file
View File

@@ -0,0 +1,125 @@
from QuikPy import QuikPy as qp # 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 = qp.QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK
qpProvider = qp.QuikPy(Host='192.168.1.7') # Вызываем конструктор QuikPy с подключением к удаленному компьютеру с QUIK
GetAllAccounts() # Получаем все счета. По ним можно будет сформировать список счетов для торговли
print()
GetAccount() # Российские фьючерсы и опционы (счет по умолчанию)
# Выход
qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра