MT5 error 10046: The request is rejected, because the "Opposite positions on a single symbol are disabled" rule is set for the trading account.
Close the open position before opening the opposite one, or reduce it, instead of hedging it.
Updated 22 October 2026. Runs in your browser; nothing you type is uploaded.
The number after retcode= in MT5's Experts or Journal tab. 41 codes, as MQL5's reference words them.
10046
TRADE_RETCODE_HEDGE_PROHIBITED
The request is rejected, because the "Opposite positions on a single symbol are disabled" rule is set for the trading account. For example, if the account has a Buy position, then a user cannot open a Sell position or place a pending sell order. The rule is only applied to accounts with hedging accounting system (ACCOUNT_MARGIN_MODE=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING).
Cause and fix for 10046What MQL5 says
10046TRADE_RETCODE_HEDGE_PROHIBITED- The request is rejected, because the "Opposite positions on a single symbol are disabled" rule is set for the trading account. For example, if the account has a Buy position, then a user cannot open a Sell position or place a pending sell order. The rule is only applied to accounts with hedging accounting system (ACCOUNT_MARGIN_MODE=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING).
From MQL5's table of trade server return codes, read 22 October 2026. An Expert Advisor finds it in MqlTradeResult.retcode; the Experts and Journal tabs print it.
What causes it
The account is on the hedging system but forbids opposite positions on one symbol, so a sell cannot open while a buy on the same symbol is open (or the other way round).
The fix in MQL5
Close the open position before opening the opposite one, or reduce it, instead of hedging it.
#include <Trade/Trade.mqh>
CTrade trade;
void Reverse(const double lots)
{
trade.Sell(lots, _Symbol); // while a buy on this symbol is still open
}#include <Trade/Trade.mqh>
CTrade trade;
void Reverse(const double lots)
{
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
const ulong ticket = PositionGetTicket(i);
if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
trade.PositionClose(ticket); // close the buy first
}
trade.Sell(lots, _Symbol);
}Both compile in MetaEditor 5 with no errors or warnings. Adapt them to your EA; they were not run against a trade server.
Other MT5 errors
- MT5 error 10004: Requote
- MT5 error 10006: Request rejected
- MT5 retcode 10009: Request completed
- MT5 error 10013: Invalid request
- MT5 error 10014: Invalid volume in the request
- MT5 error 10015: Invalid price in the request
- MT5 error 10016: Invalid stops in the request
- MT5 error 10017: Trade is disabled
- MT5 error 10018: Market is closed
- MT5 error 10019: There is not enough money to complete the request
- MT5 error 10021: There are no quotes to process the request
- MT5 error 10022: Invalid order expiration date in the request
- MT5 error 10026: Autotrading disabled by server
- MT5 error 10027: Autotrading disabled by client terminal
- MT5 error 10030: Invalid order filling type
- MT5 error 10031: No connection with the trade server
- MT5 error 10044: The request is rejected, because the "Only position closing is allowed" rule is set for the symbol
Read a whole MT5 EA's source
- MTR FullSystemEA (MQL5 source) The full MQL5 source of a production MT5 EA for XAUUSD M5 (hedge-grid and recovery): 21 files, 16,923 lines. $49 once.