← Atrás

S# 4.1.5: перестало срабатывать правило WhenNewMyTrades()

Напишу сразу несколько проблем с которыми столкнулся при переходе на новые версии. Выкачал с codeplex из trunk версию S# (4.1.5 видимо) и стратегия перестала заходить в функцию обработчик правила WhenNewMyTrades(). Правило добавляю так: this.WhenNewMyTrades().Do(Proc).Apply(this); Сделки в системе есть. В логах ничего, и ошибок не выдает. На версиях 4.1.4 и 4.1.3 работало.

Еще RealTimeEmulationTrader при работе выкидывает Exception:

|Error |QuikTrader|System.InvalidOperationException: Priority queue is empty at Ecng.Collections.PriorityQueue2.Peek() at Ecng.Collections.PriorityQueue2.PeekValue() at StockSharp.Algo.Testing.MarketEmulator.#=qJBGOJSwSh1TIzfSCaBP_NjwG2KLTkF4SftYzOjliS5k=.#=qyHleL509f0chKkK2FQrqgg==() at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader1.#=qfiTYh07Tf3X0oetJXF6rUxRfV7XLv04MClyynJxpMZ8=(IEnumerable1 #=q4rrcDObcvigkYsB8qiYEmA==) at Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) at Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable`1 items)

Также с версии 4.1.3 (раньше был на 4.0) не работают правила Security.WhenBestBidPriceLess() и Security.WhenBestAskPriceLess(); - тоже просто не заходит в обработчик. Может быть это просто связано с какими то изменениями и надо стратегии/правила/EmulationTrader как-то по-другому запускать? Заранее спасибо!

¿Le resultó útil este tema?

Compartir tema

Comentarios (16)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

esper
esper

Это все на эмуляторе?

Ant.On.
Ant.On. Autor

нет, на эмуляторе сделки не проходят. Это на реальных сделках не работает

esper
esper

🤨 Все же не понял, где именно не работает? Лог нужен в любом случае.

Ant.On.
Ant.On. Autor

Есть 3 проблемы:

  1. Проблема с эмулятором: не срабатывает лимитный ордер (рыночный работает и сделки совершаются). Лог если кидать выше рынка (Exception из-за того что стакан открыт старый, если стакан открыть заново в ТС, то его нет - может баг?):

2012/10/16 19:17:17.810| |QuikTrader|Экспорт запущен. 2012/10/16 19:17:18.669|Error |QuikTrader|System.InvalidOperationException: Priority queue is empty at Ecng.Collections.PriorityQueue2.Peek() at Ecng.Collections.PriorityQueue2.PeekValue() at StockSharp.Algo.Testing.MarketEmulator.#=qJBGOJSwSh1TIzfSCaBP_NjwG2KLTkF4SftYzOjliS5k=.#=qyHleL509f0chKkK2FQrqgg==() at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader1.#=qfiTYh07Tf3X0oetJXF6rUxRfV7XLv04MClyynJxpMZ8=(IEnumerable1 #=q4rrcDObcvigkYsB8qiYEmA==) at Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) at Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable1 items) 2012/10/16 19:17:18.701|Error |QuikTrader|System.InvalidOperationException: Priority queue is empty at Ecng.Collections.PriorityQueue2.Peek() at Ecng.Collections.PriorityQueue2.PeekValue() at StockSharp.Algo.Testing.MarketEmulator.#=qJBGOJSwSh1TIzfSCaBP_NjwG2KLTkF4SftYzOjliS5k=.#=qyHleL509f0chKkK2FQrqgg==() at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader1.#=qfiTYh07Tf3X0oetJXF6rUxRfV7XLv04MClyynJxpMZ8=(IEnumerable1 #=q4rrcDObcvigkYsB8qiYEmA==) at Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) at Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable1 items) 2012/10/16 19:19:48.263| |PTC_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,-1]. Позиция при старте 0. 2012/10/16 19:19:48.294| |Q_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,2]. Позиция при старте 0. 2012/10/16 19:19:48.326| |BS_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [2,1]. Позиция при старте 0. 2012/10/16 19:19:49.701| |PTC_SBRF-12.12@RTS_SPBFUT00360|Новая позиция: SPBFUT00360-SBRF-12.12@RTS=1. 2012/10/16 19:19:49.701| |BS_SBRF-12.12@RTS_SPBFUT00360|Новая позиция: SPBFUT00360-SBRF-12.12@RTS=1. 2012/10/16 19:19:49.701| |Q_SBRF-12.12@RTS_SPBFUT00360|Новая позиция: SPBFUT00360-SBRF-12.12@RTS=1. 2012/10/16 19:19:49.701| |Q_SBRF-12.12@RTS_SPBFUT00360|Заявка 69434405 больше не активна. 2012/10/16 19:19:49.701| |PTC_SBRF-12.12@RTS_SPBFUT00360|Новая позиция: SPBFUT00360-SBRF-12.12@RTS=1, SPBFUT00360-VTBR-12.12@RTS=-2. 2012/10/16 19:19:49.701| |BS_SBRF-12.12@RTS_SPBFUT00360|Новая позиция: SPBFUT00360-SBRF-12.12@RTS=1, SPBFUT00360-VTBR-12.12@RTS=-2.

а вот лог если ставить лимитки( цена проходила через них)

2012/10/16 19:26:39.060| |QuikTrader|Экспорт запущен. 2012/10/16 19:27:03.826|Error |QuikTrader|System.InvalidOperationException: Priority queue is empty at Ecng.Collections.PriorityQueue2.Dequeue() at StockSharp.Algo.Testing.MarketEmulator.#=qJBGOJSwSh1TIzfSCaBP_NjwG2KLTkF4SftYzOjliS5k=.#=qZFq6HLTDmkhFmcbjC1g$Dg==() at StockSharp.Algo.Testing.MarketEmulator.Emulate(Message msg) at StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(MarketDepth marketDepth, MarketDepth delta) at StockSharp.Algo.Testing.RealTimeEmulationTrader1.#=qfiTYh07Tf3X0oetJXF6rUxRfV7XLv04MClyynJxpMZ8=(IEnumerable1 #=q4rrcDObcvigkYsB8qiYEmA==) at Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) at Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable1 items) 2012/10/16 19:29:32.466| |PTC_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,-1]. Позиция при старте 0. 2012/10/16 19:29:32.529| |Q_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,2]. Позиция при старте 0. 2012/10/16 19:29:32.607| |BS_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [2,1]. Позиция при старте 0.

  1. не работает правило WhenNewMyTrades() - не входит в функцию обработчик. Запускаю на реальном счете. Сделки в квике есть. На версиях 4.1.4 и 4.1.3 тот же код работал. Лог:

2012/10/16 19:06:08.591| |QuikTrader|Экспорт запущен. 2012/10/16 19:06:24.669| |PTC_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,-1]. Позиция при старте 0. 2012/10/16 19:06:24.701| |Q_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,2]. Позиция при старте 0. 2012/10/16 19:06:24.732| |BS_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [2,1]. Позиция при старте 0. 2012/10/16 19:06:24.919| |QuikTrader|New order: 68763953/9190308641 Покупка Цена=9297 Объем=1 Сост=Active Бал=1 2012/10/16 19:06:24.919| |QuikTrader|Order changed: 68763953/9190308641 Покупка Цена=9297 Объем=1 Сост=Active Бал=1 2012/10/16 19:11:29.716| |QuikTrader|Order changed: 68763953/9190308641 Покупка Цена=9297 Объем=1 Сост=Done Бал=1

3.не работает правило Security.WhenBestAskPriceLess(); Раньше его не использовал и не могу сказать работало ли оно на 4.0. Но на 4.1.х у меня не запускается...

Marco
Marco

Привет,

Что касается WhenNewMyTrades, посмотрите тему http://www.stocksharp.com/forum/3042/Nie-prikhodit-sobytiie-OnNewMyTrades/. Для заявок, размещаемых через котирование, попробуйте выставлять WaitAllTrades=true. Свойство было введено в 4.1.4.

Mikhail Sukhov
Mikhail Sukhov

На КП лежит фикс с доп логами. Можете включить прогнать свой код еще раз с новыми сборками? При этом надо включить у RTEmuTrader режим логирования Debug.

tony_inv
tony_inv

Проблема 2 была решена - спасибо. правило WhenNewMyTrades работает как надо. Проблема 1. Эмулятор еще не запускал, - завтра напишу результаты. Проблема 3 осталась: правило WhenBid/AskPriceLess/More не срабатывает. В логах ничего (правда режим логгирования был не дебаг здесь)

Mikhail Sukhov
Mikhail Sukhov

tony_inv: Проблема 3 осталась: правило WhenBid/AskPriceLess/More не срабатывает. В логах ничего (правда режим логгирования был не дебаг здесь)

Больше подробностей. Код, логи, что ожидается, что в реальности, как проверяется.

А почему юзер новый?

esper
esper

tony_inv: Проблема 3 осталась: правило WhenBid/AskPriceLess/More не срабатывает. В логах ничего (правда режим логгирования был не дебаг здесь) Экспорт стакана запущен?

tony_inv
tony_inv

Да, экспорт стакана запущен. Пробовал применять правило как

sec.WhenBestBidPriceLess(sec.ShrinkPrice(price / (1 + treshold / 100))).Do(ReQuote).Apply(this);

так и:

sec.GetMarketDepth().WhenBestBidPriceLess(sec.ShrinkPrice(price / (1 + treshold / 100))).Do(ReQuote).Apply(this);

Возможно когда правило применяется к конкретному инструменту то нужно что-то еще указать? В логах не пишет ничего. Вроде режим логгирования поставил Debug (LogLevels.Debug). Хочется, чтобы когда бид падает ниже определнной цены запускался обработчик ReQuote(). Логов и полного кода сейчас дать не могу, т.к. нет доступа к компу с системой (собственно по этой причине и юзер новый и с эмулятором еще нет ответа). Что именно нужно - лог стратегии? лог трейдера? я приводил полные логи фактически выше...

pyhta4og
pyhta4og

tony_inv: Да, экспорт стакана запущен. Пробовал применять правило как

sec.WhenBestBidPriceLess(sec.ShrinkPrice(price / (1 + treshold / 100))).Do(ReQuote).Apply(this);

> так и:
> ```csharp
sec.GetMarketDepth().WhenBestBidPriceLess(sec.ShrinkPrice(price / (1 + treshold / 100))).Do(ReQuote).Apply(this);

Возможно когда правило применяется к конкретному инструменту то нужно что-то еще указать? В логах не пишет ничего. Вроде режим логгирования поставил Debug (LogLevels.Debug). Хочется, чтобы когда бид падает ниже определнной цены запускался обработчик ReQuote(). Логов и полного кода сейчас дать не могу, т.к. нет доступа к компу с системой (собственно по этой причине и юзер новый и с эмулятором еще нет ответа). Что именно нужно - лог стратегии? лог трейдера? я приводил полные логи фактически выше...

Логи трейдера нужны. В режиме Debug должно писаться куча сообщений о создании и активации правил. И куча сообщений типа "IN/OUT/EM" по всем данным которые поступали или исходили из эмулятора.

Вы уверены что логи RealTimeEmulationTrader стоят в DEBUG? Как вы его создаете (кусочек кода?)

tony_inv
tony_inv

Блин, щас еще раз посмотрел как создаю, и понял что логгировал не EmulationTrader а его Underlying. Переключил, логи пошли как вы говорите, - но к сожалению, торгов нет - проверить не могу:( Спасибо за комментарий. А создавал так:

                            trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(Path.Text) { IsAsyncMode = true });
                            ((RealTimeEmulationTrader<QuikTrader>)trader).LogLevel = LogLevels.Debug;
                            _logManager.Sources.Add(((RealTimeEmulationTrader<QuikTrader>)trader).UnderlyingTrader);

теперь так:

                            trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader(Path.Text) { IsAsyncMode = true });
                            ((RealTimeEmulationTrader<QuikTrader>)trader).LogLevel = LogLevels.Debug;
                            _logManager.Sources.Add(trader);
tony_inv
tony_inv

Итак, привожу куски логов, как мне кажется наиболее релевантные (сам лог файл очень большой). Кусок, в котором видно, что заявка выставляется:

2012/10/22 19:43:01.211|Debug |RealTimeEmulationTrader1|IN:MarketDepth, T=19:43:01.211Бид 9469 11/Оффер 9471 4(1)@19:43:01.211[1,0] 2012/10/22 19:43:01.211|Debug |RealTimeEmulationTrader1|EM:Registering,T=19:43:00.322,70958764/0 Покупка Цена=9464 Объем=1 Сост=None Бал=1@19:43:00.322[1,0] 2012/10/22 19:43:01.211|Debug |RealTimeEmulationTrader1|OUT:Registered,T=19:43:00.322,70958764/1 Покупка Цена=9464 Объем=1 Сост=Active Бал=1 @19:43:00.322[1,0] 2012/10/22 19:43:01.211|Debug |RealTimeEmulationTrader1|PUT 70958764/1 Покупка Цена=9464 Объем=1 Сост=Active Бал=1 REST 1 2012/10/22 19:43:01.226|Debug |RealTimeEmulationTrader1|CL:Registered,T=19:43:00.322,70958764/1 Покупка Цена=9464 Объем=1 Сост=Active Бал=1 @19:43:00.322[1,0] 2012/10/22 19:43:01.242|Debug |RealTimeEmulationTrader1|EM:MarketDepth, T=19:43:01.211Бид 9469 11/Оффер 9471 4(1)@19:43:01.211[0,0] 2012/10/22 19:43:01.242|Debug |RealTimeEmulationTrader1|OUT:MarketDepth, T=19:43:01.211Бид 9469 11/Оффер 9471 4(1)@19:43:01.211[0,0] 2012/10/22 19:43:01.242|Debug |RealTimeEmulationTrader1|CL:MarketDepth, T=19:43:01.211Бид 9469 11/Оффер 9471 4(1)@19:43:01.211[0,0] Кусок, в котором видно, что офер в стакане был ниже чем 9464: 2012/10/22 20:00:37.692|Debug |RealTimeEmulationTrader1|EM:MarketDepth, T=20:00:37.692Бид 9465 9/Оффер 9466 88(1)@20:00:37.692[0,0] 2012/10/22 20:00:37.692|Debug |RealTimeEmulationTrader1|OUT:MarketDepth, T=20:00:37.692Бид 9465 9/Оффер 9466 88(1)@20:00:37.692[0,0] 2012/10/22 20:00:37.692|Debug |RealTimeEmulationTrader1|CL:MarketDepth, T=20:00:37.692Бид 9465 9/Оффер 9466 88(1)@20:00:37.692[0,0] 2012/10/22 20:00:38.690|Debug |RealTimeEmulationTrader1|IN:MarketDepth, T=20:00:38.690Бид 9465 5/Оффер 9466 70(1)@20:00:38.690[0,0] 2012/10/22 20:00:38.690|Debug |RealTimeEmulationTrader1|EM:MarketDepth, T=20:00:38.690Бид 9465 5/Оффер 9466 70(1)@20:00:38.690[0,0] 2012/10/22 20:00:38.690|Debug |RealTimeEmulationTrader1|OUT:MarketDepth, T=20:00:38.690Бид 9465 5/Оффер 9466 70(1)@20:00:38.690[0,0] 2012/10/22 20:00:38.690|Debug |RealTimeEmulationTrader1|CL:MarketDepth, T=20:00:38.690Бид 9465 5/Оффер 9466 70(1)@20:00:38.690[0,0] 2012/10/22 20:00:39.688|Debug |RealTimeEmulationTrader1|IN:MarketDepth, T=20:00:39.688Бид 9463 1/Оффер 9464 11(1)@20:00:39.688[0,0] 2012/10/22 20:00:39.688|Debug |RealTimeEmulationTrader1|EM:MarketDepth, T=20:00:39.688Бид 9463 1/Оффер 9464 11(1)@20:00:39.688[0,0] 2012/10/22 20:00:39.688|Debug |RealTimeEmulationTrader1|OUT:MarketDepth, T=20:00:39.688Бид 9463 1/Оффер 9464 11(1)@20:00:39.688[0,0] 2012/10/22 20:00:39.688|Debug |RealTimeEmulationTrader1|CL:MarketDepth, T=20:00:39.688Бид 9463 1/Оффер 9464 11(1)@20:00:39.688[0,0] 2012/10/22 20:00:40.687|Debug |RealTimeEmulationTrader1|IN:MarketDepth, T=20:00:40.687Бид 9463 1/Оффер 9464 11(1)@20:00:40.687[0,0] 2012/10/22 20:00:40.687|Debug |RealTimeEmulationTrader1|EM:MarketDepth, T=20:00:40.687Бид 9463 1/Оффер 9464 11(1)@20:00:40.687[0,0] 2012/10/22 20:00:40.687|Debug |RealTimeEmulationTrader1|OUT:MarketDepth, T=20:00:40.687Бид 9463 1/Оффер 9464 11(1)@20:00:40.687[0,0] 2012/10/22 20:00:40.687|Debug |RealTimeEmulationTrader1|CL:MarketDepth, T=20:00:40.687Бид 9463 1/Оффер 9464 11(1)@20:00:40.687[0,0] 2012/10/22 20:00:41.685|Debug |RealTimeEmulationTrader1|IN:MarketDepth, T=20:00:41.685Бид 9463 1/Оффер 9464 8(1)@20:00:41.685[0,0] Больше в логах эта заявка не упоминается... Лог стратегии: 2012/10/22 19:43:00.758| |PTC_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,-1]. Позиция при старте 0. 2012/10/22 19:43:00.790| |Q_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [0,1]. Позиция при старте 0. 2012/10/22 19:43:00.836| |BS_SBRF-12.12@RTS_SPBFUT00360|Стратегия запущена. [1,1]. Позиция при старте 0. Этого достаточно? если нет, могу послать лог файл весь... Что необходимо показать для решения проблемы с работой правила WhenBestBidPriceLess?

pyhta4og
pyhta4og

Попробуйте подписаться на Trader.SecurityChanged - они будут вам приходить в стратегию?

esper
esper

Попробуйте использовать правило так:```csharp s.WhenBestBidPriceLess(new Unit(price, UnitTypes.Limit)).Do()

tony_inv
tony_inv
tony_inv

Спасибо,

s.WhenBestBidPriceLess(new Unit(price, UnitTypes.Limit)).Do()

Это работает.