107 lines
7.7 KiB
Python
107 lines
7.7 KiB
Python
from QuikPy import QuikPy # Работа с QUIK из Python через LUA скрипты QuikSharp
|
||
|
||
|
||
def OnTransReply(data):
|
||
"""Обработчик события ответа на транзакцию пользователя"""
|
||
print('OnTransReply')
|
||
print(data['data']) # Печатаем полученные данные
|
||
|
||
def OnOrder(data):
|
||
"""Обработчик события получения новой / изменения существующей заявки"""
|
||
print('OnOrder')
|
||
print(data['data']) # Печатаем полученные данные
|
||
|
||
def OnTrade(data):
|
||
"""Обработчик события получения новой / изменения существующей сделки
|
||
Не вызывается при закрытии сделки
|
||
"""
|
||
print('OnTrade')
|
||
print(data['data']) # Печатаем полученные данные
|
||
|
||
def OnFuturesClientHolding(data):
|
||
"""Обработчик события изменения позиции по срочному рынку"""
|
||
print('OnFuturesClientHolding')
|
||
print(data['data']) # Печатаем полученные данные
|
||
|
||
def OnDepoLimit(data):
|
||
"""Обработчик события изменения позиции по инструментам"""
|
||
print('OnDepoLimit')
|
||
print(data['data']) # Печатаем полученные данные
|
||
|
||
def OnDepoLimitDelete(data):
|
||
"""Обработчик события удаления позиции по инструментам"""
|
||
print('OnDepoLimitDelete')
|
||
print(data['data']) # Печатаем полученные данные
|
||
|
||
if __name__ == '__main__': # Точка входа при запуске этого скрипта
|
||
qpProvider = QuikPy() # Вызываем конструктор QuikPy с подключением к локальному компьютеру с QUIK
|
||
# qpProvider = QuikPy(Host='<Ваш IP адрес>') # Вызываем конструктор QuikPy с подключением к удаленному компьютеру с QUIK
|
||
qpProvider.OnTransReply = OnTransReply # Ответ на транзакцию пользователя. Если транзакция выполняется из QUIK, то не вызывается
|
||
qpProvider.OnOrder = OnOrder # Получение новой / изменение существующей заявки
|
||
qpProvider.OnTrade = OnTrade # Получение новой / изменение существующей сделки
|
||
qpProvider.OnFuturesClientHolding = OnFuturesClientHolding # Изменение позиции по срочному рынку
|
||
qpProvider.OnDepoLimit = OnDepoLimit # Изменение позиции по инструментам
|
||
qpProvider.OnDepoLimitDelete = OnDepoLimitDelete # Удаление позиции по инструментам
|
||
|
||
classCode = 'SPBFUT' # Код площадки
|
||
secCode = 'SiH2' # Код тикера
|
||
TransId = 12345 # Номер транзакции
|
||
price = 77000 # Цена входа/выхода
|
||
quantity = 1 # Кол-во в лотах
|
||
|
||
# Новая лимитная/рыночная заявка
|
||
# transaction = { # Все значения должны передаваться в виде строк
|
||
# 'TRANS_ID': str(TransId), # Номер транзакции задается клиентом
|
||
# 'CLIENT_CODE': '', # Код клиента. Для фьючерсов его нет
|
||
# 'ACCOUNT': 'SPBFUT00PST', # Счет
|
||
# 'ACTION': 'NEW_ORDER', # Тип заявки: Новая лимитная/рыночная заявка
|
||
# 'CLASSCODE': classCode, # Код площадки
|
||
# 'SECCODE': secCode, # Код тикера
|
||
# 'OPERATION': 'S', # B = покупка, S = продажа
|
||
# 'PRICE': str(price), # Цена исполнения. Для рыночных фьючерсных заявок наихудшая цена в зависимости от направления. Для остальных рыночных заявок цена = 0
|
||
# 'QUANTITY': str(quantity), # Кол-во в лотах
|
||
# 'TYPE': 'L'} # L = лимитная заявка (по умолчанию), M = рыночная заявка
|
||
# print(f'Новая лимитная/рыночная заявка отправлена на рынок: {qpProvider.SendTransaction(transaction)["data"]}')
|
||
|
||
# Удаление существующей лимитной заявки
|
||
# orderNum = 1234567890123456789 # 19-и значный номер заявки
|
||
# transaction = {
|
||
# 'TRANS_ID': str(TransId), # Номер транзакции задается клиентом
|
||
# 'ACTION': 'KILL_ORDER', # Тип заявки: Удаление существующей заявки
|
||
# 'CLASSCODE': classCode, # Код площадки
|
||
# 'SECCODE': secCode, # Код тикера
|
||
# 'ORDER_KEY': str(orderNum)} # Номер заявки
|
||
# print(f'Удаление заявки отправлено на рынок: {qpProvider.SendTransaction(transaction)["data"]}')
|
||
|
||
# Новая стоп заявка
|
||
StopSteps = 10 # Размер проскальзывания в шагах цены
|
||
slippage = float(qpProvider.GetSecurityInfo(classCode, secCode)['data']['min_price_step']) * StopSteps # Размер проскальзывания в деньгах
|
||
if slippage.is_integer(): # Целое значение проскальзывания мы должны отправлять без десятичных знаков
|
||
slippage = int(slippage) # поэтому, приводим такое проскальзывание к целому числу
|
||
transaction = { # Все значения должны передаваться в виде строк
|
||
'TRANS_ID': str(TransId), # Номер транзакции задается клиентом
|
||
'CLIENT_CODE': '', # Код клиента. Для фьючерсов его нет
|
||
'ACCOUNT': 'SPBFUT00PST', # Счет
|
||
'ACTION': 'NEW_STOP_ORDER', # Тип заявки: Новая стоп заявка
|
||
'CLASSCODE': classCode, # Код площадки
|
||
'SECCODE': secCode, # Код тикера
|
||
'OPERATION': 'B', # B = покупка, S = продажа
|
||
'PRICE': str(price), # Цена исполнения
|
||
'QUANTITY': str(quantity), # Кол-во в лотах
|
||
'STOPPRICE': str(price + slippage), # Стоп цена исполнения
|
||
'EXPIRY_DATE': 'GTC'} # Срок действия до отмены
|
||
print(f'Новая стоп заявка отправлена на рынок: {qpProvider.SendTransaction(transaction)["data"]}')
|
||
|
||
# Удаление существующей стоп заявки
|
||
# orderNum = 1234567 # Номер заявки
|
||
# transaction = {
|
||
# 'TRANS_ID': str(TransId), # Номер транзакции задается клиентом
|
||
# 'ACTION': 'KILL_STOP_ORDER', # Тип заявки: Удаление существующей заявки
|
||
# 'CLASSCODE': classCode, # Код площадки
|
||
# 'SECCODE': secCode, # Код тикера
|
||
# 'STOP_ORDER_KEY': str(orderNum)} # Номер заявки
|
||
# print(f'Удаление стоп заявки отправлено на рынок: {qpProvider.SendTransaction(transaction)["data"]}')
|
||
|
||
input('Enter - отмена') # Ждем исполнение заявки
|
||
qpProvider.CloseConnectionAndThread() # Перед выходом закрываем соединение и поток QuikPy из любого экземпляра
|