← Zurück

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

Я веду подсчет открытой позиции самостоятельно - ловлю 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; и в логах Квика видно что как раз в это время ордер был полностью исполнен! 🤬

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

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (11)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

Говорил уже много раз - 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
President Autor
  1. Указывайте в сообщениях о багах версию S#. версия S# - 3.2.5

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

а за GetCurrentPosition() огромное спасибо!

hobo
hobo

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

President
President Autor

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

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

President
President Autor

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

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

Alexander
Alexander

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

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

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

President
President Autor

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
Alexander

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

Alexander
Alexander

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

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

President
President Autor

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
President Autor

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