orders delay
Atom Ответить
31.01.2012


raf

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



Спасибо:




19 Ответов
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

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


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

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

ra81

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


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

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

OvcharenkoVI

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


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

hurricane

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


Цитата:

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


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

ra81

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


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

Я так понял вопрос, что нужно перед новой регистрацией заявки, выждать паузу. А не внести латенси регистрации заявки. Отсюда в котировании такой паузы нет.


Цитата:
в котировании используется вроде ReRegisterOrder

Все зависит от Свойства IsSupportAtomicReRegister - если у эмулятора оно будет false, тада котирование будет юзать отмену и затем регистрацию заявки.
Спасибо:

OvcharenkoVI

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


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

Я так понял вопрос, что нужно перед новой регистрацией заявки, выждать паузу. А не внести латенси регистрации заявки. Отсюда в котировании такой паузы нет.


Цитата:
в котировании используется вроде ReRegisterOrder

Все зависит от Свойства IsSupportAtomicReRegister - если у эмулятора оно будет false, тада котирование будет юзать отмену и затем регистрацию заявки.


об этом и говорю
Спасибо:

foRs

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


Вообще 2 варианта рассматривал выждать паузу и латенси при регистрации. Делал тест с латенси 0 мс. получилось к примеру 400 лосов, при латенси 1000 мс. 667 лосов. Ну значит пашет вроде при котировании.

А по умолчанию в котировании используется RegisterOrder или ReRegister ?
Спасибо:

OvcharenkoVI

Фотография
Автор статей
Дата: 17.04.2012
Ответить


foRs Перейти
Вообще 2 варианта рассматривал выждать паузу и латенси при регистрации. Делал тест с латенси 0 мс. получилось к примеру 400 лосов, при латенси 1000 мс. 667 лосов. Ну значит пашет вроде при котировании.

А по умолчанию в котировании используется RegisterOrder или ReRegister ?


Если IsSupportAtomicReRegister = false, то Register. Если true, то reregister
Спасибо:

hobo

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


В тестировании задержки при исполнении ордеров так же(а имхо даже более) важны, чем Latency при регистрации.
Кидаем лимитку на уровень с большим числом заявок, ну пусть она зарегистрировалась даже через секунду, выполнение всех ордеров, которые были выставлены раньше, может занять гораздо больше чем секунду
Спасибо:

pyhta4og

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


hobo Перейти
В тестировании задержки при исполнении ордеров так же(а имхо даже более) важны, чем Latency при регистрации.
Кидаем лимитку на уровень с большим числом заявок, ну пусть она зарегистрировалась даже через секунду, выполнение всех ордеров, которые были выставлены раньше, может занять гораздо больше чем секунду


Исполнение лимитки сделано только после того как исполнятся весь объем в стакане на уровне цены лимитки. Пример. цена 100 стоит 10 контрактов на покупку. кидаем заявку на покупку 1 контракта. Приходят сделки. 1,2,3 контракта по цене 100. Это кто-то продает в бид. Так вот, пока весь объем 10 контрактов на уровне 100 не кончится тестер не будет исполнять нашу заявку.
Спасибо: hobo

Кот Матроскин

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


OvcharenkoVI Перейти

Если IsSupportAtomicReRegister = false, то Register. Если true, то reregister

Что-то не получается установить IsSupportAtomicReRegister = false
Пишет, что метод доступа protected set, для записи не доступно...
Спасибо:

hobo

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


pyhta4og Перейти
Исполнение лимитки сделано только после того как исполнятся весь объем в стакане на уровне цены лимитки. Пример. цена 100 стоит 10 контрактов на покупку. кидаем заявку на покупку 1 контракта. Приходят сделки. 1,2,3 контракта по цене 100. Это кто-то продает в бид. Так вот, пока весь объем 10 контрактов на уровне 100 не кончится тестер не будет исполнять нашу заявку.

Супер. А если стакан новый пришел, а мою заявку еще не исполнили?
Ну допустим, на момент выставления моей заявки на уровне было 10 лотов, стакан появился новый, там стало 25 лотов, ясно что все 15(ну 15 минус мой объем, если быть точным) встали после меня, исполнение какого объема будет ждать тестер, когда дойдет до исполнения моего ордера?

Кот Матроскин Перейти
Пишет, что метод доступа protected set, для записи не доступно...

Security.Exchange.IsSupportAtomicReRegister
Спасибо: Кот Матроскин

Кот Матроскин

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


hobo Перейти

Кот Матроскин Перейти
Пишет, что метод доступа protected set, для записи не доступно...

Security.Exchange.IsSupportAtomicReRegister

А я пытался не через Security.Exchange, а через Trader Blushing
Спасибо:


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

loading
clippy