Жесть с NewMyTrades!!!! (не вызвалось событие NewMyTrades)
Atom Ответить
22.07.2011


Я веду подсчет открытой позиции самостоятельно - ловлю NewMyTrades,
и если бумага моя (==this.Security) то увеличиваю/уменьшаю (в зависимости от направления ордера по которому пришел трейд) счетчик int OpenedPosition в стратегии.

а сегодня столкнулся с серьезной проблемой

была открытая лонг позиция в 2 бумаги. это подтверждает и мой счетчик и PositionManager.Position:
22.07.2011 13:55:39.415 PositionManager.Position: 2; OpenedPosition:2

роботом был послан ордер на биржу на продажу 3х лотов:
22.07.2011 13:55:39.810 RegisterOrder: Ok! sec=LKU1 dir=SELL vol=3 price=18769,00

пока ордер висел позиция не менялась
22.07.2011 13:55:49.408 PnLManager.PnL: 2; OpenedPosition:2;

но потом вдруг - БЕЗ ВЫЗОВА NewMyTrade свойство PositionManager.Position изменилось!
22.07.2011 13:55:50.490 PnLManager.PnL: -1; OpenedPosition:2;
и в логах Квика видно что как раз в это время ордер был полностью исполнен!
Cursing

т.к. робот не знал о выполнении его ордера - трейды же не пришли, то продолжил торговать.
и через несколько секунд ситуация еще раз повторилось, а потом еще раз и до тех пор пока все средства со счета в ГО не ушли.
спасло только то что счет небольшой и цена далеко не ушла - вручную потом откупил совсем с небольшими потерями.Bored

как так получилось что NewMyTrade не был вызван???
и как можно перестраховаться от таких косяков в будущем???
как ЖЕЛЕЗНО узнать свою позицию???
Confused

PS> PositionManager.Position который показал правильную инфу тут постоянно неправильно показывает в других ситуациях

Теги:


Спасибо:




11 Ответов
Alexander

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


Говорил уже много раз - StrategyPositionManager по умолчанию, если не перегружали, считается по ордерам.

1) Указывайте в сообщениях о багах версию S#.
2) Что выводил ProcessDataError?


И опять же, повторюсь, я узнаю позицию так - под каждую систему завожу отдельный субсчёт. Позицию получаю из таблицы в квике:

Код
		protected int GetCurrentPosition()
		{
			return Trader.GetPosition(Portfolio, Security) != null
					   ? (int)Trader.GetPosition(Portfolio, Security).CurrentValue
					   : 0;
		}


Ни разу не было ни одного косяка.


P.S. Просьба названия темам давать более осмысленные :)
Спасибо: President

President

Фотография
Благотворитель
Дата: 23.07.2011
Ответить


1) Указывайте в сообщениях о багах версию S#.
версия S# - 3.2.5

2) Что выводил ProcessDataError?
не знаю. я его не выводил. теперь буду выводить.

а за GetCurrentPosition() огромное спасибо!
Автор топика
Спасибо:

hobo

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


Попробовал метод Александра на 3.2.5. - после 20 сделок расхождений нет, возьму на вооружение.
Ограничение: до запуска стратегии позиция должна быть 0, если нет - до первой сделки/заявки метод возвратит 0, что неверно.
Спасибо:

President

Фотография
Благотворитель
Дата: 23.07.2011
Ответить


хм.
а у меня в EmulationTrader при тестировании на случайных данных
this.Trader.GetPosition(Portfolio, Security)
всегда возвращает null.

а хотелось бы чтобы код работал одинаково и для тестирования и для реала.
Автор топика
Спасибо:

President

Фотография
Благотворитель
Дата: 25.07.2011
Ответить


при тестировании на рийл-тайме (RealTimeEmulationTrader)
this.Trader.GetPosition(Portfolio, Security)
также всегда возвращает null
хотя ордера уже исполнились и трейды прошли

т.о. вопрос о том как железно узнать свою позицию остается открытым.
Автор топика
Спасибо:

Alexander

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


Вопрос что выводит ProcessDataError ответа пока также не нашёл :)
Спасибо:

Alexander

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


President Перейти
при тестировании на рийл-тайме (RealTimeEmulationTrader)
this.Trader.GetPosition(Portfolio, Security)
также всегда возвращает null
хотя ордера уже исполнились и трейды прошли

т.о. вопрос о том как железно узнать свою позицию остается открытым.


Что передаётся в конструктор, какой трейдер?
Стабильно ли вызываются события NewOrders \ OrdersChanged \ OrdersFailed \ NewStopOrders \ StopOrdersChanged \ StopOrdersFailed
Спасибо:

President

Фотография
Благотворитель
Дата: 25.07.2011
Ответить


Alexander Перейти
President Перейти
при тестировании на рийл-тайме (RealTimeEmulationTrader)
this.Trader.GetPosition(Portfolio, Security)
также всегда возвращает null
хотя ордера уже исполнились и трейды прошли

т.о. вопрос о том как железно узнать свою позицию остается открытым.


Что передаётся в конструктор, какой трейдер?
Стабильно ли вызываются события NewOrders \ OrdersChanged \ OrdersFailed \ NewStopOrders \ StopOrdersChanged \ StopOrdersFailed


корневая стратегия это наследник от TimeFrameStrategy и у нее конструктор такой:
Код
		public MyStrategy(ITrader trader, TimeSpan timeFrame)
			: base(timeFrame)
		{
			this.Trader = trader;
			this.TimeFrame = timeFrame;
....

плюс в ней есть несколько вложенных подстратегий - они наследуются от Strategy.
и им в конструкторе делается: this.Trader = trader;

trader это RealTimeEmulationTrader (а в выходные пробовал с EmulationTrader на случайных числах)

по событиям:
NewOrder приходит на register ордера и reregister
OrderChanged приходит всегда группами по три штуки на отмену ордера и на его исполнение и на reregister
других событий я не видел.
Автор топика
Спасибо:

Alexander

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


Как создаётся RealTimeEmulationTrader?

Что выводит ProcessDataError, вопрос открыт до сих пор
Спасибо:

President

Фотография
Благотворитель
Дата: 25.07.2011
Ответить


Alexander Перейти
Как создаётся RealTimeEmulationTrader?

Что выводит ProcessDataError, вопрос открыт до сих пор

RealTimeEmulationTrader создается так:
Код
_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader());
_trader.Connected += () =>
{
...
   _trader.StartExport();
   _trader.ProcessDataError += error => this.GuiAsync(() =>
   {
 	MessageBox.Show(this, error.ToString(), "Ошибка");
   });
...
}
_trader.Connect();


ProcessDataError не прилетает.
Автор топика
Спасибо:

President

Фотография
Благотворитель
Дата: 10.08.2011
Ответить


8 августа снова повторилась эта бага во время реальных торгов - судя по логам выставленный ордер был полностью исполнен одним трейдом, IsMatched() вернул true
однако событие NewMyTrade не было вызвано!
ProcessDataError не вызывался.
Я считаю что это крайне серьезная бага для пользователей StockSharp - если алгоритм завязан на учет своих трейдов то по ее причине происходят серьезные убытки
Автор топика
Спасибо:


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

loading
clippy