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


Привет. Продолжаю мучать эмулятор.
Столкнулся с тем что иногда эмулятор никак не реагирует на выставление заявки.
Обработчики стоят следующие:
Код
			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 Ответов
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(), и добавил такие же события как писал выше.
После регистрации заявки вызова событий так же не происходит.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 04.04.2012
Ответить


PavelAd Перейти

Если имеете ввиду пример SampleRealTimeTesting


Имею ввиду тот пример, которые наиболее точно подходит к вашей ситуации.
Спасибо:

PavelAd

Фотография
Дата: 04.04.2012
Ответить


Mikhail Sukhov Перейти
PavelAd Перейти

Если имеете ввиду пример SampleRealTimeTesting


Имею ввиду тот пример, которые наиболее точно подходит к вашей ситуации.


не понял. Какой именно? Все примеры посмотрел, под Quik нет примера для тестирования на реальных рыночных данных.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 04.04.2012
Ответить


PavelAd Перейти
не понял. Какой именно? Все примеры посмотрел, под Quik нет примера для тестирования на реальных рыночных данных.


Вы отписались в топик про EmulationTrader. Вы его используете или RTEmulation?
Спасибо:

PavelAd

Фотография
Дата: 04.04.2012
Ответить


Mikhail Sukhov Перейти

Вы отписались в топик про EmulationTrader. Вы его используете или RTEmulation?

Использую RealTimeEmulationTrader
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 04.04.2012
Ответить


PavelAd Перейти
Mikhail Sukhov Перейти

Вы отписались в топик про EmulationTrader. Вы его используете или RTEmulation?

Использую RealTimeEmulationTrader


Если в примере заменить только шлюз, не меняя логику, он работает?
Спасибо:

PavelAd

Фотография
Дата: 05.04.2012
Ответить


Я нашел свою ошибку.
Проблема была в том что я сначала подписывался на события NewSecurities, NewTrades для QuikTrader
а после этого создавал RealTimeEmulationTrader<QuikTrader> и передавал его в стратегию.

Не думал что это влияет. Предлагаю отразить это в доке в разделе "Тестирование - На рыночных данных"
Спасибо:

Alexander

Фотография
Дата: 05.04.2012
Ответить


PavelAd Перейти
Я нашел свою ошибку.
Проблема была в том что я сначала подписывался на события NewSecurities, NewTrades для QuikTrader
а после этого создавал RealTimeEmulationTrader<QuikTrader> и передавал его в стратегию.

Не думал что это влияет. Предлагаю отразить это в доке в разделе "Тестирование - На рыночных данных"


Так это очевидно.
Вы подписываетесь на события одного шлюза,а работаете с другим. :)
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy