Заполнение заявок у MarketEmulator
Atom Ответить
19.09.2014


При тестировании на RealTimeEmulationTrader при значении настройки у MarketEmulator MatchOnTouch = false заполнение заявок происходит путем «прошивания» уровня цены заявки. При этом цена полученной сделки принимает значение лучше, чем была выставлена цена у лимитированной заявки, что не отражает реальную картину. В связи с тем, что на реальном рынке цена сделки практически всегда соответствует цене заявки.

Подскажите, пожалуйста, каким образом сделать, чтобы при значении настройки MatchOnTouch = false у MarketEmulator заполнение заявок происходило по ценам самих заявок (как при MatchOnTouch = true, но с «прошиванием» уровня цены заявки, а не касанием)?

PS. Речь идет о лимитированных заявках выставленных единичным лотом.



Спасибо:




10 Ответов
Mikhail Sukhov

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


Pyrkoff Go to
на реальном рынке цена сделки практически всегда соответствует цене заявки.


Вы же клиент обучения? Скачайте участок ОЛ с контакта, постройте распределение по цене заявки и сделки. И увидите, что это не так.
Спасибо:

Pyrkoff

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


Михаил Сухов Go to
Pyrkoff Go to
на реальном рынке цена сделки практически всегда соответствует цене заявки.


Вы же клиент обучения? Скачайте участок ОЛ с контакта, постройте распределение по цене заявки и сделки. И увидите, что это не так.


Выразился не совсем так. С ордер логом согласен, я имел в виду свои заявки, они в 99% случаев исполняются по ценам самих заявок на реале, потому что выставляются всегда ниже бида в случае бая и выше аска в случае селла.
А вот если рассматривать эмуляцию при MatchOnTouch = false, то там исполнение, как я уже писал, происходит всегда лучше цены заявки. И в результате получается, что к каждой сделке «приклеивается» пункт, которого на реале практически никогда не встретить.

При включенной опции MatchOnTouch = false исполнение заявки дожидается, когда цена прошьет ее уровень. Рынок уровень прошивает, происходит исполнение, но, как мне кажется логичным, оно должно происходить по цене заявки, а не по цене на сколько данный уровень прошьется. Всё это естественно применимо для заявок, которые выставляются ниже рынка в случае бая и выше в случае селла.

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

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

Mikhail Sukhov

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


Или я вас не понимаю, или вы говорите о разных вещах. Цена сделки у лимитки всегда не хуже цены заявки. В этом ее смысл.

Если вы стоите в стакане, и по вам ударяют, то цена ваших сделок будет всегда = цене заявки.

Если вы ударяете по стакану, то цена ваших сделок будет >= лучшей противоположной цене и <= цене заявки.
Спасибо:

Pyrkoff

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


Михаил Сухов Go to
Если вы стоите в стакане, и по вам ударяют, то цена ваших сделок будет всегда = цене заявки.


Вот я как раз об этом, я выставляю отложку, то есть «стою в стакане». По мне «ударяют», то есть прошивают уровень моей заявки, и на реале практически всегда цена сделки получается равной цене заявки. А вот у MarketEmulator при MatchOnTouch = false в таком случае сделка принимает значение цены лучше, чем у заявки.

По моему мнению, это достаточно оптимистический сценарий, который очень редко встречается на реальном рынке, поэтому присутствует необходимость данный момент подправить.


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

Mikhail Sukhov

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


Pyrkoff Go to

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


Мы о разных вещах видимо говорим. Не может быть такого как "практически всегда".
Спасибо:

devruss

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


покажи лог с примером: выведи цены, best bid/ask, отдельно момент выставления заявки, как цена прошивает ордер и тут же цену исполнения.

Если эта ошибка существует, то ты только что убил всем пользователям продукта большинство интрадей стратегий, не говоря про HFT=) Хотя я сам все проверял, у меня было нормально. Единственный момент, когда цена исполнения может быть лучше, чем в лимином приказе - это когда например рынок идет наверх, ты ставишь лимитный приказ на продажу, и до того как он реально поставился на биржу, рынок проходит твой уровень и твой приказ исполняется как бы "по рынку", т.е. по текущим ценам. Такое случается live на сильных движениях, например
Спасибо:

Pyrkoff

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


Михаил Сухов Go to

Не может быть такого как "практически всегда".


То незначительное количество сделок на реале, которые получали цены лучше заявок, видимо, как отметил [USERLINK]devruss[/USERLINK], попросту не успевали вовремя выставляться в нужное место. Спасибо, с этим понятно.

Используя следующий код:
Code

this.WhenNewMyTrades()
    .Do(ProcessMyTrades)
    .Apply(this);
this.WhenOrderRegistered()
    .Do(ProcessOrders)
    .Apply(this);

private void ProcessOrders(Order order)
{
    order.Comment = Security.BestPair.ToString();
}

private void ProcessMyTrades(IEnumerable<MyTrade> myTrades)
{
    foreach (var trade in myTrades)
    {
        Debug.Print("Цена заявки {0} {1}, BestPair у заявки {2}, Цена сделки {3}, BestPair у сделки {4}",
					trade.Order.Direction, 	trade.Order.Price, trade.Order.Comment, trade.Trade.Price, Security.BestPair)    	
    }            
}


вывожу лог исполнения сделок у MarketEmulator при MatchOnTouch = false:


Как видно из представленного примера исполнение всегда проходит лучше цены заявки..
Автор топика
Спасибо:

Mikhail Sukhov

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


Действительно, была ошибка. Будет фикс.
Спасибо: Pyrkoff

Pyrkoff

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


Михаил Сухов Go to
Действительно, была ошибка. Будет фикс.


Михаил, в версии 4.2.26.0 произведен фикс указанной выше проблемы. Замечательно!

Используя код:
Code

        private decimal sum;
        protected override void OnStopped()
        {
            MyTrades.ForEach(t =>sum = sum + Math.Abs(t.Trade.Price - t.Order.Price));
            Debug.Print("Общий результат {0}", sum);

            base.OnStopped();
        }


при остановке стратегии результат во всех случаях прогона отличен от ноля.
Что явно подтверждает, что проблема не была решена в полной мере!

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






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

Mikhail Sukhov

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


Pyrkoff Go to

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


Полное отсутствие - это нереально поведение.

Наверное, вы не совсем поняли первоначальную проблему. Была ошибка, что стоящая в стакане заявка исполняется по ценам, лучше чем ее цена. Это исправили. А то что вы пишите - это исправление поведения уже обратного случая - активной заявки (в стакан не ставится).
Спасибо:


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

loading
clippy