orders delay
Atom
31.01.2012
raf


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



Спасибо:


1 2  >
Garic

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


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

Mikhail Sukhov

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


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


Переопределите свой IMarketEmulator.
Спасибо:

foRs

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


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

Garic

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


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


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

Код

        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);
            }            
        }
Спасибо: foRs

foRs

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


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

OvcharenkoVI

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


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


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

pyhta4og

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


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

давным давно было сделано
Спасибо:

ra81

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


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

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

OvcharenkoVI

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


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

hurricane

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


Цитата:

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


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

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

loading
clippy