✅ 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.
-
ticket
must point to an existing position or pending order. - For market closes, set
price=0.0
and useslippage
to cap deviation. - For pending orders, many brokers ignore
volume
/price
; passing just theticket
cancels 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
OrderCloseData
with 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_many
orsymbol_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)