DXtrade sizing: volatility only (12h default hold); fees and every-day only for DXtrade

The symbol map's fixed notional per contract is gone: every DXtrade leg is
sized from the instrument's recent volatility for the firm's target hold
(blank = 12 h), and a candidate without a volatility isn't picked. Percent
commission and every-day trading are ignored on non-DXtrade firms, which keep
measured per-contract fees and the CME calendar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Li
2026-09-26 17:29:32 -05:00
co-authored by Claude Opus 5.5
parent 28f465508d
commit d01f03b293
9 changed files with 87 additions and 100 deletions
+5 -6
View File
@@ -228,13 +228,12 @@ export function isFirmPlatform(value: unknown): value is FirmPlatform {
return typeof value === 'string' && (FIRM_PLATFORMS as readonly string[]).includes(value);
}
/** One symbol a DXTrade firm may trade for a CME root. */
/** One symbol a DXTrade firm may trade for a CME root. Position size comes
* from volatility and the firm's target hold, never from the map (an older
* master's notionalPerContract is ignored). */
export interface SymbolMapCandidate {
/** The platform's symbol, e.g. "BTC/USD". */
symbol: string;
/** Fixed sizing: notional per $1,000 of leg (like futures' one contract
* per $1,000). Used when volatility sizing is off or can't run. */
notionalPerContract: number;
/** Per-side commission % for this symbol; absent = the firm's. */
commissionPct?: number;
}
@@ -263,8 +262,8 @@ export interface CatalogFirm {
tradesEveryDay?: boolean;
/** DXTrade: which symbols each CME root may trade as. */
symbolMap?: SymbolMap;
/** DXTrade volatility sizing: aim each leg's expected hold at this many
* hours (0 = fixed sizing from the symbol map). */
/** DXTrade sizing: aim each leg's expected hold at this many hours
* (0 = DEFAULT_TARGET_HOLD_HOURS, 12). */
targetHoldHours?: number;
/** Overnight financing the firm charges, % of notional per day (0 = none). */
financingPctPerDay?: number;