Essentially the assumption that prices are set efficiently does not hold for FX. Errors in pricing can occur, and when there is an arbitrage opportunity and a market maker loses money then it is assumed (possibly) due to a pricing error which the arbitrager shouldn't have taken advantage of.
A bit of history how the messaging protocol works might make things clearer.
In the old days a trade would take place over the phone as follows:
You: "I'd like to buy USDJPY, $1 million worth please"
Market Maker or broker (MM): "Ok you can get $1 million dollars worth for 123"
At this point there was a gentleman's agreement you would respond within 4 seconds whether you want that price or not (as the market may move)
You: "Mine, I'll take it"
Here you have completed your side of the contract and cannot back out. You just need the MM to confirm that they can still get your USDJPY 1 million 123 (this was traditionally confirmed with a trader sitting nearby who could see all the prices and volumes being published in the market and could give a price at which they could hedge the entire volume and still make a profit. These days traders still perform this role to a small extent but generally the broker would read a price off a screen themselves).
If they can, MM: "It's yours, USDJPY 1 million at 123" and the transaction (contract) is confirmed good. The position is transferred to you, and the trader who provided the original price hedges the risk and gets out of the position, flattening his trading book.
If the market has since moved and the trade is no longer profitable, MM: "I'm sorry the price has changed, you can now buy at 123.1" and you jump back up to the previous
Ok, so all this has been upgraded with technology over the years, specifically messaging is now done via the FIX protocol (same as is used for other asset classes). But the basic flow is still the same:
You: Request price at a quantity
MM: provides price
You: decide whether to take that price
MM: confirms that the price is still good, then sends you confirmation the trade was good (and hedges the trade), or otherwise rejects the trade.
The issue arbitraging causes is that if the prices in the market move and those moves are known to the arbitrageur but not to the market maker then the market maker gets into a position where they accept and confirm the trade, but can't hedge out at the price they thought they could, and so lose money on the trade. A few of these trades and the losses start to build up, and if it keeps happening with a certain client (remember, no anonymous exchanges here) then it's easy to punish that client (show them worse prices, cut them off completely, etc). If an arbitrageur is hiding behind a third party then the market maker might have enough clout to punish the entire third party (in which case it would be in the third party's interest to seek out the arbitrageur and punish them themselves).
A bit of history how the messaging protocol works might make things clearer.
In the old days a trade would take place over the phone as follows:
You: "I'd like to buy USDJPY, $1 million worth please" Market Maker or broker (MM): "Ok you can get $1 million dollars worth for 123"
At this point there was a gentleman's agreement you would respond within 4 seconds whether you want that price or not (as the market may move)
You: "Mine, I'll take it"
Here you have completed your side of the contract and cannot back out. You just need the MM to confirm that they can still get your USDJPY 1 million 123 (this was traditionally confirmed with a trader sitting nearby who could see all the prices and volumes being published in the market and could give a price at which they could hedge the entire volume and still make a profit. These days traders still perform this role to a small extent but generally the broker would read a price off a screen themselves).
If they can, MM: "It's yours, USDJPY 1 million at 123" and the transaction (contract) is confirmed good. The position is transferred to you, and the trader who provided the original price hedges the risk and gets out of the position, flattening his trading book.
If the market has since moved and the trade is no longer profitable, MM: "I'm sorry the price has changed, you can now buy at 123.1" and you jump back up to the previous
Ok, so all this has been upgraded with technology over the years, specifically messaging is now done via the FIX protocol (same as is used for other asset classes). But the basic flow is still the same:
You: Request price at a quantity MM: provides price You: decide whether to take that price MM: confirms that the price is still good, then sends you confirmation the trade was good (and hedges the trade), or otherwise rejects the trade.
The issue arbitraging causes is that if the prices in the market move and those moves are known to the arbitrageur but not to the market maker then the market maker gets into a position where they accept and confirm the trade, but can't hedge out at the price they thought they could, and so lose money on the trade. A few of these trades and the losses start to build up, and if it keeps happening with a certain client (remember, no anonymous exchanges here) then it's easy to punish that client (show them worse prices, cut them off completely, etc). If an arbitrageur is hiding behind a third party then the market maker might have enough clout to punish the entire third party (in which case it would be in the third party's interest to seek out the arbitrageur and punish them themselves).