Сериализация и десериализация сообщений¶
Для сериализации и десериализации сообщений, отправляемых в бэкенд cTrader и получаемых от него, вы можете использовать либо Protocol Buffers (Protobufs), либо JSON (JavaScript Object Notation).
Protobufs против JSON
Вы можете рассмотреть возможность использования JSON в следующих случаях:
- Если вы хотите максимально упростить интеграцию. JSON прост в использовании, позволяя вам сериализовать сообщения в удобочитаемые строки.
- Если вы использовали JSON в прошлом при интеграции с другими API. В этом случае вы можете захотеть придерживаться формата, с которым вы наиболее знакомы.
Напротив, вы можете выбрать использование Protobufs в следующих случаях:
- Если вы хотите сделать вашу интеграцию максимально легковесной. Сообщения Protobuf компактны и, следовательно, сериализация и десериализация выполняются быстрее по сравнению с JSON.
- Если вы намерены в основном полагаться на официальные SDK, поскольку они предоставляют полезные методы и классы, которые вы можете использовать для абстрагирования наиболее сложных частей работы с Protobufs.
Сообщения Open API
Все сообщения, которые вы можете использовать в своей интеграции, можно найти в репозитории сообщений на GitHub.
Ниже мы подробно определяем каждый метод сериализации и десериализации.
JSON ¶
JSON-объекты могут быть определены как простые пары ключ-значение. Обратите внимание, что ключи всегда являются строками, в то время как значения могут быть разных типов данных, как показано в примере ниже.
{
"clientMsgId": "cm_id_2",
"payloadType": 2100,
"payload": {
"keyOne": [1, 2, 10,],
"keyTwo": "valueTwo",
}
}
В примере значение ключа "clientMsgId" является строкой, в то время как значение ключа "payloadType" является целым числом. Ключ "payload" содержит другой JSON-объект, который вложен в тело родительского объекта. Значение ключа "payload.keyOne" является списком целых чисел.
Подключение к требуемому порту
Вы можете работать с JSON только в том случае, если подключаетесь к порту 5036 при установлении соединения с бэкендом cTrader.
Узнайте, как вы можете отправлять и получать JSON.
Protocol Buffers ¶
Protocol Buffers (или Protobufs) предлагают независимый от языка и платформы, расширяемый механизм для сериализации структурированных данных. Используя Protobufs, вы можете кодировать структурированные данные в эффективном, но расширяемом формате.
С Protobufs вам нужно определить, как вы хотите структурировать свои данные, только один раз. Это делается путем указания типов сообщений Protobuf в файлах .proto.
Каждое сообщение Protobuf представляет собой запись информации, содержащую серию пар имя-значение. Ниже вы можете найти базовый пример файла .proto, который определяет сообщение, содержащее информацию о человеке.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Как видите, формат сообщения прост. Каждый тип сообщения имеет одно или несколько уникально пронумерованных полей, и каждое поле имеет имя и тип значения, где типы значений могут быть числами (целыми или с плавающей точкой), логическими значениями, строками, необработанными байтами или даже (как в примере выше) другими типами сообщений Protocol Buffer, что позволяет вам структурировать данные иерархически.
Вы можете найти больше информации о написании файлов .proto в руководстве по языку Protocol Buffer.
Узнайте больше о Protocol Buffers.
Примечание
cTrader Open API использует синтаксис Protocol Buffers версии 2. Однако вы все еще можете использовать последние версии выбранного вами компилятора/SDK Protocol Buffers, поскольку они обратно совместимы и работают как с файлами сообщений версии 2, так и версии 3.
Просмотрите руководство по отправке и получению Protobufs.
ProtoMessages ¶
При работе с Protobufs вы будете отправлять и получать объекты ProtoMessage, разработанные Spotware.
Для обработки фрагментации сети при отправке сообщений используется следующая структура фрейма.
1 2 3 4 | |
Примечание
Системная архитектура является little-endian (то есть младший байт первым), что означает, что вы должны изменить порядок байтов длины при отправке и получении данных.
Каждое ProtoMessage имеет следующую структуру.
1 2 3 4 5 | |
Структура содержит два обязательных поля.
payloadType. Содержит идентификаторProtoPayloadType. Это поле обозначает тип объекта Protobuf, сериализованного в полеpayload.payload. Содержит фактическое сериализованное сообщение Protobuf, которое соответствуетpayloadType.
Еще одно поле является необязательным.
clientMsgId. Содержит идентификатор сообщения, который назначается клиентом.
Фактическое определение ProtoMessage выглядит следующим образом.
1 2 3 4 5 6 7 8 | |
Соглашение об именовании¶
Сообщения Protobuf, которые формируют cTrader Open API, можно разделить на следующие типы:
- Сообщения запросов
- Сообщения ответов
- Сообщения событий
- Сообщения моделей
Сообщения запросов¶
Сообщения запросов используются для запроса информации у бэкенда cTrader или выполнения различных операций.
Сообщения запросов помечаются Req в конце соответствующих имен. Например, сообщение ProtoOAAssetListReq запрашивает у бэкенда cTrader возврат списка всех активов, доступных для торговли на текущем авторизованном счете.
Сообщения ответов¶
Сообщения ответов обозначают данные, которые получены от бэкенда cTrader.
Сообщения ответов помечаются Res в конце соответствующих имен. Например, сообщение ProtoOAAssetListRes имеет повторяющееся поле (asset), которое содержит все активы, которыми может торговать текущий авторизованный счет.
Сообщения событий¶
Сообщения событий асинхронно уведомляют всех своих подписчиков о том, что определенное событие было инициировано.
Сообщения событий помечаются Event в конце соответствующих имен. Например, ProtoOAMarginChangedEvent отправляется каждый раз, когда изменяется сумма маржи, выделенной для конкретной позиции.
Сообщения моделей¶
Сообщения моделей описывают сущности, которые формируют доменную модель в бэкенде cTrader.
Имена сообщений моделей всегда заканчиваются именем сущности, которую они определяют. Например, сообщение ProtoOAAsset определяет сущность Asset.
Репозиторий сообщений ¶
Вы можете скачать последнюю версию файлов сообщений Protocol Buffers cTrader Open API из этого репозитория.
Мы рекомендуем вам следить за репозиторием сообщений, если вы хотите получать уведомления о выпуске новой версии файлов сообщений.
Компиляция сообщений Protobuf ¶
После получения необходимых сообщений Protobuf вы можете запустить компилятор Protobuf для выбранного вами языка на файлах .proto, определяющих эти сообщения. В случае успеха компилятор сгенерирует классы доступа к данным на вашем предпочитаемом языке.
Эти классы предоставляют простые методы доступа для каждого поля (такие как name() и set_name()), а также методы для обработки сериализации и десериализации. Имя каждого класса должно соответствовать полному имени каждого скомпилированного сообщения. На этом этапе вы можете свободно использовать сгенерированные классы в своем приложении для заполнения, сериализации и десериализации сообщений Protobuf.
Чтобы узнать больше о компиляции сообщений protobuf с использованием выбранного вами языка.