В связи с выходом библиотеки trans2quik.dll версии 1.3 объявлена поддержка старой версии 1.2. Однако это не так. Выявлено следующее: в QUIK_ORDER_STATUS_CALLBACK функция QUIK_ORDER_QTY работает неправильно, параметр nBalance передается некорректно. Пример: ставим заявку с TransID=17. В QUIK_ORDER_STATUS_CALLBACK получаем три события с nStatus=1: 1) dwTransID=0, при этом QUIK_ORDER_QTY работает корректно и nBalance правильный, только вот dwTransID некорректен; 2) dwTransID=17, при этом QUIK_ORDER_QTY выдает 48562515, nBalance тоже неправильный. 3) то же самое что и 2)
Евгений написал: В связи с выходом библиотеки trans2quik.dll версии 1.3 объявлена поддержка старой версии 1.2. Однако это не так.
Совершенно не понятно как Вы пришли к такому выводу. Если у Вас возникла какая-то проблема, это совершенно не значит что мы отказываемся от поддержки ПО.
То что в ORDER_STATUS_CALLBACK приходит несколько обновлений это нормально. То что в QUIK_ORDER_QTY и в nBalance приходят непонятные значения, естественно не нормально. И данная проблема у нас не воспроизводится. Что на версии 1.2, что на версии 1.3, данные приходят корректные. В свзяи с ем, причины такого поведения пока не понятны. Сообщите версию терминала QUIK, и точные параметры транзакции, которую Вы отправляли. Также, проверьте поведение на нашем примере API_Tester_DLG.exe
где: CodeOfClass = 'SPBFUT'; SECCODE = 'SiM7'; OPERATION = 'B'; QUANTITY = '1'; PRICE = '55571'; TransID = 17; BaseContract = 'Si'; Далее посылаем асинхронную транзакцию. В общем, параметры не так важны, так ка транзакция встает. Версия Quik 7.9.1.1 На версии 7.2.2.3 поведение такое же. На более ранних версиях 6.17.3.6 и ранее такого поведения не было, то есть всё было корректно.
Добавлю: Процессор 32 бит. То есть trans2quik.dll версии 1.3 в принципе не встанет. Кстати вопрос: зачем было писать 32-х разрядную библиотеку trans2quik.dll (а она именно 32-х разрядная) для 32-х разрядного Quik, только для 64-х разрядного процессора? В PE заголовке библиотеки указано: IMAGE_FILE_MACHINE_AMD64
Евгений, Приведите часть кода, отвечающую за вывод информации из ORDER_STATUS_CALLBACK
Цитата
Евгений написал: Добавлю: Процессор 32 бит. То есть trans2quik.dll версии 1.3 в принципе не встанет. Кстати вопрос: зачем было писать 32-х разрядную библиотеку trans2quik.dll (а она именно 32-х разрядная) для 32-х разрядного Quik, только для 64-х разрядного процессора? В PE заголовке библиотеки указано: IMAGE_FILE_MACHINE_AMD64
Для того чтобы х64 битные приложения могли работать с trans2quik.dll Например х64 битный Excel.
Евгений написал: Добавлю: Процессор 32 бит. То есть trans2quik.dll версии 1.3 в принципе не встанет. Кстати вопрос: зачем было писать 32-х разрядную библиотеку trans2quik.dll (а она именно 32-х разрядная) для 32-х разрядного Quik, только для 64-х разрядного процессора? В PE заголовке библиотеки указано: IMAGE_FILE_MACHINE_AMD64
Потому что разрядность библиотеки trans2quik.dll - она важная для твоего приложения, чтобы была возможность писать 64хбитный софт работающий с trans2quik.dll. Разрядность квика тут совершенно не при чем.
А по поводу странных цифр - посмотри внимательно, в версии 1.3 nBalance это инт64 а не дабл как раньше.
var Msg1: TMessage; qty: integer; begin if nMode = 0 then begin qty:= QUIK_ORDER_QTY(nOrderDescriptor); Msg1.WParamLo:= nBalance; Msg1.WParamHi:= qty; Msg1.LParamLo:= nStatus; Msg1.LParamHi:= dwTransID; SendMessage(MainHandle, My_Mes, Msg1.WParam, Msg1.LParam); end; end; Подразумевается, что qty, nBalance, dwTransID не больше чем максимальное значение word. PChar = PAnsiChar. Обработчик сообщения My_Mes выводит информацию пользователю.
Попробовал. Это не имеет значения. Integer - 32-x битное целое число. Его можно объявить как long, longInt и хоть как угодно - от этого ничего не изменится.
Это Ваше: Функция TRANS2QUIK_ORDER_STATUS_CALLBACK Функция обратного вызова для получения информации о параметрах заявки. void TRANS2QUIK_ORDER_STATUS_CALLBACK (long nMode, DWORD dwTransID, double dNumber, LPSTR lpstrClassCode, LPSTR lpstrSecCode, double dPrice, long nBalance, double dValue, long nIsSell, long nStatus, long nOrderDescriptor)
Параметр
Описание
nMode
Тип: Long. Признак того, идет ли начальное получение заявок или нет, возможные значения: «0» – новая заявка, «1» - идет начальное получение заявок, «2» – получена последняя заявка из начальной рассылки
dwTransID
Тип: Long. TransID транзакции, породившей заявку. Имеет значение «0», если заявка не была порождена транзакцией из файла, либо если TransID неизвестен
dNumber
Тип: Double. Номер заявки
lpstrClassCode
Тип: указатель на переменную типа Строка. Код класса
lpstrSecCode
Тип: указатель на переменную типа Строка. Код бумаги
dPrice
Тип: Double. Цена заявки
nBalance
Тип: Long. Неисполненный остаток заявки
dValue
Тип: Double. Объем заявки
nIsSell
Тип: Long. Направление заявки: «0» еcли «Покупка», иначе «Продажа»
nStatus
Тип: Long. Состояние исполнения заявки: Значение «1» соответствует состоянию «Активна», «2» - «Снята», иначе «Исполнена»
nOrderDescriptor Тип: Long. Дескриптор заявки, может использоваться для следующих специальных функций в теле функции обратного вызова: и т.д.
Какой параметр Вы мне советуете объявить типом double (занимает 8 байт)? Я, кстати, ранее уже пробовал объявлять nBalance типом int64 (занимает 8 байт), и nOrderDescriptor типом intptr_t. По сути это один тип данных - LongLong. Так вот возникла ошибка - Quik не передает в стек параметры такого размера для trans2quik версии 1.2, что ожидаемо. Хотелось бы узнать, воспроизводится ли у Вас моя проблема?
Проблема решена. И trans2quik, к чести разработчиков, здесь ни при чем. Проблема состояла в упаковке данных для сообщения. Дельфийские Msg1.WParamHi, Lo, LParamHi, Lo по ходу работают только на чтение. Приведу работающий код: asm mov EAX, nBalance mov word ptr Msg1.WParam, AX mov EAX, qty mov word ptr Msg1.WParam + 2, AX mov EAX, nStatus mov word ptr Msg1.LParam, AX mov EAX, dwTransID mov word ptr Msg1.LParam + 2, AX end; SendMessage(MainHandle, My_Mes, Msg1.WParam, Msg1.LParam);
Анатолий Паврозин написал: Добрый день! Попалась адаптация к Delphi от Ginger (2008 года)- trans2quik_api.pas. Не подскажите где взять посвежее? Заранее благодарен.