← 戻る

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 как-то по-другому запускать? Заранее спасибо!

このトピックは参考になりましたか?

トピックを共有

コメント (16)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

esper
esper

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

Ant.On.
Ant.On. 著者

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

esper
esper

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

Ant.On.
Ant.On. 著者

Есть 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()

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