When using the IBKR paper account through the API, limit orders are sometimes filled at better prices than the limit—something that almost never happens in live trading. This doesn't seem to occur when trading via TWS's paper account, so it appears specific to API-generated orders. While some level of inaccuracy is expected in a simulated environment, this particular flaw results in unrealistically favorable fills and undermines strategy testing. It should be relatively straightforward for IBKR to ensure fills are capped at the submitted limit price. Until then, the only workaround is manually adjusting fills to reflect the actual limit price—which is tedious.
Resting/Passive limit order? Maybe you are sending a limit order and it immediately executes because market moved against you? You would get price improvement. Basically becomes a marketable limit order.
How much positive slippage are you getting on your fills? I am often filled at better prices than where my limit orders are set especially during more volatile periods when price is moving fast and the spread can widen quickly. Those conditions are great for limit entries, horrible for stop entries.
I see your point. But that’s not what’s happening. What I typically see is that limit orders get hit at the limit price and then rest — and if some time passes, a few of them end up getting filled with price improvement on the remaining shares. This doesn’t happen on every order, but it does on a few. The issue is that this kind of favorable fill would never occur in live trading. What’s strange is how easy it should be to fix: just ensure that resting limit orders fill strictly at the limit price, like they do in the real world.
I haven’t experienced this. Maybe it’s the type of stocks you trade (low volume, high spread). I have written my own simulator and I have a flag to disallow price improvements. The reason for price improvements was because fills were simulated based on trades and size of bid/ask. So as bids are removed, price trades lower and fills are simulated at lower prices. Similar logic may exist at IBKRs. I think if I were you, I would split the order into smaller size orders a few tick sizes apart. This, in fact, would be a better real live execution practice than sending one big order to single exchange.
Here is an example. The limit order is one order sell at 3.16. The order was filled over 8 minutes and the orders are listed in chronological order. As you can see the fills would of course not happen in live trading. So what I do is simply assume all shares filled at 3.16. SLD 100 DNUT 3.3 USD NASDAQ SLD 500 DNUT 3.16 USD NASDAQ SLD 100 DNUT 3.21 USD DRCTEDGE SLD 100 DNUT 3.2 USD DRCTEDGE SLD 100 DNUT 3.19 USD DRCTEDGE SLD 100 DNUT 3.2 USD DRCTEDGE SLD 100 DNUT 3.19 USD DRCTEDGE SLD 200 DNUT 3.19 USD NASDAQ SLD 100 DNUT 3.19 USD DRCTEDGE SLD 100 DNUT 3.19 USD DRCTEDGE SLD 100 DNUT 3.19 USD DRCTEDGE SLD 100 DNUT 3.19 USD DRCTEDGE SLD 100 DNUT 3.19 USD NASDAQ SLD 500 DNUT 3.24 USD DRCTEDGE SLD 100 DNUT 3.25 USD ARCA SLD 500 DNUT 3.26 USD BATS SLD 500 DNUT 3.27 USD DRCTEDGE SLD 500 DNUT 3.28 USD MEMX SLD 400 DNUT 3.28 USD MEMX SLD 100 DNUT 3.3 USD DRCTEDGE SLD 100 DNUT 3.3 USD NASDAQ SLD 500 DNUT 3.31 USD DRCTEDGE SLD 100 DNUT 3.3 USD DRCTEDGE SLD 400 DNUT 3.32 USD MEMX SLD 400 DNUT 3.33 USD DRCTEDGE SLD 142 DNUT 3.33 USD DRCTEDGE
I would suggest you don’t put such big orders on the book, but break them up. If you put large order on the book, algos will use it to lean on it, so you will either not get filled and miss a profitable trade. or will only get filled when trade goes against you. Adverse selection