[BUG] EmulationTrader выполняет лимитные заявки по неправильным ценам


[BUG] EmulationTrader выполняет лимитные заявки по неправильным ценам
Atom Ответить
24.11.2011


Всем привет,

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

Код

11:17:37.330 |            | MyStrategy        | Calculated ExitPrice: 96520 
11:17:37.330 |            | MyStrategy        | Registering exit order
11:17:52.360 |            | MyStrategy        | Новая Sell сделка 50 по цене 96525 на 1 заявки 20689543.
11:17:52.360 |            | MyStrategy        | ExitOrder filled!


В первой колонке время в эмуляции (то есть как оно должно быть "на рынке"). Тут мы поставили заявку в 37 секунд, мы должны встать в стакан. Через 15 секунд цена дошла до нас, в реальности мы не можем в таком случае получить цену, лучше чем ту, по которой поставили. Нас обязаны по ней забрать.

EmulationTrader считает что мы получаем по любой цене которая удовлетворяет, или лучше нашей заявки. Бывают очень серьезные различия, например в 100 пунктов на фьючерсе РТС. Соответственно, это искажает результаты тестирования.

Версия стокшарпа с codeplex: 11757



Спасибо:




3 Ответов
kenota

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


Кто нибудь может подтвердить проблему? Или может команда стокшарпа может что то сказать?
Автор топика
Спасибо:

pyhta4og

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


Описание работы эмулятора в текущей версии.

1)
Пусть был стакан (цена, направление, объем). Стакан (А)

10 SELL 1
9 SELL 1
8 SELL 1

5 BUY 1
4 BUY 1

Вы кидаете заявку 9 BUY 2. Она сводится со стаканом по ценам 8 и 9.
Это алгоритм матчинга по стакану (FillOnQuotes)

2) Пусть был тот же стакан (А). Вы кидаете заявку 7 BUY 2. Она становится в стакан.
Он будет
10 SELL 1
9 SELL 1
8 SELL 1

-7 BUY 2 - наша заявка.
5 BUY 1
4 BUY 1


Теперь приходит с биржи новый стакан (Б)

10 SELL 1
9 SELL 1
8 SELL 1
7 SELL 1 - 7 BUY 2 - наша заявка
6 SELL 1

4 BUY 1
3 BUY 1
2 BUY 1

Алгоритм сведения все тот же - (С). Будут сделки по ценам 6 и 7.

3) Та же ситуация что и в 2). Т.е. заявка встала в стакан
10 SELL 1
9 SELL 1
8 SELL 1

-7 BUY 2 - наша заявка.
5 BUY 1
4 BUY 1

Приходит сделка 5 TRADE 1. Она соответствует тому что стакан (А) стал стаканом (Б). Т.е. заявку 5 BUY 1 кто-то взял встречной заявкой (лимитной SELL с ценой <=5 или маркетной).

Эмулятор в случае такой биржевой сделки также удовлетворит нашу заявку 7 BUY 2 по ее лимитной цене 7. Это алгоритм матчинга по сделкам (FillOnTrades)


Ситуация (1) соответствует ситуации когда вы кидаете стратегией лимитную заявку которая сразу может быть зафиллена текущим стаканом. И алгоритм матчинга здесь корректный - она исполняется по лУчшей чем в ней указано цене.

Ситуация (3) соответствует эмуляции ситуации, когда есть сделка совершенная по цене 5 ниже нашей заявки на покупку. Это означает что в стакан была помещена заявка на SELL с ценой (<=5) ниже нашей (7). Мы явно с биржи такой заявки в наших данных не видим и алгоритм 2) не отработает. Поэтому сделана такая дополнительная эмуляция по сделкам.

При эмуляции по сделкам цена филла лимитной заявки всегда будет равна цене заявленной в лиминой заявке.

В вашем случае видимо в эмулятор первым пришел обновленный стакан, а не сделка соответствующая этому обновлению.
И сработал алгоритм FillOnQuotes.


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

Вообще говоря, следует признать что это ошибка. И ситуацию (2) надо обрабатывать иначе. Т.е. при обработке вновь входящего стакана, в случае если есть заявка которая матчится этим стаканом, то филлить ее по цене заявки. Видимо такие стаканы, не сопровождающиеся сделками, иногда все таки приходят. Вопрос на сколько часто.
Спасибо:

kenota

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


Отключил полностью генерацию стаканов, все равно такое поведение встречается, вот пример лога без генерации стаканов вообще:

Код

10:59:52.587 |            | MyStrategy        | TakeProfitPrice: 103855 stop price:103515
10:59:52.587 |            | MyStrategy        | Registering take profit order
10:59:53.040 |            | MyStrategy        | Новая Sell сделка 26 по цене 103865 на 1 заявки 16654826.


Хотя, таких моментов вроде стало намного меньше если пара секунд прошла между установкой заявки и выходом то вроде их нету. Сделаю сравнение по сделкам и отпишусь сюда еще раз.
Автор топика
Спасибо:


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

loading
clippy