Alexander
|
Дата: 25.07.2011
Посмотрите, создаётся ли событие NewOrder у Trader, который инициализирован в стратегии, в том моменте, когда у Strategy ничего не поднимается.
|
|
Спасибо:
|
|
|
|
|
romanick
|
Дата: 25.07.2011
Alexander Посмотрите, создаётся ли событие NewOrder у Trader, который инициализирован в стратегии, в том моменте, когда у Strategy ничего не поднимается. Не совсем понял вопрос. Я писал, что Strategy.NewOrder тоже не вызывается в этом моменте, хотя до этого момента всё отрабатывает. Т.е. до определённого момента этот код отлично работает: Код
this.NewOrder += (Order obj) => {
log("newOrder="+obj.TransactionId);
};
this.OrderFailed += (OrderFail obj) => {
log("fail="+obj.Order.TransactionId);
};
А потом перестаёт. P.S. Никаких циклов которые могут бесконечно зациклить поток, у меня нет. Эмулятор продолжает работать, в OnNewTrade сделки приходят: Код
this.When(tradeData.security.SecurityNewTrades())
.Do(OnNewTrade);
|
|
Спасибо:
|
|
|
|
|
Alexander
|
Дата: 25.07.2011
Я понял. Подпишитесь на событие NewOrder у Strategy.Trader, посмотрите - поднимается ли событие там.
И да, что выдаёт ProcessDataError?
|
|
Спасибо:
|
|
|
|
|
romanick
|
Дата: 25.07.2011
|
|
|
|
Alexander Я понял. Подпишитесь на событие NewOrder у Strategy.Trader, посмотрите - поднимается ли событие там.
И да, что выдаёт ProcessDataError? Код
this.Trader.ProcessDataError += (Exception obj) => {
log("[ProcessDataError] "+obj.Message);
};
this.Trader.NewOrders += (IEnumerable<Order> obj) => {
log("[NewOrders] "+obj.First().TransactionId);
};
ProcessDataError - ни разу не вызывается NewOrders - ведёт себя точно также как и this.When(newOrder.Registered()) - т.е. работает до определённого момента, затем просто перестаёт. Вообще, по субъективным ощущениям эмулятор просто пропускает вызов Strategy.RegisterOrder. Привожу на всякий случай весь код отправки заявки: Код
void SendOrder(OrderDirections dir, Order order = null)
{
Order newOrder;
if(order == null){
newOrder = new Order{
Portfolio = tradeData.portfolio,
Price = dir== OrderDirections.Buy?bBandsBottom:bBandsTop,
Security = tradeData.security,
Volume = current_params.MPLimit,
Direction = dir,
Type = OrderTypes.Limit
};
} else
newOrder = order;
this.When(newOrder.Failed())
.Do(() => {
SendedOrderFailed(newOrder);
if (dir==OrderDirections.Buy)
buyOrder = null;
else
sellOrder = null;
});
this.When(newOrder.Registered())
.Do(() => {
try{
log(dir+"-заявка принята, id="+newOrder.TransactionId.ToString() + " vol="+newOrder.Volume);
if (dir==OrderDirections.Buy && order == null && sellOrder == null && !wasMoved){
SendOrder(OrderDirections.Sell); // отправляем противозаявку
}
}catch(Exception ex){
log("ex1:"+ex.Message);
}
});
if (order == null)
this.When(newOrder.NewTrades())
.Do(() => { OnMyOpenTrade(newOrder); });
else
this.When(newOrder.NewTrades())
.Do(() => {
try{
OnMyClosingTrade(newOrder);
}catch(Exception ex){
log("ex2:"+ex.Message);
}
});
if (dir == OrderDirections.Buy)
buyOrder = newOrder;
else
sellOrder = newOrder;
RegisterOrder(newOrder);
log(dir+"-заявка отправлена "+newOrder.Price+" "+newOrder.Volume, true);
}
Примечания: Лог о том что заявка отправлена вижу, но реакции на это нет. Параметр order - это заявка созданная при помощи вызова Order.Clone(), с изменёнными Price и Volume. Неадекваное поведение случается только если order != null, но и то не всегда, - примерно 50 сделок отлично проходят.
|
|
Спасибо:
|
|
|
|
|
PavelAd
|
Дата: 04.04.2012
Та же самая проблема на версии 4.0.0.22, код: Код
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);
}
void orderRegisteredFailed(OrderFail orderFail) {
this.AddWarningLog("Ошибка регистрации заявки: {0}", orderFail.Error);
}
void orderMatched(Order order) {
this.AddInfoLog("Исполнена {0} заявка номер {1} по цене {2}.", order.Direction, order.Id, order.Price);
}
Ни одно из событий не вызывается в Orders - ноль заявок. Используется RealTimeEmulationTrader<QuikTrader>. Событие this.Trader.NewOrders, так же не вызывается. Ошибок на событие ProcessDataError никаких. Ошибка в реализации S#?
|
|
Спасибо:
|
|
|
|
|
pyhta4og
|
Дата: 04.04.2012
|
|
|
|
PavelAd Та же самая проблема на версии 4.0.0.22, код: Код
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);
}
void orderRegisteredFailed(OrderFail orderFail) {
this.AddWarningLog("Ошибка регистрации заявки: {0}", orderFail.Error);
}
void orderMatched(Order order) {
this.AddInfoLog("Исполнена {0} заявка номер {1} по цене {2}.", order.Direction, order.Id, order.Price);
}
Ни одно из событий не вызывается в Orders - ноль заявок. Используется RealTimeEmulationTrader<QuikTrader>. Событие this.Trader.NewOrders, так же не вызывается. Ошибок на событие ProcessDataError никаких. Ошибка в реализации S#? When(sellOrder.Registered()).Do(orderRegistered); Вы When не написали.
|
|
Спасибо:
|
|
|
|
|
PavelAd
|
Дата: 04.04.2012
Пробовал такой вариант подписывания на события, так же вызова нет Код
this.When(sellOrder.Registered()).Do(orderRegistered);
this.When(sellOrder.Matched()).Do(orderMatched);
this.When(sellOrder.RegisterFailed()).Do(orderRegisteredFailed);
|
|
Спасибо:
|
|
|
|
|
PavelAd
|
Дата: 04.04.2012
pyhta4og Вы When не написали.
Есть два варианта вызова. Как я понял When не указывается когда правило непосредственно из заявки вызываем. из документации к S#: Цитата:В Visual Basic и C# этот метод можно вызывать как метод экземпляра для любого объекта типа Order. При вызове метода для экземпляра следует опускать первый параметр. Но и если делать так как предложили вы, тоже не происходит вызова события.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 04.04.2012
Начнем с простого. Пример запускали? Работает?
|
|
Спасибо:
|
|
|
|
|
PavelAd
|
Дата: 04.04.2012
Mikhail Sukhov Начнем с простого. Пример запускали? Работает? Если имеете ввиду пример SampleRealTimeTesting то за неимением SmartCOM проверить не могу. Но изменил в примере SampleSMA создание шлюза на: Код
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(Path.Text));
изменил регистрацию заявок через RegisterOrder(), и добавил такие же события как писал выше. После регистрации заявки вызова событий так же не происходит.
|
|
Спасибо:
|
|
|
|