EmulationTrader: не приходит ответ на выставление заявки

EmulationTrader: не приходит ответ на выставление заявки
Atom
7/25/2011
romanick


Привет. Продолжаю мучать эмулятор. Столкнулся с тем что иногда эмулятор никак не реагирует на выставление заявки. Обработчики стоят следующие:

			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




Thanks:


1 2  >
Alexander

Avatar
Date: 7/25/2011
Reply


Посмотрите, создаётся ли событие NewOrder у Trader, который инициализирован в стратегии, в том моменте, когда у Strategy ничего не поднимается.

Thanks:

romanick

Avatar
Date: 7/25/2011
Reply


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);
Thanks:

Alexander

Avatar
Date: 7/25/2011
Reply


Я понял. Подпишитесь на событие NewOrder у Strategy.Trader, посмотрите - поднимается ли событие там.

И да, что выдаёт ProcessDataError?

Thanks:

romanick

Avatar
Date: 7/25/2011
Reply


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 сделок отлично проходят.

Thanks:

PavelAd

Avatar
Date: 4/4/2012
Reply


Та же самая проблема на версии 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#?

Thanks:

pyhta4og

Avatar
Date: 4/4/2012
Reply


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 не написали.
Thanks:

PavelAd

Avatar
Date: 4/4/2012
Reply


Пробовал такой вариант подписывания на события, так же вызова нет

      
      this.When(sellOrder.Registered()).Do(orderRegistered);      
      this.When(sellOrder.Matched()).Do(orderMatched);
      this.When(sellOrder.RegisterFailed()).Do(orderRegisteredFailed);

Thanks:

PavelAd

Avatar
Date: 4/4/2012
Reply


pyhta4og: Вы When не написали.

Есть два варианта вызова. Как я понял When не указывается когда правило непосредственно из заявки вызываем. из документации к S#:

В Visual Basic и C# этот метод можно вызывать как метод экземпляра для любого объекта типа Order. При вызове метода для экземпляра следует опускать первый параметр.

Но и если делать так как предложили вы, тоже не происходит вызова события.

Thanks:

Mikhail Sukhov

Avatar
Date: 4/4/2012
Reply


Начнем с простого. Пример запускали? Работает?

Thanks:

PavelAd

Avatar
Date: 4/4/2012
Reply


Mikhail Sukhov: Начнем с простого. Пример запускали? Работает? Если имеете ввиду пример SampleRealTimeTesting то за неимением SmartCOM проверить не могу. Но изменил в примере SampleSMA создание шлюза на:

_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(Path.Text));

изменил регистрацию заявок через RegisterOrder(), и добавил такие же события как писал выше. После регистрации заявки вызова событий так же не происходит.

Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy