Skip to content
Parth Parekh
SYSTEMSARCHITECTURE
EXECUTIONMASTER · CONTROL · OMS

One master trade.
Thirty client books.

Master, control, OMS, and venue are separate tiers because each failure had to land somewhere specific. Strategy publishes once and never names a broker; control sizes and routes; each OMS owns one venue and every book on it.

  • Strategy publishes one master trade at unit size and never names a broker — adding a client or a venue is not a strategy change.
  • Control sizes per book, picks the broker, and picks the OMS — and keeps routing from cached state when the client directory is down.
  • Each OMS instance owns one broker API and every client account on that broker, each in its own lane.
  • These tiers were not drawn on day one; each boundary came from a failure that had to be owned somewhere.
FIG. H · MASTER TO VENUETIER 1MASTER TRADEpublished once, at unit sizeTIER 2CONTROL LAYERsize · route · risk gate · write-ahead20–30 accountsTIER 3OMS ×5each holds every client on its broker5 brokersTIER 4VENUENSE · BSE · NFO · BFO · MCXDESK CONTROLSpause · freeze · square-offTHE STRATEGY NEVER NAMES A BROKER.The control layer resolves the account, the size andthe door.Desk controls sit beside the path, never on it.

← DRAG TO READ THE FULL DRAWING

MASTER

Published once

One tradesheet at unit size. No clients, capital, or brokers in the strategy layer — adding any of them is operations, not a fork.

CONTROL

Sizes and routes

Per client: size, broker, OMS. Routing continues from same-day cache when the directory is down; orders that used the cache are marked.

OMS

Holds the clients

One instance per broker, every account on that broker inside it — own connection, cache, rate limit, and lane.

TICK TO FILLWHAT BLOCKS · WHAT OBSERVES

What is on the path,
and what is beside it.

Tick → feature → signal → risk gate → order. Pre-trade risk blocks: no answer, no order. Post-trade risk observes: position, charges, and P&L may lag by a moment — they never hold a trade.

SECTION A–A · TICK TO FILL1 · MARKET DATATICKsequenced2 · MARKET DATABOOK · CHAINIV, then Greeks3 · RESEARCHFEATUREpoint-in-time4 · RESEARCHSIGNALlegs, not prices5 · RISK — PRE-TRADEPRE-TRADE GATEmargin · limits · killblocks6 · EXECUTIONSIZE · ROUTEper account7 · EXECUTIONSENDnever storage-gated8 · VENUEFILLbroker book is truthPOSITION · P&Lobserves, never gatesPRE-TRADE RISK BLOCKS. POST-TRADE RISK OBSERVES.10–20 ms colo · 80–500 ms internet, end to end.A timeout returns to a recheck, not to done.

← DRAG TO READ THE FULL SECTION

RESEARCHIDEATION TO LIVE

How an idea
becomes a position.

Hypothesis → backtest with real costs and causality → paper on the live order path → capital. Eight strategies cleared every gate; most ideas stop earlier, and that is the engine working.

FIG. J · STRATEGY LIFECYCLEITERATE1IDEATIONmicrostructure, desk, data2HYPOTHESISa reason to be paid3SPECIFYlegs, entries, exits4BACKTESTnext-bar fill, real costsshelved5WALK-FORWARDtrain frozen, OOS scoredshelved6PAPERthe live OMS doorshelved7LIVEclient capitalTHE GATES ARE THE PRODUCT.Most ideas leave through the side, not the end.Eight cleared every gate into live capital.

← DRAG TO READ THE FULL LOOP

THE ENGINE

A strategy is a spec

Instruments, entries, legs, exits, and lifecycle rules are declared — not forked. Multi-leg structures, Greeks, and strike selection are part of the contract.

THE GATES

Costs and causality

Next-bar fills after the broker clock. Charges by product class. Walk-forward freezes training decisions before out-of-sample is scored.

THE HANDOFF

Paper uses the live door

Same OMS, same timeouts, same fan-out. What clears paper is the program that runs on capital.

HOW THE SERVICES TALKAND WHERE THEY GROW

Typed edges, two sockets.

Most architecture diagrams draw every arrow the same way and hide the only interesting question: which edge is synchronous and on the order path, and which is a stream that can fall behind without anyone losing money. These are typed. The two dashed sockets mark the places the system is designed to grow — a new broker is an adapter, a new strategy is a producer, and neither one edits the order path.

SOURCESPLANEDECISIONEXECUTIONEXCHANGE FEEDUDP / binaryBROKER SOCKETstandby tapeREFERENCE DATAlots · constituents · masterEXCHANGE REPORTSend of daySEQUENCER · BOOKgap · dup · reorderSTREAM BUSfan of consumersHOT CACHEserve nowWAREHOUSEreplayed by researchOPTION CHAINIV → GreeksRESEARCH ENGINEnext-bar fill · costsREGIMEyesterday's close onlyMARGIN SERVICEbasket ≠ sum of legsEXECUTION BUSone signal, many booksBROKER OMS ×5one interfaceDESK SCREENScontrol plane, off the order+ BROKER ADAPTERone interface, no OMS change+ STRATEGYa producer, not a rewriteORDER PATH — synchronous, blockingCALLS — request / responseSUBSCRIBES — streamWRITES — behind the pathOPEN AT EXACTLY TWO SOCKETS.A NEW BROKER IS AN ADAPTER.A NEW STRATEGY IS A PRODUCER.NEITHER EDITS THE ORDER PATH.FIG. G — SERVICE MAP & EXTENSION POINTS

← DRAG TO READ THE FULL MAP

DETAIL FIGURESONE CLAIM EACH

Six drawings, six claims.

Each figure carries one assertion, and each one is something I would happily be interrogated on.

FIG. A — ORDER LIFECYCLE

A timeout is not a terminal state

The most expensive mistake in a broker integration is treating a timed-out request as a decided one. It is undecided — the order may already be live at the exchange. So the state machine has no edge from TIMEOUT to done. It has an edge to a recheck that runs off the hot path, and only the venue's answer writes the book, with partial fills aggregated correctly.

ACCEPTSENTnever storage-gatedACKPARTIALBOOKEDTIMEOUTRECHECKoff the hot pathnot terminalA TIMEOUT IS NOT A FILL. MARK IT DONE AND THE FILL THAT LANDS LATER NEVER HITS THE BOOK.RECHECK THE VENUE, THEN WRITE THE STATE. THE BROKER BOOK IS SOURCE OF TRUTH.FIG. A — ORDER LIFECYCLE

FIG. B — EXECUTION FAN-OUT

One intent, many books, five doors

A trader or a strategy fires once. Sizing happens per account, each leg leaves through that client's broker adapter, and isolation is the invariant: one client erroring, or one broker host having a bad morning, must not stall the other lanes. Paper trading leaves by the same door as live, so research and production are the same program.

INTENT1 lotSIZEper accountACCOUNT 01ACCOUNT 02ACCOUNT 03ACCOUNT 04ACCOUNT 05… up to 30KITEXTSIBKRNUVAMAJLITE20–30 CLIENT ACCOUNTS, ONE DECISION5 DOORSONE INTERFACEONE CLIENT OR ONE HOST FAILING MUST NOT FREEZE THE OTHERS. PAPER LEAVES BY THE SAME DOOR.FIG. B — EXECUTION FAN-OUT

FIG. C — MARKET-DATA PLANE

Quiet is not dead

A silent primary tape looks exactly like a calm market until you decide it doesn't. Past a silence threshold the switch throws to the standby source and the chain stays priced. Downstream the plane does three separate jobs — sequence, serve now, store for replay — because collapsing them is how research ends up reading a different market than the desk traded.

EXCHANGEUDP / binaryBROKER WSstandby tapeSILENCE → THROWQUIET IS NOT DEADSEQUENCEgap · dup · orderNORMALIZEHOT CACHEserve nowWAREHOUSEreplayed by researchREFERENCE DATA — LOTS, CONSTITUENTS, INSTRUMENT MASTER — RUNS ON A DIFFERENT CLOCK THAN THE TAPE.IF INGEST FAILS, BUFFER AND RETRY. NEVER INVENT A TICK.FIG. C — MARKET-DATA PLANE

FIG. I — DATA PLATFORM

Nothing reaches the record unchecked

Loads land in a dated staging area and are promoted into the system of record only after validation — schema and grain, duplicates, freshness, and gaps diffed against the exchange trading calendar. A run that fails stays in staging and is recorded as degraded rather than half-loading a day that a strategy will later average over. One control centre is the sole trigger authority, because two schedulers firing the same pipeline is a data-corruption bug waiting for a busy morning.

CONTROL CENTREthe only thing that may trigger a runEXCHANGE + BROKERspot · futures · optionsREFERENCE DATAconstituents · lots · mastersREPORTSexchange · broker · corp actionsSTAGINGdated, isolatedVALIDATIONschema + grainduplicatesfreshnesscalendar gapsSYSTEM OF RECORDwhat strategies readFAILS → STAYS IN STAGING, RECORDED AS A DEGRADED RUNA MISSING DAY IS FOUND BY DIFFING WHAT EXISTS AGAINST THE TRADING CALENDAR, NOT BY A STRATEGY AVERAGING OVER THE HOLE.NEW WRITES DEFAULT TO DRY-RUN: REAL SESSION, REAL SOCKET, REAL COMPUTE — ONLY THE TERMINAL WRITE IS WITHHELD AND COUNTED.GATE THE WRITES. NEVER THE READS.FIG. I — DATA PLATFORM

FIG. D — PLANE SEPARATION

The screen is not on the order

Everything a human looks at can be slightly stale. Nothing that places an order waits on it. The crossed edge is the one this drawing exists to forbid: a lookup belonging to the display path quietly becoming a dependency of the send path. When the directory is down, routing continues from same-day cached state and the screen says so.

HOT PATH — NOTHING MAY BLOCK ITSIGNALSIZESENDACKCONTROL PLANE — ALLOWED TO BE A MOMENT BEHINDCLIENT DIRECTORYMARGIN VIEWBLOTTER · CHARGESA SCREEN THAT WAITS ON THE CLIENT DIRECTORY IS A BUG. AN ORDER THAT WAITS ON IT IS A WORSE ONE.DISPLAY READS A CACHE. IF THE DIRECTORY IS DOWN, ROUTING USES LAST-KNOWN-GOOD AND SAYS SO.FIG. D — PLANE SEPARATION

FIG. E — ORDER-PATH LATENCY

Two bands, measured end to end

Colocated, the order path sits in the ten-to-twenty millisecond band. Over the internet it is eighty to five hundred. Those are the numbers the desk plans around, and they are the ones worth quoting because they describe the whole path a real order takes rather than one hop of it.

1 ms10 ms100 ms1000 msCOLO ORDER PATH — 10–20 msINTERNET PATH — 80–500 msMEASURED BANDS, NOT A CLAIMED SUB-MICROSECOND STACK. THE HONEST NUMBER IS THE USEFUL ONE.FIG. E — ORDER-PATH LATENCY
FAILOVER AND RECOVERYPRIMARY · SECONDARY · REFUSE

Every chain ends
in refusing, not
in guessing.

Resilience is not a property you claim, it is an ordered list you can recite. For each subsystem: what is preferred, what takes over, and where it stops. The last rung is always to stop and say so — because a system that carries on with invented state fails silently, and silent is the expensive kind.

SUBSYSTEMPREFERREDLAST RESORTMarket-data feedExchange binary feedBroker socket, on silence thresho…Last trusted bookRefuse to publishQuote and candle readsLocal cacheRecent-tick storeWarehouseBroker APIOrder statusLive status socketCached snapshotOrder and trade bookDirect status queryClient routingClient directorySame-day routing cacheRefuse — previous-day state is no…Order persistenceLocal write-ahead commitBackground replication to the sto…Reconcile against the broker bookBroker connectivityPrimary hostPer-host circuit opens after repe…Backoff and retryAlert the deskWarehousePrimary nodeReplicaBackup replication of both storesDocumented recovery pathEVERY CHAIN ENDS IN REFUSING RATHER THAN GUESSING. A SYSTEM THAT CARRIES ON WITH INVENTED STATE FAILS SILENTLY, AND SILENT IS THE EXPENSIVE KIND.FIG. L — DEGRADATION LADDER

← DRAG TO READ THE FULL LADDER

Market-data feed

  1. 1Exchange binary feed
  2. 2Broker socket, on silence threshold
  3. 3Last trusted book
  4. 4Refuse to publish

A silent primary is a failure, not a calm market. Past the threshold another source takes the tape.

Quote and candle reads

  1. 1Local cache
  2. 2Recent-tick store
  3. 3Warehouse
  4. 4Broker API

The order of the tiers is declared, and every result records which tier answered it.

Order status

  1. 1Live status socket
  2. 2Cached snapshot
  3. 3Order and trade book
  4. 4Direct status query

Status degrades in quality rather than disappearing. Undecided stays undecided until the venue answers.

Client routing

  1. 1Client directory
  2. 2Same-day routing cache
  3. 3Refuse — previous-day state is not used

Routing survives the directory being down, and the orders that used the cache are marked as having done so.

Order persistence

  1. 1Local write-ahead commit
  2. 2Background replication to the store
  3. 3Reconcile against the broker book

A storage outage delays the record. It never rejects the trade.

Broker connectivity

  1. 1Primary host
  2. 2Per-host circuit opens after repeated failure
  3. 3Backoff and retry
  4. 4Alert the desk

One broker having a bad morning must not take the other four with it. Lanes are isolated per broker and per client.

Warehouse

  1. 1Primary node
  2. 2Replica
  3. 3Backup replication of both stores
  4. 4Documented recovery path

History is the one thing that cannot be rebuilt from the market. It is replicated and backed up, not just stored.

PRIMARY, SECONDARY, BACKUPTHREE PROMISES, THREE CLOCKS

“We have a backup”
is three different
sentences.

Failover, replication and restore get conflated constantly, and the day that matters is the day someone discovers they meant different things. Each tier below runs on its own clock, and each subsystem gets the mechanism its tolerance can actually afford.

TIERTIME TO BE WHOLE AGAIN1 s1 min1 hr1 dayFAILOVERAutomatic, in-processAvailability — keep trading nowsilence switch · circuit breaker · cached routing · status fallbackREPLICATIONScheduled, one-directionalDurability — the copy existsprimary → backup for both stores · lag measurable on demandRESTOREDeliberate, human-initiatedRecoverability — trade off the copyverify the gap · repoint configuration · restart · reverse when primary returnsA BACKUP THAT EXISTS IS NOT A BACKUP YOU CAN TRADE OFF. THOSE ARE DIFFERENT TIERS, AND ONLY ONE OF THEM IS AUTOMATIC.REPLICATION CADENCE IS THE WORKING RECOVERY-POINT TARGET UNTIL A TIGHTER ONE IS SET AND DRILLED.FIG. M — CONTINUITY TIERS

← DRAG TO READ THE FULL DRAWING

Three promises, three clocks

Failover keeps you trading in seconds and is automatic. Replication means a second copy exists and runs on a schedule you can measure. Restore means trading off that copy, and it is a deliberate act with a human in it. A desk that says “we have a backup” and means the second one has confused durability with availability.

Each tier gets the mechanism it can afford

The order path cannot wait for anything, so its continuity is in-process: a silence threshold throws the feed to a standby source, a per-host breaker isolates a failing broker, routing continues from same-day cached state when the directory is unreachable. The warehouse can afford minutes, so its continuity is replication. Matching the mechanism to the tolerance is the whole design.

Replication is one-directional on purpose

Primary reads, backup writes, never the reverse under normal operation. A bidirectional copy is a conflict waiting for the day both sides are reachable and disagree. The copy itself is pulled by the backup server rather than streamed through the job that triggers it, so the orchestration process is never the bottleneck or the failure point for the data movement.

Promotion is a configuration change, not a code change

Every service addresses its stores through configuration rather than a hardcoded host. Recovering therefore means verifying the replication gap, repointing that configuration at the backup, and restarting — no service is rebuilt, and no service needed to know in advance that it might one day be talking to a different machine.

Reachability is not currency

A green health check proves the host answers, not that its data is caught up. Those are separate checks: continuous deep health probes on both primary and backup, and a separate on-demand replication-gap walk across the estate — on-demand because walking every table and collection is expensive enough that it must not run on a timer and quietly degrade the thing it is measuring.

The posture has to survive the estate growing

In a system that keeps gaining services, continuity cannot be per-service heroics. A new service inherits the posture by satisfying three contracts: it declares its dependencies so the topology knows what it takes with it when it fails, it exposes a health endpoint the monitor already knows how to poll, and it addresses its stores through configuration so it is repointable. Meet those three and the service is covered on the day it ships.

An undrilled runbook is a hypothesis

A recovery path that has never been executed is an inference from how the configuration works, not a rehearsed procedure — and the honest thing is to say so and schedule the drill, rather than discover the difference during an incident. Replication cadence is the working recovery-point target until a tighter one is defined and tested.

FAILURE MODESWHAT THE TESTS PROTECT

Reliability is a list
of named failures.

“Robust” is not a property. It is a set of specific things that have gone wrong and now have a test with their name on it. These five shape the architecture.

12453 MISSINGGAP · DUPLICATE · REORDER

Sequence first

Gap, duplicate and reorder are named failures on the feed, not surprises. A book built on a missing packet is not a book.

PRIMARY — SILENTSTANDBY TAKES THE TAPE

Quiet is not dead

A silent primary is a failure, not a calm market. Past the threshold the standby takes the tape and the chain stays alive.

TIMEOUTRECHECKNOT A TERMINAL STATETHEN BOOK

Timeout is not a fill

Mark it done and the fill that lands later never reaches the book. Recheck the venue off the hot path, then write the state.

REPEATED FAILUREOPEN · BACK OFF · RETRY

A dead host backs off

Repeated failure trips the lane open per host, so one broker having a bad morning cannot take the other four down with it.

LOCALSENTSTORE, BEHINDCOMMIT LOCAL FIRST

Storage never rejects an order

The order commits locally first and replicates behind. A storage outage delays the record; it does not refuse the trade.

ASK ME ABOUT

how sizing resolves per client; what the order path does when the client directory hangs; why a timeout is undecided rather than failed; how an order survives a storage outage; why a modify never quotes off last price; what is empty at 09:14 if an overnight job died.

WHY A BACKTEST IS EVIDENCEBIAS, MECHANICALLY

Every bias has
a mechanism, not
a promise.

Anyone can say they avoid look-ahead. The question worth asking is what happens when somebody forgets. These are the places that answer is “the build fails” or “a test goes red” rather than “someone notices in review”.

STRATEGY COREno I/O · no clock · no databaseselectionlegsstopsre-entryexitsIMPORT BOUNDARY — THE BUILD FAILS IF THE CORE REACHES ACROSS ITBACKTESTrecorded barsPAPERlive chain, simulated fillLIVEbroker, client capitalADAPTERS — MODE SELECTS ONE OF THESE, AND NOTHING ELSEFROZEN CONFIG HASHlive refuses to start unless its resolved parameters match the frozen setCROSS-MODE EQUIVALENCE TESTone recorded day, both adapter sets, identical command sequenceCODE IDENTITY IS STRUCTURAL. PARAMETER IDENTITY IS A HASH. NEITHER IS A PROMISE SOMEONE HAS TO REMEMBER TO KEEP.FIG. K — ONE CORE, THREE MODES

← DRAG TO READ THE FULL DRAWING

Look-ahead is a build failure, not a habit

The strategy core cannot read data later than the current timestamp, and it cannot import an adapter — an import-contract check fails the build if it tries. The same constraint that prevents look-ahead is what makes live an adapter swap rather than a rewrite. It is one rule wearing two hats.

Never impute a price

A missing bar stays missing. Rows are wholly present or wholly absent, and a lookup returns nothing rather than the last value carried forward. A fabricated price can fire a stop that never happened, or hide one that did — and both of those show up as performance rather than as an error.

Selection is frozen before it is scored

Walk-forward freezes every decision made inside a training window before test sessions are scored, so a parameter chosen because it worked cannot then be credited for working. Anything that only survives when that freeze is relaxed did not survive.

Survivorship lives in the universe, not the returns

An index is not a fixed list. Members join and leave, and a backtest whose universe is built from today's constituents has quietly tested a portfolio nobody could have held. So constituent membership and weights are stored historically and read as of the trade date, and expired or delisted contracts stay in the store rather than being cleaned out of it. The instruments that disappeared are the ones carrying the losses.

Point-in-time reference data, not current reference data

Lot sizes, tick conventions and instrument masters change, and the danger is not that a change breaks something loudly — it is the day the engine reads the new lot size from the chain while a report divides by the old one from config. Both numbers are internally consistent, the pairing is false, and nothing surfaces it. Reference data therefore carries its own effective dates and the values asserted in code are catalogued against what reads them.

The number of things you tried is part of the result

Run enough permutations across strikes, times, thresholds and symbols and something will look excellent by construction. A scan that reports only its winner is reporting a maximum, not an edge. So a sweep records how many configurations were evaluated alongside the one that won, and the winning row carries the hash of the configuration that produced it — the count of trials is evidence, not a footnote.

Selection is a decision that must be dated

Choosing a parameter, a symbol or a strike-selection method is itself a decision that had to be made at a point in time. Walk-forward freezes those decisions inside the training window before test sessions are scored, and the same rule applies to the universe: whatever narrowed it had to be knowable then. A filter applied with hindsight is indistinguishable from a good result.

One key, or contracts merge silently

A contract is identified by underlying, expiry, strike and type — everywhere, including deduplication, the quality gate and the cache. A partial key quietly merges two contracts, because the same strike exists across every expiry listed on a trade date, and the resulting series looks perfectly plausible.

Deployed is proven, not remembered

Every run stamps its resolved configuration into a hash, and live refuses to start unless that hash matches an explicitly frozen one. It turns “did we deploy what we tested?” from a memory question into a startup assertion, and kills the failure where someone edits a live parameter weeks later and the backtest evidence quietly stops applying.

Structural facts are separated from choices

Values the exchange owns — session bounds, tick conventions, lot sizes — are held apart from anything a strategy owner may tune, and the ones asserted in code rather than read from the instrument master are catalogued with what reads them and how they fail. The dangerous change is not the one that breaks loudly; it is the one where every number stays internally consistent and only the relationship to the market is false.

Remaining divergence is measured, not hidden

Backtest and live cannot be identical everywhere — one has bar highs, the other has ticks; one models charges, the other queries them. Those places are enumerated, the charge model's correctness is defined as agreement with the live API and enforced by a test, and where selection can legitimately differ, paper runs beside a same-day backtest with the difference diffed rather than assumed away.

RESEARCH ENGINETHE GATE BEFORE THE OMS

Ideas do not skip the clock.

Research and simulation engine

The engine execution infra would have to build anyway

CLI + trader-facing builder → contract → warehouse or CSV → features → strategy legs → lifecycle engine (bar-by-bar; portfolio / strategy / group state) → fills (default next bar) → Indian cost factories → metrics. Drawdown kill blocks new entries. Paper is not a second program.

contract / UI
  → load bars + chain
  → generate_signals (legs, not prices)
  → lifecycle (exits / hedge / re-entry / EOD)
  → fill after broker-ack clock
  → costs by product class
  → paper OMS → live OMS
Architecture A · 0DTE index short-premium

Session cube, then walk-forward

Warehouse is source of truth: a bounded session is sliced, quality-gated, then a dense in-memory cube. Features are timestamp-safe. An event-driven simulator walks the session. Walk-forward freezes train-window decisions before they touch test sessions. Costs last. Then paper, then the five-broker door. No clocks or PnL on this page.

warehouse slice
  → quality gates
  → dense cube
  → timestamp-safe features
  → event-driven session sim
  → walk-forward (train frozen)
  → costs → paper / live OMS
Architecture B · expiry-day theta harvest

Clocked session, no overnight

Time is first-class state: the calendar knows it is expiry; the engine will not carry a book overnight; flatten is an EOD contract. Slots and re-entry live in the same lifecycle engine. Same costs. Same kill-switchable OMS. Clock-driven, flatten-or-die — not cube-shaped. Parameters stay at the desk.

Calendar: expiry day?
  → session clock as state
  → same lifecycle engine
       time exits + EOD flatten
       no overnight positions
  → costs → paper → live OMS

Gate A

Hypothesis

A reason the market might pay you. Not a backtest yet.

Gate B

No-lookahead

Next-bar fill. Indian costs. Walk-forward. Fail here on purpose.

Gate C

Paper

Same OMS door as live. Simulated fills. Same timeouts, same fan-out.

Gate D

Live

Capital. Eight made it. The rest stay off the book.

STACK AS STRATAJOB FIRST

Different layers, different tools.

Each layer gets the tool that suits its job: C++ where the packet path is hot, Python across the services, a column store for time-series, a cache for what has to be instant.

Feed
C++ · UDP · sockets · threads · LZO · sequence · Linux
Store
ClickHouse (tick and bar time-series) · Redis · Redis streams · MongoDB · Docker · Git
Sim / research
Python · event loop / bar clock · NumPy · Pandas · lifecycle engine
OMS / EMS
Python · FastAPI · REST · WebSockets · poller · circuit breaker · kill switch
Brokers
Zerodha Kite · Motilal XTS · IBKR · Nuvama · JLite
Venues
NSE · BSE · NFO · BFO · MCX