скачать Программный интерфейс подключения внешних систем к торгово-депозитарным комплексам ММВБ (Библиотека MTESRL.DLL, v. 3.8) Содержание Введение 2 Библиотека mtesrl.dll 2 Сценарий работы с библиотекой 3 Регистрация на сервере 3 Получение описания информационных объектов 4 Работа с информационными объектами 5 Выполнение транзакций 5 Работа с таблицами 7 Открытие таблицы 7 Запрос изменений 8 Закрытие таблицы 9 Пример работы с таблицами 9 Замечания по работе с таблицами 10 Оптимизация использования памяти 11 Восстановление после сбоя на TEServer.exe 11 Пример восстановления после сбоя 12 Завершение сеанса связи 13 Сообщения об ошибках 13 Коды ошибок 13 Приложение 1. Формат буфера для функции MTEStructure 15 Приложение 2. Формат буфера для функции MTEOpenTable 17 Приложение 3. Формат буфера для функции MTERefresh 18 Приложение 4. Элементарные типы 19 Приложение 5. Форматирование полей типа FLOAT 19 ВведениеОписанный в данном документе проект находится в стадии разработки. Определение функций API, константы, структуры данных являются предварительными и могут измениться. Работа компонентов проекта может отличаться от изложенного в документации. Программный интерфейс позволяет подключать к торгово-депозитарным комплексам ММВБ внешние системы распространения торговой информации, сбора клиентских заявок, ведения позиций, риск-менеджмента и другие системы. ^ ![]() В данном документе подробно рассматривается создание клиентов программного интерфейса. Все необходимые для этого функции собраны в библиотеке MTESrl.dll. ^ Библиотека служит для создания клиентов универсального программного интерфейса, позволяющего подключать к торгово-депозитарным комплексам ММВБ внешние системы распространения торговой информации, сбора клиентских заявок, ведения позиций, риск-менеджмента и другие системы. Библиотека обеспечивает двунаправленную связь с торговой системой и содержит функции как для получения информации из торговой системы (сделки, котировки, инструменты и т.п.), так и для выполнения активных транзакций (постановка/снятие заявок и т.п.). В подкаталоге Demo каталога установки системы находятся интерфейсные модули к библиотеке и примеры на Delphi 7 и MS VC 6. ^ Типичный сценарий работы клиента с программным интерфейсом выглядит так:
Для начала работы с интерфейсом необходимо подключиться к серверу TEServer.exe. Для этого служит функция MTEConnect. Вызывать ее следует до обращения ко всем последующим функциям. function MTEConnect(Params, ErrorMsg: LPSTR): Integer; Аргументы: Params Параметры, используемые для установления соединения. Указатель на ASCIIZ-строку, содержащую список параметров, разделенных символами возврата каретки и перевода строки (0x0D, 0x0A) в следующем формате: Parameter1=Value1 Parameter2=Value2 ... ParameterN=ValueN Названия параметров и их допустимые значения зависят от способа соединения конкретной библиотеки с торговой системой. Библиотека MTESRL.DLL использует следующие параметры: Соединение через интернет: HOST - список IP-адресов и портов серверов доступа, разделенный запятыми, например: “194.186.240.85:20006,194.186.240.73:20006”; SERVER - идентификатор сервера доступа, например “EQ_TEST”; USERID - идентификатор пользователя в торговой системе ММВБ; PASSWORD - пароль пользователя в торговой системе ММВБ; INTERFACE - идентификатор интерфейса торговой системы ММВБ, с которым желает работать пользователь; BOARDS - список режимов, с которыми желает работать пользователь, например: “EQBR,EQNO,EQNL,PSEQ” (необязательный параметр, если не задан будут выбраны все доступные режимы); PROFILENAME - имя профиля системы криптографической защиты информации «Валидата» (необязательный параметр, если не задан шифрование и ЭЦП будет отключено); ^ RS-232: PORT - имя последовательного порта, например, COM1; BAUDRATE - скорость порта, например, 115200; Соединение по TCP/IP: ^ - IP-адрес хоста, на котором работает TEServer; SERVICE - сервис, на котором работает TEServer; Соединение по NetBEUI: HOST - имя хоста, на котором работает TEServer; PIPE - именованный канал, на котором работает TEServer; Также во всех случаях поддерживаются параметры: ^ - время ожидания выполнения запроса сервером (торговой системой) в мс, например 60000 (1 мин) (значение по умолчанию 30 сек); SYNCTIME - “0” не синхронизировать время на клиенте с временем сервера (если параметр опущен синхронизация включена), “1” – синхронизировать время; ^ - “0” отключить логирование операций (не создавать log-файл), “1” – включить логирование; RETRIES - количество попыток восстановить связь с TEServer в случае коммуникационных проблем. (по умолчанию 10); CONNECTTIME - максимальное время реконнекта, в мс. По умолчанию 1 минута; LOGFOLDER – каталог для создания лог-файлов работы библиотеки. По умолчанию лог-файлы создаются в одном каталоге с библиотекой. ErrorMsg Указатель на буфер размером не менее 256 байт, куда в случае возникновения ошибки будет помещена строка с описанием ошибки. ^ В случае успеха функция возвращает дескриптор установленного соединения. (значение большее или равное MTE_OK) Полученный дескриптор соединения используется в дальнейшем при вызове всех функций MTExxxx. При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. При этом в аргумент ErrorMsg помещается описание проблемы. Пример: Установка соединения с сервером через порт COM1 на скорости 115200 бод. Idx: Integer; ErrorMsg: TErrorMsg; ... Idx := MTEConnect('PORT=COM1'#13#10'BAUDRATE=115200', @ErrorMsg); if Idx < MTE_OK then begin Writeln('Ошибка при установке соединения: ' + ErrorMsg); Halt; end else Writeln('Соединение установлено.'); ^ Описание информационных объектов торговой системы содержит список таблиц, транзакций, их полей и некоторых вспомогательных объектов, доступных клиенту. Для получения описания используется функция MTEStructure. function MTEStructure(Idx: Integer; var Msg: PMTEMsg): Integer; Аргументы: Idx Дескриптор соединения, для которого нужно получить информацию. Msg Адрес переменной (имеющей тип "указатель на TMTEMsg"), куда будет помещен указатель на буфер, содержащий описание информационных объектов. Формат буфера описан в приложении 1. Структура TMTEMsg определена так: PMTEMsg = ^TMTEMsg; TMTEMsg = record DataLen: Integer; // Длина следующих далее данных Data: record end; // Данные переменной длины end; ^ В случае успеха функция возвращает MTE_OK и помещает в аргумент Msg указатель на буфер с описанием. При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код ошибки MTE_TSMR, поле Data структуры Msg содержит текст сообщения об ошибке длиной DataLen символов. Пример: Получение описания доступных информационных объектов для сеанса с номером Idx. Idx: Integer; // Инициализирована вызовом MTEConnect Err: Integer; Msg: PMTEMsg; S: string; ... Err := MTEStructure(Idx, Msg); if Err <> MTE_OK then if Err = MTE_TSMR then begin SetString(S, @Msg.Data, Msg.DataLen); Writeln('Ошибка: ' + S); end else Writeln('Ошибка: ' + MTEErrorMsg(Err)) else Writeln('Описание информационных объектов получено.); Структура информационных объектов, возвращаемых данной функцией, может быть получена в виде HTML-файла с помощью команды Файл|Сохранить структуру программы TEServer.exe. ^ Работа с информационными объектами включает работу с таблицами и выполнение транзакций. Выполнение транзакцийАктивные операции, такие как постановка или снятие заявки, называемые также транзакциями, выполняются с помощью функции MTEExecTrans. function MTEExecTrans(Idx: Integer; TransName, Params, ResultMsg: LPSTR): Integer; Аргументы: Idx Дескриптор соединения, на котором выполняется транзакция. TransName Указатель на ASCIIZ-строку c именем транзакции. Допустимые имена могут быть получены вызовом функции MTEStructure. Params Указатель на ASCIIZ-строку, содержащую параметры транзакции. Длина строки и ее содержимое должны соответствовать описанию входных полей транзакции, полученном с помощью MTEStructure. Все поля должны быть представлены в текстовом виде в формате торговой системы следующим образом:
ResultMsg Указатель на буфер размером не менее 256 байт, куда в случае успешного выполнения будет помещена строка текста с результатом обработки транзакции торговой системой. ^ Если транзакция была обработана торговой системой, возвращается следующее: MTE_OK - транзакция выполнена; MTE_TRANSREJECTED - транзакция обработана, но была отвергнута торговым сервером (недопустимые параметры, нет прав на выполнение и т.п.); MTE_TSMR - фатальный сбой при выполнении транзакции (потеря соединения с торговой системой и т.п.). При этом в аргумент ResultMsg помещается строка текста с результатом обработки транзакции торговой системой. При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Значение поля ResultMsg при этом не определено. Пример: Допустим в описании информационных объектов, полученном с помощью MTEStructure, определена транзакция "Поставить заявку" со следующими полями: ORDER // Имя транзакции BuySell: Char(1) // "B" - покупка, "S" - продажа SecCode: Char(17) // код инструмента Price: Float(9) // цена Quantity: Integer(10) // кол-во лотов Приведенный ниже фрагмент кода ставит заявку на покупку 14 лотов инструмента "0CURRUSD000000TOD" по цене 26,15 (для этого инструмента формат представления цен содержит 4 знака после десятичной точки): Idx: Integer; // Инициализирована вызовом MTEConnect Err: Integer; ResultMsg: TErrorMsg; ... Err := TEExecTrans(Idx, 'ORDER', 'B0CURRUSD000000TOD0002615000000000014', @ResultMsg); case Err of MTE_OK: Writeln('Транзакция выполнена: ' + ResultMsg); MTE_TSMR, MTE_TRANSREJECTED: Writeln('Транзакция НЕ выполнена: ' + ResultMsg); else Writeln('Ошибка: ' + MTEErrorMsg(Err)); end; ^ Работа с таблицами включает в себя следующие шаги:
Работа с таблицей торговой системы начинается с вызова функции MTEOpenTable. Функция открывает таблицу и возвращает часть или все текущее содержимое таблицы. function MTEOpenTable(Idx: Integer; TableName, Params: LPSTR; Complete: BOOL; var Msg: PMTEMsg): Integer; Аргументы: Idx Дескриптор соединения, полученный с помощью вызова MTEConnect. TableName Указатель на ASCIIZ-строку c именем таблицы. Допустимые имена могут быть получены вызовом функции MTEStructure. Params Указатель на ASCIIZ-строку, содержащую параметры таблицы. Длина строки и ее содержимое должны соответствовать описанию входных полей таблицы, полученном с помощью MTEStructure. Все поля должны быть представлены в текстовом виде в формате торговой системы (см. MTEExecTrans). Complete Флаг, позволяющий запросить все содержимое таблицы или только часть. Используется следующим образом:
Msg Адрес переменной (имеющей тип "указатель на TMTEMsg"), куда в случае успеха будет помещен указатель на буфер, содержащий информацию из открытой таблицы. Формат буфера описан в приложении 2. ^ В случае успеха функция возвращает дескриптор открытой таблицы (значение большее или равное MTE_OK) Полученный дескриптор используется в дальнейшем при вызове функции MTEAddTable. При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код ошибки MTE_TSMR, поле Data структуры Msg содержит текст сообщения об ошибке длиной DataLen символов. ^ Запрос изменений выполняется в пакетном режиме, т.е. одновременно запрашиваются изменения по нескольким открытым таблицам. Для этого запрос сначала формируется путем нескольких вызовов MTEAddTable, а затем выполняется с помощью MTERefresh. Вызов других функций библиотеки (кроме MTEErrorMsg) между двумя этими функциями запрещен. Функция MTEAddTable добавляет в очередь (пакет запросов) запрос на получение изменений в таблице, с момента предыдущего запроса изменений. function MTEAddTable(Idx, HTable, Ref: Integer): Integer; Аргументы: Idx Дескриптор соединения, полученный с помощью вызова MTEConnect. HTable Дескриптор таблицы, полученный с помощью вызова MTEOpenTable. Ref Дополнительный параметр, используемый клиентом по своему усмотрению. Применяется обычно для идентификации информации, предназначенной данной таблице, в буфере, возвращаемом функцией MTERefresh. ^ Один из кодов ошибки MTE_xxxx. Функция MTERefresh отправляет на сервер пакет запросов на получение изменений, сформированный вызовами MTEAddTable, и возвращает эти изменения. function MTERefresh(Idx: Integer; var Msg: PMTEMsg): Integer; Аргументы: ^ Дескриптор соединения, полученный с помощью вызова MTEConnect. Msg Адрес переменной (имеющей тип "указатель на TMTEMsg"), куда в случае успеха будет помещен указатель на буфер, содержащий полученные обновления. Формат буфера описан в приложении 3. ^ В случае успеха функция возвращает MTE_OK и помещает в аргумент Msg указатель на полученные данные При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код ошибки MTE_TSMR, поле Data структуры Msg содержит текст сообщения об ошибке длиной DataLen символов. ^ По окончании работы с таблицей ее необходимо закрыть используя функцию MTECloseTable. После вызова этой функции дескриптор таблицы не может более использоваться. function MTECloseTable(Idx, HTable: Integer): Integer; Аргументы: Idx Дескриптор соединения, полученный с помощью вызова MTEConnect. HTable Дескриптор закрываемой таблицы, полученный с помощью вызова MTEOpenTable. Возвращаемое значение: Один из кодов ошибки MTE_xxxx. ^ Допустим в описании информационных объектов, полученном с помощью MTEStructure, определены таблицы "Ценные бумаги" и "Сделки" со следующими входными полями: SECURITIES // Имя таблицы (Ценные бумаги) Market: Char(4) // Код рынка Board: Char(4) // Код режима торгов TRADES // Таблицы "Сделки" без параметров В следующем фрагменте кода показано как следует работать с таблицами торговой системы. Таблицы открываются, периодически запрашивается изменение их содержимого, и затем таблицы закрываются. Idx: Integer; // Инициализирована вызовом MTEConnect Msg: PMTEMsg; HSecurs, HTrades: Integer; ... HSecurs := MTEOpenTable(Idx, 'SECURITIES', 'CURR ', True, Msg); ... // Обработка полученных данных ... HTrades := MTEOpenTable(Idx, 'TRADES', '', False, Msg); ... // Обработка полученных данных ... repeat MTEAddTable(Idx, HSecurs, 0); MTEAddTable(Idx, HTrades, 1); MTERefresh(Idx, Msg); ... // Обработка обновлений ... until Terminated; MTECloseTable(Idx, HSecurs); MTECloseTable(Idx, HTrades); ^ Замечание 1. Большинство таблиц торговой системы могут быть открыты и закрыты в произвольный момент времени внутри сеанса связи с сервером, произвольное количество раз, можно открыть произвольное число экземпляров одной и той же таблицы. Однако из-за ограничений, накладываемых реализацией торговой системы, некоторые таблицы могут быть открыты только один раз в течение сеанса. К таким таблицам относится, например, таблица ORDERS ("Заявки"). Если такую таблицу закрыть, а затем открыть вновь, то содержимое таблицы, полученное в первый раз, вновь получено не будет, а будут приходить только изменения. В связи с вышесказанным, такие таблицы рекомендуется открывать только один раз в течение сеанса связи и закрывать их только при завершении сеанса. Замечание 2. Для таблиц с установленным флагом "tfClearOnUpdate - Очищать при обновлении" (кроме таблицы ORDERBOOK) определен следующий порядок обработки обновлений: когда таблица должна быть полностью очищена КолвоСтрок устанавливается равным 1, то есть, возвращается одна строка со значением ДлинаДанных = 0 (см. приложение 2). Для таблицы ORDERBOOK существуют два режима запроса информации по котировкам:
Соответственно, для первого способа в случае, когда таблица котировок должна быть очищена в ответ на запрос, приходит таблица с одной строкой, содержащей следующие значения: КолвоПолей =2 и ДлинаДанных = (длина поля "Режим" + длина поля "Инструмент") В этой строке содержатся только поля "Режим" и "Инструмент". Для второго случая в ответе на запрос могут содержаться несколько таких строк (в которых присутствуют только значения полей "Режим" и "Инструмент"), что для данных инструментов означает очистку значений котировок. Обратите внимание на еще два момента: при первом запросе таблицы для всех доступных инструментов, т.е. при открытии, могут прийти строки изначально с нулевыми котировками. Это связано с логикой выдачи информации Торговой Системой: по данным бумагам происходили какие-либо изменения в статусе и ТС выдает данные изменения в котировочных полях, которые не отображаются в клиентских системах. Поэтому и происходит выдача всех измененных котировок, даже если они пустые. При последующих запросах выдается информация по только измененным котировкам. Второй момент: TEClient.exe отображает в окне котировок для всех инструментам только данные последнего запроса на изменения, т.е. только те котировки, в которых произошли изменения. ^ Все функции библиотеки MTESrl.dll, возвращающие указатель на буфер с информацией (указатель на структуру PMTEMsg, например, MTEStructure, MTERefresh и другие) используют в качестве приемного буфера одну и ту же область памяти (в рамках одного соединения, для разных соединений используются разные области памяти). Назовем такие функции информационными. Если при очередном вызове информационной функции размер получаемых данных превышает размер выделенного для приема буфера, происходит выделение (Reallocation) большего блока памяти. Таким образом максимальный размер выделенной памяти равен размеру максимального полученного блока информации. Вся выделенная память освобождается при завершении соединения с помощью функции MTEDisconnect. Существует возможность освободить память, используемую в качестве приемного буфера, в произвольный момент времени, не завершая соединения. Для этого предназначена функция MTEFreeBuffer. Эту функцию следует вызывать только после обработки всех принятых данных. Следует помнить, что это приведет к необходимости выделения памяти при следующем вызове одной из информационных функций. Частый вызов функции MTEFreeBuffer может отрицательно повлиять на производительность. function MTEFreeBuffer(Idx: Integer): Integer; Аргументы: Idx Дескриптор соединения, полученный с помощью вызова MTEConnect, которое надо закрыть. Возвращаемое значение: Один из кодов ошибки MTE_xxxx. ^ Библиотека MTESRL.DLL позволяет начать получение данных от TEServer не с “нуля” а с некоторого момента. Для этого предварительно должен быть сохранен “снимок” состояния открытых таблиц. Впоследствии, например, в случае потери соединения с TEServer, можно восстановить состояние открытых таблиц и продолжить получение информации. Ниже приведен подробный сценарий работы в таких случаях. Для получения текущего состояния открытых на сервере таблиц используется следующая функция: function MTEGetSnapshot(Idx: Integer; var Snapshot: PChar; var Len: Integer): Integer; Аргументы: Idx Дескриптор соединения, для которого необходимо получить «снимок» открытых таблиц. Snapshot Адрес переменной, куда в случае успеха будет помещен указатель на «снимок». ^ Адрес переменной, куда в случае успеха будет помещена длина «снимка» (буфера, указатель на который находится в Snapshot). Возвращаемое значение: В случае успеха функция возвращает MTE_OK. При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код ошибки MTE_TSMR, аргумент Snapshot указывает на текст сообщения об ошибке, а аргумент Len содержит длину этого сообщения. «Снимок» открытых на сервере таблиц может рассматриваться просто как буфер некоторых двоичных данных. Его содержимое не несет для клиента никакой смысловой нагрузки. Состояние открытых на сервере таблиц может быть в любой момент времени восстановлено по сделанному ранее “снимку”. function MTESetSnapshot(Idx: Integer; Snapshot: PChar; Len: Integer; ErrorMsg: LPSTR): Integer; Аргументы: Idx Дескриптор соединения, для которого восстанавливается состояние. Snapshot Указатель на буфер, содержащий предварительно снятый «снимок». ^ Длина буфера, на который указывает Snapshot. ErrorMsg Указатель на буфер размером не менее 256 байт, куда будет помещена строка текста с результатом восстановления состояния. ^ Если функция была обработана торговой системой, возвращается следующее: MTE_OK – восстановление выполнено; MTE_TSMR - торговая система не смогла восстановить состояние. При этом в аргумент ErrorMsg помещается строка текста с результатом, возвращенным торговой системой. При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Значение поля ErrorMsg при этом не определено. ^ Предположим, что мы:
Допустим, в какой-то момент соединение с TEServer было нарушено. Процедура восстановления будет выглядеть так:
^ По окончании работы с рынком клиент должен вызвать функцию MTEDisconnect. function MTEDisconnect(Idx: Integer): Integer; Аргументы: Idx Дескриптор соединения, полученный с помощью вызова MTEConnect, которое надо закрыть. ^ Один из кодов ошибки MTE_xxxx. Пример: Закрываем соединение, имеющее дескриптор Idx. Idx: Integer; // Инициализирована вызовом MTEConnect Err: Integer; ... Err := MTEDisconnect(Idx); if Err <> MTE_OK then Writeln(MTEErrorMsg(Err) else Writeln('Сеанс работы c рынком завершен'); ^ Все функции библиотеки возвращают коды ошибок MTE_xxxx. Для получения текстового описания по коду ошибки может использоваться функция MTEErrorMsg. function MTEErrorMsg(ErrCode: Integer): LPSTR; Аргументы: ErrorCode Один из кодов MTE_xxxx. Возвращаемое значение: Указатель на ASCIIZ-строку, содержащую текстовое описание ошибки. ^ MTE_OK = 0 Нет ошибок. MTE_CONFIG = -1 Ошибка при открытии или настройке последовательного порта. Неправильно задано имя порта, его скорость, либо порт занят другим приложением. ^ Сервер не доступен. Не запущен TEServer, недоступна торговая система, либо нарушена связь по последовательному соединению. MTE_LOGERROR = -3 При вызове MTEConnect не удалось создать log-файл. ^ Задан недопустимый дескриптор соединения. Не было вызова MTEConnect, либо уже был вызвана функция MTEDisconnect. MTE_NOTCONNECTED = -5 Соединение с указанным дескриптором было разорвано вследствие возникновения ошибки (не в результате вызова MTEDisconnect). Ошибка в TEServer, торговая система завершила работу, либо нарушена связь по последовательному соединению. ^ Ошибка записи в последовательный порт. Ошибка в TEServer, либо нарушена связь по последовательному соединению. MTE_READ = -7 Ошибка чтения из последовательного порта. Ошибка в TEServer, либо нарушена связь по последовательному соединению. ^ Ошибка на уровне протокола взаимодействия с торговой системой ММВБ, либо торговая система недоступна. MTE_NOMEMORY = -9 Недостаточно памяти для выполнения операции. ^ Ошибка при сжатии/разжатии данных, передаваемых по последовательному соединению. MTE_PKTINPROGRESS = -11 Была вызвана функция MTEAddTable без последующего вызова MTERefresh. Во время сборки пакета запросов на обновление вызов других функций библиотеки невозможен. ^ Была вызвана функция MTERefresh без предварительного вызова MTEAddTable. Сначала необходимо сформировать пакет запросов на обновление. MTE_LOGON = -13 При соединении с сервером были указаны неверные регистрационные параметры: USERID, PASSWORD и т.п. ^ Неверный дескриптор таблицы. Дескриптор не был получен вызовом MTEOpenTable, либо таблица уже закрыта с помощью MTECloseTable. MTE_DSROFF = -15 Связь по последовательному порту нарушена (отсутствует сигнал DSR). Возможно нарушена целостность последовательного кабеля, либо последовательный порт закрыт на одной из сторон соединения. ^ Во время выполнения функции произошла непредвиденная ошибка. MTE_BADPTR = -17 Одной из функций MTExxxx() в качесте аргумента передан недопустимый указатель. ^ Торговая система ММВБ обработала запрос и вернула код ошибки. Транзакция не выполнена. MTE_TOOSLOWCONNECT = -19 Слишком медленный канал связи не дает корректно завершить процедуру коннекта/реконнекта MTE_CRYPTO_ERROR = -20 Ошибка при шифровании/расшифровании, создания/проверки ЭЦП ^ Поле Data структуры TMTEMsg, указатель на которую возвращает функция MTEStructure, имеет следующий формат (описание элементарных типов String, Integer и т.п. см. прил. 4): поле тип TInterface: ИмяИнтерфейса String ОписаниеИнтерфейса String ПеречислимыеТипы TEnumTypes Таблицы TTables Транзакции TTransactions Описание информационных объектов состоит из трех блоков: описание перечислимых типов, таблиц и транзакций. TEnumTypes: КолвоТипов Integer Тип1 TEnumType Тип2 TEnumType ... ТипN TEnumType TEnumType: Имя String Описание String Размер Integer Тип TEnumKind КолвоКонстант Integer Константа1 String Константа2 String ... КонстантаN String TEnumKind: Integer ekCheck = 0 ekGroup = 1 ekCombo = 2 Перечислимые типы используются для описания допустимых значений полей таблиц и транзакций. Описание типа может выглядеть например так: 'TCurrency' // Имя 'Валюта' // Описание 4 // Размер ekCombo // Предпочтительный вид представления - "Тип" 3 // Кол-во констант 'RUR =Рубли' // Константа 1 'USD =Доллары' // Константа 2 'DEM =Марки' // Константа 3 Поле "Размер" (=4) указывает размер допустимых значений для полей, имеющих данный тип. Поле "Тип" (=ekCombo) задает предпочтительный способ представления поля, используемый при создании формы ввода параметров. Например, поле с типом ekCombo может быть представлено в виде списка значений. Возможные варианты показаны на следующем рисунке: ![]() Константы состоят из двух частей - допустимого значения (всегда длиной "Размер") и описания этого значения, разделенных символом равенства (=). TTables: КолвоТаблиц Integer Таблица1 TTable Таблица2 TTable ... ТаблицаN TTable TTable: Имя String Описание String Атрибуты TTableFlags ВходныеПоля TFields ВыходныеПоля TFields TTableFlags: Integer tfUpdateable = 1 tfClearOnUpdate = 2 Список входных полей таблицы используется при формировании строки параметров для функции MTEOpenTable. Список выходных параметров позволяет разбирать буфера, возвращаемые функциями MTEOpenTable и MTERefresh. Атрибуты таблицы могут комбинироваться и имеют следующие значения: tfUpdateable - таблица является обновляемой. Для нее можно вызывать функции MTEAddTable/MTERefresh; tfClearOnUpdate - старое содержимое таблицы должно удаляться при получении каждого обновления с помощью функций MTEAddTable/MTERefresh. TFields: КолвоПолей Integer Поле1 TField Поле2 TField ... ПолеN TField TField: Имя String Описание String Размер Integer Тип TFieldType Атрибуты TFieldFlags ПеречислимыйТип String ЗначениеПоУмолчанию String TFieldType: Integer ftChar = 0 ftInteger = 1 ftFixed = 2 ftFloat = 3 ftDate = 4 ftTime = 5 TFieldFlags: Integer ffKey = 1 ffSecCode = 2 Атрибуты поля могут комбинироваться и имеют следующие значения: ffKey - поле является ключевым. Строки таблицы с совпадающими значениями ключевых полей должны объединяться в одну строкую; ffSecCode - поле содержит код финансового инструмента. Примечание. В списке выходных полей таблицы отсутсвует поле "ЗначениеПоУмолчанию". "Размер" задает длину поля в символах. "ПеречислимыйТип" может содержать имя перечислимого типа, к которому относится поле, или пустую строку. "Значение по умолчанию" может использоваться при создании формы ввода параметров. Все поля представлены в текстовом виде в формате торговой системы (см. MTEExecTrans). TTransactions: КолвоТранзакций Integer Транзакция1 TTransaction Транзакция2 TTransaction ... ТранзакцияN TTransaction TTransaction: Имя String Описание String ВходныеПоля TFields Список входных полей транзакции используется при формировании строки параметров для функции MTEExecTrans. ^ Поле Data структуры TMTEMsg, указатель на которую возвращает функция MTEOpenTable, содержит строки запрошенной таблицы и имеет следующий формат (описание элементарных типов String, Integer и т.п. см. прил. 4): поле тип TMTETable: Ref Integer КолвоСтрок Integer Строка1 TMTERow Строка2 TMTERow ... СтрокаN TMTERow Поле "Ref" используется при запросе изменений сразу по нескольким таблицам с помощью функций MTEAddTable/MTERefresh. Оно содержит значение, переданное в качестве третьего параметра функции MTEAddTable(Idx, HTable, Ref). По значению этого поля можно легко определить, какой таблице (дескриптор HTable) соответствует полученная структура TMTETable. В буфере, возвращаемом MTEOpenTable, значение поля "Ref" не определено. TMTERow: КолвоПолей Byte ДлинаДанных Integer НомераПолей Byte[КолвоПолей] ДанныеПолей Byte[ДлинаДанных] Строки таблицы имеют переменную длину и могут содержать разное число полей. Поле "КолвоПолей" содержит число полей таблицы, присутствующих в данной строке. Если значение это поля равно 0, в строке присутствуют все поля таблицы (см MTEStructure). Поле "ДлинаДанных" содержит суммарный размер полей таблицы в данной строке. Поле "НомераПолей" имеет переменную длину. Его размер равен значению поля "КолвоПолей". Поле содержит номера полей (по одному байту на номер), присутствующих в данной строке. Номер поля соответствует порядковому номеру выходного поля в описании информационных объектов (см MTEStructure). Если "КолвоПолей" равно 0, значит "НомераПолей" отсутствует, а в качестве номеров полей следует брать последовательность номеров 0, 1, 2, 3 … N. Поле "ДанныеПолей" (размером "ДлинаДанных" байт) содержит набор значения полей таблицы. Колво полей определяются значением "КолвоПолей", а их суммарная длина - "ДлинаДанных". Длина и тип каждого конкретного поля определяются в описании информационных объектов (см MTEStructure). Все поля представлены в текстовом виде в формате торговой системы (см. MTEExecTrans). Пример: Допустим в описании инфоромационных объектов, полученном с помощью MTEStructure, определена таблица "Сделки" со следующими выходными полями: TRADES // "Сделки" TradeNum: Integer(12) // Номер сделки TradeTime: Char(6) // Время сделки BuySell: Char(1) // "B" - покупка, "S" - продажа SecCode: Char(17) // код инструмента Price: Float(9) // цена Qty: Integer(10) // кол-во лотов Вызвана функция: MTEOpenTable(Idx, 'TRADES', '', True, Msg); В результате в поле Msg.Data содержится следующая информация { 0x00000000, // Поле "Ref" 0x00000002, // Получено 2 строки 0x04, // В первой строке 4 поля 0x00000030, // Длина данных 48 байт #0#3#4#5, // Номера полей 0, 3, 4, 5: // это поля "TradeNum", "SecCode", "Price", "Qty" из описания '0000001205670CURRUSD000000TOD0002579000000000037' // Значения полей: 120567, "0CURRUSD000000TOD", 25.79, 37 0x02, // Во второй строке 2 поля 0x17, // Длина данных 23 байта #1#3, // Номера полей 1, 3: // это поля "TradeTime" и "SecCode" из описания '1029530CURRUSD000000TOM' // Значения полей: "10:29:53" и "0CURRUSD000000TOM" } ^ Поле Data структуры TMTEMsg, указатель на которую возвращает функция MTEOpenRefresh, содержит несколько таблиц торговой системы и имеет следующий формат (описание элементарных типов String, Integer и т.п. см. прил. 4): поле тип TMTETables: КолвоТаблиц Integer Таблица1 TMTETable Таблица2 TMTETable ... ТаблицаN TMTETable Таким образом, буфер содержит несколько таблиц. Формат буфера таблицы описан в приложении 2. ^ Для представления элементарных типов в библиотеке MTESRL.DLL используются следующие структуры: Byte Один байт. Integer Четыре байта в формате процессоров x86 (сначала наименее значащий байт). ^ Структура следующего вида: ДлинаСтроки: Integer ТекстСтроки: Byte[ДлинаСтроки] Byte[N] Массив байт длиной N. Приложение 5. Форматирование полей типа FLOATЗначения полей типа Float (вещественные числа) передаются в текстовом представлении без десятичной точки. Количество знаков после десятичной точки в полях типа Float для конкретной ценной бумаги определяется значением поля "DECNUM" таблицы "SECURITIES". В полях типа Float обязательно должны присутствовать DECNUM знаков после запятой. Например, число 465,39 для ценной бумаги с DECNUM = 4 должно быть представлено как "4653900". Значение "46539" в этом случае будет воспринято торговой системой как 4,6539.
|