← Zurück

Не всегда приходит инструмент

Наблюдаю странную ситуацию на тестовом сервере (на рабочем не проверял): ловлю событие NewSecurities, мне надо отловить бумагу RIZ0. Получаю ее не каждый раз :( Т.е. коннекчусь, смотрю что приходит, например:

один раз так: .... AZKM RU000A0JPB41 GM32500BL0 VB13000BX0 KBSB RU000A0JPD98 ....

другой раз так: .... AZKM RU000A0JPB41 GM32500BL0 RIZ0 VB13000BX0 KBSB RU000A0JPD98 ....

Как видно, в первом случае RIZ0 почему-то отсутствует, все остальные бумаги на месте. Собственно вопрос - куда исчезает бумага? Причем происходит это вроде бы случайным образом. Или может есть какая-то хитрая настройка или какая другая причина столь странного поведения?

War dieses Thema hilfreich?

Thema teilen

Kommentare (11)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

У меня код:

trader.NewSecurities += securities =>
{
	foreach (var security in securities)
	{
		if (security.Code == "RIZ0")
		{
			_riz0 = security;
			trader.RegisterSecurity(_rim0);
		}
	}
};

и на демо и на реале стабильно находил фьюч. Но я не проверял порядок прихода инструментов. Может быть там не всегда одна и так же сортировка?

eaa
eaa Autor

у меня то же самое, разве что в цикле печатает все, что приходит. стабильно работает, работает, а потом так же стабильно эта бумага не появляется. Потом опять начинает появляться... это и смущает. сначала думал что может оно где-то лочится в коде, но вроде нет - остальное-то приходит стабильно.

eaa
eaa Autor

Вот еще заметил такую вещь...


trader.NewSecurities += securities =>
{
    foreach (var security in securities)
    {
        if (security.Code == "RIZ0")
        {
            _riz0 = security;
            trader.RegisterSecurity(_rim0);
            waitHandle.Set();
        }
    }
};

waitHandle.WaitOne();

Если ставлю точку останова на waitHandle.WaitOne() и потом продолжаю выполнение - приходят все коды, если убираю - некоторые теряются, в т.ч. тот, который мне нужен, хотя не только он... Пробовал перед ним ставить sleep() - толку нет.

Может есть мысль, как победить?

Mikhail Sukhov
Mikhail Sukhov

eaa: Вот еще заметил такую вещь...

Если ставлю точку останова на waitHandle.WaitOne() и потом продолжаю выполнение - приходят все коды, если убираю - некоторые теряются, в т.ч. тот, который мне нужен, хотя не только он... Пробовал перед ним ставить sleep() - толку нет.

Может есть мысль, как победить?

Я весь код не вижу, но думаю это то, о чем я писал выше. Инструменты приходят не всегда в одном и том же порядке. А Вы в коде ожидаете, что RIZ придется одним из первых. В качестве проверки сделайте простое приложение, которое выводит в консоль момент прихода RIZ0:

trader.NewSecurities += securities =>
{
    foreach (var security in securities)
    {
        if (security.Code == "RIZ0")
        {
            Console.WriteLine("Пришло!!!");
        }
    }
};

Console.ReadLine();

Уверен, что надпись Пришло будет появляться всегда, хоть и с небольшими задержками.

eaa
eaa Autor

Нашел как обойти, но так и не понял причину.

Собственно, когда я ставлю точку останова, то приходит событие NewSecurities, если я ее не ставлю, то приходит SecuritiesChanged, и ловить эту бумагу надо в другом обработчике... Странно, но факт.

Если кто знает почему так - отпишите плз.

Mikhail Sukhov
Mikhail Sukhov

eaa: Если кто знает почему так - отпишите плз.

А мой ответ чем не подошел?

eaa
eaa Autor

Он не объясняет, почему в одном случае приходит NewSecurity, а в другом - SecurityChanged.

Mikhail Sukhov
Mikhail Sukhov

eaa: Он не объясняет, почему в одном случае приходит NewSecurity, а в другом - SecurityChanged.

Я думаю проблема в синхронизации данных. Вы пробовали создать простой приложение с кодом, которое я написал? Всегда ли приходит фьюч на РТС?

Alex2
Alex2

Mikhail Sukhov:

eaa: Он не объясняет, почему в одном случае приходит NewSecurity, а в другом - SecurityChanged.

Я думаю проблема в синхронизации данных. Вы пробовали создать простой приложение с кодом, которое я написал? Всегда ли приходит фьюч на РТС?

Подтверждаю, такая же проблема с RIZ0 Пробовал приведенный вами код для NewSecurities не срабатывает:

		trader.NewSecurities += securities =>
                    {
                        foreach (var security in securities)
                        {
                            if (security.Code == "RIZ0")
                            {
                                Console.WriteLine(security.Code);
                            }
                        }
                        

Бумага не находится.

А вот если поместить этот же код в trader.SecuritiesChanged RIZ0 находится.

ps: если бы не инфа в предыдущих постах о SecuritiesChanged - до сих пор ломал бы голову, почему не приходит RIZ0

Mikhail Sukhov
Mikhail Sukhov

Alex2: Подтверждаю, такая же проблема с RIZ0 Пробовал приведенный вами код для NewSecurities не срабатывает:

Ок, понятно. Проблема в том, что инструмент инициализируется позднее. Из-за того, что сделки (или заявки) по инструменту приходят раньше, чем сама информация по инструменту. Из-за этого в NewSecurities посылается не полностью инициализированный объект Security. Как вариант - смотрите на Security.Id, а не на Code. Он не изменяется в процессе работы.

Alex2
Alex2

Mikhail Sukhov:

Alex2: Подтверждаю, такая же проблема с RIZ0 Пробовал приведенный вами код для NewSecurities не срабатывает:

Ок, понятно. Проблема в том, что инструмент инициализируется позднее. Из-за того, что сделки (или заявки) по инструменту приходят раньше, чем сама информация по инструменту. Из-за этого в NewSecurities посылается не полностью инициализированный объект Security. Как вариант - смотрите на Security.Id, а не на Code. Он не изменяется в процессе работы.

Да, это помогло. Спасибо.