Skip to content

Realtime Order Updates Streaming

Order update streaming is the control plane for execution logic.

Use this stream to react to:

  • order accepted, modified, cancelled states
  • trade fills and partial fills
  • execution lifecycle without polling get-order repeatedly

Callback Model

You typically process:

  • on_order_update for non-fill state transitions
  • on_trade_update for fill events

WebSocket Order Updates Example

from nubra_python_sdk.ticker import orderupdate
from nubra_python_sdk.start_sdk import InitNubraSdk, NubraEnv

nubra = InitNubraSdk(NubraEnv.UAT, env_creds=True)

def pick(obj, *names):
    for name in names:
        value = getattr(obj, name, None)
        if value is not None:
            return value
    return None

def clean(d):
    return {k: v for k, v in d.items() if v is not None}

def on_order_update(msg):
    print(
        "[OrderUpdate]",
        clean(
            {
                "order_id": pick(msg, "order_id"),
                "basket_id": pick(msg, "basket_id"),
                "status": pick(msg, "execution_status", "response_type"),
                "request_type": pick(msg, "request_type"),
                "update_msg": pick(msg, "update_msg"),
                "exchange": pick(msg, "exchange"),
            }
        ),
    )

def on_trade_update(msg):
    params = pick(msg, "order_params")
    print(
        "[TradeUpdate]",
        clean(
            {
                "order_id": pick(msg, "order_id"),
                "basket_id": pick(msg, "basket_id"),
                "trade_qty": pick(params, "trade_qty") if params else None,
                "trade_price": pick(params, "trade_price") if params else None,
                "filled_qty": pick(params, "filled_qty") if params else None,
                "avg_fill_price": pick(params, "avg_fill_price") if params else None,
            }
        ),
    )

def on_connect(msg):
    print("[OrderSocket] Connected:", msg)

socket = orderupdate.OrderUpdate(
    client=nubra,
    on_order_update=on_order_update,
    on_trade_update=on_trade_update,
    on_connect=on_connect,
)

socket.connect("V2")
socket.keep_running()

Practical Notes

  • keep this stream running independently from market-data streams
  • write updates to a durable event log for post-trade auditability
  • use get-order APIs for reconciliation snapshots, not for primary live state
NEO Assistant