-
Notifications
You must be signed in to change notification settings - Fork 0
/
02.html
139 lines (139 loc) · 30.3 KB
/
02.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>iliyasite new document title</title>
</head>
<body>
<p>from QuikPy import QuikPy # Работа с QUIK из Python через LUA скрипты QuikSharp</p>
<div></div>
<div></div>
<div>def GetAllAccounts():</div>
<div> """Получение всех торговых счетов"""</div>
<div> futuresFirmId = 'SPBFUT' # Фирма для фьючерсов. Измените, если требуется, на фирму, которую для фьючерсов поставил ваш брокер</div>
<div></div>
<div> classCodes = qpProvider.GetClassesList()['data'] # Список классов</div>
<div> classCodesList = classCodes[:-1].split(',') # Удаляем последнюю запятую, разбиваем значения по запятой</div>
<div> tradeAccounts = qpProvider.GetTradeAccounts()['data'] # Все торговые счета</div>
<div> moneyLimits = qpProvider.GetMoneyLimits()['data'] # Все денежные лимиты (остатки на счетах)</div>
<div> depoLimits = qpProvider.GetAllDepoLimits()['data'] # Все лимиты по бумагам (позиции по инструментам)</div>
<div> orders = qpProvider.GetAllOrders()['data'] # Все заявки</div>
<div> stopOrders = qpProvider.GetAllStopOrders()['data'] # Все стоп заявки</div>
<div></div>
<div> # Коды клиента / Фирмы / Счета</div>
<div> for tradeAccount in tradeAccounts: # Пробегаемся по всем счетам</div>
<div> firmId = tradeAccount['firmid'] # Фирма</div>
<div> tradeAccountId = tradeAccount['trdaccid'] # Счет</div>
<div> distinctClientCode = list(set([moneyLimit['client_code'] for moneyLimit in moneyLimits if moneyLimit['firmid'] == firmId])) # Уникальные коды клиента по фирме</div>
<div> print(f'Код клиента {distinctClientCode[0] if distinctClientCode else "не задан"}, Фирма {firmId}, Счет {tradeAccountId} ({tradeAccount["description"]})')</div>
<div> tradeAccountClassCodes = tradeAccount['class_codes'][1:-1].split('|') # Классы торгового счета. Удаляем последнюю вертикальную черту, разбиваем значения по вертикальной черте</div>
<div> intersectionClassCodes = list(set(tradeAccountClassCodes).intersection(classCodesList)) # Классы, которые есть и в списке и в торговом счете</div>
<div> # Классы</div>
<div> for classCode in intersectionClassCodes: # Пробегаемся по всем общим классам</div>
<div> classInfo = qpProvider.GetClassInfo(classCode)['data'] # Информация о классе</div>
<div> print(f'- Класс {classCode} ({classInfo["name"]}), Тикеров {classInfo["nsecs"]}')</div>
<div> # Инструменты. Если выводить на экран, то занимают много места. Поэтому, закомментировали</div>
<div> # classSecurities = qpProvider.GetClassSecurities(classCode)['data'][:-1].split(',') # Список инструментов класса. Удаляем последнюю запятую, разбиваем значения по запятой</div>
<div> # print(f' - Тикеры ({classSecurities})')</div>
<div> if firmId == futuresFirmId: # Для фьючерсов свои расчеты</div>
<div> # Лимиты</div>
<div> print(f'- Фьючерсный лимит {qpProvider.GetFuturesLimit(firmId, tradeAccountId, 0, "SUR")["data"]["cbplimit"]} SUR')</div>
<div> # Позиции</div>
<div> futuresHoldings = qpProvider.GetFuturesHoldings()['data'] # Все фьючерсные позиции</div>
<div> activeFuturesHoldings = [futuresHolding for futuresHolding in futuresHoldings if futuresHolding['totalnet'] != 0] # Активные фьючерсные позиции</div>
<div> for activeFuturesHolding in activeFuturesHoldings:</div>
<div> print(f' - Фьючерсная позиция {activeFuturesHolding["sec_code"]} {activeFuturesHolding["totalnet"]} @ {activeFuturesHolding["cbplused"]}')</div>
<div> else: # Для остальных фирм</div>
<div> # Лимиты</div>
<div> firmMoneyLimits = [moneyLimit for moneyLimit in moneyLimits if moneyLimit['firmid'] == firmId] # Денежные лимиты по фирме</div>
<div> for firmMoneyLimit in firmMoneyLimits: # Пробегаемся по всем денежным лимитам</div>
<div> limitKind = firmMoneyLimit['limit_kind'] # День лимита</div>
<div> print(f'- Денежный лимит {firmMoneyLimit["tag"]} на T{limitKind}: {firmMoneyLimit["currentbal"]} {firmMoneyLimit["currcode"]}')</div>
<div> # Позиции</div>
<div> firmKindDepoLimits = [depoLimit for depoLimit in depoLimits if depoLimit['firmid'] == firmId and depoLimit['limit_kind'] == limitKind and depoLimit['currentbal'] != 0] # Берем только открытые позиции по фирме и дню</div>
<div> for firmKindDepoLimit in firmKindDepoLimits: # Пробегаемся по всем позициям</div>
<div> secCode = firmKindDepoLimit["sec_code"] # Код тикера</div>
<div> classCode = qpProvider.GetSecurityClass(classCodes, secCode)['data']</div>
<div> entryPrice = float(firmKindDepoLimit["wa_position_price"])</div>
<div> lastPrice = float(qpProvider.GetParamEx(classCode, secCode, 'LAST')['data']['param_value']) # Последняя цена сделки</div>
<div> if classCode == 'TQOB': # Для рынка облигаций</div>
<div> lastPrice *= 10 # Умножаем на 10</div>
<div> print(f' - Позиция {classCode}.{secCode} {firmKindDepoLimit["currentbal"]} @ {entryPrice:.2f}/{lastPrice:.2f}')</div>
<div> # Заявки</div>
<div> firmOrders = [order for order in orders if order['firmid'] == firmId and order['flags'] & 0b1 == 0b1] # Активные заявки по фирме</div>
<div> for firmOrder in firmOrders: # Пробегаемся по всем заявка</div>
<div> isBuy = firmOrder['flags'] & 0b100 != 0b100 # Заявка на покупку</div>
<div> print(f'- Заявка номер {firmOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {firmOrder["class_code"]}.{firmOrder["sec_code"]} {firmOrder["qty"]} @ {firmOrder["price"]}')</div>
<div> # Стоп заявки</div>
<div> firmStopOrders = [stopOrder for stopOrder in stopOrders if stopOrder['firmid'] == firmId and stopOrder['flags'] & 0b1 == 0b1] # Активные стоп заявки по фирме</div>
<div> for firmStopOrder in firmStopOrders: # Пробегаемся по всем стоп заявкам</div>
<div> isBuy = firmStopOrder['flags'] & 0b100 != 0b100 # Заявка на покупку</div>
<div> print(f'- Стоп заявка номер {firmStopOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {firmStopOrder["class_code"]}.{firmStopOrder["sec_code"]} {firmStopOrder["qty"]} @ {firmStopOrder["price"]}')</div>
<div></div>
<div>def GetAccount(ClientCode='', FirmId='SPBFUT', TradeAccountId='SPBFUT00PST', LimitKind=0, CurrencyCode='SUR', IsFutures=True):</div>
<div> """Получение торгового счета. По умолчанию, выдается счет срочного рынка"""</div>
<div> classCodes = qpProvider.GetClassesList()['data'] # Список классов</div>
<div> moneyLimits = qpProvider.GetMoneyLimits()['data'] # Все денежные лимиты (остатки на счетах)</div>
<div> depoLimits = qpProvider.GetAllDepoLimits()['data'] # Все лимиты по бумагам (позиции по инструментам)</div>
<div> orders = qpProvider.GetAllOrders()['data'] # Все заявки</div>
<div> stopOrders = qpProvider.GetAllStopOrders()['data'] # Все стоп заявки</div>
<div></div>
<div> print(f'Код клиента {ClientCode}, Фирма {FirmId}, Счет {TradeAccountId}, T{LimitKind}, {CurrencyCode}')</div>
<div> if IsFutures: # Для фьючерсов свои расчеты</div>
<div> print(f'- Фьючерсный лимит {qpProvider.GetFuturesLimit(FirmId, TradeAccountId, 0, "SUR")["data"]["cbplimit"]} SUR')</div>
<div> futuresHoldings = qpProvider.GetFuturesHoldings()['data'] # Все фьючерсные позиции</div>
<div> activeFuturesHoldings = [futuresHolding for futuresHolding in futuresHoldings if futuresHolding['totalnet'] != 0] # Активные фьючерсные позиции</div>
<div> for activeFuturesHolding in activeFuturesHoldings:</div>
<div> print(f'- Фьючерсная позиция {activeFuturesHolding["sec_code"]} {activeFuturesHolding["totalnet"]} @ {activeFuturesHolding["cbplused"]}')</div>
<div> else: # Для остальных фирм</div>
<div> accountMoneyLimit = [moneyLimit for moneyLimit in moneyLimits # Денежный лимит</div>
<div> if moneyLimit['client_code'] == ClientCode and # Выбираем по коду клиента</div>
<div> moneyLimit['firmid'] == FirmId and # Фирме</div>
<div> moneyLimit['limit_kind'] == LimitKind and # Дню лимита</div>
<div> moneyLimit["currcode"] == CurrencyCode][0] # Валюте</div>
<div> print(f'- Денежный лимит {accountMoneyLimit["currentbal"]}')</div>
<div> accountDepoLimits = [depoLimit for depoLimit in depoLimits # Бумажный лимит</div>
<div> if depoLimit['client_code'] == ClientCode and # Выбираем по коду клиента</div>
<div> depoLimit['firmid'] == FirmId and # Фирме</div>
<div> depoLimit['limit_kind'] == LimitKind and # Дню лимита</div>
<div> depoLimit['currentbal'] != 0] # Берем только открытые позиции по фирме и дню</div>
<div> for firmKindDepoLimit in accountDepoLimits: # Пробегаемся по всем позициям</div>
<div> secCode = firmKindDepoLimit["sec_code"] # Код тикера</div>
<div> entryPrice = float(firmKindDepoLimit["wa_position_price"])</div>
<div> classCode = qpProvider.GetSecurityClass(classCodes, secCode)['data']</div>
<div> lastPrice = float(qpProvider.GetParamEx(classCode, secCode, 'LAST')['data']['param_value']) # Последняя цена сделки</div>
<div> if classCode == 'TQOB': # Для рынка облигаций</div>
<div> lastPrice *= 10 # Умножаем на 10</div>
<div> print(f'- Позиция {classCode}.{secCode} {firmKindDepoLimit["currentbal"]} @ {entryPrice:.2f}/{lastPrice:.2f}')</div>
<div> accountOrders = [order for order in orders # Заявки</div>
<div> if (order['client_code'] == ClientCode or ClientCode == '') and # Выбираем по коду клиента</div>
<div> order['firmid'] == FirmId and # Фирме</div>
<div> order['account'] == TradeAccountId and # Счету</div>
<div> order['flags'] & 0b1 == 0b1] # Активные заявки</div>
<div> for accountOrder in accountOrders: # Пробегаемся по всем заявкам</div>
<div> isBuy = accountOrder['flags'] & 0b100 != 0b100 # Заявка на покупку</div>
<div> print(f'- Заявка номер {accountOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {accountOrder["class_code"]}.{accountOrder["sec_code"]} {accountOrder["qty"]} @ {accountOrder["price"]}')</div>
<div> accountStopOrders = [stopOrder for stopOrder in stopOrders # Стоп заявки</div>
<div> if (stopOrder['client_code'] == ClientCode or ClientCode == '') and # Выбираем по коду клиента</div>
<div> stopOrder['firmid'] == FirmId and # Фирме</div>
<div> stopOrder['account'] == TradeAccountId and # Счету</div>
<div> stopOrder['flags'] & 0b1 == 0b1] # Активные стоп заявки</div>
<div> for accountStopOrder in accountStopOrders: # Пробегаемся по всем стоп заявкам</div>
<div> isBuy = accountStopOrder['flags'] & 0b100 != 0b100 # Заявка на покупку</div>
<div> print(f'- Стоп заявка номер {accountStopOrder["order_num"]} {"Покупка" if isBuy else "Продажа"} {accountStopOrder["class_code"]}.{accountStopOrder["sec_code"]} {accountStopOrder["qty"]} @ {accountStopOrder["price"]}')</div>
<div></div>
<div></div>
<div>if __name__ == '__main__': # Точка входа при запуске этого скрипта</div>
<div> qpProvider = QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK</div>
<div> # qpProvider = QuikPy(Host='<Ваш IP адрес>') # Вызываем конструктор QuikPy с подключением к удаленному компьютеру с QUIK</div>
<div></div>
<div> GetAllAccounts() # Получаем все счета. По ним можно будет сформировать список счетов для торговли</div>
<div> print()</div>
<div> GetAccount() # Российские фьючерсы и опционы (счет по умолчанию)</div>
<div> # По списку полученных счетов обязательно проверьте каждый!</div>
<div> # GetAccount('<Код клиента>', '<Код фирмы>', '<Счет>', <Номер дня лимита>, '<Валюта>', <Счет фьючерсов=True, иначе=False>)</div>
<div></div>
<div></div>
<div> # Выход</div>
<div> qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра</div>
</body>
</html>