Futures legs respect a firm's per-instrument contract limit
A firm can cap how many contracts of an instrument its accounts may hold (the catalog's instrumentLimits, set on the master's Firms page). A leg trades one contract per $1,000, capped by the account type's max contracts and that limit. The Auto draw sizes each instrument's hold with the capped count, so a limit that slows a leg past 12 hours takes it out of the draw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
b125257d4e
commit
58e7414849
+17
-3
@@ -107,10 +107,24 @@ export function dailyMoveDollars(closes: number[], pointValue: number, barsPerDa
|
||||
}
|
||||
|
||||
/** Contracts a futures leg trades: one per $1,000, capped by the account
|
||||
* type's max contracts (0 = no cap) — the rule fireLeg sizes by. */
|
||||
export function futuresContracts(leg: number, maxPositionSize: number): number {
|
||||
* type's max contracts and the firm's limit on the instrument (0 = no
|
||||
* cap) — the rule fireLeg sizes by. */
|
||||
export function futuresContracts(leg: number, maxPositionSize: number, instrumentLimit = 0): number {
|
||||
const raw = Math.max(1, Math.ceil(leg / 1000));
|
||||
return maxPositionSize > 0 ? Math.min(raw, maxPositionSize) : raw;
|
||||
const caps = [maxPositionSize, instrumentLimit].filter((c) => c > 0);
|
||||
return caps.length > 0 ? Math.min(raw, ...caps) : raw;
|
||||
}
|
||||
|
||||
/** The most contracts a firm allows on one instrument, as its catalog entry
|
||||
* says: CME roots only, whole numbers from 1 to 1000. Anything else is
|
||||
* dropped — no limit beyond the account type's max contracts. */
|
||||
export function sanitizeInstrumentLimits(raw: unknown): Record<string, number> {
|
||||
const out: Record<string, number> = {};
|
||||
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return out;
|
||||
for (const [root, value] of Object.entries(raw as Record<string, unknown>)) {
|
||||
if (CME_SPECS[root] && typeof value === 'number' && Number.isInteger(value) && value >= 1 && value <= 1000) out[root] = value;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user