Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Октября 12, 2024, 10:23:46 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] 3 4
16
После последней команды приходит структура <securities> с запрошенными опционами.

После того как опционы пришли, команда subscribe выполняется без ошибок?

17
В блоке <securities> после команды connect этот инструмент есть? Прикрепите пожалуйста xdf-лог, если он у вас пишется.

18
1. SendCommand не является потокобезопасной
2. "Длительные блокировки" приведут к задержкам получения данных от сервера. Если клиент получает данные реже чем они поступают в "очередь клиента" на стороне сервера, возникает вероятность отключения клиента от сервера Transaq.
"Длительное время" не есть какая-то фиксированная величина, скорее тут речь идет о том что данные нужно как можно быстрее "переложить к себе в структуры данных" и вернуть управление в поток библиотеки. То есть задача клиента - обеспечить регулярную вычитку данных от сервера с минимальной задержкой.

19
TRANSAQ Connector / Re: Поясните по sec_info и sec_info_upd
« on: Сентября 01, 2022, 02:01:46 pm »
Здравствуйте,
структура sec_info - результат выполнения команды get_securities_info (инициируется пользователем),
sec_info_upd приходит как обновление данных от сервера без запроса пользователя.
В апдейте приходят только те поля, которые указаны в документации.

20
Однако последующий запуск gethistorydata привел к завершению приложения без получения данных.
Не очень понятно что значит завершается. Падает (аварийно завершается с выбрасыванием исключения) или просто завершает свою работу без ошибок?
Если падает: вероятно вы храните указатели на данные, полученные от коннектора. Данные надо копировать, так как указатели удаляются. К тому же на пользователе лежит ответственность очистки буфера данных после каждой полученной порции данных (см. команду FreeMemory). Вызова FreeMemory я в отрывке вашего кода не вижу, на это стоит обратить внимание.

Запрашивать историю последовательно естественно можно, код ваш логически верен.

21
Но "candles111" в журнале нет. В чем может быть причина?
Причин может быть много  :)
У вас есть документация по xmlconnector? Там про команду connect написано следующее:
Quote
После того, как все начальные данные будут загружены, приложению будет отдана структура <server_status> со значением  connected="true". Это означает, что коннектор готов к работе.
Коннектору требуется время для загрузки начальных данных, поэтому нет смысла сразу после отправки команды на подключение к серверу (Transaq_Connect) запрашивать историю.
Правильный алгоритм работы - позвать команду connect, дождаться в колбэк структуру <server_status> с положительным статусом и только потом запрашивать данные.
Еще коннектор ведет лог в файле xdf*.log. Его содержимое зависит от уровня логирования, указанного при инициализации библиотеки. Там скорее всего можно найти ответ на ваш вопрос о причинах.

22
Добрый день! Прочитал всю ветку, но так и не нашел ответа на первоначальный вопрос: Как с помощью gethistorydata получать исторические данные через TXmlConnector на C#? Если у кого получилось, поделитесь, пож.

Добрый! Проблема в понимании логики работы или написании кода? Остальные команды удалось реализовать?

Скачиваем ТУТ пример коннектора на C#.
Файл MainForm.cs:
Code: (C#) [Select]
void Get_Transaq_History(int SecurityID, int TimeframeID, int HistoryLength, bool ResetFlag)формирование и отправка команды в коннектор

Файл connector.cs:
Code: (C#) [Select]
public static string Transaq_HandleData(string data)обработчик входящих данных от коннектора.
Вас интересует две секции из этого кода:
1. Значения period для передачи коннектору в gethistorydata
Code: [Select]
// данные для таймфреймов
if (section == "candlekinds")

2. Сами свечи, то есть результат вызова gethistorydata
Code: [Select]
// данные по свечам
if (section == "candles")
{
   if (ename == "candles")
   {
      // ваша обработка
    }
    if (ename == "candle")
    {
      // ваша обработка
    }
}

23
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>

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

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

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

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

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

29
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 - выходной объект-строка

30
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

Pages: 1 [2] 3 4


Войти

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