Сценарий работы с библиотекой 3 icon

Сценарий работы с библиотекой 3


Смотрите также:
План работы библиотеки моу «сош №1» (с углубленным изучением отдельных предметов) на 2009-2010...
Конкурс книгочеев командная игра для учащихся 5-х классов...
«Медицинская литература»...
«Медицинская литература»...
«Медицинская литература»...
«Медицинская литература»...
Доступ открыт только с компьютеров рнб...
«Медицинская литература»...
Библиографический указатель включает сведения о поступивших в эти библиотеки новых книгах...
Библиографический указатель включает сведения о поступивших в эти библиотеки новых книгах...
Должностная инструкция заведующей библиотекой (библиотекаря) образовательного учреждения Общие...
Система стандартов по информации, библиотечному и издательскому делу...





Программный интерфейс подключения внешних систем к торгово-депозитарным комплексам ММВБ

(Библиотека 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.
^

Библиотека mtesrl.dll


Библиотека служит для создания клиентов универсального программного интерфейса, позволяющего подключать к торгово-депозитарным комплексам ММВБ внешние системы распространения торговой информации, сбора клиентских заявок, ведения позиций, риск-менеджмента и другие системы. Библиотека обеспечивает двунаправленную связь с торговой системой и содержит функции как для получения информации из торговой системы (сделки, котировки, инструменты и т.п.), так и для выполнения активных транзакций (постановка/снятие заявок и т.п.).

В подкаталоге Demo каталога установки системы находятся интерфейсные модули к библиотеке и примеры на Delphi 7 и MS VC 6.
^

Сценарий работы с библиотекой


Типичный сценарий работы клиента с программным интерфейсом выглядит так:

  1. Регистрация на сервере

  2. Получение описания информационных объектов (типов, таблиц и транзакций)

  3. Работа с информационными объектами (таблицами и транзакциями)

  4. Завершение сеанса связи
^

Регистрация на сервере


Для начала работы с интерфейсом необходимо подключиться к серверу 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:

^ HOST - IP-адрес хоста, на котором работает TEServer;

SERVICE - сервис, на котором работает TEServer;


Соединение по NetBEUI:

HOST - имя хоста, на котором работает TEServer;

PIPE - именованный канал, на котором работает TEServer;


Также во всех случаях поддерживаются параметры:

^ TIMEOUT - время ожидания выполнения запроса сервером (торговой системой) в мс, например 60000 (1 мин) (значение по умолчанию 30 сек);

SYNCTIME - “0” не синхронизировать время на клиенте с временем сервера (если параметр опущен синхронизация включена), “1” – синхронизировать время;

^ LOGGING - “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. Все поля должны быть представлены в текстовом виде в формате торговой системы следующим образом:

Char

Дополняется справа пробелами до длины, указанной в описании поля. Например, для поля типа Char(12) строка "ROOT" должна быть представлена как "ROOT "

Integer

Дополняется слева нулями до нужной длины. Например, значение 127 с типом Integer(10) преобразуется в строку "0000000127"

Fixed

Оставляется два знака после десятичной точки, убирается десятичная точка, дополняется слева нулями до нужной длины. Например, значение 927,4 с типом Fixed(8) преобразуется в строку "00092740"

Float

Оставляется N знаков после десятичной точки, убирается десятичная точка, дополняется слева нулями до нужной длины. Значение N зависит от формата представления цен для финансового инструмента, к которому относится данное поле. Например, значение 26,75 с типом Float(9) для инструмента с N = 4 преобразуется в строку "000267500"

Date

Представляется в формате YYYYMMDD. Например значение 24 августа 1999г. преобразуется к "19990824"

Time

Представляется в формате HHMMSS. Например значение 16:27:39 преобразуется к "162739"


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;


^

Работа с таблицами


Работа с таблицами включает в себя следующие шаги:

  1. Открытие таблицы

  2. Периодический запрос изменений

  3. Закрытие таблицы
^

Открытие таблицы


Работа с таблицей торговой системы начинается с вызова функции 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

Флаг, позволяющий запросить все содержимое таблицы или только часть. Используется следующим образом:

TRUE

Функция возвращает всю информацию, содержащуюся в данный момент в таблице. Выполняет столько обращений к торговой системе, сколько нужно для получения всех данных. При большом объеме таблицы (например "Сделки") может выполняться долго. Если все содержимое сразу не требуется и чтобы уменьшить время выполнения, следует использовать значение FALSE.

FALSE

Функция возвращается только часть данных или вообще ничего, в зависимости от типа таблицы. Выполняет не более одного обращения к торговой системе. Остальные данные рассматриваются как обновления и должны дочитываться в цикле запроса изменений с помощью вызовов MTEAddTable/MTERefresh.

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;

Аргументы:

^ Idx

Дескриптор соединения, полученный с помощью вызова 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 существуют два режима запроса информации по котировкам:

  1. для получения информации по одному инструменту, в запросе задаются непустые значения для полей "Режим" и "Инструмент";

  2. для получения информации по котировкам всех доступных инструментов в одном запросе, поля "Режим" и "Инструмент" заполняются символами пробела.

Соответственно, для первого способа в случае, когда таблица котировок должна быть очищена в ответ на запрос, приходит таблица с одной строкой, содержащей следующие значения: КолвоПолей =2 и ДлинаДанных = (длина поля "Режим" + длина поля "Инструмент") В этой строке содержатся только поля "Режим" и "Инструмент". Для второго случая в ответе на запрос могут содержаться несколько таких строк (в которых присутствуют только значения полей "Режим" и "Инструмент"), что для данных инструментов означает очистку значений котировок.

Обратите внимание на еще два момента: при первом запросе таблицы для всех доступных инструментов, т.е. при открытии, могут прийти строки изначально с нулевыми котировками. Это связано с логикой выдачи информации Торговой Системой: по данным бумагам происходили какие-либо изменения в статусе и ТС выдает данные изменения в котировочных полях, которые не отображаются в клиентских системах. Поэтому и происходит выдача всех измененных котировок, даже если они пустые. При последующих запросах выдается информация по только измененным котировкам.

Второй момент: TEClient.exe отображает в окне котировок для всех инструментам только данные последнего запроса на изменения, т.е. только те котировки, в которых произошли изменения.


^

Оптимизация использования памяти


Все функции библиотеки MTESrl.dll, возвращающие указатель на буфер с информацией (указатель на структуру PMTEMsg, например, MTEStructure, MTERefresh и другие) используют в качестве приемного буфера одну и ту же область памяти (в рамках одного соединения, для разных соединений используются разные области памяти). Назовем такие функции информационными.

Если при очередном вызове информационной функции размер получаемых данных превышает размер выделенного для приема буфера, происходит выделение (Reallocation) большего блока памяти. Таким образом максимальный размер выделенной памяти равен размеру максимального полученного блока информации. Вся выделенная память освобождается при завершении соединения с помощью функции MTEDisconnect.

Существует возможность освободить память, используемую в качестве приемного буфера, в произвольный момент времени, не завершая соединения. Для этого предназначена функция MTEFreeBuffer. Эту функцию следует вызывать только после обработки всех принятых данных. Следует помнить, что это приведет к необходимости выделения памяти при следующем вызове одной из информационных функций. Частый вызов функции MTEFreeBuffer может отрицательно повлиять на производительность.


function MTEFreeBuffer(Idx: Integer): Integer;

Аргументы:

Idx

Дескриптор соединения, полученный с помощью вызова MTEConnect, которое надо закрыть.

Возвращаемое значение:

Один из кодов ошибки MTE_xxxx.


^

Восстановление после сбоя на TEServer.exe


Библиотека MTESRL.DLL позволяет начать получение данных от TEServer не с “нуля” а с некоторого момента. Для этого предварительно должен быть сохранен “снимок” состояния открытых таблиц. Впоследствии, например, в случае потери соединения с TEServer, можно восстановить состояние открытых таблиц и продолжить получение информации. Ниже приведен подробный сценарий работы в таких случаях.

Для получения текущего состояния открытых на сервере таблиц используется следующая функция:

function MTEGetSnapshot(Idx: Integer; var Snapshot: PChar;
var Len: Integer): Integer;

Аргументы:

Idx

Дескриптор соединения, для которого необходимо получить «снимок» открытых таблиц.

Snapshot

Адрес переменной, куда в случае успеха будет помещен указатель на «снимок».

^ Len

Адрес переменной, куда в случае успеха будет помещена длина «снимка» (буфера, указатель на который находится в Snapshot).

Возвращаемое значение:

В случае успеха функция возвращает MTE_OK.

При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Если возвращен код ошибки MTE_TSMR, аргумент Snapshot указывает на текст сообщения об ошибке, а аргумент Len содержит длину этого сообщения.

«Снимок» открытых на сервере таблиц может рассматриваться просто как буфер некоторых двоичных данных. Его содержимое не несет для клиента никакой смысловой нагрузки.


Состояние открытых на сервере таблиц может быть в любой момент времени восстановлено по сделанному ранее “снимку”.

function MTESetSnapshot(Idx: Integer; Snapshot: PChar; Len: Integer;
ErrorMsg: LPSTR): Integer;

Аргументы:

Idx

Дескриптор соединения, для которого восстанавливается состояние.

Snapshot

Указатель на буфер, содержащий предварительно снятый «снимок».

^ Len

Длина буфера, на который указывает Snapshot.

ErrorMsg

Указатель на буфер размером не менее 256 байт, куда будет помещена строка текста с результатом восстановления состояния.

^ Возвращаемое значение:

Если функция была обработана торговой системой, возвращается следующее:

MTE_OK – восстановление выполнено;

MTE_TSMR - торговая система не смогла восстановить состояние.

При этом в аргумент ErrorMsg помещается строка текста с результатом, возвращенным торговой системой.

При возникновении ошибки возвращается один из кодов ошибки MTE_xxxx. Значение поля ErrorMsg при этом не определено.


^

Пример восстановления после сбоя


Предположим, что мы:

  1. установили соединение с TEServer c помощью MTEConnect;

  2. открыли несколько таблиц с помощью MTEOpenTable и сохранили их дескрипторы в переменных hTable1, hTable2, ..., hTableN;

  3. выполняли транзакции и запрашивали обновления информационных таблиц, переодически сохраняя «снимок» состояния с помощью функции MTEGetSnapshot;

Допустим, в какой-то момент соединение с TEServer было нарушено. Процедура восстановления будет выглядеть так:

  1. Заново установливаем соединение с TEServer c помощью MTEConnect;

  2. Вызываем MTESetSnapshot с последним сохраненным «снимком»

  3. Теперь можем пользоваться старыми дескрипторами тыблиц hTable1, hTable2, ..., hTableN, открытыми в предыдущем сеансе. Вызывать MTEOpenTable не нужно.


^

Завершение сеанса связи


По окончании работы с рынком клиент должен вызвать функцию 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

Ошибка при открытии или настройке последовательного порта. Неправильно задано имя порта, его скорость, либо порт занят другим приложением.

^ MTE_SRVUNAVAIL = -2

Сервер не доступен. Не запущен TEServer, недоступна торговая система, либо нарушена связь по последовательному соединению.

MTE_LOGERROR = -3

При вызове MTEConnect не удалось создать log-файл.

^ MTE_INVALIDCONNECT = -4

Задан недопустимый дескриптор соединения. Не было вызова MTEConnect, либо уже был вызвана функция MTEDisconnect.

MTE_NOTCONNECTED = -5

Соединение с указанным дескриптором было разорвано вследствие возникновения ошибки (не в результате вызова MTEDisconnect). Ошибка в TEServer, торговая система завершила работу, либо нарушена связь по последовательному соединению.

^ MTE_WRITE = -6

Ошибка записи в последовательный порт. Ошибка в TEServer, либо нарушена связь по последовательному соединению.

MTE_READ = -7

Ошибка чтения из последовательного порта. Ошибка в TEServer, либо нарушена связь по последовательному соединению.

^ MTE_TSMR = -8

Ошибка на уровне протокола взаимодействия с торговой системой ММВБ, либо торговая система недоступна.

MTE_NOMEMORY = -9

Недостаточно памяти для выполнения операции.

^ MTE_ZLIB = -10

Ошибка при сжатии/разжатии данных, передаваемых по последовательному соединению.

MTE_PKTINPROGRESS = -11

Была вызвана функция MTEAddTable без последующего вызова MTERefresh. Во время сборки пакета запросов на обновление вызов других функций библиотеки невозможен.

^ MTE_PKTNOTSTARTED = -12

Была вызвана функция MTERefresh без предварительного вызова MTEAddTable. Сначала необходимо сформировать пакет запросов на обновление.

MTE_LOGON = -13

При соединении с сервером были указаны неверные регистрационные параметры: USERID, PASSWORD и т.п.

^ MTE_INVALIDHANDLE = -14

Неверный дескриптор таблицы. Дескриптор не был получен вызовом MTEOpenTable, либо таблица уже закрыта с помощью MTECloseTable.

MTE_DSROFF = -15

Связь по последовательному порту нарушена (отсутствует сигнал DSR). Возможно нарушена целостность последовательного кабеля, либо последовательный порт закрыт на одной из сторон соединения.

^ MTE_UNKNOWN = -16

Во время выполнения функции произошла непредвиденная ошибка.

MTE_BADPTR = -17

Одной из функций MTExxxx() в качесте аргумента передан недопустимый указатель.

^ MTE_TRANSREJECTED = -18

Торговая система ММВБ обработала запрос и вернула код ошибки. Транзакция не выполнена.

MTE_TOOSLOWCONNECT = -19

Слишком медленный канал связи не дает корректно завершить процедуру коннекта/реконнекта

MTE_CRYPTO_ERROR = -20

Ошибка при шифровании/расшифровании, создания/проверки ЭЦП


^

Приложение 1. Формат буфера для функции MTEStructure


Поле 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.

^

Приложение 2. Формат буфера для функции MTEOpenTable


Поле 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"

}
^

Приложение 3. Формат буфера для функции MTERefresh


Поле Data структуры TMTEMsg, указатель на которую возвращает функция MTEOpenRefresh, содержит несколько таблиц торговой системы и имеет следующий формат (описание элементарных типов String, Integer и т.п. см. прил. 4):

поле тип

TMTETables:

КолвоТаблиц Integer

Таблица1 TMTETable

Таблица2 TMTETable

...

ТаблицаN TMTETable


Таким образом, буфер содержит несколько таблиц. Формат буфера таблицы описан в приложении 2.
^

Приложение 4. Элементарные типы


Для представления элементарных типов в библиотеке MTESRL.DLL используются следующие структуры:

Byte

Один байт.


Integer

Четыре байта в формате процессоров x86 (сначала наименее значащий байт).


^ String

Структура следующего вида:


ДлинаСтроки: Integer

ТекстСтроки: Byte[ДлинаСтроки]


Byte[N]

Массив байт длиной N.

Приложение 5. Форматирование полей типа FLOAT


Значения полей типа Float (вещественные числа) передаются в текстовом представлении без десятичной точки. Количество знаков после десятичной точки в полях типа Float для конкретной ценной бумаги определяется значением поля "DECNUM" таблицы "SECURITIES".

В полях типа Float обязательно должны присутствовать DECNUM знаков после запятой. Например, число 465,39 для ценной бумаги с DECNUM = 4 должно быть представлено как "4653900". Значение "46539" в этом случае будет воспринято торговой системой как 4,6539.





Скачать 294.86 Kb.
оставить комментарий
Дата17.09.2011
Размер294.86 Kb.
ТипСценарий, Образовательные материалы
Добавить документ в свой блог или на сайт

Ваша оценка этого документа будет первой.
Ваша оценка:
Разместите кнопку на своём сайте или блоге:
rudocs.exdat.com

База данных защищена авторским правом ©exdat 2000-2017
При копировании материала укажите ссылку
обратиться к администрации
Анализ
Справочники
Сценарии
Рефераты
Курсовые работы
Авторефераты
Программы
Методички
Документы
Понятия

опубликовать
Документы

Рейтинг@Mail.ru
наверх