Не работают правила BestAskPriceMore и BestAskPriceLess
Atom Ответить
02.03.2012


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

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

Теги:


Спасибо:




39 Ответов
< 1 2 
Alexander

Фотография
Дата: 11.03.2012
Ответить


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


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

Alexander

Фотография
Дата: 11.03.2012
Ответить


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

vader

Фотография
Дата: 11.03.2012
Ответить


Сделал как Вы сказали - увы.
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[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable`1 #=qPGXNlOeGBVUabNWOLh_DvA==)
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[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable`1 #=qPGXNlOeGBVUabNWOLh_DvA==)
p.BestAsk == null
p.BestBid == null
Автор топика
Спасибо:

vader

Фотография
Дата: 11.03.2012
Ответить


Сделал как Вы сказали - результат тот же
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[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable`1 #=qPGXNlOeGBVUabNWOLh_DvA==)
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[T](Action`1 handler, T arg)
в StockSharp.Algo.BaseTrader.#=qepDkskvfBznv_TxRF4yrHrSmn6GO3w$xqR1CIq0ckKQ=.#=qA2uCed6RkDY$ALG9UmQnSg==(IEnumerable`1 #=qPGXNlOeGBVUabNWOLh_DvA==)

Картинка
Автор топика
Спасибо:

Alexander

Фотография
Дата: 11.03.2012
Ответить


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

vader

Фотография
Дата: 11.03.2012
Ответить


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

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

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

Alexander

Фотография
Дата: 11.03.2012
Ответить


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

vader

Фотография
Дата: 12.03.2012
Ответить


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

Касательно 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

Фотография
Дата: 12.03.2012
Ответить


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

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

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

Alexander

Фотография
Дата: 13.03.2012
Ответить


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

Alexander

Фотография
Дата: 13.03.2012
Ответить


Далее. Переписал код класса стратегии 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

Фотография
Дата: 13.03.2012
Ответить


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

decimal _priceOfTask.
Автор топика
Спасибо:

Alexander

Фотография
Дата: 13.03.2012
Ответить


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

decimal _priceOfTask.


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

vader

Фотография
Дата: 13.03.2012
Ответить


Александр, спасибо за помощь и за разъяснение.
Автор топика
Спасибо:
< 1 2 

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy