Так как теперь это поддерживается BaseTrader. Теперь все события, которые пришли для plaza_security_id, и при этом инструмента такого еще не было получено, "сохраняются" в очередь через метод ProcessSecurityAction. И как только такой инструмент будет получен, то все эти сохраненные действия будут обработаны.
Не понял смысла _quotes. Зачем оно?
コメント (35)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Это словарь стаканов, по которым клиент получает котировки. На нашем коде лежит обязанность отслеживать, живая ли это котировка, или ее нужно удалить из стакана. Подробно это описано здесь.
Если бы у класса Ecng.Trading.BusinessEntities.Quote было уникальное свойство string/long Id, в которое я бы вставлял значение replID, и потом по этому ключу можно было внутри Ecng.Trading.BusinessEntities.MarketDepth находить/редактировать/удалять нужный элемент типа Quote, _quotes было бы не нужно. Можешь что-нибудь похожее сделать? А то сейчас мне приходится самому хранить набор котировок, и всякий раз когда приходит новая котировка, перезаполнять MarketDepth (см. реализацию метода PlazaTrader.OnAggregationDataInserted).
Я думал, что настроил работу стаканов с глубиной 5, но пока писал это сообщение, понял, что похоже неправильно. На выходных буду исправлять.
Еще: у Плазы три разных стакана с глубиной 5, 20 и 50, а нас для каждой бумаги только один стакан. Ломаю голову, как это соединить вместе.
Исправил, а то я все недоумевал, почему у меня по некоторым бумагам пустые стаканы.
Кстати, очень важно: фильтрации похоже не будет. Иначе потом не сможем собрать стакан по бумаге, которой не было в фильтре.
Как насчет использования Quote.ExtensionInfo?
Предлагаю пока забить на фильтр и выбор глубины стакана, пусть будет какой-то. Например, 5, раз ты уже с ним начал работу. Надо уже собирать воедино экспорт и работу с заявками. У меня вот что-то экспорт не работает.
Они отображаются в SampleGUI?
Да, конечно, я думаю, у тебя дело в номере порта.
На 3001 вообще не подключалось... А ты можешь проверить на последних исходниках?
Ну я лошара. Там же фильтры стоят😂
upd: У меня работает и с 4001. Зачем тогда менять порт по умолчанию?
Какие фильтры?
В окне Инструменты есть выпадающие списки.
А ну да, я тоже не сразу додумал. А зачем, кстати, два выпадающих списка? У всех же оцпионов класс бумаги OPT, а у всех фьючерсов - FUT. Может второй список убрать?
Это же копи-пастинг.
Попытался запустить PlazaTrader. В OnSessionContentsFutureStreamInserted вылетело исключение:
Не посмотришь, почему?
Попытался запустить PlazaTrader. В OnSessionContentsFutureStreamInserted вылетело исключение:
Не посмотришь, почему?
Залью фикс. Вкратце - http://forum.rts.ru/viewtopic.asp?t=21079
Вообще, конечно, это досадно, что isin_id не уникален. Залей побыстрее. Хочу с заявками покопаться.
Так уже.
Он уникален, но только в пределах сессии, вот почему в текущую сессию могут придти данные по инструментам за следующую сессию довольно интересно.
Жесть, убил вчера часов пять на эту асинхронную отправку. Прикол весь был в том, что в плазовском примере все работало, а в PlazaTrader все время выкидывало InvalidCastException. Причем под конец код отправки сообщения в обоих случаях был идентичен. Путем перебора всего что можно пять минут назад нашел решение: у наследника IP2AsyncSendEvent2 (в PlazaTrader - это MessageDispatcher внутри TransactionManager) не должно быть ничего (методов, свойств и т.д.) кроме void IP2AsyncSendEvent2.SendAsync2Reply(CP2BLMessage reply, uint errCode, long eventParam). Еврика!!! Ничего пока не заливал. Попробую сделать вечером.
Возможно там просто атрибута [System.Runtime.InteropServices.ComVisible(true)] не было? У меня в другом проекте такой код
Забираю эврику обратно😢 Дело действительно в [System.Runtime.InteropServices.ComVisible(true)] + класс обязательно должен быть public (в нашем случае MessageDispatcher). Без public атрибута [System.Runtime.InteropServices.ComVisible(true)] недостаточно. Его я поставил вчера на 30-ой минуте, но исключения сыпаться не перестали.
А зачем закомментил AddMyTrade(0, orderTransactionId, trade);? Не работает?
Мне кажется, достаточно только public сделать.
Этого метода нет🤨 У меня с ним не проект не компилился.
Сейчас проверил в другом проекте, без атрибута не работает.
А у меня работает.😒 А как проверяли?
Код я приводил выше, просто убрал оттуда атрибут. Без атрибута исключениее на SendAsync2, с атрибутом все нормально. Это и правда становится интересно...
Стоп машина. Если исключение возникает на SendAsync2, то оно должно возникнуть и на Send. Просто в синхронном режиме ошибки получались читаемые (с описанием), а в асинхронном была ошибка InvalidCastException. Теперь, когда сделали MessageDispatcher ошибки в SendAsync2 так же стали читаемые. Я проверял это на отправке заявки с ценой = 1. Убрал атрибут ComVisible, ошибки опять читаемые. Как только сделал класс private - тут же вместо описания ошибки опять InvalidCastException.
Так Send вроде как IP2AsyncSendEvent2 не использует и ошибки связанной с ним там быть не должно🤨
Не использует.
Подведу итог вашей дискуссии: в синхронном режиме приходят читаемые ошибки - это ответ Плазы, в асинхронном, если сделать класс private, InvalidCastException - это "привет" Interop'а. Кстати, судя по ответу плазовца эти два метода (Send / SendAsync) внутри реализованы по-разному.
Я только что обновил p2fortsgate_messages.ini в ресурсах. Может быть исправить код, чтобы PlazaTrader всегда создавал этот файл с нуля? У меня была старая версия этого файла, и вместо нормального ответа на русском, я получал расплывчатое сообщение на английском. Все стало на свои места, после того как я нашел твой пост, Михаил.
Еще один момент, атрибут ComVisible у класса действительно не нужен, но только в том случае, если вся сборка у нас ComVisible
Обнови References.
У меня в последнем дистрибутиве другой формат p2fortsgate_messages.ini.