Не работают правила BestAskPriceMore и BestAskPriceLess. Создал их относительно одной цены - ни одно из них не сработало. При этом MarketDepthChanged.
Версия S# - исправленная версия 4.0.20.
Не работают правила BestAskPriceMore и BestAskPriceLess. Создал их относительно одной цены - ни одно из них не сработало. При этом MarketDepthChanged.
Версия S# - исправленная версия 4.0.20.
评论 (39)
登录 或 创建账户, 登录或注册以发表评论
SecuritiesChanged приходит? Отследите по нему когда срабатывает условие с Security.BestAsk \ security.BestBid
Нет, SecurityChanged не приходит.
потому и правило не работает. какой шлюз?
Раньше работало?
Шлюз - QuikTrader.
Раньше работало? - не знаю, я им раньше не пользовался.
Довольно странно что не приходит SecuritiesChanged. Вы как проверяли? Как подписывались на событие? Как запускается экспорт и что говорит Verifier?
И самое главное - стакан экспортируется?
Стакан экспортируется. Verifier говорит что все настроено правильно. На событие подписываюсь так - this.SecurityChanged += AggressiveRegimeByRules_SecurityChanged; Не очень понял вопрос про то, как запускается экспорт. Как запускается экспорт чего? Если стакана, то так - Trader.RegisterQuotes(security);
Вопрос был о SecuritiesChanged, а не о SecurityChanged Это событие у Trader.
Какие таблицы экспортируются? Покажите кусок кода где запускается экспорт. Чему равно Security.BestAsk \ Security.BestBid? стакан какой получаете по инструменту через GetMarketDepth тоже покажите.
"Какие таблицы экспортируются?" Все настройки таблиц взяты из 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 тоже покажите." Как это сделать?
и чему равно BestAsk.Price что вы распечатали?
по стакану - получите через метод, далее можете хоть через дебагер показать аски \ биды.
"и чему равно BestBid что вы распечатали?" С BestBid тоже все в порядке.
"по стакану - получите через метод, далее можете хоть через дебагер показать аски \ биды." Сделано так - сначала стакан я получаю стакан через метод Trader.GetMarketDepth(security), сохраняю ссылку на него и когда мне нужно я поучаю его таким образом - _marketDepth.GetTopQuotes(20) В дебаге видно что стакан заполнен бидами и асками.
В 4.0.21 будет фикс
К сожалению правила BestBidPriceMore и BestAskPriceLess не работают.
Security.Trader.SecuritiesChanged вызывается? И посмотрите по этому событию последовательно как у вас меняется BestAsk \ BestBid
С некотрой периодичностью такой код говорит, что BestAsk и BestBid одновременно являются null.
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(IEnumerable
1 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Что-то вы с QuikTrader плохое понаделали в своем коде.
И с какой ценой вы запускаете правило BestBidPriceMore что оно у вас ни разу не срабатывает?
"И с какой ценой вы запускаете правило 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 плохое понаделали в своем коде." отнаследовался от него.
Сделайте правило без наследника от QuikTrader, стандартный Trader. По срабатыванию правила добавьте просто распечатку что правило сработало.
"Сделайте правило без наследника от QuikTrader, стандартный Trader." Сделаю. "По срабатыванию правила добавьте просто распечатку что правило сработало." Правило то не срабатывает. Как я по нему распечатку дам?
Что у вас сейчас в обработчике правила? Если есть какая-то распечатка при вызове его - ок. Если идут какие-то if вначале - вставьте распечатку до них.
"Сделайте правило без наследника от QuikTrader, стандартный Trader." Сделаю." Стал использовать стандартный Trader - QuikTrader - ситуация не улучшилась, правила не работают.
"Что у вас сейчас в обработчике правила? Если есть какая-то распечатка при вызове его - ок. Если идут какие-то if вначале - вставьте распечатку до них." Обработчик правила сейчас выглядит так -
Он не был ни раз вызван.
Само правило создается так
Лог 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(IEnumerable
1 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Покажите свой квик. Дополнительные колонки из таблицы инструментов экспортируются?
Показать Квик - в плане? Вас интересует как настроены таблицы? Настройка таблиц произведена загреузкой Вашего wnd.
"Дополнительные колонки из таблицы инструментов экспортируются?" Да - DdeSecurityColumns.MinStepPrice.
Не могу прикрепить скрин.
<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>
Вы сами нигде не обнуляете BestBid\BestAsk случайно? А то мягко говоря что-то странное происходит.
Предлагаю сделать следующее. Берёте Quik\Sample, в котором точно не будет изменений. Далее подписываетесь на событие Trader.SecuritiesChanged и выводите BestBid \ BestAsk
По прикреплённому скриншоту:
Сделал как Вы сказали - увы. p.BestAsk == null p.BestBid == null System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Sample.MainWindow.Trader_SecuritiesChanged(IEnumerable
1 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Сделал как Вы сказали - результат тот же p.BestAsk == null p.BestAsk == null p.BestBid == null p.BestBid == null System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Sample.MainWindow.Trader_SecuritiesChanged(IEnumerable
1 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==)Картинка
Quik\Sample попробовали? И что у вас на 167 строке что он так ругается? :)
"Quik\Sample попробовали?" Да попробовал.
"И что у вас на 167 строке что он так ругается? :)" System.Diagnostics.Debug.WriteLine("securitys " + p.BestAsk.Price.ToString() + " " + p.BestBid.Price.ToString());
Я просто перенес обработку событи туда, без изменений. BestAsk оказался null, вот и ругается.
ну и как с SampleQuik? Давайте через скайп (amukhanchikov), быстрее будет.
К сожадению не обладаю возможностью использовать скайп.
Касательно SampleQuik. Модифицировал его таким образом.
Результат такой. p.BestAsk == null p.BestBid == null p.BestAsk == null p.BestBid == null p.BestAsk == null p.BestBid == null
Правильно, экспорт по стакану не запущен ведь у вас, потому там и идут null
Попробовал в последние 5 минут вечерней сессии - запустил экспорт стакана (просто его открыв из Sample -> инструменты -> стакан) - ни разу не пришло null в биде или аске.
Завтра попробую с утра минут 10-15 погонять. Удивлюсь, если возникнет хоть 1 null.
Гоняю полчаса после старта экспорта стакана - ни разу не возникло сообщения что либо bid, либо ask равен null.
Далее. Переписал код класса стратегии Quik\SampleSma, сделал его таким
всё сработало, правило успешно сработало при повышении лучшего бида на 0.0001 и лучшего бида значения 1800 (пример работает с лукойлом).
Собственно возникает вопрос в связи с чем это всё не работает у вас. Может вы не так работаете с типом Unit, который передаётся в правило?
Да, я понял, что у меня неправило было. Я делал либо так. this.When(Security.BestAskPriceLess(new Unit(_priceOfTask))) .Do(SayPrice); либо так this.When(Security.BestAskPriceLess((_priceOfTask))) .Do(SayPrice);
decimal _priceOfTask.
Это равносильно :) По умолчанию и там и там у вас создаётся Unit с типом Absolute, т.е. смотрится превышение на эту величину.
Александр, спасибо за помощь и за разъяснение.