✅ Order Close¶
Request: close a position (full or partial) or cancel a pending order by ticket.
Source files (SDK):
MetaRpcMT5/mt5_account.py— methodorder_close(...)MetaRpcMT5/mt5_term_api_trading_helper_pb2.py—OrderClose*messages (OrderCloseRequest,OrderCloseReply,OrderCloseData)MetaRpcMT5/mt5_term_api_trading_helper_pb2_grpc.py— service stubTradingHelperStub
RPC¶
- Service:
mt5_term_api.TradingHelper - Method:
OrderClose(OrderCloseRequest) → OrderCloseReply - Low-level client:
TradingHelperStub.OrderClose(request, metadata, timeout) - SDK wrapper:
MT5Account.order_close(request, deadline=None, cancellation_event=None) → OrderCloseData
🔗 Code Example¶
# Minimal canonical example: close 0.10 lots at market with max 20pt slippage
from MetaRpcMT5 import mt5_term_api_trading_helper_pb2 as th_pb2
req = th_pb2.OrderCloseRequest(
ticket=1234567890,
volume=0.10, # partial or full size
price=0.0, # market close → server uses current price
slippage=20, # max deviation in points
comment="SDK close",
expert_id=1001,
)
res = await acct.order_close(req)
print(res.deal, res.returned_string_code)
Method Signature¶
async def order_close(
self,
request: trading_helper_pb2.OrderCloseRequest,
deadline: datetime | None = None,
cancellation_event: asyncio.Event | None = None,
) -> trading_helper_pb2.OrderCloseData
💬 Just about the main thing¶
- What is it. Closes an open position (optionally partial) or cancels a pending order by its ticket.
- Why. One RPC to execute exits from strategies/UI with precise control over volume, slippage, and price.
-
Be careful.
-
ticketmust point to an existing position or pending order. - For market closes, set
price=0.0and useslippageto cap deviation. - For pending orders, many brokers ignore
volume/price; passing just theticketcancels it. - Times returned in the reply (if any) are UTC.
- When to call. Any time you need to exit or cancel without crafting a new order.
- Quick check. You should get
OrderCloseDatawith deal/order IDs and a return code; non‑zero error codes mean failure.
🔽 Input¶
Message: OrderCloseRequest¶
| # | Field | Proto Type | Required | Description |
|---|---|---|---|---|
| 1 | ticket |
uint64 |
yes | Ticket of the position or pending order. |
| 2 | volume |
double |
no | Lots to close (ignored for many pending cancels). |
| 3 | price |
double |
no | Close price (use 0.0 for market). |
| 4 | slippage |
uint64 |
no | Max deviation in points for market close. |
| 5 | comment |
string |
no | Optional user/broker comment. |
| 6 | expert_id |
uint64 |
no | Magic/EA identifier. |
Request message:
OrderCloseRequest { ticket, volume, price, slippage, comment, expert_id }
⬆️ Output¶
Message: OrderCloseData¶
| # | Field | Proto Type | Description |
|---|---|---|---|
| 1 | returned_code |
uint32 |
Server return code (numeric). |
| 2 | deal |
uint64 |
Deal ticket generated by the close (if any). |
| 3 | order |
uint64 |
Order ticket affected/cancelled. |
| 4 | volume |
double |
Closed volume. |
| 5 | price |
double |
Execution price. |
| 6 | bid |
double |
Bid at processing time. |
| 7 | ask |
double |
Ask at processing time. |
| 8 | comment |
string |
Server comment. |
| 9 | request_id |
uint32 |
Request identifier. |
| 10 | ret_code_external |
int32 |
External/bridge code if provided. |
| 11 | returned_string_code |
string |
Return code (string). |
| 12 | returned_code_description |
string |
Human‑readable description. |
Wire reply:
OrderCloseReply { data: OrderCloseData, error: Error? }SDK returnsreply.data.
🎯 Purpose¶
- Execute exits (full/partial) or cancel pendings programmatically.
- Provide clear UI feedback via deal/order IDs and return codes.
🧩 Notes & Tips¶
- Validate min lot and step via
symbol_params_manyorsymbol_info_double(SYMBOL_TRADE_TICK_SIZE)before partial close. - Use
symbol_info_integer(SYMBOL_TRADE_FREEZE_LEVEL)to avoid freeze violations when closing near price. - For hedged accounts, partial closes reduce position volume; for netting, close offsets existing exposure.
See also: order_send.md, on_trade.md, opened_orders.md
Usage Examples¶
1) Full close at market¶
from MetaRpcMT5 import mt5_term_api_trading_helper_pb2 as th_pb2
req = th_pb2.OrderCloseRequest(ticket=1234567890, volume=0.0, price=0.0, slippage=20)
res = await acct.order_close(req)
print(res.deal, res.returned_string_code)
2) Partial close 0.05 lots¶
req = th_pb2.OrderCloseRequest(ticket=1234567890, volume=0.05, price=0.0, slippage=15)
res = await acct.order_close(req)
print("closed:", res.volume)
3) Cancel a pending order by ticket¶
req = th_pb2.OrderCloseRequest(ticket=22334455) # volume/price typically ignored
res = await acct.order_close(req)
print(res.order, res.returned_code_description)