Order order; order.action = action; order.orderType = "STP"; order.totalQuantity = quantity; order.auxPrice = stopPrice; order.account = account; order.tif = i_tif; order.outsideRth = true; order.triggerMethod = 7;//7 - Last or bid/ask function https://interactivebrokers.github.io/tws-api/trigger_method_limit.html
triggerMethod не особо что-то сильно поменял (раньше было значение по-умолчанию — Last trade)
Для начала нужно понять как вы определяете проскальзывание.
Это мягко говоря нетривиальный вопрос.
Далее смотрим "Last or bid/ask".
В разгар сессии отклонения между Last и bid/ask могут быть существенными.
Попробуйте order.triggerMethod = 4; // Bid/ask function
Ну и конечно стоп — это всегда эмуляция.
Потому что в нём есть условная составляющая на обработку которой требуется время.
А время порождает проскальзывание.
dip, я о суровой реальности
https://www.cmegroup.com/education/courses/things-to-know-before-trading-cme-futures/futures-order-types.html
«The stop order type is an order which, when accepted, does not immediately go on the book, but must be triggered...»
Ключевое слово здесь «triggered».
Не важно где они лежат.
Важно, что для их срабатывания требуется время для сравнения цены в ордере и на бирже.
За это время рынок естественным образом меняется.
Далее стоп ордер порождает рыночную заявку.
Что ещё усугубляет ситуацию.
https://www.interactivebrokers.com/en/trading/orders/stop.php
В результате вы вполне справедливо получаете проскальзывание.
Хотите точного исполнения, используйте ордер типа «STP LMT».
Но там тоже придётся улучшать цену и закладывать проскальзывание.
dip, до matching engine ордеру ещё нужно дойти.
О чём я тут и распинаюсь.
Вы не ответили каким способом измеряете проскальзывание.
Надеюсь не глазами ?