Skip to content

✅ Order Close

Request: close a position (full or partial) or cancel a pending order by ticket.

Source files (SDK):

  • MetaRpcMT5/mt5_account.py — method order_close(...)
  • MetaRpcMT5/mt5_term_api_trading_helper_pb2.pyOrderClose* messages (OrderCloseRequest, OrderCloseReply, OrderCloseData)
  • MetaRpcMT5/mt5_term_api_trading_helper_pb2_grpc.py — service stub TradingHelperStub

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 use slippage to cap deviation.
  • For pending orders, many brokers ignore volume/price; passing just the ticket 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 returns reply.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 or symbol_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)