← Atrás

Убрал словарь _isinSecurities

Так как теперь это поддерживается BaseTrader. Теперь все события, которые пришли для plaza_security_id, и при этом инструмента такого еще не было получено, "сохраняются" в очередь через метод ProcessSecurityAction. И как только такой инструмент будет получен, то все эти сохраненные действия будут обработаны.

Не понял смысла _quotes. Зачем оно?

¿Le resultó útil este tema?

Compartir tema

Comentarios (35)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

aspirant
aspirant

Mikhail Sukhov: Не понял смысла _quotes. Зачем оно?

Это словарь стаканов, по которым клиент получает котировки. На нашем коде лежит обязанность отслеживать, живая ли это котировка, или ее нужно удалить из стакана. Подробно это описано здесь.

Если бы у класса Ecng.Trading.BusinessEntities.Quote было уникальное свойство string/long Id, в которое я бы вставлял значение replID, и потом по этому ключу можно было внутри Ecng.Trading.BusinessEntities.MarketDepth находить/редактировать/удалять нужный элемент типа Quote, _quotes было бы не нужно. Можешь что-нибудь похожее сделать? А то сейчас мне приходится самому хранить набор котировок, и всякий раз когда приходит новая котировка, перезаполнять MarketDepth (см. реализацию метода PlazaTrader.OnAggregationDataInserted).

Я думал, что настроил работу стаканов с глубиной 5, но пока писал это сообщение, понял, что похоже неправильно. На выходных буду исправлять.

Еще: у Плазы три разных стакана с глубиной 5, 20 и 50, а нас для каждой бумаги только один стакан. Ломаю голову, как это соединить вместе.

aspirant
aspirant

aspirant: Я думал, что настроил работу стаканов с глубиной 5, но пока писал это сообщение, понял, что похоже неправильно. На выходных буду исправлять.

Исправил, а то я все недоумевал, почему у меня по некоторым бумагам пустые стаканы.

Кстати, очень важно: фильтрации похоже не будет. Иначе потом не сможем собрать стакан по бумаге, которой не было в фильтре.

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant: Если бы у класса Ecng.Trading.BusinessEntities.Quote было уникальное свойство string/long Id, в которое я бы вставлял значение replID, и потом по этому ключу можно было внутри Ecng.Trading.BusinessEntities.MarketDepth находить/редактировать/удалять нужный элемент типа Quote, _quotes было бы не нужно.

Как насчет использования Quote.ExtensionInfo?

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

aspirant: Я думал, что настроил работу стаканов с глубиной 5, но пока писал это сообщение, понял, что похоже неправильно. На выходных буду исправлять.

Исправил, а то я все недоумевал, почему у меня по некоторым бумагам пустые стаканы.

Кстати, очень важно: фильтрации похоже не будет. Иначе потом не сможем собрать стакан по бумаге, которой не было в фильтре.

Предлагаю пока забить на фильтр и выбор глубины стакана, пусть будет какой-то. Например, 5, раз ты уже с ним начал работу. Надо уже собирать воедино экспорт и работу с заявками. У меня вот что-то экспорт не работает.

aspirant
aspirant

aspirant: Как насчет использования Quote.ExtensionInfo?Не затормозим? Алгоритм такой, что нужно будет каждый раз в него лезть. Посмотри реализацию OnAggregationDataInserted.

aspirant
aspirant

Mikhail Sukhov: Предлагаю пока забить на фильтр и выбор глубины стакана, пусть будет какой-то. Например, 5, раз ты уже с ним начал работу. Пятерки работают и с опционами, и с фьючерсами.

Mikhail Sukhov: У меня вот что-то экспорт не работает. А что конкретно не работает? У меня приходят инструменты и стаканы.

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant: А что конкретно не работает? У меня приходят инструменты и стаканы.

Они отображаются в SampleGUI?

aspirant
aspirant

Mikhail Sukhov: Они отображаются в SampleGUI?

Да, конечно, я думаю, у тебя дело в номере порта.

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

Mikhail Sukhov: Они отображаются в SampleGUI?

Да, конечно, я думаю, у тебя дело в номере порта.

На 3001 вообще не подключалось... А ты можешь проверить на последних исходниках?

Mikhail Sukhov
Mikhail Sukhov Autor

Mikhail Sukhov:

aspirant:

Mikhail Sukhov: Они отображаются в SampleGUI?

Да, конечно, я думаю, у тебя дело в номере порта.

На 3001 вообще не подключалось... А ты можешь проверить на последних исходниках?

Ну я лошара. Там же фильтры стоят😂

upd: У меня работает и с 4001. Зачем тогда менять порт по умолчанию?

aspirant
aspirant

Mikhail Sukhov: Там же фильтры стоят😂

Какие фильтры?

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

Mikhail Sukhov: Там же фильтры стоят😂

Какие фильтры?

В окне Инструменты есть выпадающие списки.

aspirant
aspirant

Mikhail Sukhov:

aspirant:

Mikhail Sukhov: Там же фильтры стоят😂

Какие фильтры?

В окне Инструменты есть выпадающие списки.

А ну да, я тоже не сразу додумал. А зачем, кстати, два выпадающих списка? У всех же оцпионов класс бумаги OPT, а у всех фьючерсов - FUT. Может второй список убрать?

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant: А зачем, кстати, два выпадающих списка? У всех же оцпионов класс бумаги OPT, а у всех фьючерсов - FUT. Может второй список убрать?

Это же копи-пастинг.

aspirant
aspirant

Попытался запустить PlazaTrader. В OnSessionContentsFutureStreamInserted вылетело исключение:

InvalidOperationException: Инструмент инструмента 158622 торговой системы уже имеет ассоциацию

Не посмотришь, почему?

Mikhail Sukhov
Mikhail Sukhov Autor

Попытался запустить PlazaTrader. В OnSessionContentsFutureStreamInserted вылетело исключение:

InvalidOperationException: Инструмент инструмента 158622 торговой системы уже имеет ассоциацию

Не посмотришь, почему?

Залью фикс. Вкратце - http://forum.rts.ru/viewtopic.asp?t=21079

aspirant
aspirant

Mikhail Sukhov: Вкратце - http://forum.rts.ru/viewtopic.asp?t=21079

Вообще, конечно, это досадно, что isin_id не уникален. Залей побыстрее. Хочу с заявками покопаться.

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

Mikhail Sukhov: Вкратце - http://forum.rts.ru/viewtopic.asp?t=21079

Вообще, конечно, это досадно, что isin_id не уникален. Залей побыстрее. Хочу с заявками покопаться.

Так уже.

esper
esper

Он уникален, но только в пределах сессии, вот почему в текущую сессию могут придти данные по инструментам за следующую сессию довольно интересно.

aspirant
aspirant

Жесть, убил вчера часов пять на эту асинхронную отправку. Прикол весь был в том, что в плазовском примере все работало, а в PlazaTrader все время выкидывало InvalidCastException. Причем под конец код отправки сообщения в обоих случаях был идентичен. Путем перебора всего что можно пять минут назад нашел решение: у наследника IP2AsyncSendEvent2 (в PlazaTrader - это MessageDispatcher внутри TransactionManager) не должно быть ничего (методов, свойств и т.д.) кроме void IP2AsyncSendEvent2.SendAsync2Reply(CP2BLMessage reply, uint errCode, long eventParam). Еврика!!! Ничего пока не заливал. Попробую сделать вечером.

esper
esper

Возможно там просто атрибута [System.Runtime.InteropServices.ComVisible(true)] не было? У меня в другом проекте такой код

/// <summary> /// Объект обратного вызова для получения результата доставки сообщения /// </summary> [System.Runtime.InteropServices.ComVisible(true)] public class SendAsync2Event : IP2AsyncSendEvent2 { ExecutedEventHandler handler = null;

/// <summary>
/// Инициализировать объект обратного вызова
/// </summary>
/// <param name="handler">Делегат для вызова при доставке сообщения</param>
public SendAsync2Event(ExecutedEventHandler handler)
{
    this.handler = handler;
}

/// <summary>
/// Метод вызывается после доставки сообщения плазой
/// </summary>
/// <param name="reply"></param>
/// <param name="errCode"></param>
/// <param name="type"></param>
void IP2AsyncSendEvent2.SendAsync2Reply(CP2BLMessage reply, uint errCode, long type)
{
    if (handler != null)
    {
        handler(new OrderResult(reply, errCode, type));
    }
}

} работает без проблем.

aspirant
aspirant

esper: Возможно там просто атрибута [System.Runtime.InteropServices.ComVisible(true)] не было?

Забираю эврику обратно😢 Дело действительно в [System.Runtime.InteropServices.ComVisible(true)] + класс обязательно должен быть public (в нашем случае MessageDispatcher). Без public атрибута [System.Runtime.InteropServices.ComVisible(true)] недостаточно. Его я поставил вчера на 30-ой минуте, но исключения сыпаться не перестали.

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

esper: Возможно там просто атрибута [System.Runtime.InteropServices.ComVisible(true)] не было?

Забираю эврику обратно😢 Дело действительно в [System.Runtime.InteropServices.ComVisible(true)] + класс обязательно должен быть public (в нашем случае MessageDispatcher). Без public атрибута [System.Runtime.InteropServices.ComVisible(true)] недостаточно. Его я поставил вчера на 30-ой минуте, но исключения сыпаться не перестали.

А зачем закомментил AddMyTrade(0, orderTransactionId, trade);? Не работает?

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

esper: Возможно там просто атрибута [System.Runtime.InteropServices.ComVisible(true)] не было?

Забираю эврику обратно😢 Дело действительно в [System.Runtime.InteropServices.ComVisible(true)] + класс обязательно должен быть public (в нашем случае MessageDispatcher). Без public атрибута [System.Runtime.InteropServices.ComVisible(true)] недостаточно. Его я поставил вчера на 30-ой минуте, но исключения сыпаться не перестали.

Мне кажется, достаточно только public сделать.

aspirant
aspirant

Mikhail Sukhov: А зачем закомментил AddMyTrade(0, orderTransactionId, trade);? Не работает?

Этого метода нет🤨 У меня с ним не проект не компилился.

esper
esper

Mikhail Sukhov: Мне кажется, достаточно только public сделать.

Сейчас проверил в другом проекте, без атрибута не работает.

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: Мне кажется, достаточно только public сделать.

Сейчас проверил в другом проекте, без атрибута не работает.

А у меня работает.😒 А как проверяли?

esper
esper

Mikhail Sukhov: А у меня работает.😒 А как проверяли?

Код я приводил выше, просто убрал оттуда атрибут. Без атрибута исключениее на SendAsync2, с атрибутом все нормально. Это и правда становится интересно...

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: А у меня работает.😒 А как проверяли?

Код я приводил выше, просто убрал оттуда атрибут. Без атрибута исключениее на SendAsync2, с атрибутом все нормально. Это и правда становится интересно...

Стоп машина. Если исключение возникает на SendAsync2, то оно должно возникнуть и на Send. Просто в синхронном режиме ошибки получались читаемые (с описанием), а в асинхронном была ошибка InvalidCastException. Теперь, когда сделали MessageDispatcher ошибки в SendAsync2 так же стали читаемые. Я проверял это на отправке заявки с ценой = 1. Убрал атрибут ComVisible, ошибки опять читаемые. Как только сделал класс private - тут же вместо описания ошибки опять InvalidCastException.

esper
esper

Mikhail Sukhov:

esper:

Mikhail Sukhov: А у меня работает.😒 А как проверяли?

Код я приводил выше, просто убрал оттуда атрибут. Без атрибута исключениее на SendAsync2, с атрибутом все нормально. Это и правда становится интересно...

Стоп машина. Если исключение возникает на SendAsync2, то оно должно возникнуть и на Send. Просто в синхронном режиме ошибки получались читаемые (с описанием), а в асинхронном была ошибка InvalidCastException. Теперь, когда сделали MessageDispatcher ошибки в SendAsync2 так же стали читаемые. Я проверял это на отправке заявки с ценой = 1. Убрал атрибут ComVisible, ошибки опять читаемые. Как только сделал класс private - тут же вместо описания ошибки опять InvalidCastException.

Так Send вроде как IP2AsyncSendEvent2 не использует и ошибки связанной с ним там быть не должно🤨

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov:

esper:

Mikhail Sukhov: А у меня работает.😒 А как проверяли?

Код я приводил выше, просто убрал оттуда атрибут. Без атрибута исключениее на SendAsync2, с атрибутом все нормально. Это и правда становится интересно...

Стоп машина. Если исключение возникает на SendAsync2, то оно должно возникнуть и на Send. Просто в синхронном режиме ошибки получались читаемые (с описанием), а в асинхронном была ошибка InvalidCastException. Теперь, когда сделали MessageDispatcher ошибки в SendAsync2 так же стали читаемые. Я проверял это на отправке заявки с ценой = 1. Убрал атрибут ComVisible, ошибки опять читаемые. Как только сделал класс private - тут же вместо описания ошибки опять InvalidCastException.

Так Send вроде как IP2AsyncSendEvent2 не использует и ошибки связанной с ним там быть не должно🤨

Не использует.

aspirant
aspirant

Mikhail Sukhov:

esper:

Mikhail Sukhov:

esper:

Mikhail Sukhov: А у меня работает.😒 А как проверяли?

Код я приводил выше, просто убрал оттуда атрибут. Без атрибута исключениее на SendAsync2, с атрибутом все нормально. Это и правда становится интересно...

Стоп машина. Если исключение возникает на SendAsync2, то оно должно возникнуть и на Send. Просто в синхронном режиме ошибки получались читаемые (с описанием), а в асинхронном была ошибка InvalidCastException. Теперь, когда сделали MessageDispatcher ошибки в SendAsync2 так же стали читаемые. Я проверял это на отправке заявки с ценой = 1. Убрал атрибут ComVisible, ошибки опять читаемые. Как только сделал класс private - тут же вместо описания ошибки опять InvalidCastException.

Так Send вроде как IP2AsyncSendEvent2 не использует и ошибки связанной с ним там быть не должно🤨

Не использует.

Подведу итог вашей дискуссии: в синхронном режиме приходят читаемые ошибки - это ответ Плазы, в асинхронном, если сделать класс private, InvalidCastException - это "привет" Interop'а. Кстати, судя по ответу плазовца эти два метода (Send / SendAsync) внутри реализованы по-разному.

Я только что обновил p2fortsgate_messages.ini в ресурсах. Может быть исправить код, чтобы PlazaTrader всегда создавал этот файл с нуля? У меня была старая версия этого файла, и вместо нормального ответа на русском, я получал расплывчатое сообщение на английском. Все стало на свои места, после того как я нашел твой пост, Михаил.

esper
esper

aspirant: Подведу итог вашей дискуссии: в синхронном режиме приходят читаемые ошибки - это ответ Плазы, в асинхронном, если сделать класс private, InvalidCastException - это "привет" Interop'а. Кстати, судя по ответу плазовца эти два метода (Send / SendAsync) внутри реализованы по-разному.

Еще один момент, атрибут ComVisible у класса действительно не нужен, но только в том случае, если вся сборка у нас ComVisible

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

Mikhail Sukhov: А зачем закомментил AddMyTrade(0, orderTransactionId, trade);? Не работает?

Этого метода нет🤨 У меня с ним не проект не компилился.

Обнови References.

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant: Я только что обновил p2fortsgate_messages.ini в ресурсах. Может быть исправить код, чтобы PlazaTrader всегда создавал этот файл с нуля? У меня была старая версия этого файла, и вместо нормального ответа на русском, я получал расплывчатое сообщение на английском. Все стало на свои места, после того как я нашел твой пост, Михаил.

У меня в последнем дистрибутиве другой формат p2fortsgate_messages.ini.