orders delay
Atom
1/31/2012


raf

Avatar
Возможно ли при тестировании на истории тестеру EmulationTrader принудительно задать задержку например в 1000 милисекунд (по тестируемой шкале времени) для выставления ордеров (пропуск тиков перед размещением ордеров)? Ведь реальная задержка при выставлении ордеров 100 - 250 ms, а тестер их выставляет мгновенно.



Thanks:


1 2  >
Garic

Avatar
Date: 1/31/2012
Reply


Я это делаю вручную.
Ордер сохраняю в список с желаемым временем.
Подписываюсь на marketTimeChanged - и регистрирую.
Thanks:

Mikhail Sukhov

Avatar
Date: 1/31/2012
Reply


Garic Go to
Я это делаю вручную.
Ордер сохраняю в список с желаемым временем.
Подписываюсь на marketTimeChanged - и регистрирую.


Переопределите свой IMarketEmulator.
Thanks:

foRs

Avatar
Date: 2/20/2012
Reply


а можно поподробнее по задержке с куском кода для примера добавить в справку. это же актуально для всех, кто тести на истории
Thanks:

Garic

Avatar
Date: 2/20/2012
Reply


foRs Go to
а можно поподробнее по задержке с куском кода для примера добавить в справку. это же актуально для всех, кто тести на истории


Ну я не думаю что мой код претендует на добавление в справку :)
Исполнение у меня сделано примерно так (наследник Strategy)

Code

        public decimal CurrentPos;
        private Object _lockObjCurrentPos = new Object();
        private SynchronizedDictionary<Order, OrderInfo> _ordersInfo = new SynchronizedDictionary<Order, OrderInfo>();
        public OrderInfo OrderInfo(Order order)
        {
            return _ordersInfo.SyncGet(o => o.FirstOrDefault(t => t.Key == order)).Value;
        }

        // Ордера которые отправляются с задержкой.
        protected SortedList<Order, DateTime> _delayedOrders = new SortedList<Order, DateTime>();
        private Object _lockObjDelayedOrders = new Object();

        public void OnMarketTimeChanged()
        {
            List<Order> orders = new List<Order>();

            var processOrders = _delayedOrders.Where(p => p.Value <= TraderManager.MarketTime);

            if (processOrders.Count() == 0)
                return;

            lock (_lockObjDelayedOrders)
            {
                foreach (var pair in processOrders)                
                    orders.Add(pair.Key);

                foreach (var order in orders)
                    _delayedOrders.RemoveWhere(p => p.Key.Id == order.Id);
            }

            foreach (var order in orders)
            {
                lock (_lockObjCurrentPos)
                {
                    CurrentPos += order.Volume * (order.Direction == OrderDirections.Buy ? 1 : -1);
                }
                                
                base.RegisterOrder(order);
            }
        }

        public virtual void MyCreateOrder(OrderDirections direction, string comment = "", decimal price = 0, decimal volume = 0, TimeSpan _delay = new TimeSpan())
        {   
            var priceLocal = price;

            if (volume == 0)
                volume = base.Volume;
            if (priceLocal == 0)
            {               
                priceLocal = Security.LastTrade.Price + 1000 * (direction == OrderDirections.Buy ? 1 : -1);              
            }

            var order = this.CreateOrder(direction, priceLocal, volume);

            var timePlan = MarketTime;            
                        
            _ordersInfo.SyncDo(o => o.Add(order, new OrderInfo
                               {
                                   Comment = comment,
                                   PricePlan = price == 0 ? candleList.Last().ClosePrice : price,
                                   TimePlan = timePlan
                               }));
            
            try
            {   
                if (_delay == new TimeSpan())
                {
                    lock (_lockObjCurrentPos)
                    {
                        CurrentPos += order.Volume * (order.Direction == OrderDirections.Buy ? 1 : -1);
                    }                    

                    base.RegisterOrder(order);
                }
                else
                {
                    _delayedOrders.Add(order, TraderManager.MarketTime + _delay);
                }                
            }
            catch (Exception e)
            {
                LoggingHelper.AddErrorLog(this, e);
            }            
        }
Thanks: foRs

foRs

Avatar
Date: 4/15/2012
Reply


А в тесте с использованием котирования задержку на выставление при перерегистрации заявок как сделать?
Thanks:

OvcharenkoVI

Avatar
Date: 4/15/2012
Reply


foRs Go to
А в тесте с использованием котирования задержку на выставление при перерегистрации заявок как сделать?


Если пользоваться предыдущим методом, то, наверное, вообще геморрой )))
Thanks:

pyhta4og

Avatar
Date: 4/16/2012
Reply


MarketEmulator.Settings.Latency
- задержка при RegisterOrder

давным давно было сделано
Thanks:

ra81

Avatar
Date: 4/16/2012
Reply


foRs Go to
А в тесте с использованием котирования задержку на выставление при перерегистрации заявок как сделать?

Вот если именно таймаут между перевыставлениями заявок - то кажется никак. Только сделать свое котирование с таймаутом :).
Если же речь про латенси о которой говорилось выше, то ответ дан :)
Thanks:

OvcharenkoVI

Avatar
Date: 4/16/2012
Reply


Так в котировании же также используется RegisterOrder, значит задержка будет, зачем свое котирование писать
Thanks:

hurricane

Avatar
Date: 4/16/2012
Reply


Quote:

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


в котировании используется вроде ReRegisterOrder
Thanks:
1 2  >

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

loading
clippy