Описание работы эмулятора в текущей версии.
1)
Пусть был стакан (цена, направление, объем). Стакан (А)
10 SELL 1
9 SELL 1
8 SELL 1
5 BUY 1
4 BUY 1
Вы кидаете заявку 9 BUY 2. Она сводится со стаканом по ценам 8 и 9.
Это алгоритм матчинга по стакану (FillOnQuotes)
- Пусть был тот же стакан (А). Вы кидаете заявку 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.
- Та же ситуация что и в 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) надо обрабатывать иначе. Т.е. при обработке вновь входящего стакана, в случае если есть заявка которая матчится этим стаканом, то филлить ее по цене заявки. Видимо такие стаканы, не сопровождающиеся сделками, иногда все таки приходят. Вопрос на сколько часто.