Live futures spreads off one client, and the master's max entry spread

One quote feed per machine: a TopstepX client's market hub, else a
Tradovate client's market-data socket, subscribed to every listed root's
front month and the drain micro. A supervisor keeps it on a working client,
dropping one that fails or goes quiet while the market trades.

The Auto draw weighs each instrument by its live spread (the typical tick
when no fresh quote is at hand). No futures entry pays more than the
master's max entry spread ($15 until set) to cross the book: the draw
leaves such an instrument out, an explicit symbol sits the tick out, and
fireLeg and the extra-day trade check it last before sending. The Settings
page and the master's stats show the live spreads and the feed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Li
2026-09-27 15:06:44 -05:00
co-authored by Claude Opus 5.5
parent 1782c16145
commit db1d12327a
13 changed files with 747 additions and 33 deletions
+18 -1
View File
@@ -132,12 +132,20 @@ export interface InstrumentStats {
sessionProgress: number | null;
/** Holds at or over this are disabled. */
maxHoldHours: number;
/** Entries paying more than this to cross the spread are skipped (0 = no limit). */
maxEntrySpreadDollars?: number;
/** The firm whose client feeds the live quotes; null = none, typical spreads. */
quoteSource?: string | null;
instruments: {
symbol: string;
listed: boolean;
contract: string | null;
/** One tick of spread on one contract, in dollars. */
/** Crossing the spread on one contract, in dollars: live when
* `spreadLive`, else the typical one tick. */
spreadDollars: number;
spreadLive?: boolean;
/** Over the entry limit right now: out of the draw, not traded. */
spreadBlocked?: boolean;
/** One contract's typical daily move (1σ), in dollars. */
dailyMoveDollars: number | null;
holdHours: number | null;
@@ -335,10 +343,19 @@ export interface CatalogFirm {
updatedAt: string;
}
/** Settings the master applies to every instance (its Settings page). */
export interface CatalogTradingSettings {
/** The most an entry may pay to cross the spread, per contract, in
* dollars (0 = no limit). */
maxEntrySpreadDollars: number;
}
export interface FirmCatalogPayload {
version: number;
updatedAt: string;
firms: CatalogFirm[];
/** Absent from a master from before its Settings page. */
trading?: CatalogTradingSettings;
}
export interface FirmCatalogUnchanged {