Order entry
Place limit order
Place a limit order for a tradable product. If an execution venue isn't specified, the default venue for the symbol will be used. Depending on the time-in-force instruction, the order may require additional parameters.
from decimal import Decimal
from architect_py import OrderDir
order = await client.place_limit_order(
symbol="BTC Crypto/USD",
execution_venue="COINBASE",
account=None, # required for some venues
dir=OrderDir.BUY,
quantity=Decimal(1),
limit_price=Decimal(10000),
post_only=True, # optional
)
print(order.status)
Order request fields
id
N
Order ID to assign to the order; if not specified, the Architect OEMS will assign one randomly.
symbol
Y
Tradable product
dir
Y
Order side; BUY or SELL
quantity
Y
Order quantity
trader
N
Trader effecting the order; if not specified, Architect uses the logged-in user
account
N
Account for the order; if not specified, Architect will use the trader's default account configured for the execution venue.
order_type
Y
Order type
limit_price
N*
Required for certain order types
post_only
N*
Required for certain order types
trigger_price
N*
Required for certain order types
time_in_force
Y
Order time-in-force instruction
execution_venue
N
Execution venue for the order; if not specified, Architect will use the primary venue for the symbol.
Order types
LIMIT
Limit order; execute no worse than the limit price specified.
limit_price
post_only: only place the order if it would rest in the book; do not take
STOP_LOSS_LIMIT
Stop-limit order; if the trigger price is breached, place a limit order at the price specified.
limit_price
trigger_price
TAKE_PROFIT_LIMIT
Take-profit order; if the trigger price is breached, place a limit order at the price specified.
limit_price
trigger_price
Time-in-force instructions
GTC
Good-til-cancel
GTD
Good-til-date; datetime must be specified
DAY
Day order
IOC
Immediate-or-cancel
FOK
Fill-or-kill
ATO
At-the-open
ATC
At-the-close
Place batch order
Place a batch order. Batch orders are multiple orders intended to be executed in a batch. The difference in placing a batch order instead of sending multiple place-orders depends on the specific venue. Some venues have optimized batch order placement APIs or atomicity guarantees that would differentiate it from vanilla multiple orders.
from decimal import Decimal
from architect_py import OrderDir
from architect_py.batch_place_order import BatchPlaceOrder
batch = BatchPlaceOrder()
# call `place_order` for each order in the batch;
# orders are added to the batch but not yet submitted
await batch.place_order(
symbol="BTC Crypto/USD",
execution_venue="COINBASE",
account=None,
dir=OrderDir.BUY,
quantity=Decimal(1),
limit_price=Decimal(10000),
post_only=True,
)
# send batch order to OMS
await client.place_batch_order(batch)
Cancel order
Request to cancel an order by order ID. Cancel requests are asynchronous and return immediately. The order is canceled when the exchange confirms the cancellation.
A working order is only canceled when the exchange confirms the cancellation, which can be checked by polling the order status.
cancel = await client.cancel_order("12345678-1234-5678-1234-567812345678:0")
print(cancel.status)
Cancel all orders
Request to cancel all orders matching the selectors.
await client.cancel_all_orders(execution_venue="CME")
Reconcile out orders
In cases where the state of an order falls out of sync, e.g. Architect thinks an order is still open but the order is known to be out/canceled by a human, use this manual reconciliation endpoint to force the order out. This is particular common in the case of staled orders.
await client.reconcile_out(order_id="a0bcb1f4-4f9d-45c1-8bad-6d1239f0a2e2:0")
# or, reconcile out multiple orders
await client.reconcile_out(order_ids=[])
Orderflow channel
The most efficient way to trade using the Architect OEMS is to use the bidirectional orderflow channel. This is similar to a websocket or FIX session where one connection is opened and maintained for an entire trading session. The client will send place order and cancel order requests and receive order status updates and fills in realtime.
The specific mechanics of using the orderflow channel depend on the specific language SDK's implementation.
Stream orderflow
Subscribe to orderflow events, order status updates, fills from the Architect OEMS. The events streamed are the same as those received by the orderflow
bidirectional channel.
async for event in client.stream_orderflow():
print(event)
Get open orders
Get all open orders matching the selectors.
orders = await client.get_open_orders()
for order in orders:
print(order.id)
Get historical orders
Get all historical orders (orders whose statuses are not PENDING
nor OPEN
) matching the selectors. If order_ids
is not specified, then from_inclusive
and to_exclusive
are required.
orders = await client.get_historical_orders()
for order in orders:
print(order.id)
Get fills
Get all fills matching the selectors.
res = await client.get_fills()
for fill in res.fills:
print(fill.id)
Fill IDs
Architect attempts to uniquely identify fills, executions, or trades across all venues. They are typically UUIDv5s which are derived from exchange fill IDs and other characteristics of the fill necessary to make the identifications unambiguous.
Last updated