Skip to content

Trading API

Order placement, modification, cancellation, and position management.

Access via client.trading.

TradingAPI

TradingAPI

Trading operations: orders and positions.

Provides methods for order placement, modification, cancellation,
and position management.

Example
from ctrader_api_client.models import NewOrderRequest
from ctrader_api_client.enums import OrderSide, OrderType

# Place a market order
request = NewOrderRequest(
    symbol_id=270,
    side=OrderSide.BUY,
    volume=100,  # 0.01 lots
    order_type=OrderType.MARKET,
)
execution = await client.trading.place_order(account_id, request)
print(f"Order {execution.order_id}: {execution.execution_type}")

# Get open positions
positions = await client.trading.get_open_positions(account_id)
for pos in positions:
    print(f"Position {pos.position_id}: {pos.volume} @ {pos.entry_price}")

place_order(account_id, request, timeout=None)

Place a new order.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
request NewOrderRequest

Order parameters.

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
ExecutionEvent

ExecutionEvent with order details.

Note

For market orders, the order may be immediately filled.
Check execution_type to determine the outcome:
- ORDER_ACCEPTED: Pending order created
- ORDER_FILLED: Order fully executed
- ORDER_PARTIAL_FILL: Order partially executed
- ORDER_REJECTED: Order was rejected

Raises:

Type Description
APIError

If request fails.

CTraderConnectionTimeoutError

If request times out.

amend_order(account_id, request, timeout=None)

Modify a pending order.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
request AmendOrderRequest

Amendment parameters.

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
ExecutionEvent

ExecutionEvent confirming the amendment.

Raises:

Type Description
APIError

If request fails or order not found.

CTraderConnectionTimeoutError

If request times out.

cancel_order(account_id, order_id, timeout=None)

Cancel a pending order.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
order_id int

The order to cancel.

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
ExecutionEvent

ExecutionEvent confirming cancellation.

Raises:

Type Description
APIError

If request fails or order not found.

CTraderConnectionTimeoutError

If request times out.

close_position(account_id, request, timeout=None)

Close a position (fully or partially).

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
request ClosePositionRequest

Close parameters (position_id and volume required).

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
ExecutionEvent

ExecutionEvent with closing details.

Raises:

Type Description
APIError

If request fails or position not found.

CTraderConnectionTimeoutError

If request times out.

amend_position(account_id, request, timeout=None)

Modify position stop loss and take profit.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
request AmendPositionRequest

Amendment parameters.

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
ExecutionEvent

ExecutionEvent confirming the amendment.

Raises:

Type Description
APIError

If request fails or position not found.

CTraderConnectionTimeoutError

If request times out.

get_open_positions(account_id, timeout=None)

Get all open positions.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
list[Position]

List of open Position objects.

Raises:

Type Description
APIError

If request fails.

CTraderConnectionTimeoutError

If request times out.

get_pending_orders(account_id, timeout=None)

Get all pending orders.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
list[Order]

List of pending Order objects.

Raises:

Type Description
APIError

If request fails.

CTraderConnectionTimeoutError

If request times out.

get_deals(account_id, from_timestamp, to_timestamp, timeout=None)

Get historical deals.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
from_timestamp datetime

Start of time range (inclusive).

required
to_timestamp datetime

End of time range (inclusive).

required
timeout float | None

Request timeout (uses default if None).

None

Returns:

Type Description
list[Deal]

List of Deal objects in the time range.

Note

The maximum time range may be limited by the server.
For large ranges, consider paginating with smaller windows.

Raises:

Type Description
APIError

If request fails.

CTraderConnectionTimeoutError

If request times out.

get_deals_by_position_id(account_id, position_id)

Get all deals for a specific position.

Parameters:

Name Type Description Default
account_id int

The cTID trader account ID.

required
position_id int

The position ID to filter deals by.

required

Returns:

Type Description
list[Deal]

List of Deal objects associated with the position.

Raises:

Type Description
APIError

If request fails.

CTraderConnectionTimeoutError

If request times out.

Usage Examples

Place a Market Order

from ctrader_api_client.models import NewOrderRequest
from ctrader_api_client.enums import OrderType, OrderSide

# Get symbol info for volume conversion
symbol = await client.symbols.get_by_id(account_id, 270)

# Place a 0.1 lot buy order
request = NewOrderRequest(
    symbol_id=270,
    order_type=OrderType.MARKET,
    side=OrderSide.BUY,
    volume=symbol.lots_to_volume(0.1),  # Convert lots to volume
)

result = await client.trading.place_order(account_id, request)
print(f"Order {result.order_id}: {result.execution_type}")

Place a Limit Order

# Get symbol info
symbol = await client.symbols.get_by_id(account_id, 270)

request = NewOrderRequest(
    symbol_id=270,
    order_type=OrderType.LIMIT,
    side=OrderSide.BUY,
    volume=symbol.lots_to_volume(0.1),
    limit_price=5000.0,  # Limit price
    stop_loss=4950.0,  # Optional SL
    take_profit=5100.0,  # Optional TP
)

result = await client.trading.place_order(account_id, request)

Place an Order with Relative SL/TP

# Relative SL/TP are specified in price units (distance from entry)
request = NewOrderRequest(
    symbol_id=270,
    order_type=OrderType.MARKET,
    side=OrderSide.BUY,
    volume=symbol.lots_to_volume(0.1),
    relative_stop_loss=50.0,   # 50 points below entry
    relative_take_profit=100.0,  # 100 points above entry
)

result = await client.trading.place_order(account_id, request)

Cancel an Order

result = await client.trading.cancel_order(account_id, order_id)
print(f"Cancelled: {result.execution_type}")

Close a Position

from ctrader_api_client.models import ClosePositionRequest

# First, get the position to know its volume
positions = await client.trading.get_open_positions(account_id)
position = next(p for p in positions if p.position_id == position_id)

# Close the entire position
request = ClosePositionRequest(
    position_id=position.position_id,
    volume=position.volume,  # Use full volume for complete close
)

result = await client.trading.close_position(account_id, request)
print(f"Position closed: {result.execution_type}")

Partial Close a Position

# Get symbol to convert lots
symbol = await client.symbols.get_by_id(account_id, position.symbol_id)

# Close half of a 1-lot position
request = ClosePositionRequest(
    position_id=position.position_id,
    volume=symbol.lots_to_volume(0.5),  # Close 0.5 lots
)

result = await client.trading.close_position(account_id, request)

Modify Position SL/TP

from ctrader_api_client.models import AmendPositionRequest

request = AmendPositionRequest(
    position_id=123456,
    stop_loss=4900.0,
    take_profit=5200.0,
)

result = await client.trading.amend_position(account_id, request)

Get Open Positions

positions = await client.trading.get_open_positions(account_id)

for pos in positions:
    # Get symbol for volume conversion
    symbol = await client.symbols.get_by_id(account_id, pos.symbol_id)
    lots = symbol.volume_to_lots(pos.volume)

    print(f"Position {pos.position_id}: {lots} lots @ {pos.entry_price}")
    print(f"  Swap: {pos.swap}, Commission: {pos.commission}")

Get Pending Orders

orders = await client.trading.get_pending_orders(account_id)

for order in orders:
    print(f"Order {order.order_id}: {order.order_type} {order.side}")

Get Historical Deals

from datetime import datetime, timedelta

deals = await client.trading.get_deals(
    account_id,
    from_timestamp=datetime.now() - timedelta(days=7),
    to_timestamp=datetime.now(),
)

for deal in deals:
    print(f"Deal {deal.deal_id}: {deal.side} {deal.filled_volume}")
    print(f"  Commission: {deal.commission}")

    # Check if this deal closed a position
    if deal.is_closing_deal and deal.close_detail:
        print(f"  Gross P/L: {deal.close_detail.gross_profit}")