API_URL: https://tradernet.ru/api/
API_SECRET: при доступе по userId задаётся в профиле пользователя в разделе "лучшие трейдеры", при доступе по ip задаётся администратором
Формат данных: JSON
Тип HTTP запроса: POST (возможен GET для тестирования)
Запрос представляет из себя JSON со следующими параметрами:
параметр | описание | обязательный |
---|---|---|
uid | id пользователя (int) | да, для не аутентифицированных пользователей |
cmd | команда (string) | да |
params | параметры команды (object) | да |
sig | подпись (string) | да |
Параметр sig равен md5 от конкатенации пар "parameter_name=parameter_value", отсортированных в порядке возрастания имени параметра (по алфавиту) и добавленного в конец строки секрета API_SECRET. Вложенные параметры обрабатываются рекурсивно.
параметр | описание | обязательный | |
---|---|---|---|
code | Код ответа (int) | да | |
data | Данные ответа (mixed) | нет | |
errMsg | Сообщение об ошибке (string), | необязательный параметр, может взвращаться в случае возникновения ошибки | нет |
Код | Имя | Описание |
---|---|---|
0 | ERROR_OK | Всё Ок, ошибок нет |
1 | ERROR_INCORRECT_QUERY | Ошибка в запросе (неправильный формат, несуществующая команда и т.д.) |
2 | ERROR_BAD_JSON | Неправильный/повреждённый json |
3 | ERROR_UNKNOWN_CMD | Несуществующая команда |
4 | ERROR_BAD_SIGN | Неправильная подпись |
5 | ERROR_CMD_PARAMS | Ошибка в параметрах команды |
6 | ERROR_IMG_DOWNLOAD | Ошибка загрузки картинки |
7 | ERROR_UNKNOWN_UID | Не определён userId |
8 | ERROR_UNKNOWN_IP | Не известный IP |
9 | ERROR_ORDERSTAT_INSERT | Вставка в модель orderstat не удалась |
10 | ERROR_UNKNOWN_CLIENT_ID | Неизвестный clientId |
11 | ERROR_EMPTY_PROFITS | Пустой рейтинг |
12 | ERROR_ACCESS_DENIED | Доступ закрыт / ошибка авторизации |
13 | ERROR_UPLOAD | Ошибка загрузки файла |
14 | ERROR_BAD_CODE | Неверный проверочный код |
Добавление поста в свой блог
Параметры команды:
параметр | описание | обязательный |
---|---|---|
title | Заголовок (string) | нет |
subtitle | Подзаголовок (string) | нет |
tags | Тэги поста (string), разделитель - запятая | нет |
text | Текст поста (string) | да |
images | Изображения прикрепляемые к посту (array) | нет |
Images может содержать в себе несколько объектов image:
параметр | описание | обязательный |
---|---|---|
num | уникальный номер картинки внутри поста | да |
url | url картинки (string) | да |
position | позиция изображения (string), возможные варианты - left, right, between | нет |
description | описание картинки | нет |
Пример:
<?php
$params = array (
'title' => 'title',
'subtitle' => 'subtitle',
'tags' => 'tag1 ,tag2, tag3',
'text' => 'Posttext[img_1][img_2]',
'images' =>
array (
array (
'num' => 1,
'url' => 'http://example.com/sample.jpg',
'position' => 'left',
'description' => 'Imagedescription',
),
array (
'num' => 2,
'url' => 'http://example.com/sample2.jpg',
'position' => 'between',
'description' => 'Secondimagedescription',
),
),
);
?>
Получение ленты подписок пользователя (в блогах)
Параметры команды
параметр | описание | обязательный |
---|---|---|
page | запрашиваемая страница | да |
ts | время, когда была просмотрена первая страница ленты | для первой страницы - нет, для остальных желателен |
Формат ответа:
параметр | описание | обязательный |
---|---|---|
userId | пользователь, чью подписку смотрим | да |
tsStart | время просмотра первой страницы ленты | да |
page | текущая страница | да |
posts | массив объектов постов | да |
posts item:
параметр | описание | обязательный |
---|---|---|
id | id поста | да |
date_crt | дата создания | да |
title | заголовок | да |
subtitle | подзаголовок | да |
text | текст | да |
agg_comments | кол-во комментариев к посту | да |
agg_likes | кол-во лайков | да |
login | отображаемое имя юзера | да |
ilike | лайк текущего юзера | да |
type | Тип поста (Пост = 1 или Инвестидея = 2 или Обучение = 3) | нет |
param_1 | если тип = 2 - рекомендация (1 = Купить, 2 = Продать) | нет |
param_2 | если тип = 2 - ожидаемый процент дохода | нет |
avatar | аватрка юзера | да |
tags | тэги (object) | нет |
Пример ответа сервера:
{
"code": 0,
"blogs_feed": {
"userId": 10,
"tsStart": "2012-06-02 23:52:50",
"page": "1",
"posts": [
{
"id": 240,
"date_crt": "2012-06-02 23:52:21.830204",
"title": "title",
"subtitle": "subtitle",
"text": "TEXT",
"agg_comments": 0,
"agg_likes": null,
"login": "gti",
"ilike": null,
"mainImg": "/data/avatar/10.s.png",
"type": "1 - блог || 2 - инвестидея",
"param_1": "Рекомендация (если type = 2 )",
"param_2": "Доход (если type = 2 )",
"tags": {
"1": "Тэг №1",
"2": "тэг №2"
}
},
{
"id": 239,
"date_crt": "2012-06-02 23:51:32.776083",
"title": "",
"subtitle": "",
"text": "TEXTTEXT",
"agg_comments": 3,
"agg_likes": 2,
"login": "gti",
"ilike": true,
"mainImg": "/data/avatar/10.s.png"
}
]
}
}
Получение ленты подписок клиента (в блогах)
Параметры команды
параметр | описание | обязательный |
---|---|---|
clientId | ID клиента | да |
page | запрашиваемая страница | да |
ts | время, когда была просмотрена первая страница ленты | для первой страницы - нет, для остальных желателен |
Формат ответа
параметр | описание | обязательный |
---|---|---|
userId | пользователь, чью подписку смотрим | да |
tsStart | время просмотра первой страницы ленты | да |
page | текущая страница | да |
posts | массив объектов постов | да |
posts item
параметр | описание | обязательный |
---|---|---|
id | id поста | да |
date_crt | дата создания | да |
title | заголовок | да |
subtitle | подзаголовок | да |
text | текст | да |
agg_comments | кол-во комментариев к посту | да |
agg_likes | кол-во лайков | да |
login | отображаемое имя юзера | да |
ilike | лайк текущего юзера | да |
type | Тип поста (Пост = 1 или Инвестидея = 2) | нет |
param_1 | если тип = 2 - рекомендация (1 = Купить, 2 = Продать) | нет |
param_2 | если тип = 2 - ожидаемый процент дохода | нет |
avatar | аватрка юзера | да |
tags | тэги (object) | нет |
Пример ответа сервера
{
"code": 0,
"blogs_feed": {
"userId": 10,
"tsStart": "2012-06-02 23:52:50",
"page": "1",
"posts": [
{
"id": 240,
"date_crt": "2012-06-02 23:52:21.830204",
"title": "title",
"subtitle": "subtitle",
"text": "TEXT",
"agg_comments": 0,
"agg_likes": null,
"login": "gti",
"ilike": null,
"mainImg": "/data/avatar/10.s.png",
"type": "1 - блог || 2 - инвестидея || 3 - обучение",
"param_1": "Рекомендация (если type = 2 )",
"param_2": "Доход (если type = 2 )",
"tags": {
"1": "Тэг №1",
"2": "тэг №2"
}
},
{
"id": 239,
"date_crt": "2012-06-02 23:51:32.776083",
"title": "",
"subtitle": "",
"text": "TEXTTEXT",
"agg_comments": 3,
"agg_likes": 2,
"login": "gti",
"ilike": true,
"mainImg": "/data/avatar/10.s.png"
}
]
}
}
Сохраняет статистику обработки неисполняемых заявок, а в случае если: нет соединения, заявки не выставляются и т.п.; статистика высылается на настраиваемые почтовые ящики.
Описание команды
Полученные на входе параметры записываются в бд (orderstat), если нет соединения, то высылаются на настраиваемые почтовые ящики (mail.conf.php::developer_emails). Доступ осуществляется по IP (project.conf.php::accessIPtoAPI). Для передачи параметров используются методы GET или POST (POST предпочтительнее), формат параметров - массив JSON
Параметры команды
параметр | описание | обязательный | тип |
---|---|---|---|
broker_id | id брокера | да | INT4 |
order_type | тип заявки (выставление неисполняемой заявки, снятие неисполняемой заявки) | да | INT2 |
instanse_id | идентификатор робота | да | INT4 |
connection_type | тип соединения | да | INT2 |
time_begin | время отправки заявки (локальное клиентское время) | да | TIMESTAMP |
time_end | время получения заявки (локальное клиентское время) | да | TIMESTAMP |
time_roundtrip | (time_end – time_begin) | да | INT4 |
Пример запроса
{
"cmd":"setOrderstat",
"params":{
"broker_id":"767",
"instanse_id":"1234",
"order_type":"1",
"connection_type":"1",
"time_begin":"2012-07-02 15:29:00.666",
"time_end":"2012-07-02 15:29:00.777",
"time_roundtrip":"7676"
}
}
Примеры ответа сервера
Успешное завершение:
{ "code": 0}
Ошибка в параметрах:
{
"code": 5,
"errMsg": "Invalid params for Orderstat"
}
Ошибка авторизации:
{
"code": 8,
"errMsg": "Unkonown IP"
}
Ошибка вставки:
{
"code": 9,
"errMsg": "Error Insertion"
}
Список достижений
Формат ответа
параметр | описание | обязательный |
---|---|---|
portfolioId | да | |
profit | да | |
income | да | |
profileUrl | Ссылка на портфель | да |
login | Логин владельца портфеля | да |
score | да |
Пример ответа сервера
{
"profit_list": {
"2337": {
"portfolioId": 2337,
"profit": "1.016255",
"income": "1727.520000",
"profileUrl": "https://sb-ek.testdev/portfolios/view/id/2337",
"login": "KGQ",
"score": 0
},
"2713": {
"portfolioId": 2713,
"profit": "1.005844",
"income": "540.460000",
"profileUrl": "https://sb-ek.testdev/portfolios/view/id/2713",
"login": "9LH",
"score": 0
},
"4125": {
"portfolioId": 4125,
"profit": "1.002844",
"income": "1592.340000",
"profileUrl": "https://sb-ek.testdev/portfolios/view/id/4125",
"login": "CMR",
"score": 0
}
},
"code": 0
}
Лента инвестидей по тикеру всех авторов на которых подписан пользователь
Параметры команды
параметр | описание | обязательный |
---|---|---|
clientId | ID клиента, | да |
ticker | Тикер | да |
page | запрашиваемая страница, | да |
ts | время, когда была просмотрена первая страница ленты | для первой страницы - нет, для остальных желателен |
Формат ответа
параметр | описание | обязательный |
---|---|---|
userId | пользователь, чью подписку смотрим, | да |
tsStart | время просмотра первой страницы ленты. | да |
page | текущая страница | да |
posts | массив объектов постов | да |
posts item
параметр | описание | обязательный |
---|---|---|
id | id поста | да |
date_crt | дата создания | да |
title | заголовок | да |
subtitle | подзаголовок | да |
text | текст | да |
agg_comments | кол-во комментариев к посту | да |
agg_likes | кол-во лайков | да |
login | отображаемое имя юзера | да |
ilike | лайк текущего юзера | да |
type | Тип поста (Пост = 1 или Инвестидея = 2) | нет |
param_1 | если тип = 2 - рекомендация (1 = Купить, 2 = Продать) | нет |
param_2 | если тип = 2 - ожидаемый процент дохода | нет |
avatar | аватрка юзера | да |
tags | тэги (object) | нет |
Пример ответа сервера
{
"code": 0,
"blogs_feed": {
"userId": 10,
"tsStart": "2012-06-02 23:52:50",
"page": "1",
"posts": [
{
"id": 240,
"date_crt": "2012-06-02 23:52:21.830204",
"title": "title",
"subtitle": "subtitle",
"text": "TEXT",
"agg_comments": 0,
"agg_likes": null,
"login": "gti",
"ilike": null,
"mainImg": "/data/avatar/10.s.png",
"type": "1 - блог || 2 - инвестидея || 3 - обучение",
"param_1": "Рекомендация (если type = 2 )",
"param_2": "Доход (если type = 2 )",
"tags": {
"1": "Тэг №1",
"2": "тэг №2"
}
},
{
"id": 239,
"date_crt": "2012-06-02 23:51:32.776083",
"title": "",
"subtitle": "",
"text": "TEXTTEXT",
"agg_comments": 3,
"agg_likes": 2,
"login": "gti",
"ilike": true,
"mainImg": "/data/avatar/10.s.png"
}
]
}
}
Пост по ID
Параметры команды
параметр | описание | обязательный |
---|---|---|
postId | ID поста | да |
Формат ответа
параметр | описание | обязательный |
---|---|---|
userId | пользователь, чью подписку смотрим, | да |
viewerId | пользователь, который смотрит, | да |
tsStart | время просмотра первой страницы ленты. | да |
page | текущая страница | да |
posts | объектов пост | да |
blog_post item
параметр | описание | обязательный |
---|---|---|
id | id поста | да |
date_crt | дата создания | да |
title | заголовок | да |
subtitle | подзаголовок | да |
text | текст | да |
agg_comments | кол-во комментариев к посту | да |
agg_likes | кол-во лайков | да |
login | отображаемое имя юзера | да |
ilike | лайк текущего юзера | да |
type | Тип поста (Пост = 1 или Инвестидея = 2 или Обучение = 3) | нет |
param_1 | если тип = 2 - рекомендация (1 = Купить, 2 = Продать) | нет |
param_2 | если тип = 2 - ожидаемый процент дохода | нет |
avatar | аватрка юзера | да |
tags | тэги (object) | нет |
Пример ответа сервера
{
"blog_post": {
"userId": null,
"viewerId": 0,
"tsStart": "2012-10-25 12:28:46",
"posts": [
{
"id": 749,
"user_id": 339110,
"date_crt": "2012-10-12 14:11:12.841533",
"date_mod": "2012-10-12 14:11:12.841533",
"title": "тест",
"subtitle": "Подзаголовок",
"text": "<p>[img_1]обучаемся</p>",
"agg_comments": 0,
"agg_likes": null,
"agg_likers": null,
"type": 3,
"security_id": null,
"param_1": null,
"param_2": null,
"approve": 1,
"liker_1": null,
"liker_2": null,
"login": "ztalker",
"ilike": null,
"avatar": "/i/_tradersClubUserPicture.png",
"postDate": "12 октября в 14:11",
"images": [
{
"id": 279,
"num": 1,
"post_id": 749,
"position": 1,
"description": ""
}
]
}
],
"page": 1,
"moder": true
},
"code": 0
}
Рейтинг трэйдеров
Параметры команды
параметр | описание | обязательный |
---|---|---|
type | тип акаунта boolean or null | нет |
viewMode | сколько записей в рейтинге[1-10] or null | нет |
period | Период на котором строится рейтинг[D,W,M,Y] or null | нет |
Формат ответа
параметр | описание | обязательный |
---|---|---|
code | Код статуса исполнения | да |
profits | ассоциативный массив лучших трейдеров. В качестве ключей используются id портфелей | нет |
profits item
параметр | описание | обязательный |
---|---|---|
rating | Рейтинг | да |
profit | да | |
income | да | |
user_id | да | |
countMonth | кол-во сделок за мес. | да |
isDemo | тип портфеля | да |
name | имя текущего юзера | да |
login | логин текущего юзера | да |
score | нет |
Пример ответа сервера
{
"profits": {
"21198": {
"rating": 5,
"profit": 1254.0858,
"income": null,
"user_id": 56423,
"countMonth": 1,
"isDemo": 1,
"name": "TDGJ",
"login": "TDGJ",
"score": 25
},
"35807": {
"rating": 2,
"profit": 10233.3143,
"income": "102280090.780000",
"user_id": 101262,
"countMonth": 1,
"isDemo": 1,
"name": "3G2K",
"login": "Target2006",
"score": 145
}
},
"code": 0
}
Данные пользователя по ID
Параметры команды
параметр | описание | обязательный |
---|---|---|
user_id | ID Пользователя | да |
Формат ответа
параметр | описание | обязательный |
---|---|---|
user_data | объект юзер | нет |
code | Код статуса исполнения | да |
user_data
параметр | описание | обязательный |
---|---|---|
id | ID юзера | да |
group_id | да | |
login | да | |
pwd | да | |
lastname | нет | |
firstname | нет | |
middlename | нет | |
нет | ||
mod_tmstmp | да | |
rec_tmstmp | да | |
last_visit_tmstmp | да | |
f_active | да | |
md5 | да | |
trader_systems_id | нет | |
client_id | да | |
f_demo | да | |
birthday | нет | |
sex | нет | |
citizenship | да | |
status | да | |
type | да | |
umod_tmstmp | да | |
status_id | да | |
date_tsmod | да | |
utm_campaign | да | |
role_name | да | |
role | да |
Пример ответа сервера
{
"user_data": {
"id": 10,
"group_id": 2,
"login": "gti",
"pwd": "wrew43ew4w3e3435wser",
"lastname": "Вованов",
"firstname": "Вован",
"middlename": "Вованович",
"email": null,
"mod_tmstmp": "2012-10-24 07:39:31",
"rec_tmstmp": "2010-04-01 13:02:22",
"last_visit_tmstmp": null,
"f_active": 1,
"md5": null,
"trader_systems_id": null,
"client_id": 343434,
"f_demo": 0,
"birthday": null,
"sex": null,
"citizenship": null,
"status": null,
"type": null,
"umod_tmstmp": null,
"status_id": null,
"date_tsmod": null,
"utm_campaign": null,
"role_name": "user",
"role": 2
},
"code": 0
}
Анкета: Шаг 1. Регистрация пользователя. Создание учётной записи. Получение его userId.
Параметры команды
параметр | описание | обязательный |
---|---|---|
login | логин пользователя | да |
password | пароль пользователя | да |
utm_campaign | APIv1 | да |
В ответ возвращается идентификатор созданного пользователя - userId.
Пример запроса
<?php
$params = array (
'login' => 'testlogin@testdomain.test',
'password' => 'pasSwD73245',
'utm_campaign' => 'APIv1',
);
?>
Анкета: Шаг 2. Отправка sms кода для подтверждения номера телефона
Параметры команды
параметр | описание | обязательный |
---|---|---|
userId | id пользователя (возвращается при вызове команды reg) | да |
phone | номер телефона в формате +7xxxzzzzzzz | да |
При вызове данной команды пользователю отправляется sms сообщение с проверочным кодом. Код считается действительным в течение 30 минут.
В ответ возвращается phoneId.
Анкета: Шаг 3. Подтверждение номера телефона при помощи кода
Параметры команды
параметр | описание | обязательный |
---|---|---|
userId | id пользователя (возвращается при вызове команды reg) | да |
phone | номер телефона в формате +7xxxzzzzzzz | да |
phoneId | id телефона (возвращается при вызове regPhone) | да |
code | Код полученный пользователем в sms сообщении | да |
В случае удачной проверки возвращается isCodeCorrect=true
Анкета: Шаг 4. Выбор тарифа пользователя
Параметры команды
параметр | описание | обязательный |
---|---|---|
userId | id пользователя (возвращается при вызове команды reg) | да |
tariff | выбранный пользователем тариф, например tariff_investor, tariff_allInclusive или tariff_personalBroker | да |
phoneId | id телефона (из regPhone) | да |
code | Проверочный код (из regPhone) | да |
На данный момент можно указать только три тарифа:
Анкета: Шаг 5. Паспортные данные нового пользователя
Параметры команды
параметр | описание | обязательный |
---|---|---|
userId | id пользователя (возвращается при вызове команды reg) | да |
anketa | массив с данными анкеты | да |
phoneId | id телефона (из regPhone) | да |
code | Проверочный код (sms из regPhone) | да |
Массив с данными анкеты
параметр | описание | обязательный |
---|---|---|
country | Гражданство пользователя (Россия, Украина и т.д.) | да |
fname | Фамилия | да |
iname | Имя | да |
oname | Отчество | да |
bday | Дата рождения - число | да |
bmonth | Дата рождения - месяц | да |
byear | Дата рождения - год | да |
passport_ser | Серия паспорта | да |
passport_number | Номер паспорта | да |
Анкета: Шаг 6. Регистрационные документы нового пользователя
Параметры команды
параметр | описание | обязательный |
---|---|---|
userId | id пользователя (возвращается при вызове команды reg) | да |
filesData | массив "имя файла" => "тип файла" | да |
phoneId | id телефона (из regPhone) | да |
code | Проверочный код (sms из regPhone) | да |
Сами файлы отправляются стандартным способом.
В ответ возвращается code=0, в случае удачной загрузки, либо код ошибки.
Получение истории котировок по бумаге
var json = {
'cmd': 'getQuotesHistory',
'params':
{
'ticker': 'SBER',
'interval': 60, // '1', '5', '10', '15', '30', '60',
'from': '2015-01-01’,
'to': '2015-02-01' //если параметр опущен, будет взята текущая дата
}
}
$.ajax({
url: 'https://tradernet.ru/api/',
type: 'POST',
data: {q: json},
success: function (response) {
console.log(response);
}
});
Получение информации по бумаге
var json = {
'cmd': 'getSecurityInfo',
'params':
{
'ticker': 'SBER',
'sup': true // если опустить этот ключ, придет более подробная инфрмация из торговой системы
}
}
$.ajax({
url: 'https://tradernet.ru/api/',
type: 'POST',
data: {q: json},
success: function (response) {
console.log(response);
}
});
Получение информации по бумаге
Для работы с сервисом нужно подключить код библиотеки socket.io на странице клиента:
<script src="https://wsbeta.tradernet.ru/socket.io/socket.io.js"></script>
И создать объект socket.io:
var ws = io('https://wsbeta.tradernet.ru');
В настоящий момент возможна работа с одним из двух серверов - боевым или демо:
Для работы с боевым сервером необходима авторизация на сайте https://tradernet.ru, для работы с демо сервером - на сайте https://beta.tradernet.ru
Для подключения к API из Node.js можно использовать библиотеку socket.io-client:
var io = require('socket.io-client');
var ws = io('https://wsbeta.tradernet.ru', {
transports: ['websocket']
});
ws.on('connect', function () {
console.log('socket.io-client connected');
});
В отличие от браузерной авторизации, в Node.js можно авторизоваться по ключу.
Это позволяет избежать необходимости открытия сессии безопасности обычным способом (по токену или по SMS).
Чтобы авторизоваться в системе по ключу нужно:
Пример авторизации:
var io = require('socket.io-client');
var tncrypto = require('./tn-crypto');
var pubKey = '*** PUBLIC KEY ***';
var secKey = '*** SECRET KEY ***';
var ws = io('https://wsbeta.tradernet.ru', {
transports: ['websocket']
});
ws.on('connect', function () {
console.log('WS connect');
auth(ws, pubKey, secKey, function (err, auth) {
if (err) return console.error('Ошибка авторизации', err);
console.log('login:', auth.login);
console.log('mode:', auth.mode);
if (auth.trade)
console.log('Приказы подавать можно');
else
console.log('Приказы подавать нельзя');
});
});
function auth(ws, pubKey, secKey, cb) {
var data = {
apiKey: pubKey,
cmd: 'getAuthInfo',
nonce: Date.now()
};
var sig = tncrypto.sign(data, secKey);
ws.emit('auth', data, sig, cb);
}
Здесь использован модуль шифрования tn-crypto.js, который находится в папке examples/
Примеры в этой статье можно запускать в JSFIDDLE. Для этого нужно предварительно авторизоваться на сайте https://beta.tradernet.ru.
Внимание! Не используйте для запуска примеров боевой логин. Если Вы авторизованы как клиент, перед запуском примеров завершите свой сеанс и войдите с логином демо-пользователя.
Чтобы открыть пример в JSFIDDLE, достаточно перейти по ссылке под кодом примера:
var ws = io('https://wsbeta.tradernet.ru');
ws.on('connect', function () {
console.log('socket.io connected');
});
Подписка на котировки
Осуществляется отправкой на сервер сообщения notifyQuotes со списком тикеров. Котировки приходят в сообщениях с именем q. В первый раз котировка приходит полностью. Потом приходят изменения.
Синонимы: sup_updateSecurities2.
var ws = io('https://wsbeta.tradernet.ru');
ws.on('q', function (data) {
console.log(data);
});
ws.emit('notifyQuotes', ['SBER', 'LKOH', 'GMKN', 'ROSN', 'GAZPM']);
Пример сообщения:
{
"q": [
{
"n": 0,
"c": "SBER",
"mrg": "M",
"ltr": "MCX",
"kind": 1,
"type": 1,
"name": "Сбербанк",
"name2": "Sberbank",
"bbp": 73.56,
"bbc": " ",
"bbs": 12000,
"bbf": 0,
"bap": 73.57,
"bac": " ",
"bas": 100,
"baf": 0,
"pp": 74,
"op": 74,
"ltp": 73.565,
"lts": 140,
"ltt": "2014-10-29T02:23:59",
"chg": -0.435,
"pcp": -0.59,
"ltc": " ",
"mintp": 73.39,
"maxtp": 74.17,
"vol": 110940760,
"vlt": 1644150.795,
"yld": 0,
"acd": 0,
"fv": 0,
"mtd": "",
"cpn": 0,
"cpp": 0,
"ncd": "",
"ncp": 0,
"dpb": 0,
"dps": 0,
"trades": 0,
"min_step": 0.01,
"step_price": 0,
"p5": 79.935,
"chg5": -7.97,
"p22": 77.475,
"chg22": -5.05,
"p110": 82,
"chg110": -10.29,
"p220": 97.08,
"chg220": -24.22,
"x_dsc1": "18.0",
"x_dsc2": "23.0",
"x_dsc3": "30.0",
"x_descr": "Сберегательный банк России...",
"x_curr": "RUR",
"x_short": "1",
"x_lot": "10",
"x_currVal": "1.00000000",
"x_min": "20",
"x_max": "100",
"x_istrade": "1"
}
]
}
Поля:
Поле | Описание |
---|---|
n | Порядковый номер котировки. Каждый тикер имеет свою нумерацию |
c | Тикер |
mrg | Признак маржинальности. Если бумага маржинальна, содержит строку 'M' |
ltr | Биржа последней сделки |
kind | Вид бумаги (1 - Common Обыкновенные, 2 - Pref Привилегированные, 3 - Percent Процентные, 4 - Discount Дисконтные, 5 - Delivery Поставочный, 6 - Rated Расчетный, 7 - Interval Интервальный) |
type | Тип бумаги (1 - акции, 2 - облигации, 3 - фьючерсы) |
name | Название бумаги |
name2 | Латинское название бумаги |
bbp | Лучший бид |
bbc | Обозначение изменения лучшего бида ('' - не изменился, 'D' - вниз, 'U' - вверх) |
bbs | Количество (сайз) лучшего бида |
bbf | Объем(?) лучшего бида |
bap | Лучший аск |
bac | Обозначение изменения лучшего аска ('' - не изменился, 'D' - вниз, 'U' - вверх) |
bas | Количество (сайз) лучшего аска |
baf | Объем(?) лучшего аска |
pp | Цена предыдущего закрытия |
op | Цена открытия в текущей торговой сессии |
ltp | Цена последней сделки |
lts | Количество (сайз) последней сделки |
ltt | Время последней сделки |
chg | Изменение цены последней сделки в пунктах относительно цены закрытия предыдущей торговой сессии |
pcp | Изменение в процентах относительно цены закрытия предыдущей торговой сессии |
ltc | Обозначение изменения цены последней сделки ('' - не изменилась, 'D' - вниз, 'U' - вверх) |
mintp | Минимальная цена сделки за день |
maxtp | Максимальная цена сделки за день |
vol | Объём торгов за день в штуках |
vlt | Объём торгов за день в валюте |
yld | Доходность к погашению (для облигаций) |
acd | Накопленный купонный доход (НКД) |
fv | Номинал |
mtd | Дата погашения |
cpn | Купон в валюте |
cpp | Купонный период (в днях) |
ncd | Дата следующего купона |
ncp | Дата последнего купона |
dpd | ГО покупки |
dps | ГО продажи |
trades | Количество сделок |
min_step | Минимальный шаг цены |
step_price | Шаг цены |
p5 | Цена 5 дней назад |
chg5 | Изменение цены за 5 дней |
p22 | Цена 22 дня назад |
chg22 | Изменение цены за 22 дня |
p110 | Цена 110 дней назад |
chg110 | Изменение цены за 110 дней |
p220 | Цена 220 дней назад |
chg220 | Изменение цены за 220 дней |
x_dsc1 | Дисконт |
x_dsc2 | не используется |
x_dsc3 | не используется |
x_descr | Описание |
x_curr | Валюта |
x_short | Можно ли шортить бумагу |
x_lot | Минимальный лот |
x_currVal | Курс валюты по отношению к рублю |
x_min | Минимум за (период) |
x_max | Максимум за (период) |
x_istrade | Были ли по бумаге сделки |
Подписка на стакан
Осуществляется отправкой на сервер сообщения notifyOrderBook со списком тикеров. Стакан приходит в сообщениях с именем b. В первый раз стакан приходит полностью. Потом приходят изменения.
var ws = io('https://wsbeta.tradernet.ru');
ws.on('b', function (orderBook) {
console.log(orderBook);
});
ws.emit('notifyOrderBook', ['SBER']);
Пример сообщения:
{
"dom": [{
"n": 0,
"i": "SBER",
"min_step": 0.01,
"step_price": 0,
"del": [],
"ins": [{
"p": 73.42,
"s": "S",
"q": 182000,
"k": 0
},
...
{
"p": 73.22,
"s": "B",
"q": 87700,
"k": 19
}],
"upd": [],
"cnt": 20,
"x": 10
}]
}
Каждое сообщение стакана содержит такие поля:
Поле | Описание |
---|---|
n | Порядковый номер. Каждый тикер имеет свою нумерацию |
i | Тикер |
min_step | Минимальный шаг цены |
step_price | |
del | Массив удаляемых позиций |
ins | Массив вставляемых позиций |
upd | Массив обновляемых позиций |
cnt | Глубина стакана |
x | ... |
Каждый массив удаляемых, вставляемых или обновляемых позиций содержит следующие поля:
Поле | Описание |
---|---|
p | Цена |
s | Признак bid или sell, который может принимать значения "B" или "S" соответственно |
q | Количество |
k | Номер позиции в стакане |
При получении сообщений стакана обновление позиций следует производить так:
Подписка на сообщения о рынках
Осуществляется отправкой сообщения notifyMarkets.
Сообщения о рынках имеют метку markets.
var ws = io('https://wsbeta.tradernet.ru');
ws.on('markets', function (markets) {
console.log(markets);
});
ws.emit('notifyMarkets');
Пример сообщения:
[
{
"markets": {
"t": "11/5/2014 3:28:30 PM",
"m": [
{
"n": "ММВБ_АКЦ_Ф",
"n2": "MCX",
"s": "OPEN",
"o": "19:00:00",
"c": "18:40:00",
"dt": "0",
"ev": [
{
"id": "StartGate",
"t": "19:00:00",
"next": "2014-11-05T19:00:00"
},
{
"id": "MarketOpen",
"t": "19:00:00",
"next": "2014-11-05T19:00:00"
},
{
"id": "ResetMIS",
"t": "00:00:00",
"next": "2014-11-06T00:00:00"
},
{
"id": "MarketClose",
"t": "18:40:00",
"next": "2014-11-05T18:40:00"
},
{
"id": "StopGate",
"t": "18:40:00",
"next": "2014-11-05T18:40:00"
}
]
},
...
]
}
}
]
Каждое сообщение о рынке содержит такие поля:
Поле | Описание |
---|---|
n | Название рынка |
n2 | Альтернативное название рынка |
s | Состояние рынка ( OPEN или CLOSE ) |
o | Время открытия рынка |
c | Время закрытия рынка |
dt | Сдвиг в минутах относительно Москвы |
Установка минимальной задержки между обновлениями котировок и стакана. Принимает интервал обновления в миллисекундах.
var ws = io('https://wsbeta.tradernet.ru');
ws.emit('setDelay', 1000);
Поиск ценных бумаг по частичному совпадению тикера
var ws = io('https://wsbeta.tradernet.ru');
ws.emit('searchSecurities', 'SBER', function (err, res) {
console.log(err, res);
});
Пример сообщения:
[
{
"sid": 16394,
"n": "Сбербанк России",
"t": "SBER",
"isin": "RU0009029540",
"type": "ао",
"tp": "ao",
"tn": "Сбербанк России SBER",
"exkey": "MICEX",
"exname": "ММВБ",
"nt_ticker": "SBER"
},
{
"sid": 16395,
"n": "Сбербанк-п",
"t": "SBERP",
"isin": "RU0009029557",
"type": "ап",
"tp": "ap",
"tn": "Сбербанк-п SBERP",
"exkey": "MICEX",
"exname": "ММВБ",
"nt_ticker": "SBERP"
}
]
Подписка на сессии безопасности клиента
Осуществляется отправкой сообщения notifySessions.
Сообщения о рынках имеют метку sessions.
var ws = io('https://wsbeta.tradernet.ru');
ws.on('sessions', function (sessions) {
console.log(sessions);
});
ws.emit('notifySessions');
Поля сообщения
id | Идентификатор сессии |
---|---|
owner_login | Логин пользователя, от имени которого открыта сессия |
user_login | Логин авторизованного пользователя |
safety_type_id | Тип сессии безопасности |
start_datetime | Дата открытия сессии безопасности |
expire_datetime | Дата истечения сессии безопасности |
expire | Время, оставшееся до истечения сессии безопасности, мс |
Пример сообщения:
[
{
"response": {
"res": [
{
"id": 6765662,
"owner_login": "OWNER_LOGIN",
"user_login": "USER_LOGIN",
"safety_type_id": 4,
"key_current": "Логин, пароль",
"start_datetime": "2014-11-11T13:22:06.247",
"expire_datetime": "2014-11-12T13:22:06.247",
"expire": 37790
}
]
}
}
]
Подписка на портфель клиента
Осуществляется отправкой сообщения notifyPortfolio.
Сообщения о рынках имеют метку portfolio.
var ws = io('https://wsbeta.tradernet.ru');
ws.on('portfolio', function (portfolio) {
console.log(portfolio);
});
ws.emit('notifyPortfolio');
Пример сообщения:
[
{
"ps": {
"key": "%YOUR_LOGIN",
"acc": [
{
"s": 422453.751611,
"forecast_in": 85000,
"forecast_out": 12400,
"curr": "RUR",
"currval": 1
}
],
"pos": [
{
"i": "LKOH",
"t": 1,
"k": 1,
"s": 22226.9,
"q": 11,
"fv": "0",
"curr": "RUR",
"currval": 1,
"name": "ЛУКОЙЛ",
"name2": "LUKOIL",
"open_bal": 22226.9,
"mkt_price": 2130.1,
"vm": "0",
"go": 22226.9,
"profit_close": 1006.2,
"acc_pos_id": 36054354,
"trade": [
{
"trade_count": 11
}
]
}
]
}
}
]
Поля сообщения:
Поле | Описание |
---|---|
key | Ключ сообщений портфеля (логин, предварённый знаком процента) |
acc | Массив счётов клиента |
pos | Массив позиций клиента |
Поля счёта:
Поле | Описание |
---|---|
s | Свободные средства |
forecast_in | |
forecast_out | |
curr | Валюта счёта |
currval | Курс валюты счёта |
Поля позиции:
Поле | Описание |
---|---|
i | Тикер бумаги |
t | Тип бумаги |
k | Вид бумаги |
s | Стоимость |
q | Количество |
curr | Валюта |
currval | Курс валюты |
name | Наименование бумаги |
name2 | Альтернативное наименование бумаги |
open_bal | Цена открытия |
mkt_price | Рыночная цена |
vm | |
go | |
profit_close | |
acc_pos_id | |
trade | |
trade[].trade_count |
Подписка на приказы клиента
var ws = io('https://wsbeta.tradernet.ru');
ws.on('orders', function (orders) {
console.log(orders);
});
ws.emit('notifyOrders');
Пример сообщения:
[
{
"orders": {
"key": "%BOYTSOV.MAXIM@GMAIL.COM",
"order": [
{
"id": 6878243,
"date": "2014-10-14T11:30:17.010",
"stat": 10,
"stat_orig": 10,
"stat_d": "2014-10-14T11:30:17.023",
"instr": "GAZPM",
"oper": 3,
"type": 5,
"cur": "RUR",
"p": 135.35,
"stop": 125,
"q": 680,
"aon": "0",
"exp": 3,
"rep": "0",
"fv": "0",
"name": "ГАЗПРОМ ао",
"name2": "Gazprom",
"stat_prev": 1,
"userOrderId": "0"
}
]
}
}
]
Выставление приказа
Параметры
Название | Описание |
---|---|
instr_name | Код ценной бумаги (тикер), в отношении которой подаётся приказ |
action_id | Тип операции. Принимает следующие значения: 1 – Покупка (Buy) 2 – Покупка при совершении сделок с маржой (Buy on Margin) 3 – Продажа (Sell) 4 – Продажа при совершении сделок с маржой (Sell Short) |
order_type_id | Тип приказа. Принимает следующие значения: 1 – Рыночный Приказ (Market) 2 – Приказ по заданной цене (Limit) 3 – Рыночный Стоп-приказ (Stop) 4 – Стоп-приказ по заданной цене (Stop Limit) |
curr | Код валюты приказа по ISO |
limit_price | Цена приказа |
stop_price | Стоп-цена приказа |
qty | Количество ценных бумаг (в штуках) |
aon | Признак «всё или ничего». Принимает следующие значения: 0 – с возможностью частичного исполнения 1 – с невозможностью частичного исполнения |
expiration_id | Срок действия приказа. Принимает следующие значения: 1 – Приказ «до конца текущей торговой сессии» (Day) 2 – Приказ «день/ночь или ночь/день» (Day + Ext) 3 – Приказ «до отмены» (GTC, до отмены с участием в ночных сессиях) |
submit_ch_c | Канал приёма сообщения: 1 – В электронной форме через сайт брокера в сети 2 – В устной форме 3 – В письменной форме |
message_id | Всегда передаётся 0 |
replace_order_id | При создании приказа значение поля не указывается. При формировании поручения на изменение приказа данное поле содержит ID приказа, в отношении которого делается поручение |
groupPortfolioName | id, который идентифицирует группу бумаг пользователя - в дальнейшем бумаги в позициях будут при наличии этого признака != 0 сгруппированы по данному признаку. Например, отправив две сделки с указанием groupPortfolioName == 12, в портфеле пользователя появится отдельная группа бумаг с этими двумя бумагами |
userOrderId | Признак для отслеживания выставляемых приказов по внутреннему (со стороны клиента) признаку |
var ws = io('https://wsbeta.tradernet.ru');
var putData = {
instr_name: 'SBER',
action_id: 1,
order_type_id: 1,
curr: 'RUR',
limit_price: 50,
stop_price: 40,
qty: 100,
aon: 0,
expiration_id: 1,
submit_ch_c: 1,
message_id: 0,
replace_order_id: 0,
groupPortfolioName: 12,
userOrderId: 123
};
ws.emit('putOrder', putData, function (err, res) {
console.log(err, res);
});
Результат
Возвращает идентификатор приказа
{
"orderId": 6949116
}
Отмена приказа
var ws = io('https://wsbeta.tradernet.ru');
var putData = {
instr_name: 'SBER',
action_id: 1,
order_type_id: 1,
curr: 'RUR',
limit_price: 50,
stop_price: 40,
qty: 100,
aon: 0,
expiration_id: 1,
submit_ch_c: 1,
message_id: 0,
replace_order_id: 0,
userOrderId: 123
};
ws.emit('putOrder', putData, function (err, res) {
if (res && res.orderId) deleteOrder(res.orderId);
});
function deleteOrder(orderId) {
var delData = {
order_id: orderId,
};
ws.emit('deleteOrder', delData, function (err, res) {
console.log(err, res);
});
}
Получение списка типов сессий безопасности.
var ws = io('https://wsbeta.tradernet.ru');
ws.emit('getSafetyTypes', function (err, safetyTypes) {
console.log(err, safetyTypes);
});
Результат:
Название | Описание |
---|---|
safety_type_id | Идентификатор типа сессии безопасности |
safety_type | Идентификатор тип сессии безопасности |
description | Тип сессии безопасности, отображаемый в интерфейсе пользователя |
enabled | Доступен или нет клиенту |
status | Дата истечения сессии безопасности |
status_description | Время, оставшееся до истечения сессии безопасности (мс) |
status_id | Время, оставшееся до истечения сессии безопасности (мс) |
Пример:
[
{
"safety_type_id": 2,
"safety_type": "Token Aladdin",
"description": "Использование генератора временных паролей компании Aladdin",
"enabled": false,
"status": "Использование недоступно",
"status_description": "Использование этого уровня безопасности Вам не разрешено. За разъяснениями Вы можете обратиться в службу поддержки.",
"status_id": 0
},
{
"safety_type_id": 3,
"safety_type": "SMS",
"description": "Подтверждение с помощью SMS",
"enabled": true,
"status": "Доступно [PHONE_NUMBER]",
"status_id": 1
},
{
"safety_type_id": 4,
"safety_type": "Логин, пароль",
"description": "Без дополнительного подтверждения",
"enabled": true,
"status": "Доступно",
"status_id": 1
}
]
Получение списка открытых клиентом сессий безопасности
var ws = io('https://wsbeta.tradernet.ru');
ws.emit('getSecuritySessions', function (err, sessions) {
console.log(err, sessions);
});
Результат:
Результат выполнения передаётся в аргументы err и sessions колбэка.
Аргумент sessions содержит список открытых клиентом сессий безопасности.
[
{
"id": 6760536,
"safety_type_id": 4,
"safety_type": "Логин, пароль",
"start_datetime": "2014-11-06T17:57:46.967",
"expire_datetime": "2014-11-07T17:57:46.967",
"expire": 86004
}
]
Параметры сессии
Название | Описание |
---|---|
id | Идентификатор сессии |
safety_type_id | Идентификатор типа сессии безопасности |
safety_type | Тип сессии безопасности, отображаемый в интерфейсе пользователя |
start_datetime | Дата открытия сессии |
expire_datetime | Дата истечения сессии безопасности |
expire | Время, оставшееся до истечения сессии безопасности (мс) |
Инициализация двухэтапного открытия сессии безопасности. Отправляет код подтверждения указанным способом (SMS).
Параметры
Название | Описание |
---|---|
safetyTypeId | идентификатор типа сессиия безопасности |
var ws = io('https://wsbeta.tradernet.ru');
// SMS
var safetyTypeId = 3;
ws.emit('initValidation', safetyTypeId, function (err, res) {
console.log(err, res);
});
Результат:
Результат выполнения передаётся в аргументы err и res колбэка.
Аргумент err принимает объект ошибки или null.
В случае успешной отправки аргумент res получает значение 0.
Открытие сессии безопасности. Если был выбран тип безопасности с подтверждением, проверяет код подтверждения, укананный клиентом. Если тип безопасности не требует подтверждения, просто открывает сессию.
Параметры
Название | Описание |
---|---|
safetyTypeId | идентификатор типа сессиия безопасности |
validationKey | код подтверждения. Если тип безопасности не требует подтверждения, должен быть null |
var ws = io('https://wsbeta.tradernet.ru');
var data = {
safetyTypeId: 3, // SMS
validationKey: 'CODE FROM SMS'
};
ws.emit('openSecuritySession', data, function (err, res) {
console.log(err, res);
});
Результат:
Результат выполнения передаётся в аргументы err и res колбэка.
Если возникла ошибка, аргумент err принимает объект ошибки, иначе null.
Если сессия открылась, аргумент res получает идентификатор сессии безопасности.
Активация токена. Передаётся серийный номер токена.
var ws = io('https://wsbeta.tradernet.ru');
var tokenSN = 'TOKEN_SN';
ws.emit('activateToken', tokenSN, function (err, res) {
console.log(err, res);
});
Синхронизация токена. Передаётся два последовательных ключа, выданных токеном.
var ws = io('https://wsbeta.tradernet.ru');
var key1 = 'KEY1';
var key2 = 'KEY2';
ws.emit('synchronizeToken', key1, key2, function (err, res) {
console.log(err, res);
});
Возвращает информацию о токене
var ws = io('https://wsbeta.tradernet.ru');
ws.emit('getTokenInfo', function (err, res) {
console.log(err, res);
});