The complete formula grammar.

Every StreamXLS value is a native Excel =RTD() formula against ProgID Tws.Rtd, addressed by a uniform topic-string tuple. One grammar covers six topic families: market data, accounts, positions, orders, order staging, and connection status. This page is the full catalog — contract syntax, every field name, and the return conventions. Topic and field names are case-insensitive throughout. For the machine-generated exhaustive reference (every field, key, and status value, produced from the engine itself), see the complete reference on GitHub.

§ · The grammar

One formula, six families

The shape is always the same:

=RTD("Tws.Rtd", , <topic…>, <field>)

The first argument is the ProgID Tws.Rtd. The second argument is ignored — it is Excel's "Server" parameter, and StreamXLS reads none of it. All connection and contract information lives in the third argument onward. Leave the second argument empty (, ,).

Common mistake: putting a value in the second argument — that is reserved by Excel and not passed to StreamXLS. Note the extra comma:
Wrong=RTD("Tws.Rtd", "127.0.0.1:7497", "AAPL", "BID")
Right=RTD("Tws.Rtd", , "127.0.0.1:7497", "AAPL", "BID")

The six topic families

There are six families. Two of them come in singular / list pairs — position/positions and order/orders — so you will see eight topic words in total, but they group into six families. A bare contract (no leading topic word) selects market data.

Each row links to its section below.

Return-value convention. A field returns a number (or text) when its value is known to be current. When it is not — TWS disconnected or unresponsive — time-sensitive fields return #N/A rather than a stale value. A visible gap is safer than a silently frozen price.

§ · Connections & ports

Point a formula at a session

With no connection tokens, StreamXLS connects to 127.0.0.1:7496 (TWS live). Add connection tokens anywhere in the topic arguments (order does not matter) to target a different host, port, or client ID.

TokenFormatDefault
Hosthost=<ip-or-hostname>127.0.0.1
Portport=<number>7496
Client IDclientid=<number>auto-generated

Port aliases

AliasPortSession
paper7497TWS paper trading
gw4001IB Gateway live
gwpaper4002IB Gateway paper

TWS live is 7496; TWS paper 7497; IB Gateway live 4001; IB Gateway paper 4002.

Compact form

Instead of separate host=/port=/clientid= tokens, use one host:port or host:port:clientid string. Use colons — never underscores.

=RTD("Tws.Rtd", , "host=192.168.1.100", "port=4001", "clientid=5", "AAPL", "BID")
=RTD("Tws.Rtd", , "192.168.1.100:4001:5", "AAPL", "BID")
=RTD("Tws.Rtd", , "paper", "AAPL", "BID")            ' 127.0.0.1:7497

Multiple simultaneous connections

Each distinct host:port:clientid is a separate connection. A single workbook can watch a live and a paper session at once — put a different connection token in each cell:

=RTD("Tws.Rtd", , "port=7496", "AAPL", "BID")       ' Live TWS
=RTD("Tws.Rtd", , "port=7497", "AAPL", "BID")       ' Paper TWS
=RTD("Tws.Rtd", , "gw",        "AAPL", "BID")       ' Gateway live

The client ID can be pinned with the TWS_RTD_CLIENT_ID environment variable, which supplies the ID for any connection whose formula does not name one; a clientid= token in the formula wins over it. See Configuration → Environment variables.

§ · Contract specification

Four ways to name an instrument

1 · Simple symbol (stocks)

A bare symbol assumes SecType=STK, Exchange=SMART, Currency=USD.

=RTD("Tws.Rtd", , "AAPL", "BID")

2 · Key=value (recommended for complex securities)

=RTD("Tws.Rtd", , "sym=SPY", "sec=OPT", "strike=680", "right=C", "exp=20251219", "BID")
KeyAliasesMeaning
symsymbolUnderlying symbol
secsectype, securitytypeSecurity type (STK, OPT, FUT, CASH, BAG, …)
exchexchangeExchange
primprimexch, primary, primaryexchangePrimary exchange
curcurr, currencyCurrency
expexpiry, expiration, lasttradedateExpiration (YYYYMMDD options, YYYYMM futures)
strikestrikepriceOption strike
rightputcall, optiontypeOption right (C or P)
multmultiplierContract multiplier
loclocalsymbol, localExchange-specific local symbol
tctradingclass, classTrading class
conidcontractidTWS Contract ID

3 · Compact notation

Use @ for the exchange and / as a delimiter, omitting trailing segments you don't need. Format: SYMBOL@EXCH/PRIMEXCH/SECTYPE/EXP/RIGHT/STRIKE/CURRENCY.

=RTD("Tws.Rtd", , "AAPL@NASDAQ/STK/USD", "BID")
=RTD("Tws.Rtd", , "ES@CME/FUT/202503/USD", "LAST")
=RTD("Tws.Rtd", , "EUR.USD/CASH", "BID")

4 · ConID (most precise)

The TWS Contract ID identifies a contract unambiguously — useful for options with similar strikes. Find it in TWS via right-click → Financial Instrument Info → Description.

=RTD("Tws.Rtd", , "conid=265598", "BID")            ' AAPL

Worked examples

InstrumentContract arguments
SPY option (call)"sym=SPY","sec=OPT","strike=680","right=C","exp=20251219"
ES future"sym=ES","sec=FUT","exch=CME","exp=202503"
MES micro future"sym=MES","sec=FUT","exch=CME","exp=202503"
EUR/USD forex"sym=EUR","sec=CASH","exch=IDEALPRO","cur=USD"
Specific future by local symbol"loc=ESH5","sec=FUT","exch=CME"
§ · Market data

Ticks, derived prices, and greeks

Market-data formulas take a contract followed by a field: =RTD("Tws.Rtd", , "<contract>", "<field>"). These are the fields nearly every workbook uses.

Common price & size fields

FieldMeaningFieldMeaning
BIDBest bid priceBIDSIZESize at best bid
ASKBest ask priceASKSIZESize at best ask
LASTLast trade priceLASTSIZELast trade size
OPENSession openVOLUMETotal volume
HIGHSession highAVGVOLUMEAverage daily volume
LOWSession lowLASTTIMELast-trade timestamp
CLOSEPrevious closeHALTEDHalt indicator (0 = not halted)

Derived price fields

Two fields are computed by StreamXLS so a formula always has a reasonable price regardless of market hours or subscription:

FieldPrecedence
MarketPriceMid (BID+ASK)/2 when both present → else LAST → else CLOSE; blank until any source is available
LastOrCloseLAST if available → else CLOSE

Last never falls through to a different tick field.

Delayed-data indicators

TWS_RTD_MARKET_DATA_TYPE (default 4) is a ceiling request, not a description of your data: within one session TWS serves real-time to the symbols your subscriptions entitle and 15–20-minute-delayed data to the rest, per contract, and reports the served tier per contract. So "type 4 is set" never means every cell is delayed. Two per-contract fields read the served tier back, so a delayed price can't silently pass for live:

FieldMeaning
MarketDataTypeThe tier TWS is actually serving this contract: 1 REALTIME · 2 FROZEN · 3 DELAYED · 4 DELAYED_FROZEN. #N/A until TWS reports it. Distinct from the status-family MarketDataType, which is the configured default you requested — the ceiling, not what any one contract got.
IsDelayed1 when the served tier is delayed (3 or 4), 0 when real-time or frozen real-time (1 or 2), #N/A before TWS reports the tier. Sugar over MarketDataType — the simplest field to drive conditional formatting off.

Check IsDelayed per symbol rather than assuming from the requested type. To instead turn every delayed price into visibly-marked text — at the cost of making the cell text — see TWS_RTD_DELAYED_ANNOTATION.

Option greeks

For an option contract, greeks and model values are exposed per computation source. Field names compose as <Source><Measure>, where the source is Bid, Ask, Last, or Model and the measure is one of the eight below — e.g. ModelDelta, BidImpliedVol, LastOptPrice:

MeasureMeaning
ImpliedVolImplied volatility
DeltaOption delta
GammaOption gamma
ThetaOption theta
VegaOption vega
OptPriceModel option price
UndPriceUnderlying price used in the computation
PvDividendPresent value of dividends
=RTD("Tws.Rtd", , "sym=SPY", "sec=OPT", "strike=680", "right=C", "exp=20251219", "ModelDelta")

Option-chain enumeration

Query an underlying to discover its option chain:

FieldReturns
OptionExpirationsCSVComma-separated expiration dates with options on the underlying
OptionStrikesCSVComma-separated strike prices with options on the underlying
StrikeStepMinimum reported strike-price increment

Full tick catalog

Every tick type StreamXLS maps, by field name. Core price/size ticks arrive for any tradeable security; the rest are requested per security type. When delayed data is active, the delayed tick IDs (66–76, 88, 90) feed the same base field names above — you keep using BID, LAST, and so on.

RTD fieldTick IDDescription
BIDSIZE0Size at best bid
BID1Best bid price
ASK2Best ask price
ASKSIZE3Size at best ask
LAST4Last trade price
LASTSIZE5Last trade size
HIGH6Session high
LOW7Session low
VOLUME8Total volume
CLOSE9Previous session close
OPEN14Session open
WEEK13LO / WEEK13HI15 / 1613-week low / high
WEEK26LO / WEEK26HI17 / 1826-week low / high
WEEK52LO / WEEK52HI19 / 2052-week low / high
AVGVOLUME21Average daily volume
OPTIONHISTORICALVOL23Option historical volatility
OPTIONIMPLIEDVOL24Option implied volatility
CALLOPTIONOPENINTEREST27Call option open interest
PUTOPTIONOPENINTEREST28Put option open interest
CALLOPTIONVOLUME29Call option volume
PUTOPTIONVOLUME30Put option volume
INDEXFUTUREPREMIUM31Index-future premium
BIDEXCH32Exchange(s) posting best bid
ASKEXCH33Exchange(s) posting best ask
AUCTIONVOLUME34Auction volume
AUCTIONPRICE35Auction price
AUCTIONIMBALANCE36Auction imbalance
PLPRICE37P&L mark price
LASTTIME45Timestamp of last trade
SHORTABLE46Shortability indicator (>2.5 = easy)
HALTED49Trading-halt indicator
TRADECOUNT54Trade count
TRADERATE55Trades per minute
VOLUMERATE56Volume per minute
LASTRTHTRADE57Last regular-hours trade
RTHISTORICALVOL58Real-time historical volatility
IBDIVIDENDS59Dividend info
BONDMULTIPLIER60Bond factor multiplier
REGULATORYIMBALANCE61Regulatory imbalance
SHORTTERMVOLUME3MIN633-minute volume
SHORTTERMVOLUME5MIN645-minute volume
SHORTTERMVOLUME10MIN6510-minute volume
CREDITMANMARKPRICE78Credit mark price
CREDITMANSLOWMARKPRICE79Slow credit mark price
LASTEXCH84Exchange of last trade
FUTURESOPENINTEREST86Futures open interest
AVGOPTVOLUME87Average option volume (STK)
SHORTABLESHARES89Shares available to short
ETFNAVLAST96ETF NAV last
ETFFROZENNAVLAST97Frozen ETF NAV last
ETFNAVHIGH98ETF NAV high
ETFNAVLOW99ETF NAV low
ESTIMATEDIPOMIDPOINT101Estimated IPO midpoint
FINALIPOLAST102Final IPO price
§ · Accounts

Account values

Read any IBKR account-summary value with =RTD("Tws.Rtd", , "account", "<acct>", "<field>"). Numeric values return as numbers. Append a currency filter ("cur=USD") to pull a per-currency variant instead of the generic figure.

=RTD("Tws.Rtd", , "account", "U1234567", "NetLiquidation")
=RTD("Tws.Rtd", , "account", "U1234567", "AvailableFunds", "cur=USD")
=RTD("Tws.Rtd", , "account", "U1234567", "OpenPositionCount")

Fields are pass-through. Any IBKR account-summary tag resolves — case-insensitive and separator-tolerant ("Net Liquidation" matches NetLiquidation). Around 136 tags are delivered; the demo workbook's Account worksheet is the canonical enumeration. Rather than list all of them, here are the common anchors:

FieldFieldField
NetLiquidationAvailableFundsBuyingPower
TotalCashValueExcessLiquidityMaintMarginReq
GrossPositionValueEquityWithLoanValueOpenPositionCount

OpenPositionCount is computed per-account from non-zero positions and updates live. For the full field list open the demo workbook and read its Account worksheet. For clean resolution of aggregates vs. per-currency values, enable TWS's "$LEDGER-" prefix API setting — see Get Started → TWS / Gateway setup.

§ · Positions

A single position, or the whole list

Single / aggregate position

=RTD("Tws.Rtd", , "position", "<acct>", "<contract>", "<field>"). The account argument accepts one code, a comma-separated list, or * / blank for all accounts — matched positions aggregate (shares and market values sum; average cost is position-weighted).

=RTD("Tws.Rtd", , "position", "U1234567", "AAPL", "UnrealizedPnL")
=RTD("Tws.Rtd", , "position", "*", "AAPL@SMART", "MarketValue")
Value fieldsContract-metadata fields
Position (shares)ConID, Symbol, SecType
AverageCost (per share)Strike, Right, Expiry
MarketValueExchange, PrimaryExch
DailyPNLLocalSymbol, TradingClass
RealizedPNL / UnrealizedPNLCurrency, Multiplier

Positions list

=RTD("Tws.Rtd", , "positions", "<accts>", "<field>") enumerates the active positions across the accounts (every position where size ≠ 0 or market value ≠ 0).

FieldReturns
SymbolsCsvSemicolon-delimited position identifiers (bare symbol for stocks; compact slash notation for options/futures)
ConIdCsvSemicolon-delimited ConIDs for the same positions
PositionsChangedUtcUpdates when the set membership changes (legacy synonym: SymbolsChangedUtc)

Spill the list across cells with TEXTSPLIT (Excel 365). The list delimiter is a semicolon:

=TEXTSPLIT(RTD("Tws.Rtd", , "positions", , "SymbolsCsv"), ";")           ' across columns
=TEXTSPLIT(RTD("Tws.Rtd", , "positions", , "SymbolsCsv"), , ";")         ' down rows
=IFERROR(TEXTSPLIT(RTD("Tws.Rtd", , "positions", , "SymbolsCsv"), ";"), "")  ' first-load guard

Initial-load guard. The server withholds the first SymbolsCsv/ConIdCsv/PositionsChangedUtc until the initial positions snapshot completes, so wrap the spill in IFERROR to avoid a transient error on first load. Pair PositionsChangedUtc with SymbolsCsv to detect when the set changes.

§ · Orders

Monitoring orders

Orders list

=RTD("Tws.Rtd", , "orders", "<accts>", "<field>") returns a comma-separated list of PermIDs, filtered by account (* / blank = all).

FieldReturns
ListCsvAll orders the server has seen, including filled / cancelled / completed
OpenListCsvActive orders only — excludes Filled, Cancelled, Inactive, ApiCancelled

Single-order fields

=RTD("Tws.Rtd", , "order", "<permID>", "<field>"). Orders are addressed by PermID (the permanent, cross-client order ID that the orders lists return) — not the transient client-side order ID. Individual order fields always show last-known values regardless of order status.

Identity & statusSizing & priceContract & routing
PERMID, PARENTIDQUANTITYSYMBOL, CONID, SECTYPE
StatusFILLED, REMAININGEXCHANGE, CURRENCY
SIDE (ACTION)LMTPRICE, STOPPRICEEXPIRY, STRIKE, RIGHT
ORDERTYPE (TYPE)AVGFILLPRICEACCOUNT, SUBMITTER
ORDERREFTRAILSTOPPRICETIF, GOODAFTERTIME
FirstSeenUtcTRAILINGPERCENTGOODTILLDATE, OUTSIDERTH
LastUpdateUtcHIDDEN, DISPLAYSIZEALGOSTRATEGY, ALGOPARAMS
WHYHELDALLOWPREOPENLOCALSYMBOL, TRADINGCLASS
WARNINGTEXTMINQTY, PERCENTOFFSETMULTIPLIER, PRIMARYEXCHANGE
REJECTREASONDISCRETIONARYAMT, CASHQTYACTIVESTARTTIME, ACTIVESTOPTIME
COMPLETEDTIME, COMPLETEDSTATUSLMTPRICEOFFSET
GroupFields
BooleansBLOCKORDER, SWEEPTOFILL, ALLORNONE, NOTHELD, SOLICITED, WHATIF, INCLUDEOVERNIGHT
Commission & feesCOMMISSIONANDFEES, MINCOMMISSIONANDFEES, MAXCOMMISSIONANDFEES, COMMISSIONANDFEESCURRENCY, MARGINCURRENCY — from TWS whatIf/openOrder data
Margin impactINITMARGINBEFORE, INITMARGINCHANGE, INITMARGINAFTER, MAINTMARGINBEFORE, MAINTMARGINCHANGE, MAINTMARGINAFTER, EQUITYWITHLOANBEFORE, EQUITYWITHLOANCHANGE, EQUITYWITHLOANAFTER — from TWS whatIf/openOrder data

Closed field set. The list above is the complete set of supported order fields. An unknown or misspelled field errors loudly in the cell at formula entry (e.g. Unknown order field 'FOO'…) rather than silently showing #N/A. Need a field that isn't listed? Contact support — additions are trivial.

ORDERREF returns your bare tag/ClientTag for an engine-staged order — the engine strips its own |SXLS:<token> suffix, so a tagless engine order reads #N/A, not blank. Orders entered in TWS or by other clients return their Order Ref verbatim. (The TWS-visible composed format is described under Staging orders.)

Order-status glossary

StatusMeaning
PendingSubmitTransmitted but not yet confirmed
PendingCancelCancel request sent, awaiting confirmation
PreSubmittedSimulated order accepted, awaiting election
SubmittedOrder accepted by the system
FilledCompletely filled
CancelledCancelled (confirmed)
ApiCancelledCancelled via API before acknowledgment
InactiveRejected or cancelled
§ · Staging orders

StageOrder

StageOrder populates an order ticket in TWS as a side-effect of subscribing — entering the formula is what stages it. It takes key=value tokens in any order and returns a status string. (SendOrder is an accepted synonym; both spellings parse identically.)

=RTD("Tws.Rtd", , "StageOrder", "sym=AAPL", "side=BUY", "shares=100",
     "type=LMT", "limit=150.05", "exch=SMART", "tag=SampleOrder#1")

Required keys

KeyAliasesNotes
symsymbolSymbol
sideactionBUY or SELL
sharesquantity, qty, sizeInteger quantity
typeMKT, LMT, STP, STP LMT, TRAIL, TRAIL LIMIT, … (other IB order types as supported)
limitRequired when type=LMT or type=STP LMT
Type-dependent requirements, all checked by StreamXLS before anything is staged: STP/STP LMT require stop; TRAIL and TRAIL LIMIT each require exactly one of stop (the trailing amount) or trailingpercent; stop/trailingpercent on a type that cannot use them is rejected. TRAIL LIMIT adds two more requirements: trailstop (the initial trailing trigger price) and exactly one of limit or limitoffset.

Common optional keys

KeySets
exchExchange (defaults to SMART)
accountIB account code
fagroupFA group
algo / algostrategyAlgo strategy name
algoparamsAlgo params, encoded tag=value|tag=value|…
tag / nonce / seqClient tag for your tracking. Composed into the TWS-visible Order Ref ahead of the engine's unique tracking token: <your tag>|SXLS:<token> — your tag reads first; a tagless order carries only the SXLS:<token>. (The StreamXLS ORDERREF field strips the SXLS token and returns only your tag.)
park / parked / savedTRUE/FALSE (default FALSE). park=true stages the order as a ticket visible only in your own TWS (released by clicking its Transmit button in TWS). The default StageOrder ticket is visible in every TWS instance (released by clicking Submit in TWS).

Order attribute keys (validated)

KeyAliasesValue / validation
tifOne of DAY, GTC, IOC, FOK, OPG, GTD (default DAY). GTD requires goodtilldate
goodtilldategtdReal date/time YYYYMMDD [HH:MM:SS [TZ]]; requires tif=GTD
goodaftertimegatReal date/time YYYYMMDD [HH:MM:SS [TZ]]; any tif
outsiderthTRUE/FALSE — allow fills outside regular trading hours
stopaux, stoppriceDecimal > 0. Required for STP/STP LMT; the trailing amount for TRAIL and TRAIL LIMIT, each of which requires exactly one of stop or trailingpercent; only valid on stop/trail types
trailingpercentDecimal > 0 and ≤ 100; only valid on TRAIL/TRAIL LIMIT. The alternative to stop on both trailing types — each requires exactly one of the two
trailstoptrailstoppriceInitial trailing trigger price, decimal > 0; only valid on TRAIL/TRAIL LIMIT. Required for TRAIL LIMIT; optional for TRAIL
limitoffsetlmtoffsetDistance from the trailing trigger to the limit price; TRAIL LIMIT only. Any finite decimal — zero and negative offsets are accepted and passed through, their meaning defined by TWS. Mutually exclusive with limit
hiddenTRUE/FALSE — hidden order
displaydisplaysizeInteger > 0 — iceberg display size
allornoneaonTRUE/FALSE
minqtyInteger > 0 — minimum fill quantity
ocagroup + ocatypeRequired together. ocagroup = your OCA group name; ocatype = 1 (cancel remaining with block), 2 (reduce remaining with block), or 3 (reduce remaining without block)
Every key is validated before anything is staged; an invalid value or an unrecognized key errors loudly and no order is created. Supplying two synonyms of the same key (e.g. stop= and aux=) is rejected rather than silently picking one. Whether an attribute applies to a given order type/exchange (hidden, display, minqty) is enforced by TWS. Any TWS error is returned to Excel as the value of the StageOrder formula.

Return values

ValueMeaning
SendingOrder ticket delivering to TWS.
StagedOrder ticket delivered to TWS, awaiting your action there.
PreSubmitted / Submitted / Filled / InactiveAfter you send the order from TWS, the StageOrder subscription follows TWS's own status reports.
CancelledThe staged order was discarded, or the submitted order was cancelled.
SendOrder Error: … / Error nnn: …Validation / connection / TWS order error

How the staged order presents in TWS is chosen per formula with the optional park key.

  • Default: the order appears in TWS order lists as a deactivated ("PreSubmitted") order with a Submit button. PreSubmitted orders are visible to other TWS instances viewing the same account, and survive a TWS restart.
  • park=true (synonyms parked=, saved=): populates a local order ticket, which appears only in your TWS order list with a Transmit button. Other TWS instances on the account don't see it, and it does not appear in the API's Orders list. (TWS assigns a permanent id only if it is transmitted.)

Either way the order can never reach the market without a human click in TWS. Once you act on the order there, the cell tracks TWS's reports — including recovery from a failed release attempt (e.g., a missing account allocation): fix and transmit in TWS and the cell updates to the working status.

Deduplication. Excel deduplicates RTD topics with identical parameters, so entering the exact same order description twice in a row places only one order. To describe a second order that would otherwise look identical, add a unique tag/nonce (e.g. nonce=2) so Excel creates a distinct subscription.
A StageOrder cell is a trigger, not an order tracker. Staging happens the moment a formula is freshly entered — typed, edited, or written by a macro. Three consequences follow, all deliberate:
  • Editing a staged formula stages a second order. Excel keys a formula by its exact arguments, so changing any token — fixing a price, a size, a typo — is a new subscription: StreamXLS stages a new order and leaves the previous one staged in TWS. (You now have two.)
  • Deleting the formula does not cancel the order. After Staged, removing the cell only stops it from tracking — the ticket stays in TWS. Change or cancel it where it lives, in TWS.
  • Reopening a saved workbook does not re-stage. StreamXLS recognizes the reopen and disarms each StageOrder formula with the value Disarmed: workbook reopen does not re-stage orders. To re-stage a disarmed StageOrder, re-enter the formula (F2, Enter). A TWS reconnect does not re-stage either.

To watch and manage live orders, use the Orders topics.

§ · Status fields

Connection & data-freshness status

=RTD("Tws.Rtd", , "status", "<field>"). Status fields are per-connection: when several connections exist, supply a connection token (paper/live, or host=/port=) to target one, or omit it to piggyback the single connection.

FieldMeaning
IsConnectedLink with TWS: 1 when connected, 0 otherwise
ActiveTopicCountNumber of subscribed topics
LastUpdateUtcTimestamp of the last successful update (Excel UTC datetime)
ServerHeartbeatUtcLast Excel heartbeat (interval is unpredictable — minutes are possible)
AccountsCSVComma-separated managed account IDs from the connection handshake
MarketDataTypeConfigured default type — the ceiling you requested: 1 REALTIME · 2 FROZEN · 3 DELAYED · 4 DELAYED_FROZEN. (Per-contract, the market-data field MarketDataType reports what TWS is actually serving that contract, which can differ.)
ServerVersionThis connection's negotiated TWS ServerVersion (int), or Not Connected
MarketDataStateOk (≥206) / TooOld (1–205) / Unknown (0)
MarketDataMessageActionable "update your TWS API" text when TooOld, else empty
OrderDataStateDisconnected / Idle / Requested / Ready
LastOrderListChangeUtcUpdates when the order-list membership changes for subscribed accounts
LastOrderUpdateUtcUpdates on any new orderStatus from TWS
PositionDataStateDisconnected / Idle / Requested / Receiving / Ready
LastPositionListChangeUtcUpdates when the open-symbol list membership changes
LastPositionUpdateUtcUpdates on every position data callback
ConfigWarningsTWS_RTD_* configuration-validation warnings; empty when clean (see Configuration)
§ · Metadata & license

Build, license, and TWS-API fields

Metadata fields take no topic word — just the field: =RTD("Tws.Rtd", , "<field>"). They resolve in every license state, so a workbook can surface build and license status without special handling.

Build

FieldReturns
VERSIONProduct version, SemVer (e.g. 1.0.0)
BUILD_TIMEWhen the DLL was compiled (UTC)
SERVER_PATHFull path to the loaded StreamXLS.dll
CONFIGURATIONBuild configuration (Debug / Release)
ASSEMBLY_NAMEAssembly name (StreamXLS)

License

FieldReturns
LICENSE_STATEDeveloper / Trial / Paid / Expired / Unknown
LICENSE_MESSAGEHuman-readable status (trial days, reconnect heads-up, or purchase pointer)
LICENSE_DAYS_REMAININGWhole days left in the trial (empty when not in a trial)

TWS-API binding

FieldReturns
TWSAPI_STATEState of the runtime binding to IBKR's CSharpAPI.dll
TWSAPI_MESSAGEActionable guidance when the TWS API is absent / too old / incompatible
TWSAPI_VERSIONDetected TWS API version (empty if not detected)

Update breadcrumb

FieldReturns
UPDATE_AVAILABLE1 if an update is available, else 0
UPDATE_CRITICAL1 if that update is critical, else 0
UPDATE_LATEST_VERSIONLatest known version (empty when none)
UPDATE_MESSAGEHuman-readable update notice (empty when up to date)

The UPDATE_* fields read a local, fail-open breadcrumb; the engine makes no network call, and no breadcrumb means "up to date". Each field comes in two forms: as a metadata field (shown above) it resolves once when the cell connects, and the same four names are also available as live status fields — =RTD("Tws.Rtd",,"status","UPDATE_CRITICAL") — which re-check on every heartbeat, so a critical-update notice can reach a cell mid-session without re-entering the formula. For how the 30-day trial auto-starts and how to activate a license key, see Get Started → Your trial & license.