From 0c83c13889ded4a5ba224e6163cc2d0cc4d88df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=A7=D0=B5=D1=87=D0=B5?= =?UTF-8?q?=D1=82?= Date: Thu, 25 Mar 2021 18:02:27 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=BE=20=D1=81=D1=82=D0=BE=D0=BF=20=D0=B7=D0=B0=D1=8F=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/05 - Transactions.py | 66 +++++++++++++++++++---------------- QuikPy.py | 2 -- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/Examples/05 - Transactions.py b/Examples/05 - Transactions.py index 92b179e..51b6e00 100644 --- a/Examples/05 - Transactions.py +++ b/Examples/05 - Transactions.py @@ -43,56 +43,62 @@ if __name__ == '__main__': # Точка входа при запуске это qpProvider.OnDepoLimit = OnDepoLimit # Изменение позиции по инструментам qpProvider.OnDepoLimitDelete = OnDepoLimitDelete # Удаление позиции по инструментам + classCode = 'SPBFUT' # Код площадки + secCode = 'SiM1' # Код тикера TransId = 12345 # Номер транзакции - price = 75000 # Цена входа/выхода + price = 77000 # Цена входа/выхода quantity = 1 # Кол-во в лотах # Новая лимитная/рыночная заявка - transaction = { # Все значения должны передаваться в виде строк - 'TRANS_ID': str(TransId), # Номер транзакции задается клиентом - 'CLIENT_CODE': '', # Код клиента. Для фьючерсов его нет - 'ACCOUNT': 'SPBFUT00PST', # Счет - 'ACTION': 'NEW_ORDER', # Тип заявки: Новая лимитная/рыночная заявка - 'CLASSCODE': 'SPBFUT', # Код площадки - 'SECCODE': 'SiH1', # Код тикера - 'OPERATION': 'S', # B = покупка, S = продажа - 'PRICE': str(price), # Цена исполнения. Для рыночных фьючерсных заявок наихудшая цена в зависимости от направления. Для остальных рыночных заявок цена = 0 - 'QUANTITY': str(quantity), # Кол-во в лотах - 'TYPE': 'L'} # L = лимитная заявка (по умолчанию), M = рыночная заявка - print(f'Новая лимитная/рыночная заявка отправлена на рынок: {qpProvider.SendTransaction(transaction)["data"]}') + # 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': 'SPBFUT', # Код площадки - # 'SECCODE': 'SiH1', # Код тикера + # 'CLASSCODE': classCode, # Код площадки + # 'SECCODE': secCode, # Код тикера # 'ORDER_KEY': str(orderNum)} # Номер заявки # print(f'Удаление заявки отправлено на рынок: {qpProvider.SendTransaction(transaction)["data"]}') # Новая стоп заявка - # transaction = { # Все значения должны передаваться в виде строк - # 'TRANS_ID': str(TransId), # Номер транзакции задается клиентом - # 'CLIENT_CODE': '', # Код клиента. Для фьючерсов его нет - # 'ACCOUNT': 'SPBFUT00PST', # Счет - # 'ACTION': 'NEW_STOP_ORDER', # Тип заявки: Новая стоп заявка - # 'CLASSCODE': 'SPBFUT', # Код площадки - # 'SECCODE': 'SiH1', # Код тикера - # 'OPERATION': 'B', # B = покупка, S = продажа - # 'PRICE': str(price), # Цена исполнения - # 'QUANTITY': str(quantity), # Кол-во в лотах - # 'STOPPRICE': str(price), # Стоп цена исполнения - # 'EXPIRY_DATE': 'GTC'} # Срок действия до отмены - # 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': 'SPBFUT', # Код площадки - # 'SECCODE': 'SiH1', # Код тикера + # 'CLASSCODE': classCode, # Код площадки + # 'SECCODE': secCode, # Код тикера # 'STOP_ORDER_KEY': str(orderNum)} # Номер заявки # print(f'Удаление стоп заявки отправлено на рынок: {qpProvider.SendTransaction(transaction)["data"]}') diff --git a/QuikPy.py b/QuikPy.py index 931b2ca..f1bf2ee 100644 --- a/QuikPy.py +++ b/QuikPy.py @@ -1,7 +1,6 @@ import socket # Обращаться к LUA скриптам QuikSharp будем через соединения import threading # Результат работы функций обратного вызова будем получать в отдельном потоке import json # Передавать и принимать данные в QUIK будем через JSON -import time # Задержка при чтении буфера class Singleton(type): @@ -32,7 +31,6 @@ class QuikPy(metaclass=Singleton): # Singleton класс def CallbackHandler(self): """Поток обработки результатов функций обратного вызова""" - # TODO Проверить работу при переходе на следующую сессию (отключение и включение QUIK) socketCallbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Соединение для функций обратного вызова socketCallbacks.connect((self.Host, self.CallbacksPort)) # Открываем соединение для функций обратного вызова currentThread = threading.currentThread() # Получаем текущий поток