Why Your Limit Order Didn't Fill
The price touched your limit. Shares printed there. You got nothing. The answer is queue position, and it's the least understood mechanic in day trading.
- execution
- order-types
- fills
You put a bid at 4.20. The stock trades down to 4.20. You watch 8,000 shares print at 4.20 on the tape.
Your order is still working.
Then price lifts to 4.28 without you, and you’re left staring at a chart that says you were right about the level and a blotter that says you own nothing. This is the moment most traders decide their broker is broken or the market is rigged.
Neither. You were in a line, and the line didn’t reach you.
Price touching your limit is not the same as your order trading
A limit order is a conditional instruction: trade me at this price or better, otherwise wait. The waiting happens somewhere specific. Your order joins a queue at your price level, and that queue is ordered.
Whoever got there first is ahead of you. When a seller comes in and hits the bid, they trade against the front of the queue and work backward until their size runs out. If 12,000 shares were already resting at 4.20 and a seller dumps 8,000, that seller never reaches you. The tape prints 8,000 at 4.20. Your order, sitting at position 12,001 through 12,500, never moved.
The print you saw was real. It just wasn’t yours, and it was never going to be.
Where you land in line
Two things put you at the back.
Time. Price-time priority means your position is set by when you arrived at that price level. Post at 4.20 while the stock is at 4.35 and you’ve got a good spot by the time price gets there. Post at 4.20 after the stock is already at 4.21 and you’re behind everyone who anticipated it. The traders who fill at good levels usually got there early and waited, which is less exciting than it sounds and is most of the skill.
Modification. Change your price, and you lose your spot and rejoin at the back. Nudge a resting order three times chasing the inside and you’ve reset your queue position three times. Each nudge felt like being active. Each one moved you further from a fill.
Our fill engine models this directly. A resting limit takes a synthetic queue position behind the displayed size at its level, filled first-come-first-served, and it only fills when enough size trades through to reach it. There’s also a decaying probability that a passing trade skips you entirely, which is the messy reality of an order book that isn’t a single tidy line but a set of venues each with its own queue.
The uncomfortable part: when you do fill
Here’s the thing about queues that took me a while to sit with.
You mostly fill when you’re wrong.
Say your 4.20 bid is genuinely well-placed and buyers step in there. Price bounces. The queue in front of you was never fully consumed, so you didn’t fill, and you watch the move you correctly identified go without you.
Now say the level fails. Sellers keep coming. They chew through the 12,000 ahead of you, reach your 500, fill you at 4.20, and keep going to 4.14. You got your fill, and you got it because the level broke.
That asymmetry is structural, not bad luck. Passive orders are selected against by the market’s own logic: they fill when there’s enough motivated flow to reach them, and motivated flow in one direction is exactly the thing that makes your price stop being good. This is why “I only use limits so I never pay the spread” is an incomplete argument. You’re not paying the spread. You’re paying in fills you don’t get on the trades you wanted, and fills you do get on the ones you didn’t.
The half-answer: partial fills
Between “filled” and “nothing” sits the outcome traders plan for least.
A seller comes through, works down the queue, and reaches you with 200 shares of appetite left. You wanted 500. You get 200, and the remaining 300 stays working at your price.
Now you’re in an awkward spot that isn’t in anyone’s trade plan. You have a position, at a size you didn’t choose, with a live order attached to it that may or may not complete. If the trade goes your way from here, your remainder never fills and you’re two-fifths of the size you intended on a winner. If it goes against you, the rest fills on the way down and you arrive at full size exactly as the thesis breaks.
Decide in advance what a partial means to you. Cancel the remainder and manage what you have, or leave it working because the position was always meant to be scaled into. Both are defensible. Discovering you have no rule while holding 200 unplanned shares is not.
The other reasons nothing happened
Queue position is the common answer. It isn’t the only one.
You were never marketable and never going to be. A buy limit at 4.20 when the offer is 4.31 fills only if someone comes down to you. If the stock runs from 4.31 to 4.80 without printing 4.20, your order does exactly what you told it to do, which is nothing.
Your order was rejected, and you didn’t notice. Rejections are loud in a good platform and easy to miss in a busy one. Insufficient buying power, an invalid size or price, an attempt to sell shares you don’t hold. If your account is near its limit, an order can bounce and leave you thinking you have exposure you don’t.
A cancel raced your fill. You hit cancel as a fill was coming back. Both messages are in flight at the same time, and which wins is a matter of tick ordering, not intent. Sometimes you cancel and fill anyway. That’s not a bug, it’s two messages crossing.
Any platform worth using shows an order’s full lifecycle rather than a binary filled/unfilled. Ours moves through six states: pending on latency, working, partially filled, filled, cancelled, rejected. The distinction between “working” and “rejected” is the entire difference between waiting patiently and standing in a burning building.
What to actually do
Decide up front whether you’re paying for certainty or price. A marketable order buys certainty. It fills against the inside immediately in the overwhelming majority of cases, and you pay the spread plus whatever your size costs you. A resting order buys price, and pays in fill probability. Both are correct. Picking one after you’ve already sent the order is not.
Get there early or don’t get there. If you want passive fills at a level, be at the level before price arrives. Posting into a level as price hits it is the worst of both: you take queue risk without the queue position that makes it worth taking.
Stop nudging. Set the price you want. If it’s wrong, cancel and reassess deliberately. Reprice-chasing is how traders convert a passive strategy into an active one while still believing they’re being patient.
Give unfilled orders a time limit. An order that hasn’t filled in the window where your thesis was valid isn’t waiting anymore, it’s a stale instruction that will fill on someone else’s schedule. Cancel it.
Watching it happen
Reading about queue position doesn’t fix it. Watching a level you’re resting at get consumed from the front, in a replay you can pause and step through, does something reading can’t.
That’s the case for practicing against a real book instead of a chart. The chart tells you 4.20 traded. The book tells you 12,000 shares were there first and only 8,000 sellers showed up, which is the reason you’re flat and the chart will never explain.
Our desk is a free beta and it does exactly that: real historical tape, a montage showing the sizes, and resting orders that hold a queue position instead of filling the instant price touches them. Pick a day where you got left behind and watch it happen at quarter speed.
Related: slippage has three sources covers the late-entry cost of resting orders that do fill, and why paper-trading fills lie explains why most simulators fill every limit the instant price touches it.