версия trans2quik.dll 1.2 поддерживается некорректно

Страницы: 1
RSS
версия trans2quik.dll 1.2 поддерживается некорректно
 
В связи с выходом библиотеки 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
 
Параметры транзакции:
    strTransactionString:= 'CLASSCODE=' + CodeOfClass + '; SECCODE=' + NearContract + '; ACTION=NEW_ORDER; ACCOUNT=' + ExchangeAccount + '; TYPE=L; OPERATION=' + strOPERATION + '; QUANTITY=' + strQUANTITY + '; PRICE=' + strPRICE + '; TRANS_ID=' + IntToStr(Trans_ID) + '; BASE_CONTRACT=' + BaseContract + ';';

где: 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 а не дабл как раньше.
 
procedure QUIK_ORDER_STATUS_CALLBACK(nMode, dwTransID: integer; dNumber: double; lpstrClassCode, lpstrSecCode: PChar; dPrice: double; nBalance: integer; dValue: double; nIsSell, nStatus, nOrderDescriptor: integer);stdcall;

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 выводит информацию пользователю.
 
Евгений,
Судя по коду это Delphi.
Попробуйте установить что-нибудь более подходящее по типам данных, нежели integer.
Например тот же Longint
 
Попробовал. Это не имеет значения. Integer - 32-x битное целое число. Его можно объявить как long, longInt и хоть как угодно - от этого ничего не изменится.
 
Евгений,
Вам как бы уже два человека сказали, что тип данных имеет значение, а значит имеет смысл прислушаться.
Попробуйте еще выбрать тип double.
 
Это Ваше:
Функция 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, что ожидаемо.
Хотелось бы узнать, воспроизводится ли у Вас моя проблема?
 
Цитата
Евгений написал:
Какой параметр Вы мне советуете объявить типом double (занимает 8 байт)?

речь про qty и про nBalance

Цитата
Евгений написал:
Хотелось бы узнать, воспроизводится ли у Вас моя проблема?

На это уже был ответ, еще раз:
Цитата
Sergey Gorokhov написал:
И данная проблема у нас не воспроизводится.
Что на версии 1.2, что на версии 1.3, данные приходят корректные.
 
Нельзя объявлять nBalance типом double. Сразу возникает ошибка Access violation. Я уже писал об этом.
 
Проблема решена. И 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. Не подскажите где взять посвежее? Заранее благодарен.
 
Здравствуйте,
Цитата
Анатолий Паврозин написал:
Добрый день! Попалась  адаптация к Delphi от Ginger (2008 года)- trans2quik_api.pas. Не подскажите где взять посвежее? Заранее благодарен.
"Посвежее" файла trans2quik_api.pas у нас нет.
 
Жаль.Ладно, возьму из trans2quik_api.h, а перечня с пояснением функций тоже нет. В readme_trans2quik_1_2 совсем малость описано.
Страницы: 1
Читают тему
Наверх