Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Декабря 05, 2021, 05:49:16 am
Начало Помощь Поиск Войти Регистрация
Новости:

Просмотр сообщений

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Сорвачев Сергей

Pages: [1] 2
1
TRANSAQ Connector / Re: поле <value>
« on: Октября 26, 2021, 06:23:27 pm »
Добрый день. Какую версию библиотеки вы используете? Мы проверили работоспособность на ММВБ, поле заполняется:
Code: [Select]
<trade>
<secid>15381</secid>
<tradeno>4193445894</tradeno>
<orderno>26504867093</orderno>
<board>TQBR</board>
<seccode>GMKN</seccode>
<client>00010</client>
<buysell>B</buysell>
<union>KOSHKIN</union>
<time>26.10.2021 16:40:05.437</time>
<brokerref></brokerref>
<value>23248</value>
<comission>2.33</comission>
<price>23248</price>
<quantity>1</quantity>
<items>1</items>
<yield>0.0</yield>
<currentpos>1</currentpos>
<accruedint>0.0</accruedint>
<tradetype>T</tradetype>
<settlecode>Y2</settlecode>
</trade>

2
Пришлите пожалуйста полные логи dsp, ts, xdf на support@transaq.ru. Обработка колбэка длиной в 1300779 микросекунд уже не есть хорошо. Надо посмотреть при каких обстоятельствах возникает проблема. Минидампов случайно нет в папке с коннетором? Если есть пришлите их тоже.

3
Какая версия у вас? Uninitialize синхронизирован с потоком колбэков.

4
TRANSAQ Connector / Re: Время Жизни Сессии
« on: Марта 15, 2021, 01:52:50 pm »
Пришлите пожалуйста логи коннектора на support@transaq.ru, по ним можно будет судить что происходит.
Пример именования файлов, которые нас интересуют:
20210315_xdf.log
20210315_dsp.log
20210315_ts.log

5
TRANSAQ Connector / Re: Время Жизни Сессии
« on: Марта 15, 2021, 11:37:18 am »
1. Такого понятия нет. Подключение к серверу активно пока клиент не будет отключен сервером или не отключится сам. Также отключения могут происходить из-за некоторых ошибок (например сетевых задержек и т.п.)
2. Без необходимости делать реконнект не следует
3. <server_status connected=false/> - признак потери/завершения подключения к серверу
4. Этот вопрос следует направить Вашему брокеру

6
TRANSAQ Connector / Re: FreeMemory и python
« on: Февраля 19, 2021, 06:30:19 pm »
Пример полного класса-обертки для xmlconnector.dll

7
TRANSAQ Connector / Re: FreeMemory и python
« on: Февраля 19, 2021, 06:26:03 pm »
Полагаю, что так:
XC_ENCODING = 'utf-8'
py_data = cast(data, c_char_p).value.decode(XC_ENCODING)

data - входной параметр вашей callback-функции
py_data - выходной объект-строка

8
TRANSAQ Connector / Re: FreeMemory и python
« on: Февраля 19, 2021, 06:00:35 pm »
использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

В документации есть описание данной функции и ее сигнатуры. Функция выполняеточистку памяти, выделенной библиотекой. Возвращаемое значение - bool, параметр - unsigned char*.

Проблемы с написанием кода в питоне:

использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

dll = ctypes.WinDLL("txmlconnector64.dll")

def callback(incoming_msg):   
    print(etree.tostring(etree.XML(incoming_msg), pretty_print=True, encoding="utf-8").decode())
    dll.FreeMemory(incoming_msg)

callbackPrototype = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_char_p)
callbackPtr = callbackPrototype(callback)

В приведенном примере нет кода после dll.FreeMemory(incoming_msg).

вообще есть у кого-то хоть какието работающие примеры на питоне?
приходится извращаться с ctypes без особого понимания, что во что конвертируется...
документация отвратительная, примеры только на # - там сидеть копаться днями чтобы понять что к чему

TXmlConnector написан на C++ под Windows. Код на C#, Python и Java - авторское видение и адаптация под нужный автору язык.
Пример авторского видения:
    def __init__(self, path):
        self.__ucallback = None
        self.lib = windll.LoadLibrary(path)
        self.__SetFunctions()
        self.__SetCallback(self.__xcallback)

    def __SetFunctions(self):
        self.func_init = self.lib.Initialize
        self.func_init.restype = c_void_p
        self.func_uninit = self.lib.UnInitialize
        self.func_uninit.restype = c_void_p
        self.func_set_callback = self.lib.SetCallback
        self.func_set_callback.restype = c_bool
        self.func_send_cmd = self.lib.SendCommand
        self.func_send_cmd.restype = c_void_p
        self.func_free_mem = self.lib.FreeMemory
        self.func_free_mem.restype = c_bool
        self.func_service_info = self.lib.GetServiceInfo
        self.func_service_info.restype = c_int

    def SetUserCallback(self, fun) :
        self.__ucallback = fun

    def __SetCallback(self, func) :
        prototype = WINFUNCTYPE(c_bool, POINTER(c_ubyte))
        self.__callback_func = prototype(self.__xcallback)
        res = self.func_set_callback(self.__callback_func)
        if (not res) :
            print("Failed to set callback")

    def __xcallback(self, data):
        py_data = cast(data, c_char_p).value.decode(XC_ENCODING)
        self.func_free_mem(data)
        if (not self.__ucallback == None) :
         self.__ucallback(py_data)
        return 0

9
Вызовы callback`ов на данный момент идут из одного потока последовательно. То есть ответ - дожидается.

10
TRANSAQ Connector / Re: <bgo_buy></bgo_buy>
« on: Октября 21, 2020, 06:41:51 pm »
Пришлите пожалуйста xdf лог (необходимо установить уровень логирования loglevel=3 при вызове Initialize) на момент появления пустого bgo_buy на support@transaq.ru

11
TRANSAQ Connector / Re: <bgo_buy></bgo_buy>
« on: Октября 05, 2020, 02:03:35 pm »
Добрый день. Какую версию коннектора Вы использует?

12
TRANSAQ Connector / Re: Deadlock при вызове FreeLibrary
« on: Апреля 22, 2020, 03:16:08 pm »
В логах я проблем не увидел. Если проблема еще актуальна необходимо снять дамп процесса на момент зависания и прислать его нам. Еще было бы неплохо посмотреть Ваш код деинициализации и выгрузки библиотеки.

13
TRANSAQ Connector / Re: Deadlock при вызове FreeLibrary
« on: Апреля 13, 2020, 06:32:11 pm »
Логи на support@transaq.ru пришлите пожалуйста (dsp, xdf, ts)

14
Спасибо за ответы!
Буду разбираться дальше.
По поводу "глобальный идентификатор на каждый callback" отдельное спасибо.
Писать на C++ для меня ну вообще крайне сложно, с этим языком я пытаюсь разобраться очень давно и вообще никак не догоняю.

Можно, например, Python адаптировать под работу с txmlconnector`ом. Но в данном случае также придется мэтчить сишные типы с питоновскими.

15
У меня сложности в понимании коннектора возникли по сути не по самому коннектору, а его реализации на C#.
Эти сложности связаны с тем что библиотека txmlconnector написана на C++, у нее плюсовый интерфейсы и типы, которые при использовании в C# необходимо мэтчить ("маршаллить") с шарповыми.

[DllImport("txmlconnector.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool SetCallback(CallBackDelegate pCallback);
Это всего лишь декларация (описание) функции в языке C#, которая экспортируется из библиотеки txmlconnector. Вам ее особо понимать не надо, надо использовать саму функцию с указанным набором аргументов.

// тут понятно, делегируем функцию Колбек из библиотеки в свою функцию
Callback-функция - как можно догадаться, есть функция обратного вызова. То есть мы указываем библиотеке txmlconnector (см функцию SetCallback) что хотим получать данные от нее в нашу функцию, которую пишем в своем приложении. Данные, приходящие в колбек - это результаты выполнения запросов, которые пораждаются функцией SendCommand. Как callback-функция будет вызываться и откуда в ней берутся данные вас волновать не должно. Будем считать библиотеку черным ящиком, который что-то генерирует и оповещает нас об этом. Главное что нужно знать и это указано в документации - callback функцию нельзя блокировать на длительное время и делать в ней сложную обработку данных. То есть ее назначение принять данные и положить, например, в очередь для дальнейшей обработки.
Из документации:
"В callback функции не должны выполняться операции, которые могут заблокировать поток на длительное время. Также из callback функции не следует вызывать управляющие функции библиотеки: Initialize, UnInitialize, SetCallback, SetCallbackEx, SendCommand, так как это может привести к взаимной блокировке потоков библиотеки."

// тут не понятно что же такое IntPtr, поискал почитал понятнее не стало использую как есть без понимания
Это шарповый тип, который представляет из себя указатель. Так как в C# нет указателей, как в C++, их надо мэппить на шарповые типы.
Их MSDN: "Тип IntPtr может использоваться языками, поддерживающими указатели, и как распространенный способ обращения к данным между языками, которые не поддерживают указатели."
Пример маршаллинга класса: https://www.codeproject.com/Articles/18032/How-to-Marshal-a-C-Class

Возможно есть какой-то другой более простой способ
Пишите на C++. Как минимум потребность в маршаллинге исчезнет.

Вопрос к разработчикам.
Такой возможности нет. Есть возможность (см. функцию SetCallback) задать глобальный идентификатор на каждый callback (это сделано для проектов, в которых несколько библиотек пишут в одну callback-функцию).

Pages: [1] 2


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!