← Atrás

Не работают правила BestAskPriceMore и BestAskPriceLess

Не работают правила BestAskPriceMore и BestAskPriceLess. Создал их относительно одной цены - ни одно из них не сработало. При этом MarketDepthChanged.

Версия S# - исправленная версия 4.0.20.

¿Le resultó útil este tema?

Compartir tema

Comentarios (39)

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

Alexander
Alexander

SecuritiesChanged приходит? Отследите по нему когда срабатывает условие с Security.BestAsk \ security.BestBid

vader
vader Autor

Нет, SecurityChanged не приходит.

Alexander
Alexander

vader: Нет, SecurityChanged не приходит.

потому и правило не работает. какой шлюз?

Раньше работало?

vader
vader Autor

Шлюз - QuikTrader.

Раньше работало? - не знаю, я им раньше не пользовался.

Alexander
Alexander

Довольно странно что не приходит SecuritiesChanged. Вы как проверяли? Как подписывались на событие? Как запускается экспорт и что говорит Verifier?

Alexander
Alexander

И самое главное - стакан экспортируется?

vader
vader Autor

Стакан экспортируется. Verifier говорит что все настроено правильно. На событие подписываюсь так - this.SecurityChanged += AggressiveRegimeByRules_SecurityChanged; Не очень понял вопрос про то, как запускается экспорт. Как запускается экспорт чего? Если стакана, то так - Trader.RegisterQuotes(security);

Alexander
Alexander

Вопрос был о SecuritiesChanged, а не о SecurityChanged Это событие у Trader.

Какие таблицы экспортируются? Покажите кусок кода где запускается экспорт. Чему равно Security.BestAsk \ Security.BestBid? стакан какой получаете по инструменту через GetMarketDepth тоже покажите.

vader
vader Autor

"Какие таблицы экспортируются?" Все настройки таблиц взяты из wnd файла. Добавлены только два столбца. _trader.MyTradesTable.Columns.Add(DdeMyTradeColumns.Commission); _trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinStepPrice);

"Покажите кусок кода где запускается экспорт" _trader.Connect(); _trader.StartExport();

"Чему равно Security.BestAsk \ Security.BestBid" Объекты существуют, обращение к ним работает. Log.WriteGeneralDiagnostics("security " + Security.BestAsk.Price.ToString());

"Вопрос был о SecuritiesChanged, а не о SecurityChanged Это событие у Trader." Это событие не вызывается SecuritiesChanged. ТАкой код ничего не выводит. Trader.SecuritiesChanged +=(Trader_SecuritiesChanged); private void Trader_SecuritiesChanged(IEnumerable<StockSharp.BusinessEntities.Security> securitys) { foreach(Security p in securitys) { Log.WriteGeneralDiagnostics("securitys " + p.BestAsk.Price.ToString()); } }

"стакан какой получаете по инструменту через GetMarketDepth тоже покажите." Как это сделать?

Alexander
Alexander

и чему равно BestAsk.Price что вы распечатали?

по стакану - получите через метод, далее можете хоть через дебагер показать аски \ биды.

vader
vader Autor

"и чему равно BestBid что вы распечатали?" С BestBid тоже все в порядке.

"по стакану - получите через метод, далее можете хоть через дебагер показать аски \ биды." Сделано так - сначала стакан я получаю стакан через метод Trader.GetMarketDepth(security), сохраняю ссылку на него и когда мне нужно я поучаю его таким образом - _marketDepth.GetTopQuotes(20) В дебаге видно что стакан заполнен бидами и асками.

Alexander
Alexander

В 4.0.21 будет фикс

vader
vader Autor

К сожалению правила BestBidPriceMore и BestAskPriceLess не работают.

Alexander
Alexander

Security.Trader.SecuritiesChanged вызывается? И посмотрите по этому событию последовательно как у вас меняется BestAsk \ BestBid

vader
vader Autor

С некотрой периодичностью такой код говорит, что BestAsk и BestBid одновременно являются null.


TraderWorker.GetInstance().Trader.SecuritiesChanged +=(Trader_SecuritiesChanged);

private void Trader_SecuritiesChanged(IEnumerable<StockSharp.BusinessEntities.Security> securitys)
        {
            foreach(Security p in securitys) {
                if(p == null) {
                    Log.WriteGeneralDiagnostics("p == null");
                }
                if(p.BestAsk == null) {
                    Log.WriteGeneralDiagnostics("p.BestAsk == null");
                }
                if(p.BestBid == null) {
                    Log.WriteGeneralDiagnostics("p.BestBid == null");
                }
                Log.WriteGeneralDiagnostics("securitys " + p.BestAsk.Price.ToString() + " " + p.BestBid.Price.ToString());
            }
        }

Log securitys 171230 171165 Log securitys 171230 171165 Log securitys 171230 171165 Log securitys 171230 171165 Log securitys 171195 171180 Log securitys 171220 171165 Log securitys 171220 171180 Log securitys 171220 171165 Log securitys 171220 171175 Log securitys 171220 171175 Log securitys 171220 171165 Log securitys 171220 171175 Log p.BestAsk == null Log p.BestBid == null Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1944 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171220 171180 Log p.BestAsk == null Log securitys 171220 171180 Log p.BestBid == null Log securitys 171220 171180 Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1944 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171200 171180 Log p.BestAsk == null Log p.BestBid == null Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1944 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171200 171180 Log securitys 171200 171180 Log securitys 171200 171180 Log securitys 171200 171180 Log securitys 171200 171180 Log securitys 171200 171180 Log securitys 171200 171175 Log securitys 171195 171175 Log securitys 171195 171175 Log securitys 171195 171175 Log securitys 171190 171160 Log securitys 171190 171165 Log securitys 171190 171180 Log securitys 171190 171180 Log p.BestAsk == null Log p.BestBid == null Log securitys 171190 171180 Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1944 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171195 171180 Log securitys 171195 171180 Log securitys 171195 171180 Log securitys 171195 171180 Log securitys 171195 171180 Log securitys 171195 171180 Log securitys 171190 171180 Log securitys 171190 171180 Log securitys 171190 171180 Log securitys 171190 171180 Log securitys 171190 171180 Log securitys 171190 171180 Log securitys 171190 171180 Log p.BestAsk == null Log p.BestBid == null

Mikhail Sukhov
Mikhail Sukhov

Что-то вы с QuikTrader плохое понаделали в своем коде.

Alexander
Alexander

И с какой ценой вы запускаете правило BestBidPriceMore что оно у вас ни разу не срабатывает?

vader
vader Autor

"И с какой ценой вы запускаете правило BestBidPriceMore что оно у вас ни разу не срабатывает?"

Log securitys 171255 171250 Log securitys 171255 171250 ARBR Buy RIH2 11.03.2012 13:33:19 Создали правило BestBidPriceMore с ценой 171240 ARBR Buy RIH2 11.03.2012 13:33:19 OnStarting1 Log securitys 171255 171250 Log securitys 171255 171250

"Что-то вы с QuikTrader плохое понаделали в своем коде." отнаследовался от него.

Alexander
Alexander

Сделайте правило без наследника от QuikTrader, стандартный Trader. По срабатыванию правила добавьте просто распечатку что правило сработало.

vader
vader Autor

"Сделайте правило без наследника от QuikTrader, стандартный Trader." Сделаю. "По срабатыванию правила добавьте просто распечатку что правило сработало." Правило то не срабатывает. Как я по нему распечатку дам?

Alexander
Alexander

Что у вас сейчас в обработчике правила? Если есть какая-то распечатка при вызове его - ок. Если идут какие-то if вначале - вставьте распечатку до них.

vader
vader Autor

"Сделайте правило без наследника от QuikTrader, стандартный Trader." Сделаю." Стал использовать стандартный Trader - QuikTrader - ситуация не улучшилась, правила не работают.

"Что у вас сейчас в обработчике правила? Если есть какая-то распечатка при вызове его - ок. Если идут какие-то if вначале - вставьте распечатку до них." Обработчик правила сейчас выглядит так -


private void DoBestBidPriceMore()
        {
            WriteDiagnostics("DoBestBidPriceMore " + Security.BestAsk.Price.ToString());
        }

Он не был ни раз вызван.

Само правило создается так


this.When(Security.BestBidPriceMore(GetCurPrice()))
                    .Do(DoBestBidPriceMore);
            WriteDiagnostics("Создали правило BestBidPriceMore с ценой " + GetCurPrice().ToString());

Лог Log securitys 171245 171235 Log securitys 171245 171235 Log securitys 171245 171235 Log p.BestAsk == null Log p.BestBid == null Log securitys 171245 171235 Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1943 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171245 171235 Log securitys 171245 171235 Log securitys 171245 171235 Log securitys 171245 171235 Log securitys 171245 171235 Log securitys 171245 171235 Log securitys 171245 171235 ARBR Buy RIH2 11.03.2012 17:21:13 Создали правило BestBidPriceMore с ценой 171200 Log p.BestAsk == null Log p.BestBid == null Log securitys 171245 171235 Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1943 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171245 171235 Log securitys 171245 171240 Log securitys 171245 171240 Log securitys 171245 171240 Log securitys 171260 171240 Log securitys 171260 171245 Log securitys 171260 171240 Log securitys 171260 171240 Log securitys 171260 171240 Log securitys 171260 171240 Log securitys 171260 171240 Log securitys 171260 171240 Log securitys 171260 171240 Log securitys 171260 171240 Log p.BestAsk == null Log p.BestBid == null Log securitys 171260 171240 Log System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в BSPB.Partizan.Robot.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\vb\General\PartizanV2\source\v.2.0\Robot.xaml.cs:строка 1943 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) Log securitys 171255 171240 Log securitys 171255 171240

Alexander
Alexander

Покажите свой квик. Дополнительные колонки из таблицы инструментов экспортируются?

vader
vader Autor

Показать Квик - в плане? Вас интересует как настроены таблицы? Настройка таблиц произведена загреузкой Вашего wnd.

"Дополнительные колонки из таблицы инструментов экспортируются?" Да - DdeSecurityColumns.MinStepPrice.

vader
vader Autor

Не могу прикрепить скрин.

<a href='http://www.pictureshack.ru/view_9937Novyi_tochechnyi_risunok.jpg'><img src='http://www.pictureshack.ru/thumbs/9937Novyi_tochechnyi_risunok.jpg' border='0'></a>

Alexander
Alexander

Вы сами нигде не обнуляете BestBid\BestAsk случайно? А то мягко говоря что-то странное происходит.

Предлагаю сделать следующее. Берёте Quik\Sample, в котором точно не будет изменений. Далее подписываетесь на событие Trader.SecuritiesChanged и выводите BestBid \ BestAsk

Alexander
Alexander

По прикреплённому скриншоту:

  1. У вас дополнительные колонки в стакане. Как вы их экспортируете? Создайте стандартный стакан, без доп. колонок, как по документации. Попробуйте с ним.
  2. В документации сказано про стакан что внизу офера, вверху биды. У вас наоборот. Сделайте согласно документации.
  3. Вы дополнительно экспортируете DdeSecurityColumns.MinStepPrice. Где оно у вас на скриншоте?
vader
vader Autor

Сделал как Вы сказали - увы. p.BestAsk == null p.BestBid == null System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Sample.MainWindow.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\Lib StockSharp\StockSharp_4.0.21_Sources\Samples\Quik\Sample\MainWindow.xaml.cs:строка 167 в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) p.BestAsk == null p.BestBid == null System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Sample.MainWindow.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\Lib StockSharp\StockSharp_4.0.21_Sources\Samples\Quik\Sample\MainWindow.xaml.cs:строка 167 в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) p.BestAsk == null p.BestBid == null

vader
vader Autor

Сделал как Вы сказали - результат тот же p.BestAsk == null p.BestAsk == null p.BestBid == null p.BestBid == null System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Sample.MainWindow.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\Lib StockSharp\StockSharp_4.0.21_Sources\Samples\Quik\Sample\MainWindow.xaml.cs:строка 167 в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==) System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Sample.MainWindow.Trader_SecuritiesChanged(IEnumerable1 securitys) в C:\Lib StockSharp\StockSharp_4.0.21_Sources\Samples\Quik\Sample\MainWindow.xaml.cs:строка 167 в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable1 #=qPGXNlOeGBVUabNWOLh_DvA==)

Картинка

Alexander
Alexander

Quik\Sample попробовали? И что у вас на 167 строке что он так ругается? :)

vader
vader Autor

"Quik\Sample попробовали?" Да попробовал.

"И что у вас на 167 строке что он так ругается? :)" System.Diagnostics.Debug.WriteLine("securitys " + p.BestAsk.Price.ToString() + " " + p.BestBid.Price.ToString());

Я просто перенес обработку событи туда, без изменений. BestAsk оказался null, вот и ругается.

Alexander
Alexander

ну и как с SampleQuik? Давайте через скайп (amukhanchikov), быстрее будет.

vader
vader Autor

К сожадению не обладаю возможностью использовать скайп.

Касательно SampleQuik. Модифицировал его таким образом.


Trader.Connected += () => this.GuiAsync(() => ExportDde.IsEnabled = true);

Trader.SecuritiesChanged += (Trader_SecuritiesChanged); // мой код

ShowSecurities.IsEnabled = ShowTrades.IsEnabled = 
...

private void Trader_SecuritiesChanged(IEnumerable<Security> securitys)
        {
            foreach(Security p in securitys) {
                if(p == null) {
                    System.Diagnostics.Debug.WriteLine("p == null");
                }
                if(p.BestAsk == null) {
                    System.Diagnostics.Debug.WriteLine("p.BestAsk == null");
                }
                if(p.BestBid == null) {
                    System.Diagnostics.Debug.WriteLine("p.BestBid == null");
                }
                //System.Diagnostics.Debug.WriteLine("securitys " + p.BestAsk.Price.ToString() + " " + p.BestBid.Price.ToString());
            }
        }

Результат такой. p.BestAsk == null p.BestBid == null p.BestAsk == null p.BestBid == null p.BestAsk == null p.BestBid == null

Alexander
Alexander

Правильно, экспорт по стакану не запущен ведь у вас, потому там и идут null

Попробовал в последние 5 минут вечерней сессии - запустил экспорт стакана (просто его открыв из Sample -> инструменты -> стакан) - ни разу не пришло null в биде или аске.

Завтра попробую с утра минут 10-15 погонять. Удивлюсь, если возникнет хоть 1 null.

Alexander
Alexander

Гоняю полчаса после старта экспорта стакана - ни разу не возникло сообщения что либо bid, либо ask равен null.

Alexander
Alexander

Далее. Переписал код класса стратегии Quik\SampleSma, сделал его таким

	class SmaStrategy : Strategy
	{
		public SmaStrategy(CandleManager candleManager, SimpleMovingAverage longSma, SimpleMovingAverage shortSma, TimeSpan timeFrame)
		{
			LongSma = longSma;
			ShortSma = shortSma;
		}

		public SimpleMovingAverage LongSma { get; private set; }
		public SimpleMovingAverage ShortSma { get; private set; }

		protected override void OnStarting()
		{
			this.When(Security.BestBidPriceMore(0.0001)).Do(OnProcess);
			this.When(Security.BestBidPriceMore(new Unit(1800, UnitTypes.Limit))).Do(OnProcess2);

			base.OnStarting();
		}

		protected void OnProcess()
		{
			System.Diagnostics.Debug.WriteLine("Rule succeeded");
		}

		protected void OnProcess2()
		{
			System.Diagnostics.Debug.WriteLine("Rule2 succeeded");
		}
	}

всё сработало, правило успешно сработало при повышении лучшего бида на 0.0001 и лучшего бида значения 1800 (пример работает с лукойлом).

Собственно возникает вопрос в связи с чем это всё не работает у вас. Может вы не так работаете с типом Unit, который передаётся в правило?

vader
vader Autor

Да, я понял, что у меня неправило было. Я делал либо так. this.When(Security.BestAskPriceLess(new Unit(_priceOfTask))) .Do(SayPrice); либо так this.When(Security.BestAskPriceLess((_priceOfTask))) .Do(SayPrice);

decimal _priceOfTask.

Alexander
Alexander

vader: Да, я понял, что у меня неправило было. Я делал либо так. this.When(Security.BestAskPriceLess(new Unit(_priceOfTask))) .Do(SayPrice); либо так this.When(Security.BestAskPriceLess((_priceOfTask))) .Do(SayPrice);

decimal _priceOfTask.

Это равносильно :) По умолчанию и там и там у вас создаётся Unit с типом Absolute, т.е. смотрится превышение на эту величину.

vader
vader Autor

Александр, спасибо за помощь и за разъяснение.