Привет. Продолжаю мучать эмулятор. Столкнулся с тем что иногда эмулятор никак не реагирует на выставление заявки. Обработчики стоят следующие:
this.When(newOrder.Registered())
.Do(() => {
log("заявка принята, id="+newOrder.TransactionId.ToString() + " vol="+newOrder.Volume);
});
this.When(newOrder.Failed())
.Do(() => {
log("failed");
});
this.When(newOrder.NewTrades())
.Do(() => { log("ордер исполнен"); });
На всякий случай ещё подписывался на Strategy.NewOrder и Strategy.OrderFailed - там тоже реакции не видно. Заявку отправляю с помощью Strategy.RegisterOrder. Повторюсь, что этот баг плавающий - т.е. он то есть, то его нет.
Upd: this - стратегия, унаследованная от Strategy
评论 (17)
登录 或 创建账户, 登录或注册以发表评论
Посмотрите, создаётся ли событие NewOrder у Trader, который инициализирован в стратегии, в том моменте, когда у Strategy ничего не поднимается.
Не совсем понял вопрос. Я писал, что Strategy.NewOrder тоже не вызывается в этом моменте, хотя до этого момента всё отрабатывает.
Т.е. до определённого момента этот код отлично работает:
А потом перестаёт.
P.S. Никаких циклов которые могут бесконечно зациклить поток, у меня нет. Эмулятор продолжает работать, в OnNewTrade сделки приходят:
Я понял. Подпишитесь на событие NewOrder у Strategy.Trader, посмотрите - поднимается ли событие там.
И да, что выдаёт ProcessDataError?
ProcessDataError - ни разу не вызывается NewOrders - ведёт себя точно также как и this.When(newOrder.Registered()) - т.е. работает до определённого момента, затем просто перестаёт. Вообще, по субъективным ощущениям эмулятор просто пропускает вызов Strategy.RegisterOrder.
Привожу на всякий случай весь код отправки заявки:
Примечания: Лог о том что заявка отправлена вижу, но реакции на это нет. Параметр order - это заявка созданная при помощи вызова Order.Clone(), с изменёнными Price и Volume. Неадекваное поведение случается только если order != null, но и то не всегда, - примерно 50 сделок отлично проходят.
Та же самая проблема на версии 4.0.0.22, код:
Ни одно из событий не вызывается в Orders - ноль заявок. Используется RealTimeEmulationTrader<QuikTrader>. Событие this.Trader.NewOrders, так же не вызывается. Ошибок на событие ProcessDataError никаких. Ошибка в реализации S#?
void SendOrder(decimal sellPrice) { var sellOrder = this.CreateOrder(OrderDirections.Sell, sellPrice, Volume); sellOrder.Registered().Do(orderRegistered); sellOrder.Matched().Do(orderMatched); sellOrder.RegisterFailed().Do(orderRegisteredFailed); RegisterOrder(sellOrder); }
void orderRegistered(Order order) { this.AddInfoLog("Выставлена {0} заявка номер {1} по цене {2}.", order.Direction, order.Id, order.Price); }
Есть два варианта вызова. Как я понял When не указывается когда правило непосредственно из заявки вызываем. из документации к S#:
Но и если делать так как предложили вы, тоже не происходит вызова события.
Начнем с простого. Пример запускали? Работает?
изменил регистрацию заявок через RegisterOrder(), и добавил такие же события как писал выше. После регистрации заявки вызова событий так же не происходит.
Имею ввиду тот пример, которые наиболее точно подходит к вашей ситуации.
не понял. Какой именно? Все примеры посмотрел, под Quik нет примера для тестирования на реальных рыночных данных.
Вы отписались в топик про EmulationTrader. Вы его используете или RTEmulation?
Если в примере заменить только шлюз, не меняя логику, он работает?
Пробовал такой вариант подписывания на события, так же вызова нет
Я нашел свою ошибку. Проблема была в том что я сначала подписывался на события NewSecurities, NewTrades для QuikTrader а после этого создавал RealTimeEmulationTrader<QuikTrader> и передавал его в стратегию.
Не думал что это влияет. Предлагаю отразить это в доке в разделе "Тестирование - На рыночных данных"
Так это очевидно. Вы подписываетесь на события одного шлюза,а работаете с другим. :)