Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Ноября 09, 2024, 01:28:36 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  TRANSAQ Connector  |  Topic: Получение исторических данных gethistorydata « предыдущая тема следующая тема »
Страниц: 1 [2] Печать
Автор Тема: Получение исторических данных gethistorydata  (Прочитано 8837 раз)
Сорвачев Сергей
Разработчики
Newbie
*****
Сообщений: 49


Просмотр профиля Email
« Ответ #15 : Мая 19, 2022, 06:51:43 pm »

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


Просмотр профиля Email
« Ответ #16 : Июня 06, 2022, 11:16:41 am »

Сергей, спасибо за пояснение.
Последовал вашему совету и по gethistorydata получил результат.
Однако последующий запуск gethistorydata привел к завершению приложения без получения данных.
Это фрагмент кода:
string cmd = "<command id=\"server_status\"/>";
string res = TXmlConnector.ConnectorSendCommand(cmd);
if (res == "<result success=\"true\"/>") {
  Get_Transaq_History(DTS.t_security[0].security_code, 5, 3, true); // Получаю результат в коллбеке
}
res = TXmlConnector.ConnectorSendCommand(cmd);
if (res == "<result success=\"true\"/>") {
   Get_Transaq_History(DTS.t_security[1].security_code, 5, 3, true); // На этом программа завершается
}

Это фрагмент log:
10:39:57.218 SendCommand: <command id="gethistorydata"><security><board>TQBR</board><seccode>IRGZ</seccode></security><period>5</period><count>3</count><reset>false</reset></command>
10:39:57.258 Gethistorydata ServerReply: <result success="true"/>
10:40:10.140 ServerData: data1<candles secid="0" board="TQBR" seccode="IRGZ" period="5" status="1">
<candle date="16.02.2022 00:00:00" open="14.1" close="14.18" high="14.2" low="14.1" volume="10285"/>
<candle date="17.02.2022 00:00:00" open="14.14" close="14.2" high="14.2" low="14.06" volume="834"/>
<candle date="18.02.2022 00:00:00" open="14.18" close="14.18" high="14.24" low="14.08" volume="2739"/>
</candles>data2
10:40:24.663 SendCommand: <command id="gethistorydata"><security><board>TQBR</board><seccode>GMKN</seccode></security><period>5</period><count>3</count><reset>false</reset></command>
10:40:24.667 Gethistorydata ServerReply: <result success="true"/>

Это фрагмент xdf:
103954.399604 [6920] [15512] <cmd> <command id="server_status"/>
103954.399975 [6920] [15512] <res> [R] <result success="true"/>
103954.400976 [6920] [clbk] <info>
  • [204u] <overnight status="false"/>

103955.164020 [6920] [clbk] <info>
  • [763014u] <server_status sys_ver="629" build="17" server_tz="Russian Standard Time" id="6" connected="true"/>

103957.218012 [6920] [15512] <cmd> <command id="gethistorydata"><security><board>TQBR</board><seccode>IRGZ</seccode></security><period>5</period><count>3</count><reset>false</reset></command>
103957.258965 [6920] [15512] <res> [R] <result success="true"/>
104011.348304 [6920] [15512] <cmd> <command id="server_status"/>
104011.349305 [6920] [15512] <res> [R] <result success="true"/>
104024.663326 [6920] [15512] <cmd> <command id="gethistorydata"><security><board>TQBR</board><seccode>GMKN</seccode></security><period>5</period><count>3</count><reset>false</reset></command>
104024.666320 [6920] [15512] <res> [R] <result success="true"/>
104029.801811 [6920] [15512] <cmd> <command id="server_status"/>
104029.801811 [6920] [15512] <res> [R] <result success="true"/>

Можно ли последовательно выполнять gethistorydata и если “Да”, то прошу подсказать как. Мне нужно последовательно получить историю по ~200 инструментам и сохранить их в DTS.t_candles для последующей обработки.
Записан
Сорвачев Сергей
Разработчики
Newbie
*****
Сообщений: 49


Просмотр профиля Email
« Ответ #17 : Июня 06, 2022, 05:44:46 pm »

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

Запрашивать историю последовательно естественно можно, код ваш логически верен.
Записан
rom_hm
Newbie
*
Сообщений: 7


Просмотр профиля Email
« Ответ #18 : Июня 06, 2022, 10:43:47 pm »

Программа аварийно завершается при повторном вызове Get_Transaq_History.
Проверил, что в ConnectorSendCommand(cmd) уже есть FreeMemory. А в Get_Transaq_History есть вызов ConnectorSendCommand(cmd).
Т.е. во фрагменте кода ниже при каждом вызове Get_Transaq_History вызывается FreeMemory.
Как определить причину ошибки?
string cmd = "<command id=\"server_status\"/>";
string res = TXmlConnector.ConnectorSendCommand(cmd);
if (res == "<result success=\"true\"/>") {
Get_Transaq_History("IRGZ", 5, 3, true); // Получаю результат в коллбеке
}
res = TXmlConnector.ConnectorSendCommand(cmd);
if (res == "<result success=\"true\"/>"){
Get_Transaq_History(“GMKN”, 5, 3, true); // На этом программа аварийно завершается
}


Так выглядит ConnectorSendCommand (из примера, без изменений):
public static String ConnectorSendCommand(String command)
{
IntPtr pData = MarshalUTF8.StringToHGlobalUTF8(command);
   IntPtr pResult = SendCommand(pData);

   String result = MarshalUTF8.PtrToStringUTF8(pResult);

   Marshal.FreeHGlobal(pData);
   FreeMemory(pResult);

   return result;
}

Так выглядит Get_Transaq_History:
void Get_Transaq_History(string Seccode, int TimeframeID, int HistoryLength, bool ResetFlag)
{
string cmd = "<command id=\"gethistorydata\"><security><board>TQBR</board><seccode>" + Seccode + "</seccode></security><period>" + TimeframeID.ToString() + "</period><count>" + HistoryLength.ToString() + "</count><reset>true</reset></command>";

log.WriteLog("SendCommand: " + cmd);
string res = TXmlConnector.ConnectorSendCommand(cmd);
log.WriteLog("Gethistorydata ServerReply: " + res);
}
Записан
rom_hm
Newbie
*
Сообщений: 7


Просмотр профиля Email
« Ответ #19 : Июня 07, 2022, 02:30:33 pm »

Последний вопрос снимаю. Причину аварийного завершения нашел в колбеке.
Записан
rom_hm
Newbie
*
Сообщений: 7


Просмотр профиля Email
« Ответ #20 : Июля 25, 2022, 01:06:32 pm »

Добрый день!
Использую последовательный вызов gethistorydata по всем инструментам MOEX. Фрагмент кода ниже.
                        Get_Transaq_History("SNGS", 4, 3, true);  // Данные получаю
                        Get_Transaq_History("SNGSP", 4, 3, true);  // Нет данных
                        Get_Transaq_History("MGTS", 4, 3, true);  //  Нет данных
                        Get_Transaq_History("GMKN", 4, 3, true);  // Нет данных
                        Get_Transaq_History("SBER", 4, 3, true);  // Нет данных
                        ...


При использовании gethistorydata с period=5 (Сутки) получаю данные корректно (по ~200 инструментам).
При использовании gethistorydata с period=4 (Час) получаю данные после первых нескольких команд (1-3), затем программа завершается.
В логе вижу то, что по SNGS данные получил, а по SNGSP данных нет (см. ниже).
Где искать причину ошибки?

09:18:05.363 SendCommand: <command id="gethistorydata"><security><board>TQBR</board><seccode>SNGS</seccode></security><period>4</period><count>3</count><reset>true</reset></command>
09:19:15.825 ServerData: data1<candles secid="59" board="TQBR" seccode="SNGS" period="4" status="1">
<candle date="22.07.2022 16:00:00" open="26.325" close="26.365" high="26.47" low="26.28" volume="8893"/>
<candle date="22.07.2022 17:00:00" open="26.335" close="26.265" high="26.385" low="26.07" volume="14967"/>
<candle date="22.07.2022 18:00:00" open="26.25" close="26.365" high="26.365" low="26.215" volume="10127"/>
</candles>data2
09:19:15.826 Gethistorydata ServerReply: <result success="true"/>
09:19:15.826 SendCommand: <command id="gethistorydata"><security><board>TQBR</board><seccode>SNGSP</seccode></security><period>4</period><count>3</count><reset>true</reset></command>
Это конец логфайла.
Записан
rom_hm
Newbie
*
Сообщений: 7


Просмотр профиля Email
« Ответ #21 : Июля 27, 2022, 01:14:47 pm »

По последнему вопросу нашел причину, вопрос закрыт.
Записан
Страниц: 1 [2] Печать 
Transaq  |  СБО "Transaq"  |  TRANSAQ Connector  |  Topic: Получение исторических данных gethistorydata « предыдущая тема следующая тема »
Перейти в:  


Войти

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