How a stop loss actually works
A stop loss is an instruction to close your trade once the price reaches a level. On a buy, it triggers when the bid falls to your stop; on a sell, when the ask rises to it. The crucial point is that it triggers, then fills at the next available price — which in a fast market can be worse than your stop level.
So a stop does not guarantee your exact exit price. It guarantees an attempt to exit once the level is touched.
Common reasons it seems not to trigger
You watched the wrong price. A buy's stop uses the bid, but the chart often shows only one line; a sell's stop uses the ask, which sits a spread away. So price can look like it hit your level while the relevant side did not.
The stop was never actually set, or was rejected earlier for being invalid. The platform was disconnected, so a manual close could not happen (though a server-side stop still works when you are offline). Or a weekend or news gap jumped straight past your level.
Common reasons it filled worse than expected
Slippage in fast markets: once triggered, the stop fills at the next tradeable price, which can be several points away during news or thin liquidity. Gaps over the weekend or around events can fill far from your stop, because there simply was no price in between.
How to prevent surprises
Set stops with a little room and understand they are server-side, so they work even if your platform is closed. Account for the spread when placing a stop on the ask/bid side. Expect slippage around news and over weekends, and size positions so a gap cannot do disproportionate damage. A guaranteed stop, where offered, removes gap risk for a fee.
Broker's fault or yours?
A stop filling worse in a genuinely fast or gapping market is normal, not manipulation. But if stops are repeatedly filled well beyond the level in ordinary conditions, that is worth investigating. Check the tick data around the fill and compare with another price source before concluding anything.