Уважаемые разработчики TRANSAQ!
По моему представлению, чем больше человек пользуются Вашей программой, тем для Вас лучше. Ситуация следующая, QUIK полетел всерьез и похоже надолго. Возможно Вы в курсе. В двух словах примерно после 17 часов перестает поступать биржевая информация. Могу сказать про двух брокеров ВТБ и Финам. В ВТБ данная проблема существует уже пару месяцев все сервера кроме резервного не работают. С 26.02.2020 такие же проблемы начались и в Финам, но у них еще хуже вообще все сервера не работаю, в том числе и резервные. Поскольку ВТБ уже пару месяцев не могут разобраться с этой проблемой, Финам тоже врятли быстро с ней разберется. Для меня эта проблема стала очень серьезной по той причине, что у меня торгуют роботы в QUIK на QLua, а поскольку данные в QUIK стоят, то и торговать невозможно. Встал вопрос, нужно отказываться от QUIK и на что-то переходить. В тех поддержке Финам мне посоветовали TRANSAQ connector. Слышал про него и ранее, но необходимости не было, поскольку вполне устраивал QUIK и QLau. Думаю ага хорошо сейчас скачаю документацию по TRANSAQ connector и перенесу на него своих роботов используя C#. Открыв документацию понял, что ничерта не понимаю или не знаю.
Открываю Visual Studion, первым делом думаю, добавлю библиотеку txmlconnector.dll, Reference> Add Reference, не добавляется ошибка, значит это не библиотека .NET, проблема 1.
Я понимаю, что Вы в TRANSAQ "лютые" программисты и для Вас это вообще не проблема, но вот для Ваших пользователей это проблема, может ошибаюсь, а может и нет процентов 90 людей пишущих торговых роботов вообще не программисты а самоучки.
Ладно, на сайте Финам есть пример C# TRANSAQ connector, скачиваю, открываю, Solution. Пару тысяч строк кода и штук двадцать срок комментариев – не густо.
Вроде как нашел, как подключить библиотеку
[DllImport("txmlconnector.dll", CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr SendCommand(IntPtr pData);
Но вот почему-то нужно для каждой функции прописывать данные строки
[DllImport("txmlconnector.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool FreeMemory(IntPtr pData);
Думаю, ладно попробую здесь же хотя бы получить цену закрытия последней свечи.
В мануале написано
Функция SendCommand Служит для передачи команд Коннектору. Возвращаемое значение Указатель на XML-сообщение, содержащее данные об успешности или неуспешности выполнения команды.
В мануале написано. Чтобы получить данные за последние N свечей передаем
<command id="gethistorydata"><security><board> идентификатор режима торгов </board><seccode> код инструмента </seccode></security><period>идентификатор периода</period><count>количество свечей</count><reset>true/false</reset></command>
Результатом работы является структура вида candles. Исторические данные
<candles secid=".." period="идентификатор периода" status=".."board="идентификатор режима торгов" seccode="код инструмента"><candle date="дата" open="…" high="…" low="..." close="…"volume="…" oi="open_interest"/></candles>
Вроде все просто.
Что? Какая еще структура candles? Где ее искать? Функция SendCommand возвращает только true или false.
Ладно идем в Яндекс, запрос C# структуры. На сайте
https://docs.microsoft.com/ находим
public struct Coords
{
public Coords (double x, double y)
{
X = x;
Y = y;
}
public double X { get; }
public double Y { get; }
public override string ToString() => $"({X}, {Y})";
}
Это ничего мне не дало.
Дальше опять в Яндекс, запрос пример TRANSAQ connector, вот теперь находится Ваш форум и один единственный пример
http://www.transaq.ru/forum/index.php?topic=804.0 вообще без комментариев к коду и на C++.
Есть еще один пример
https://farique.livejournal.com/91066.html , цитата " Вот, допустим, в нашей программе мы получили данные string data. Это данные от сервера в формате строки в виде xml " – отлично, Где эти данные? Как их получить? Если данные есть, то уже не составит труда с ними разобраться.
Код из примера с сайта Финам
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;
}
В этом примере функция используется для отправки команд в connect изходя из кода не понятно а данные то где?
В этом же примере есть функция
public static string Transaq_HandleData(string data)
Вот в нее поступают данные в переменной data находятся запрашиваемые свечки
В этой функции есть строка log.WriteLog("ServerData: " + data); и в логе данные отображаются.
Функция Transaq_HandleData в свою очередь вызывается из функции
static bool myCallBack(IntPtr pData)
{
string res;
String data = MarshalUTF8.PtrToStringUTF8(pData);
FreeMemory(pData);
res = Transaq_HandleData(data);
if (res == "server_status") New_Status();
return true;
}
А функция myCallBack неизвестно откуда вызывается. Так я и не нашел откуда берется data.
Вобщем тупик конкретный.
Учитывая, что на просторах Интернета можно найти лишь несколько примеров и то очень кратеньких складывается ощущение, что "вообще никто" не знает, как он там работает TRANSAQ connector.
Уважаемые разработчики, пожалуйста, напишите для таких недопрограммистов как я, примеры или инструкции как работать с TRANSAQ connector.
1. Как правильно подключить библиотеку.
2. Как правильно отправлять запросы.
3. Как правильно получать ответ, данные и самое главное, где их получать.
4. Несколько примеров от и до, как запросить и получить данные с графика, стакана, таблицы.
5. Как работать с функциями колбека.
У QLua и TSLaba такие примеры есть, изучить их и использовать становится гораздо проще.
С уважением, Артем.