GitHubBlog

Search Documentation

Search for a page in the docs

What is UTA

UTA is currently a beta trading feature. It is usable, but it is not something you should connect to live funds casually. The stack is still being validated across brokers, order types, account states, and the Web UI approval flow; even the maintainer is still testing the edge cases. Start with a simulator, paper account, demo account, or testnet, and confirm that account reads, staging, approval, push, sync, snapshots, and error recovery all behave the way you expect. If anything feels confusing or broken, please come to Discord and report it directly. Real bug reports are the fastest way to make UTA solid enough to graduate from beta.

A Unified Trading Account (UTA) is the object OpenAlice uses for every connected trading account.

The simplest way to think about it:

broker account
  -> UTA
  -> Alice tools + Web UI
  -> Trading-as-Git history
  -> snapshots and health

Alice and the Web UI talk to the UTA. The UTA talks to the broker.

That boundary matters because every broker has a different API, order model, identifier scheme, and error vocabulary. A UTA turns those differences into one OpenAlice account surface.

What a UTA Owns

PieceWhat it does
Broker connectionTalks to Alpaca, CCXT exchanges, IBKR, Longbridge, LeverUp, or a simulator
Trading-as-Git logStores staged, committed, pushed, filled, rejected, and observed operations
Approval boundaryKeeps execution behind the Web UI push approval step
SnapshotsCaptures account state for the equity curve
HealthTracks whether the broker is healthy, degraded, offline, or disabled
Contract identityStamps tradeable contracts with aliceId

Most users do not need to think about broker internals. You connect an account, Alice sees a UTA, and every operation goes through the same workflow.

Why Not Let Alice Call Brokers Directly?

Without UTA, every AI trading action would need to know broker-specific details:

  • how a broker names contracts
  • which order types it actually supports
  • what a partial fill looks like
  • how to recover after disconnects
  • which fields are real and which are missing
  • how to tell live, paper, demo, and testnet apart

That is too much broker trivia to put into every AI decision. OpenAlice keeps the AI on a single workflow: inspect account state, stage an operation, commit it, request push approval, then sync results.

Approval Comes Before Execution

A UTA can stage and commit trade intent, but it does not execute until you approve the push in the Web UI.

stage
  -> commit
  -> push request
  -> human approval
  -> broker dispatch
  -> sync

This is the same safety wall described in Trading as Git. The UTA owns the account-specific log behind that workflow.

Account Health

Each UTA tracks connection health:

StateMeaning
HealthyBroker is responding normally
DegradedRecent failures, but requests may still work
OfflineReconnection/backoff is in progress
DisabledA permanent configuration problem needs manual repair

Credential mistakes, wrong endpoints, and live/demo mismatches should be fixed through the Trading setup UI. Transient broker/network failures can recover automatically.

The aliceId

Every tradeable contract gets a composite id:

accountId|nativeKey

Examples:

alpaca-paper|AAPL
bybit-demo|BTC/USDT:USDT
ibkr-live|265598

The account id makes the contract unambiguous. AAPL in Alpaca Paper and AAPL in IBKR Live are different aliceIds because they belong to different accounts.

Multiple UTAs

You can run several accounts at once:

  • a paper Alpaca account for testing
  • a demo crypto account for exchange workflow checks
  • an IBKR paper account for broader instrument coverage
  • a live account only after you are comfortable

Each UTA has independent history and snapshots. Reading tools can query one account or all enabled accounts, but order execution always targets a specific account and contract.

Where to Go Next