ПоискПоиск  ПравилаПравила  ПользователиПользователи  ПрофильПрофиль  РегистрацияРегистрация  ВходВход
Форум «Техническая поддержка»
Форум для разработчиков и пользователей программного обеспечения, использующегося на бирже.

Раздел тех.поддержки | Форма обратной связи Тех.поддержка ОАО Московская Биржа: +7 (495) 733-9507, 287-7691
p2ordbook таблица orders вопрос
Новая тема   Ответить на тему
 Предыдущая тема :: Следующая тема 
 Автор  Сообщение 
norvik
Стаж: 5 месяцев 26 дней
Сообщений: 3
Ср Апр 05, 2017 12:17 Ответить с цитатой Получить постоянный адрес сообщения
Доброго дня всем.

Приведу выдержку из документации , файл p2gate_ru.pdf , раздел "Поток FORTS_ORDBOOK_REPL - Cрез стакана. Анонимный"

Таблица 28. Поля таблицы orders
Поле Тип Описание
replID i8 Служебное поле подсистемы репликации
replRev i8 Служебное поле подсистемы репликации
replAct i8 Служебное поле подсистемы репликации
id_ord i8 Номер заявки
sess_id i4 Идентификатор торговой сессии
moment t Время изменения состояния заявки
xstatus i8 Расширенный статус заявки
status i4 Статус заявки
action i1 Действие с заявкой
isin_id i4 Уникальный числовой идентификатор инструмента
dir i1 Направление
price d16.5 Цена
amount i4 Количество в операции
amount_rest i4 Оставшееся количество в заявке
init_moment t Время появления заявки
init_amount i4 Начальное количество в заявке
Примечания:
• Поле status представляет собой битовую маску
0x01 Котировочная
0x02 Встречная
0x04 Внесистемная
0x100000 Запись является результатом операции перемещения заявки
0x200000 Запись является результатом операции удаления заявки
0x400000 Запись является результатом группового удаления
0x20000000 Признак удаления остатка заявки по причине кросс-сделки
• Поле action описывает действие, произошедшее с заявкой
1 Заявка добавлена
2 Заявка сведена в сделку

В примере из SDK (orderbook) где реализована сборка стакана из полного ордер лога и используется поток p2ordbook и соответственно таблицы orders для получения среза , или снепшота стакана,
есть код:

struct OrderDataEx : public Order
{
	Dir direction;
	uint32_t isin_id;
	int64_t repl_act;
	int8_t action;

	// чтение данных заявки из stream_data message
	//
	// reading order data from stream_data message
	OrderDataEx(const cg_msg_streamdata_t* stream_msg)
		: Order(stream_msg)
	{
		const char* msg_data = (const char*) stream_msg->data;

		StreamOffsetInfo* table_info = NULL;
		if(stream_msg->msg_index == OrdLogSchemeInfo::data_orders.msg_index)
		{
			table_info = &OrdLogSchemeInfo::data_orders;
		}
		else if(stream_msg->msg_index == OrdLogSchemeInfo::data_orders_log.msg_index)
		{
			table_info = &OrdLogSchemeInfo::data_orders_log;
		}
		else
		{
			EXIT_WITH_ERROR("Incorrect table index");
		}

		int8_t dir_int = *(msg_data + table_info->offset_dir);
		direction = (dir_int == 1) ? DirBuy : DirSell;
		isin_id = *(int32_t*)(msg_data + table_info->offset_isin_id);
		repl_act = *(int64_t*)(msg_data + table_info->offset_replact);
		
		action = (stream_msg->msg_index == OrdLogSchemeInfo::data_orders.msg_index) ? 
			ACTION_ADD : *(msg_data + table_info->offset_action);
	}

	virtual int toString(char* str) const
	{
		int orders_str_end = Order::toString(str);
		return orders_str_end + sprintf(
			str + orders_str_end,
			" dir = %s, isinId  = %d, replAct = %lld, action = %d"
			, (direction == DirBuy) ? "Buy" : "Sell"
			, isin_id
			, (long long int)repl_act
			, action);
	}
};



Вопрос конкретно по строке где определяется action

action = (stream_msg->msg_index == OrdLogSchemeInfo::data_orders.msg_index) ? 
			ACTION_ADD : *(msg_data + table_info->offset_action);


Почему автор примера определяет действие с заявками для среза стакана исключительно как ACTION_ADD?

Добавил в эту структуру просто для проверки :

if((*(msg_data + table_info->offset_action) == ACTION_EXEC || *(msg_data + table_info->offset_action) == ACTION_CANCEL)&&
			(stream_msg->msg_index == OrdLogSchemeInfo::data_orders.msg_index))
		{
			int i = 0;
		}


И поставил брикпойнт на int i = 0;
программа остановилась почти сразу после запуска.

То есть данные этой таблицы все таки приходят с разными типами поля action.
Не могли бы компетентные люди дать комментарий?

То же касается поля status. При получении среза стакана какой возможен статус у заявок в таблице orders? Любой или только 0х01? Если любой, то как правильно учитывать статус?

И еще момент который касается окончания процесса формирования среза, когда этот процесс можно считать завершенным - в момент прихода сообщения CG_MSG_P2REPL_ONLINE или тогда когда
получены все сообщения orders и начали поступать сообщения orders_log?

Заранее благодарю.

 
 
Последний раз редактировалось автором 05.04.2017 12:41, всего редактировалось 1 раз
marv
Стаж: 7 лет 1 месяц
Сообщений: 17
Ср Апр 05, 2017 22:58 (спустя 10 часов 40 минут) Ответить с цитатой Получить постоянный адрес сообщения
Таблица со срезом стакана orders содержит последние записи из таблицы orders_log по каждой активной заявке в стакане.
Эти последние записи могут быть add или exec (cancel в срезе вроде быть не должно).
Приложение воспринимает все эти записи как add, потому что, читая срез, оно занимается начальным заполнением стакана. 
 
Последний раз редактировалось автором 05.04.2017 22:59, всего редактировалось 1 раз
norvik
Стаж: 5 месяцев 26 дней
Сообщений: 3
Чт Апр 06, 2017 21:05 (спустя 1 день 8 часов) Ответить с цитатой Получить постоянный адрес сообщения
Спасибо конечно что поддержали тему, marv, но вот вопрос:
По сути понятия "срез" в нем может найтись только одна единственная запись с полем action в котором записано значение exec.
Иначе это уже не срез а кино.
Понятно также что вроде статус такой заявки это котировочная , так в примере все операции с количеством базируются на amount_rest и только у котировочной заявки значение этой величины после события exec может отличаться от нуля. Прибавление нулей к агрегированным уровням бессмысленно.
С первой попытки нашел в партии записей orders сразу много заявок exec

MsgStreamData. Id = 708489475 price = 114940.00 amount = 32 table = 0 rev = 7171747 dir = Sell isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708216839 price = 114590.00 amount = 5 table = 0 rev = 7175056 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708524162 price = 114920.00 amount = 15 table = 0 rev = 7178796 dir = Sell isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708441047 price = 114830.00 amount = 1 table = 0 rev = 7180132 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708095569 price = 114950.00 amount = 164 table = 0 rev = 7181676 dir = Sell isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708232023 price = 114750.00 amount = 11 table = 0 rev = 7182187 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708156568 price = 114370.00 amount = 1 table = 0 rev = 7182601 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708380414 price = 114770.00 amount = 5 table = 0 rev = 7185238 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708471662 price = 114860.00 amount = 9 table = 0 rev = 7188632 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708493724 price = 114880.00 amount = 4 table = 0 rev = 7188870 dir = Buy isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE
MsgStreamData. Id = 708523881 price = 114930.00 amount = 6 table = 0 rev = 7189313 dir = Sell isinId = 398210 replAct = 0 action = 1 exec = TRUE status = QUOTE

это просто импортировал в эксель лог и включил фильтр.
Чувствую сомнения в своей логике и к сожалению никаких опровержений из компетентных источников.
Печально.
 
 
sobolev
Стаж: 10 лет
Откуда: Москва
Сообщений: 466
Пт Апр 07, 2017 14:35 (спустя 2 дня 2 часа) Ответить с цитатой Получить постоянный адрес сообщения
посмотрел этот пример, по моему там ошибка
если из среза пришла запись со action = filled, то надо брать amount_rest

по поводу status - вы анализируете только интересующие вас биты, содержание остальных игнорирурете 
 
norvik
Стаж: 5 месяцев 26 дней
Сообщений: 3
Сб Апр 08, 2017 00:09 (спустя 2 дня 11 часов) Ответить с цитатой Получить постоянный адрес сообщения
Нет там ошибки, используется поле amount_rest это в логе я обозвал это значение amount. Я вроде догадываюсь, что при получении среза когда встречаются записи с action = exec, это незафиленные остатки котировочных заявок, которые встали в стакан по лучшей цене и должны соответственно быть добавлены как активные лимитные ордера.
Спасибо за наводку, sobolev. 
 
Последний раз редактировалось автором 08.04.2017 00:13, всего редактировалось 1 раз
Показать сообщения:   
Новая тема   Ответить на тему
Список разделов форума -> Техническая поддержка

Rambler's Top100 Rambler's Top100
Рейтинг@Mail.ru
Copyright © Московская биржа, 2006-2017.
Ваши предложения, замечания и вопросы
по работе форума направляйте на email: