Files
QuikPy/Examples/02 - Accounts.py
2021-02-15 11:06:30 +05:00

126 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 из любого экземпляра