Trade Context Busy
Also known as: error 146, trade context is busy, ERR_TRADE_CONTEXT_BUSY, IsTradeContextBusy
What is it?
Trade Context Busy is a MetaTrader error that happens when your Expert Advisor tries to send a trade while the platform's single trade thread is already occupied by another operation or another EA. MetaTrader processes order requests one at a time, so if a second request arrives before the first finishes, the new one is rejected with error 146 (trade context busy).
sequenceDiagram
autonumber
participant A as EA A
participant B as EA B
participant T as Trade thread
participant Brk as Broker
A->>T: Send SELL EUR/USD
activate T
Note over T: Thread now busy (~800ms)
T->>Brk: Route order
B->>T: Send BUY GBP/USD
T-->>B: Error 146 trade context busy
Brk-->>T: SELL filled
deactivate T
B->>T: Retry BUY GBP/USD
activate T
T->>Brk: Route order
Brk-->>T: BUY filled
deactivate T
In practice, you hit this when two EAs share one terminal, or when one EA fires multiple orders in the same tick. Say EA A starts a SELL on EUR/USD that takes 800 milliseconds to confirm; if EA B tries to BUY GBP/USD during that same 800ms window, EA B's order bounces back with the busy error.
You then have to wait for the thread to free up and retry, or your trade simply does not get placed.
Why it matters: It can silently block your EA's orders from reaching the broker, so an intended entry or exit never executes while your capital stays exposed.
A rejected order means a planned entry or exit can be missed entirely, leaving a position unmanaged while the market moves.
Real-world example
Two EAs run in one MT4 terminal: one opens a 0.5-lot EUR/USD buy that takes ~600ms to confirm, and during that window a second EA's 0.3-lot USD/JPY order is rejected with error 146 and must retry on the next tick.
How SignalBots handles it
The SignalBots MT4/MT5 Connector serializes order requests and retries on a busy trade thread, so signals you act on are less likely to be dropped by error 146. See /risk-warning.
Pro tip
Guard every order call with the IsTradeContextBusy() check and a short retry loop so a busy thread defers the request instead of dropping it.
Common pitfalls
Running two or more order-sending EAs in the same MetaTrader terminal and assuming both can trade at once, when they actually share one trade thread.
Frequently asked questions
What is MetaTrader error 146?
Error 146 is the 'trade context busy' code. It means the terminal's single trade thread was occupied by another order operation when your EA tried to trade, so the request was rejected and must be retried.
How do I fix trade context busy errors?
Wrap order calls in a loop that checks IsTradeContextBusy() and waits a few milliseconds before retrying. Running only one order-sending EA per terminal also avoids most cases.
Can two EAs run in the same MT4 terminal?
Yes, but they share one trade thread, so only one can send an order at a time. If they fire simultaneously, one gets a trade context busy error. Your capital is at risk if a blocked order leaves a position unmanaged.
Does trade context busy mean my order failed?
Yes, that specific request was rejected and not sent to the broker. A well-built EA retries automatically; without retry logic the trade is simply skipped, which can leave you exposed.
Is trade context busy a broker problem or a platform problem?
It is a platform-side limit: MetaTrader processes trades on one thread per terminal. It is not caused by your broker, so the fix is in your EA's order-handling logic, not your account.
Trading involves substantial risk of loss. Historical and backtested results do not guarantee future performance. Read the full risk warning.