проскальзывание

проскальзывание
Atom
3/18/2010
denis


делаю так var order = base.CreateOrder(direction, base.Security.GetMarketPrice(direction, MarketPriceTypes.Following), base.Volume); // регистрируем ее (обычным способом лимитированной заявкой) //base.Trader.RegisterOrder(order);

           // добавляем зарегистрированную заявку в стратегию
            base.AddOrder(order);

           // регистрируем на котирование
            var strategy = new MarketQuotingStrategy(base.Trader,

order, base.Interval, false, MarketPriceTypes.Following, new Unit()); strategy.Start(); base.ChildStrategies.Add(strategy); вылетает это

2010-03-18T14:10:16.8750000+03:00 [0] None => Quoting new order Buy price 1720,99 volume 1 2010-03-18T14:10:17.9531250+03:00 [0] Error => System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey key, TValue value) at Ecng.Collections.SynchronizedDictionary2.Add(K key, V value) at Ecng.Trading.Algo.BasePositionManager.RegisterPosition(Order order) at Ecng.Trading.Algo.StrategyPositionManager.OnNewOrder(Order order) at System.Action1.Invoke(T obj) at Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) at Ecng.Trading.Algo.Strategy.AddOrder(Order order) at Ecng.Trading.Algo.Strategy. (Order ) at System.Action1.Invoke(T obj) at Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg) at Ecng.Trading.Algo.Strategy.AddOrder(Order order) at Ecng.Trading.Algo.QuotingStrategy.OnProcess() at Ecng.Trading.Algo.Strategy.Process()

т.е. уже есть, надо убрать выражение base.AddOrder(order); а без него было так

https://docs.google.com/leaf?id=0Bw2gQDvf41vtOWIzZjIwM2EtMjI2ZS00ZDcwLTg0NjktZjRjN2VjMWJiNzIy&sort=name&layout=list&num=50

бежал за рынком почти четыре рубля, а проскальзывание равно нулю.

Значит надо самому корректировать через base.SlippageManager.RegisterOrder(myOrder, newEstimatedPrice); ?

вывод проскальзывания делаю так private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e) { this.Sync(() => { this.Status.Content = _strategy.ProcessState; //this.PnL.Content = _strategy.PnL; //this.Slippage.Content = _strategy.Slippage; this.PnL.Content = _strategy.PnLManager.AbsoluteValue; this.Slippage.Content = _strategy.SlippageManager.Slippage; this.Position.Content = _strategy.PositionManager.Position; }); }


Tags:


Thanks:


Mikhail Sukhov

Avatar
Date: 3/18/2010
Reply


Так, а если просто не вызывать AddOrder?

Thanks:

denis

Avatar
Date: 3/18/2010
Reply


Уже сделано :) Ссылка в первом посте указывает на результат без base.AddOrder(order); т.е. проскальзывание равно нулю.

Thanks:

Mikhail Sukhov

Avatar
Date: 3/18/2010
Reply


Проскальзование фиксируется по сделкам. Сделки были? И оно показывало 0?

Thanks:

denis

Avatar
Date: 3/18/2010
Reply


Михал, я без претензий. Просто не понятно как оно работает. Было несколько заявок, потом сделка купли. Все. Тут можно рассчитать проскальзывание или нужно закрыть куплю и потом считать?

Thanks:

Mikhail Sukhov

Avatar
Date: 3/18/2010
Reply


Да я тоже без претензий =) Пытаюсь выяснить все детально.

Проскальзывание работает след. образом в котировании. Регистрируется первоначальная цена сделки (тоесть по рынку). Далее, цены послед сделок игнорируются. Затем, когда получаются сделки по послед заявкам, высчитывается проскальзывание с учетом цены первой заявки. Это в теории. На практике, судя по всему не так. Как вариант, TradeHelper.GetSlippage(MyTrade, estimatePrice); пока не разберемся. Готовы к новой промежуточной версии? =)

Thanks:

denis

Avatar
Date: 3/18/2010
Reply


Thanks:

Mikhail Sukhov

Avatar
Date: 3/19/2010
Reply


  1. Заявки, конечно же.
  2. Насчет одной сделки и нескольких заявок. Нет, не будет котировщик считать проскальзывание правильно. Не добавил я в него данный механизм. Доделаю, и отправлю тестовую версию.
  3. Насчет первоначальной ошибки. Судя по коду, все нормально нужно именно до котирования регистрировать заявку. Она нормально зарегистрировалась? Можно прислать логи котировщика?
Thanks:

denis

Avatar
Date: 3/19/2010
Reply


код такой:

           // создаем заявку
                            var order = base.CreateOrder(direction,

base.Security.GetMarketPrice(direction, MarketPriceTypes.Following), base.Volume); // регистрируем ее (обычным способом лимитированной заявкой) base.Trader.RegisterOrder(order);

           // добавляем зарегистрированную заявку в стратегию
            base.AddOrder(order);

           // регистрируем на котирование
            var strategy = new MarketQuotingStrategy(base.Trader,

order, base.Interval, false, MarketPriceTypes.Following, new Unit()); strategy.Start(); base.ChildStrategies.Add(strategy);

логи:

2010-03-19T10:47:33.4531250+03:00 [0] None => Quoting renewing order Buy with id 956757318 price 1712,02 volume 1 transaction 1 2010-03-19T10:47:34.2031250+03:00 [0] None => Quoting renewed order Buy with id 956757441 price 1712,06 volume 1 transaction 2 2010-03-19T10:47:35.0781250+03:00 [0] None => Quoting renewing order Buy with id 956757441 price 1712,06 volume 1 transaction 2 2010-03-19T10:47:36.4531250+03:00 [0] None => Quoting renewed order Buy with id 956757686 price 1712,08 volume 1 transaction 3 2010-03-19T10:47:36.9062500+03:00 [0] None => Quoting renewing order Buy with id 956757686 price 1712,08 volume 1 transaction 3 2010-03-19T10:47:38.2500000+03:00 [0] None => Quoting renewed order Buy with id 956757857 price 1712,14 volume 1 transaction 4 2010-03-19T10:47:43.9375000+03:00 [0] None => Quoting renewing order Buy with id 956757857 price 1712,14 volume 1 transaction 4 2010-03-19T10:47:44.7812500+03:00 [0] None => Quoting renewed order Buy with id 956758519 price 1712,79 volume 1 transaction 5 2010-03-19T10:47:45.0937500+03:00 [0] None => Quoting renewing order Buy with id 956758519 price 1712,79 volume 1 transaction 5 2010-03-19T10:47:45.1718750+03:00 [0] Error => System.ArgumentException: Заявка по транзакции 'CLASSCODE=EQBR; SECCODE=LKOH; TRANS_ID=5; ACTION=KILL_ORDER; ORDER_KEY=956758519' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. Parameter name: transactionTxt at . (String , OrderStatus& , Int32& , Double& , String& ) at Ecng.Trading.Quik.QuikTrader. (Order , String , Boolean , Boolean ) at Ecng.Trading.Quik.QuikTrader.CancelOrder(Order order) at Ecng.Trading.Algo.TraderHelper.GuarantyCancelOrder(ITrader trader, Order order) at Ecng.Trading.Algo.TraderHelper.ReRegisterOrder(ITrader trader, Order oldOrder, Func1 getNewPrice, Boolean isForts) at Ecng.Trading.Algo.QuotingStrategy.OnProcess() at Ecng.Trading.Algo.Strategy.Process() 2010-03-19T10:47:45.1718750+03:00 [0] None => MarketQuotingStrategy stopping 2010-03-19T10:47:45.4843750+03:00 [0] None => Quoting finishing by 956758519 2010-03-19T10:47:45.4843750+03:00 [0] None => Quoting cancelling order by 956758519 2010-03-19T10:47:46.3437500+03:00 [0] None => MarketQuotingStrategy stopped 2010-03-19T10:47:47.1406250+03:00 [0] None => Quoting renewing order Buy with id 956758695 price 1712,14 volume 1 transaction 6 2010-03-19T10:47:48.3593750+03:00 [0] None => Quoting renewed order Buy with id 956758871 price 1712,8 volume 1 transaction 7 2010-03-19T10:47:48.6718750+03:00 [0] None => Quoting renewing order Buy with id 956758871 price 1712,8 volume 1 transaction 7 2010-03-19T10:47:49.0312500+03:00 [0] Error => System.ArgumentException: Заявка по транзакции 'CLASSCODE=EQBR; SECCODE=LKOH; TRANS_ID=7; ACTION=KILL_ORDER; ORDER_KEY=956758871' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. Parameter name: transactionTxt at . (String , OrderStatus& , Int32& , Double& , String& ) at Ecng.Trading.Quik.QuikTrader. (Order , String , Boolean , Boolean ) at Ecng.Trading.Quik.QuikTrader.CancelOrder(Order order) at Ecng.Trading.Algo.TraderHelper.GuarantyCancelOrder(ITrader trader, Order order) at Ecng.Trading.Algo.TraderHelper.ReRegisterOrder(ITrader trader, Order oldOrder, Func1 getNewPrice, Boolean isForts) at Ecng.Trading.Algo.QuotingStrategy.OnProcess() at Ecng.Trading.Algo.Strategy.Process() 2010-03-19T10:47:49.0312500+03:00 [0] None => MarketQuotingStrategy stopping 2010-03-19T10:47:49.3437500+03:00 [0] None => Quoting finishing by 956758871 2010-03-19T10:47:49.3437500+03:00 [0] None => Quoting cancelling order by 956758871 2010-03-19T10:47:50.4531250+03:00 [0] None => MarketQuotingStrategy stopped 2010-03-19T10:47:51.3593750+03:00 [0] None => Quoting renewing order Buy with id 956759112 price 1712,14 volume 1 transaction 8 2010-03-19T10:47:52.1718750+03:00 range error: {0} System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. Parameter name: min at Ecng.ComponentModel.Range1.ValidateBounds(T min, T max) at Ecng.ComponentModel.Range1.Init(T min, T max) at Ecng.ComponentModel.Range`1..ctor(T min, T max) at SampleSMA.MainWindow.DrawSma() in D:\trade\bot\code\stockSharp \SampleSMA\MainWindow.xaml.cs:line 243 Первый этап обработки исключения типа "System.ArgumentOutOfRangeException" в приложении Ecng.ComponentModel.dll 2010-03-19T10:47:52.7343750+03:00 [0] None => Quoting renewed order Buy with id 956759254 price 1712,98 volume 1 transaction 9 2010-03-19T10:48:02.6718750+03:00 [0] None => Quoting renewing order Buy with id 956759254 price 1712,98 volume 1 transaction 9 2010-03-19T10:48:03.8125000+03:00 [0] None => Quoting renewed order Buy with id 956760263 price 1712,99 volume 1 transaction 10 2010-03-19T10:48:07.4218750+03:00 [0] None => Quoting order 956760263 matched 2010-03-19T10:48:07.4218750+03:00 [0] None => MarketQuotingStrategy stopping 2010-03-19T10:48:07.8593750+03:00 [0] None => Quoting finishing by 956760263 2010-03-19T10:48:07.8593750+03:00 [0] None => MarketQuotingStrategy stopped

В результате этих действий было куплен один лот лука. Видно что котировщик уже не прыгает на месте, гуд. Но выключается без исполнения по факту ошибки, а для этого у меня уже добавлен код, который сверяет требуемую позу с текущей и в случае необходимости запускает котировщика снова для набора позы. Похоже что все работает, кроме проскальзывания, которое равно нулю. Но это не критично.

Thanks:

Mikhail Sukhov

Avatar
Date: 3/19/2010
Reply


Пойдем по шагам:

  1. Какой интервал котирования? Судя по этому:

2010-03-19T10:47:44.7812500+03:00 [0] None => Quoting renewed order Buy with id 956758519 price 1712,79 volume 1 transaction 5 2010-03-19T10:47:45.0937500+03:00 [0] None => Quoting renewing order Buy with id 956758519 price 1712,79 volume 1 transaction 5

У тебя прошло около четверти секунды. Я, конечно, писал в пункте 4

http://stockmarketdotnet.blogspot.com/2010/02/s-17.html, что нужна минимальная задержка, но не настолько же =)

  1. System.ArgumentOutOfRangeException я уже писал, в чем причина. Не пофиксил в алго?

  2. А где вот это? System.ArgumentException: An item with the same key has already been added. Мои догадки - заявка была не зарегистрирована. У незарегистрированных заявок одинаковый номер 0. Но нужно проверить. Жду логи. Еще по хорошему было бы залогировать состояние заявки перед отправкой на котирование, чтоб уж точно.

  3. Проскальзывание для котировщика в процессе. Я так заточил под обычные стратегии, при придется чуть поломать архитектуру. =(

Thanks:

denis

Avatar
Date: 3/19/2010
Reply


  1. Было 0,3 сек. Теперь 1 сек.

  2. это возникает на последней строке private void DrawSma() { var bounds = _timeFrame.GetCandleBounds(_trader);

                    if (_lastCandleTime < bounds.Min)
                     {
             try
             {
                 var endOffset = TimeSpan.FromSeconds(1);
                 bounds = new Range<DateTime>(_lastCandleTime +
    

_timeFrame, bounds.Min - endOffset); // line 243

пока забил на исправления, нужно разобраться с послеобеденными тормозами

  1. Верно. Когда заявка не была зарегистрирована, то возникала такая ошибка. Сейчас создаю, регаю и включаю котировщика. Все путем. делаю так base.Trader.RegisterOrder(order);

            // добавляем зарегистрированную заявку в стратегию
             base.AddOrder(order);
             AddLog(StrategyErrorStates.None, "new order at " +
    

order.Price + " status " + order.Status + " state " + order.State); потом идет котировщик логи

2010-03-19T13:55:01.8750000+03:00 [0] None => new order at 1698,21 status Done state Active 2010-03-19T13:55:09.6250000+03:00 [0] None => Quoting renewing order Buy with id 957686090 price 1698,21 volume 1 transaction 1 2010-03-19T13:55:11.5468750+03:00 [0] None => Quoting renewed order Buy with id 957686670 price 1698,99 volume 1 transaction 2 2010-03-19T13:55:12.5781250+03:00 [0] None => Quoting order 957686670 matched 2010-03-19T13:55:12.5781250+03:00 [0] None => MarketQuotingStrategy stopping 2010-03-19T13:55:13.8750000+03:00 [0] None => Quoting finishing by 957686670 2010-03-19T13:55:13.8906250+03:00 [0] None => MarketQuotingStrategy stopped

  1. Не надо ничего ломать. Потом как-нибудь, когда время будет.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy