@huskly/ibkr-client 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -6
- package/dist/ibkr/ibkrApiTypes.d.ts +3 -0
- package/dist/ibkr/ibkrApiTypes.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.d.ts +8 -0
- package/dist/ibkr/ibkrClient.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.js +201 -18
- package/dist/ibkr/ibkrClient.js.map +1 -1
- package/dist/ibkr/optionContract.d.ts.map +1 -1
- package/dist/ibkr/optionContract.js +2 -0
- package/dist/ibkr/optionContract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +11 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -70,7 +70,8 @@ validated at runtime. Its broker-neutral account API includes:
|
|
|
70
70
|
funds, buying power, excess liquidity, cushion, SMA, equity-with-loan, Reg-T, initial- and
|
|
71
71
|
maintenance-margin, full, look-ahead, and leverage values. Margin values are `null` when IBKR
|
|
72
72
|
omits or returns an invalid value; numeric zero remains `0`.
|
|
73
|
-
- `getQuotes()` and `searchInstruments()` for equity/ETF discovery and quotes.
|
|
73
|
+
- `getQuotes()` and `searchInstruments()` for equity/ETF discovery and quotes. `getQuotes()` also
|
|
74
|
+
resolves a complete OSI option symbol without loading its option chain.
|
|
74
75
|
- `fetchTransactionHistory()` for normalized portfolio transactions.
|
|
75
76
|
- `fetchOrders()` for normalized live orders, including aggregate `WORKING`
|
|
76
77
|
matching across IBKR's active order states.
|
|
@@ -84,6 +85,8 @@ The reusable `IbkrClient` also exposes typed, read-only strategy data:
|
|
|
84
85
|
- `getOptionChain(...)` returns an exact-expiry chain with canonical OSI symbols, conids,
|
|
85
86
|
bid/ask/mid prices, delta, session volume, and open interest.
|
|
86
87
|
- `getOptionQuote(...)` resolves and prices one exact contract with the same market-data shape.
|
|
88
|
+
It uses one security-definition request after the per-underlying session search. It does not load
|
|
89
|
+
the complete option chain.
|
|
87
90
|
- `getOptionContract(conid)` maps a broker conid back to durable OSI identity.
|
|
88
91
|
|
|
89
92
|
### Broker-neutral derivative discovery
|
|
@@ -135,9 +138,11 @@ to `live`, `delayed`, `frozen`, `frozen-delayed`, or `unavailable`. A missing su
|
|
|
135
138
|
never reported as live data. All discovery APIs are read-only and do not call preview, order,
|
|
136
139
|
warning-reply, or cancellation endpoints.
|
|
137
140
|
|
|
138
|
-
|
|
139
|
-
that priming state in the authenticated session.
|
|
140
|
-
|
|
141
|
+
Full-chain contract discovery always calls `secdef/search` before `secdef/strikes`, because IBKR
|
|
142
|
+
keeps that priming state in the authenticated session. An exact OSI lookup uses the cached
|
|
143
|
+
per-underlying search and one `secdef/info` request. It does not request the strike list. Empty
|
|
144
|
+
post-prime strikes and incomplete bid/ask/delta snapshots throw instead of looking like a valid
|
|
145
|
+
chain with no candidates.
|
|
141
146
|
Request shaping is resilient by design: option discovery normalizes the requested symbol,
|
|
142
147
|
applies bounded batching for secondary-definition and market-data calls, and retries read-only
|
|
143
148
|
requests on transient `429` responses with capped exponential backoff (including `Retry-After`
|
|
@@ -339,8 +344,13 @@ chained and unknown warnings remain pending for the caller, and mixed, partial,
|
|
|
339
344
|
duplicated, terminal, malformed, or ambiguous acknowledgements return `recovery_required`. Broker
|
|
340
345
|
IDs from ambiguous acknowledgements are retained as uncorrelated responses rather than assigned to
|
|
341
346
|
nodes by position. Submission acknowledgements are correlated only by the echoed `local_order_id`
|
|
342
|
-
or `cOID`.
|
|
343
|
-
|
|
347
|
+
or `cOID`. Nested child acknowledgements under `children` or `childOrders` are flattened before
|
|
348
|
+
correlation, so a parent-only top-level array does not hide live child broker IDs.
|
|
349
|
+
`accepted` requires one distinct non-null broker order ID for every requested graph member. If any
|
|
350
|
+
member still has a null order ID after correlation, the result is `recovery_required` and the reason
|
|
351
|
+
names those member IDs. Partial evidence never looks like full acceptance. If IBKR does not echo a
|
|
352
|
+
complete and consistent identity for each member, the result is `recovery_required`, and the client
|
|
353
|
+
does not assign uncorrelated broker IDs to graph members by position.
|
|
344
354
|
A failed synchronous response retains a readable `text` or `warning_message` in
|
|
345
355
|
`errors` and recovery reasons when IBKR supplies one.
|
|
346
356
|
`recoverDerivativeOrderGraph(...)` reconstructs the exact graph from its root client ID, any
|
|
@@ -179,6 +179,9 @@ export interface IbkrOrderAcceptedResponse {
|
|
|
179
179
|
orderStatus?: string;
|
|
180
180
|
local_order_id?: string;
|
|
181
181
|
cOID?: string;
|
|
182
|
+
/** Nested child acknowledgements that some graph placements return under the parent record. */
|
|
183
|
+
children?: IbkrOrderAcceptedResponse[];
|
|
184
|
+
childOrders?: IbkrOrderAcceptedResponse[];
|
|
182
185
|
}
|
|
183
186
|
export interface IbkrOrderWarningResponse {
|
|
184
187
|
id?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ibkrApiTypes.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrApiTypes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ibkrApiTypes.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrApiTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,8 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
22
22
|
private initPromise?;
|
|
23
23
|
private accountIdPromise?;
|
|
24
24
|
private readonly optionDiscovery;
|
|
25
|
+
private readonly optionUnderlyingDiscovery;
|
|
26
|
+
private readonly optionContractResolution;
|
|
25
27
|
private readonly derivativeDiscovery;
|
|
26
28
|
private readonly requestScheduler;
|
|
27
29
|
constructor(config: IbkrOauth1Config, options?: IbkrClientOptions);
|
|
@@ -134,6 +136,7 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
134
136
|
private attachGraphParentOrderIds;
|
|
135
137
|
private normalizeOrderGraphSubmission;
|
|
136
138
|
private normalizeMultiOrderSubmission;
|
|
139
|
+
private flattenOrderSubmissionItems;
|
|
137
140
|
private decodeOrderSubmission;
|
|
138
141
|
private singleOrderRecoveryResult;
|
|
139
142
|
private contingentRecoveryResult;
|
|
@@ -190,10 +193,15 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
190
193
|
/** Resolve a conid back into the canonical OSI-bearing option contract. */
|
|
191
194
|
getOptionContract(conid: number): Promise<OptionContract | null>;
|
|
192
195
|
private resolveOptionContract;
|
|
196
|
+
/** Resolve one known option directly, without enumerating its month's complete chain. */
|
|
197
|
+
private loadExactOptionContract;
|
|
193
198
|
private discoverDerivativeMonth;
|
|
194
199
|
private loadDerivativeContracts;
|
|
195
200
|
private fetchDerivativeQuotes;
|
|
196
201
|
private discoverOptions;
|
|
202
|
+
/** Search once per underlying because IBKR uses this call to prime option lookup state. */
|
|
203
|
+
private discoverOptionUnderlying;
|
|
204
|
+
private loadOptionUnderlying;
|
|
197
205
|
private loadOptionContracts;
|
|
198
206
|
private fetchOptionQuotes;
|
|
199
207
|
private historyDays;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAGrB,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,gCAAgC,EAGhC,mBAAmB,EACnB,cAAc,EACd,WAAW,EAEX,wBAAwB,EAGxB,kBAAkB,EAClB,uBAAuB,EACvB,+BAA+B,EAC/B,6BAA6B,EAC7B,oCAAoC,EACpC,6BAA6B,EAC7B,4BAA4B,EAC5B,qCAAqC,EAErC,sCAAsC,EACtC,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAGxB,0BAA0B,EAE1B,0BAA0B,EAE1B,2BAA2B,EAC3B,0BAA0B,EAC1B,uCAAuC,EACvC,iCAAiC,EACjC,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EAErB,+BAA+B,EAC/B,4BAA4B,EAE5B,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EAEX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAkCrB,OAAO,EAIL,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAGrB,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,gCAAgC,EAGhC,mBAAmB,EACnB,cAAc,EACd,WAAW,EAEX,wBAAwB,EAGxB,kBAAkB,EAClB,uBAAuB,EACvB,+BAA+B,EAC/B,6BAA6B,EAC7B,oCAAoC,EACpC,6BAA6B,EAC7B,4BAA4B,EAC5B,qCAAqC,EAErC,sCAAsC,EACtC,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAGxB,0BAA0B,EAE1B,0BAA0B,EAE1B,2BAA2B,EAC3B,0BAA0B,EAC1B,uCAAuC,EACvC,iCAAiC,EACjC,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EAErB,+BAA+B,EAC/B,4BAA4B,EAE5B,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EAEX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAkCrB,OAAO,EAIL,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAuN/B,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,IAAI,CACrB,2BAA2B,EAC3B,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,eAAe,GAAG,aAAa,CAC7D,CAAC;IACF,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC5D;AAED;;;;;GAKG;AACH,qBAAa,UACX,YACE,YAAY,EACZ,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB;IAE3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAC,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgD;IAChF,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAgD;IAC1F,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAqD;IAC9F,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoD;IACxF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;gBAE5C,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,iBAAsB;IAcrE,6EAA6E;IAC7E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASf,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAWpC,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwBrE,sBAAsB,CAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,4BAA4B,CAAC;IAsBlC,qBAAqB,CACzB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,+BAA+B,CAAC;IAgCrC,2BAA2B,CAC/B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,+BAA+B,CAAC;IA2BrC,gCAAgC,CAAC,OAAO,EAAE;QAC9C,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,sCAAsC,CAAC;QAC/C,KAAK,EAAE,qCAAqC,CAAC;KAC9C,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAgDjC,0BAA0B,CAC9B,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC;IAiBhC,sCAAsC,CAAC,KAAK,EAAE;QAClD,YAAY,EAAE,uCAAuC,CAAC;QACtD,SAAS,EAAE,IAAI,CAAC;KACjB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAyBjC,2BAA2B,CAC/B,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC;IAmLtC,OAAO,CAAC,6BAA6B;IAiCrC,OAAO,CAAC,uBAAuB;YAYjB,mCAAmC;IAsQjD,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,kCAAkC;IAW1C,OAAO,CAAC,+BAA+B;IAmBvC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,yBAAyB;IA4CjC,OAAO,CAAC,kCAAkC;IAe1C,OAAO,CAAC,0BAA0B;IAyBlC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,0BAA0B;IAMlC,OAAO,CAAC,8BAA8B;IAoEtC,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,iCAAiC;IAQzC,OAAO,CAAC,2BAA2B;IAUnC,OAAO,CAAC,6BAA6B;IA6B/B,uBAAuB,CAAC,KAAK,EAAE;QACnC,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;KACjB,GAAG,OAAO,CAAC,+BAA+B,CAAC;IAYtC,iCAAiC,CAAC,KAAK,EAAE;QAC7C,YAAY,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/D,SAAS,EAAE,IAAI,CAAC;KACjB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAqBjC,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;IAqB9B,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAwBpF,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAyD/E,uBAAuB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA+BxF,iCAAiC,CACrC,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,6BAA6B,CAAC;IA0BnC,qBAAqB,CACzB,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,iCAAiC,CAAC;IAmBvC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAY/B,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAmD9C,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAa9D,yEAAyE;YAC3D,iBAAiB;IAc/B,kFAAkF;YACpE,WAAW;IAqBzB,OAAO,CAAC,iBAAiB;IAsBnB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAyCxE,uEAAuE;IACjE,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,gCAAkD,GAC7D,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAiBxB,uBAAuB,CAC3B,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAoChC,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA2B/E,OAAO,CAAC,oBAAoB;IA4C5B,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,uBAAuB;IAkB/B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,gBAAgB;IAiCxB,OAAO,CAAC,yBAAyB;IA2EjC,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,iCAAiC;IAczC,OAAO,CAAC,6BAA6B;IAqBrC,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,wBAAwB;IAkDhC,OAAO,CAAC,mBAAmB;IAuD3B,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,6BAA6B;IAuIrC,OAAO,CAAC,6BAA6B;IAyErC,OAAO,CAAC,2BAA2B;IA+CnC,OAAO,CAAC,qBAAqB;IA0G7B,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,wBAAwB;IAsChC,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,uBAAuB;IA4B/B,OAAO,CAAC,iCAAiC;IA4DzC,OAAO,CAAC,4BAA4B;IAuCpC,OAAO,CAAC,8BAA8B;IA+EtC,OAAO,CAAC,6BAA6B;IAiGrC,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,4BAA4B;IAsCpC,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,6BAA6B;IAwBrC,OAAO,CAAC,gCAAgC;IA+IxC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,8BAA8B;IAetC,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,YAAY;YAQN,uBAAuB;IAkBrC,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,sBAAsB;YAehB,oBAAoB;IAwDlC,qFAAqF;IAC/E,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA4B7E,0EAA0E;IACpE,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgDtF,wFAAwF;IAClF,sBAAsB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAoB3F,sFAAsF;IAChF,yBAAyB,CAC7B,KAAK,EAAE,uBAAuB,GAAG;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,kBAAkB,CAAC;IAkB9B,mFAAmF;IAC7E,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAgBpF,sFAAsF;IAChF,2BAA2B,CAC/B,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,wBAAwB,CAAC;IAkDpC,mFAAmF;IAC7E,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBpB,2FAA2F;IACrF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAclF,2EAA2E;IACrE,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAMlF,2EAA2E;IACrE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA2BtE,OAAO,CAAC,qBAAqB;IAqB7B,yFAAyF;YAC3E,uBAAuB;IAyErC,OAAO,CAAC,uBAAuB;YAkCjB,uBAAuB;YAuGvB,qBAAqB;IA2CnC,OAAO,CAAC,eAAe;IAWvB,2FAA2F;IAC3F,OAAO,CAAC,wBAAwB;YAalB,oBAAoB;YA6CpB,mBAAmB;YAkDnB,iBAAiB;IAmE/B,OAAO,CAAC,WAAW;YAeL,iBAAiB;IAqB/B,OAAO,CAAC,oBAAoB;IA2C5B,OAAO,CAAC,cAAc;IAsDtB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,8BAA8B;IAOtC,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,cAAc;IAUtB,6EAA6E;IAC7E,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,yEAAyE;IACzE,SAAS,CAAC,GAAG,IAAI,MAAM;IAIvB,2EAA2E;IAC3E,SAAS,CAAC,MAAM,IAAI,MAAM;IAI1B,OAAO,CAAC,cAAc;IAsDtB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,cAAc;IAmBtB,iEAAiE;cACjD,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAInE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrD,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,WAAW;CAuBpB"}
|
package/dist/ibkr/ibkrClient.js
CHANGED
|
@@ -16,6 +16,7 @@ const OPTION_QUOTE_FIELDS = [
|
|
|
16
16
|
"84", // Bid
|
|
17
17
|
"86", // Ask
|
|
18
18
|
"87", // Formatted volume
|
|
19
|
+
"6509", // Market data availability
|
|
19
20
|
"7308", // Delta
|
|
20
21
|
"7638", // Option open interest
|
|
21
22
|
"7762", // Unformatted volume
|
|
@@ -95,6 +96,9 @@ function parseRetryAfter(raw) {
|
|
|
95
96
|
}
|
|
96
97
|
return undefined;
|
|
97
98
|
}
|
|
99
|
+
function isUnknownRecord(input) {
|
|
100
|
+
return typeof input === "object" && input !== null && !Array.isArray(input);
|
|
101
|
+
}
|
|
98
102
|
function isHeadersLike(input) {
|
|
99
103
|
return (typeof input === "object" &&
|
|
100
104
|
input !== null &&
|
|
@@ -175,6 +179,8 @@ export class IbkrClient {
|
|
|
175
179
|
initPromise;
|
|
176
180
|
accountIdPromise;
|
|
177
181
|
optionDiscovery = new Map();
|
|
182
|
+
optionUnderlyingDiscovery = new Map();
|
|
183
|
+
optionContractResolution = new Map();
|
|
178
184
|
derivativeDiscovery = new Map();
|
|
179
185
|
requestScheduler;
|
|
180
186
|
constructor(config, options = {}) {
|
|
@@ -1876,9 +1882,13 @@ export class IbkrClient {
|
|
|
1876
1882
|
});
|
|
1877
1883
|
return { ...evidence, status: order.status };
|
|
1878
1884
|
}));
|
|
1885
|
+
const memberOrderIds = members.map(({ orderId }) => orderId);
|
|
1886
|
+
const hasCompleteMemberOrderIds = memberOrderIds.every((orderId) => orderId !== null) &&
|
|
1887
|
+
new Set(memberOrderIds).size === request.nodes.length;
|
|
1879
1888
|
const hasCompleteIdentityCorrelation = distinct &&
|
|
1880
1889
|
decoded.orders.length === request.nodes.length &&
|
|
1881
|
-
correlatedOrders.size === request.nodes.length
|
|
1890
|
+
correlatedOrders.size === request.nodes.length &&
|
|
1891
|
+
hasCompleteMemberOrderIds;
|
|
1882
1892
|
if (decoded.warnings.length === 1 &&
|
|
1883
1893
|
decoded.orders.length === 0 &&
|
|
1884
1894
|
decoded.errors.length === 0 &&
|
|
@@ -1918,11 +1928,20 @@ export class IbkrClient {
|
|
|
1918
1928
|
warnings: [],
|
|
1919
1929
|
};
|
|
1920
1930
|
}
|
|
1931
|
+
const membersMissingOrderIds = members
|
|
1932
|
+
.filter(({ orderId }) => orderId === null)
|
|
1933
|
+
.map(({ memberId }) => memberId);
|
|
1934
|
+
const hasNonFailureOrderStatuses = decoded.orders.every(({ status }) => status !== "UNKNOWN" && status !== "REJECTED" && status !== "CANCELED");
|
|
1921
1935
|
const hasIdentityCorrelationFailure = decoded.pendingCancelOrderIds.length === 0 &&
|
|
1922
1936
|
decoded.errors.length === 0 &&
|
|
1923
|
-
|
|
1937
|
+
hasNonFailureOrderStatuses &&
|
|
1924
1938
|
decoded.orders.length === request.nodes.length &&
|
|
1925
1939
|
!hasCompleteIdentityCorrelation;
|
|
1940
|
+
const hasNamedMissingMemberIds = membersMissingOrderIds.length > 0 &&
|
|
1941
|
+
decoded.pendingCancelOrderIds.length === 0 &&
|
|
1942
|
+
decoded.errors.length === 0 &&
|
|
1943
|
+
hasNonFailureOrderStatuses &&
|
|
1944
|
+
!hasIdentityCorrelationFailure;
|
|
1926
1945
|
return {
|
|
1927
1946
|
state: "recovery_required",
|
|
1928
1947
|
rootClientOrderId: request.rootClientOrderId,
|
|
@@ -1930,7 +1949,9 @@ export class IbkrClient {
|
|
|
1930
1949
|
reasons: [
|
|
1931
1950
|
hasIdentityCorrelationFailure
|
|
1932
1951
|
? "IBKR did not return a unique client order identity for each graph member"
|
|
1933
|
-
:
|
|
1952
|
+
: hasNamedMissingMemberIds
|
|
1953
|
+
? `IBKR graph submission is missing broker order IDs for member(s): ${membersMissingOrderIds.join(", ")}`
|
|
1954
|
+
: this.submissionRecoveryReason(decoded, decoded.orders.length, request.nodes.length),
|
|
1934
1955
|
],
|
|
1935
1956
|
warnings: decoded.warnings,
|
|
1936
1957
|
errors: decoded.errors,
|
|
@@ -2001,17 +2022,58 @@ export class IbkrClient {
|
|
|
2001
2022
|
}
|
|
2002
2023
|
return this.contingentRecoveryResult(decoded, orders, parentClientOrderId);
|
|
2003
2024
|
}
|
|
2025
|
+
flattenOrderSubmissionItems(response) {
|
|
2026
|
+
const responseIsArray = Array.isArray(response);
|
|
2027
|
+
const rootItems = responseIsArray ? response : [response];
|
|
2028
|
+
const items = [];
|
|
2029
|
+
const malformedNesting = [];
|
|
2030
|
+
const visiting = new Set();
|
|
2031
|
+
const visit = (rawItems) => {
|
|
2032
|
+
for (const item of rawItems) {
|
|
2033
|
+
if (typeof item !== "object" || item === null || Array.isArray(item)) {
|
|
2034
|
+
items.push(item);
|
|
2035
|
+
continue;
|
|
2036
|
+
}
|
|
2037
|
+
if (visiting.has(item)) {
|
|
2038
|
+
malformedNesting.push({ ...item });
|
|
2039
|
+
continue;
|
|
2040
|
+
}
|
|
2041
|
+
visiting.add(item);
|
|
2042
|
+
const record = item;
|
|
2043
|
+
const childCollections = [record["childOrders"], record["children"]];
|
|
2044
|
+
const hasMalformedChildCollection = childCollections.some((children) => children !== undefined && !Array.isArray(children));
|
|
2045
|
+
items.push(item);
|
|
2046
|
+
if (hasMalformedChildCollection) {
|
|
2047
|
+
malformedNesting.push({ ...record });
|
|
2048
|
+
visiting.delete(item);
|
|
2049
|
+
continue;
|
|
2050
|
+
}
|
|
2051
|
+
const children = new Set();
|
|
2052
|
+
for (const collection of childCollections) {
|
|
2053
|
+
if (!Array.isArray(collection))
|
|
2054
|
+
continue;
|
|
2055
|
+
for (const child of collection)
|
|
2056
|
+
children.add(child);
|
|
2057
|
+
}
|
|
2058
|
+
if (children.size > 0)
|
|
2059
|
+
visit([...children]);
|
|
2060
|
+
visiting.delete(item);
|
|
2061
|
+
}
|
|
2062
|
+
};
|
|
2063
|
+
visit(rootItems);
|
|
2064
|
+
return { responseIsArray, items, malformedNesting };
|
|
2065
|
+
}
|
|
2004
2066
|
decodeOrderSubmission(response) {
|
|
2005
|
-
const items =
|
|
2067
|
+
const { responseIsArray, items, malformedNesting } = this.flattenOrderSubmissionItems(response);
|
|
2006
2068
|
const decoded = {
|
|
2007
|
-
responseIsArray
|
|
2069
|
+
responseIsArray,
|
|
2008
2070
|
orders: [],
|
|
2009
2071
|
rawOrderResponses: new Map(),
|
|
2010
2072
|
invalidClientOrderIdentityOrders: new Set(),
|
|
2011
2073
|
pendingCancelOrderIds: [],
|
|
2012
2074
|
warnings: [],
|
|
2013
2075
|
errors: [],
|
|
2014
|
-
unrecognizedResponses: [],
|
|
2076
|
+
unrecognizedResponses: [...malformedNesting],
|
|
2015
2077
|
};
|
|
2016
2078
|
for (const item of items) {
|
|
2017
2079
|
if (typeof item !== "object" || item === null || Array.isArray(item)) {
|
|
@@ -3019,11 +3081,87 @@ export class IbkrClient {
|
|
|
3019
3081
|
strike: raw.strike,
|
|
3020
3082
|
});
|
|
3021
3083
|
}
|
|
3022
|
-
|
|
3023
|
-
const
|
|
3024
|
-
|
|
3025
|
-
|
|
3026
|
-
|
|
3084
|
+
resolveOptionContract(input) {
|
|
3085
|
+
const underlying = input.symbol.trim().toUpperCase();
|
|
3086
|
+
const month = monthCode(input.expiry);
|
|
3087
|
+
const key = [underlying, input.expiry, String(input.strike), input.right].join(":");
|
|
3088
|
+
let pending = this.optionContractResolution.get(key);
|
|
3089
|
+
if (!pending) {
|
|
3090
|
+
pending = this.loadExactOptionContract({ ...input, symbol: underlying }, month).then((contract) => {
|
|
3091
|
+
if (contract === null)
|
|
3092
|
+
this.optionContractResolution.delete(key);
|
|
3093
|
+
return contract;
|
|
3094
|
+
}, (error) => {
|
|
3095
|
+
this.optionContractResolution.delete(key);
|
|
3096
|
+
throw error;
|
|
3097
|
+
});
|
|
3098
|
+
this.optionContractResolution.set(key, pending);
|
|
3099
|
+
}
|
|
3100
|
+
return pending;
|
|
3101
|
+
}
|
|
3102
|
+
/** Resolve one known option directly, without enumerating its month's complete chain. */
|
|
3103
|
+
async loadExactOptionContract(input, month) {
|
|
3104
|
+
const underlying = await this.discoverOptionUnderlying(input.symbol);
|
|
3105
|
+
const definitions = await this.req({
|
|
3106
|
+
path: "iserver/secdef/info",
|
|
3107
|
+
params: {
|
|
3108
|
+
conid: String(underlying.conid),
|
|
3109
|
+
sectype: "OPT",
|
|
3110
|
+
month,
|
|
3111
|
+
strike: input.strike,
|
|
3112
|
+
right: input.right,
|
|
3113
|
+
},
|
|
3114
|
+
});
|
|
3115
|
+
if (!Array.isArray(definitions)) {
|
|
3116
|
+
throw new Error(`IBKR returned malformed option definitions for ${input.symbol} ${month}`);
|
|
3117
|
+
}
|
|
3118
|
+
const matches = [];
|
|
3119
|
+
let malformed = false;
|
|
3120
|
+
for (const raw of definitions) {
|
|
3121
|
+
if (!isUnknownRecord(raw)) {
|
|
3122
|
+
malformed = true;
|
|
3123
|
+
continue;
|
|
3124
|
+
}
|
|
3125
|
+
const rawConid = raw["conid"];
|
|
3126
|
+
const rawSymbol = raw["symbol"];
|
|
3127
|
+
const rawMaturityDate = raw["maturityDate"];
|
|
3128
|
+
const rawRight = raw["right"];
|
|
3129
|
+
const rawStrike = raw["strike"];
|
|
3130
|
+
const rawSecType = raw["secType"];
|
|
3131
|
+
let contract;
|
|
3132
|
+
try {
|
|
3133
|
+
contract = normalizeOptionContract({
|
|
3134
|
+
conid: typeof rawConid === "number" ? rawConid : undefined,
|
|
3135
|
+
symbol: typeof rawSymbol === "string" ? rawSymbol : underlying.symbol,
|
|
3136
|
+
maturityDate: typeof rawMaturityDate === "string" ? rawMaturityDate : undefined,
|
|
3137
|
+
right: typeof rawRight === "string" ? rawRight : undefined,
|
|
3138
|
+
strike: typeof rawStrike === "string" || typeof rawStrike === "number" ? rawStrike : undefined,
|
|
3139
|
+
});
|
|
3140
|
+
}
|
|
3141
|
+
catch {
|
|
3142
|
+
contract = null;
|
|
3143
|
+
}
|
|
3144
|
+
if (contract === null ||
|
|
3145
|
+
(rawSecType !== undefined &&
|
|
3146
|
+
(typeof rawSecType !== "string" || rawSecType.toUpperCase() !== "OPT"))) {
|
|
3147
|
+
malformed = true;
|
|
3148
|
+
continue;
|
|
3149
|
+
}
|
|
3150
|
+
if (contract.underlying === input.symbol &&
|
|
3151
|
+
contract.expiry === input.expiry &&
|
|
3152
|
+
contract.right === input.right &&
|
|
3153
|
+
contract.strike === input.strike) {
|
|
3154
|
+
matches.push(contract);
|
|
3155
|
+
}
|
|
3156
|
+
}
|
|
3157
|
+
if (malformed) {
|
|
3158
|
+
throw new Error(`IBKR returned malformed option definitions for ${input.symbol} ${month}`);
|
|
3159
|
+
}
|
|
3160
|
+
const unique = [...new Map(matches.map((contract) => [contract.conid, contract])).values()];
|
|
3161
|
+
if (unique.length > 1) {
|
|
3162
|
+
throw new Error(`IBKR returned ambiguous option definitions for ${input.symbol} ${input.expiry}`);
|
|
3163
|
+
}
|
|
3164
|
+
return unique[0] ?? null;
|
|
3027
3165
|
}
|
|
3028
3166
|
discoverDerivativeMonth(underlying, assetClass, month, exchange, right, strike) {
|
|
3029
3167
|
const normalizedUnderlying = underlying.trim().toUpperCase();
|
|
@@ -3166,18 +3304,59 @@ export class IbkrClient {
|
|
|
3166
3304
|
}
|
|
3167
3305
|
return pending;
|
|
3168
3306
|
}
|
|
3169
|
-
|
|
3170
|
-
|
|
3307
|
+
/** Search once per underlying because IBKR uses this call to prime option lookup state. */
|
|
3308
|
+
discoverOptionUnderlying(symbol) {
|
|
3309
|
+
const normalized = symbol.trim().toUpperCase();
|
|
3310
|
+
let pending = this.optionUnderlyingDiscovery.get(normalized);
|
|
3311
|
+
if (!pending) {
|
|
3312
|
+
pending = this.loadOptionUnderlying(normalized).catch((error) => {
|
|
3313
|
+
this.optionUnderlyingDiscovery.delete(normalized);
|
|
3314
|
+
throw error;
|
|
3315
|
+
});
|
|
3316
|
+
this.optionUnderlyingDiscovery.set(normalized, pending);
|
|
3317
|
+
}
|
|
3318
|
+
return pending;
|
|
3319
|
+
}
|
|
3320
|
+
async loadOptionUnderlying(symbol) {
|
|
3321
|
+
// This search is load-bearing: IBKR silently returns empty definitions unless the current
|
|
3171
3322
|
// session has first searched the underlying.
|
|
3172
3323
|
const search = await this.req({
|
|
3173
3324
|
path: "iserver/secdef/search",
|
|
3174
3325
|
params: { symbol },
|
|
3175
3326
|
});
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
if (underlying?.conid === undefined) {
|
|
3179
|
-
throw new Error(`IBKR did not identify ${symbol} as an optionable underlying`);
|
|
3327
|
+
if (!Array.isArray(search)) {
|
|
3328
|
+
throw new Error(`IBKR returned malformed option underlying results for ${symbol}`);
|
|
3180
3329
|
}
|
|
3330
|
+
const candidates = search.flatMap((item) => {
|
|
3331
|
+
if (!isUnknownRecord(item))
|
|
3332
|
+
return [];
|
|
3333
|
+
const candidateSymbol = item["symbol"];
|
|
3334
|
+
if (typeof candidateSymbol !== "string" || candidateSymbol.trim().toUpperCase() !== symbol) {
|
|
3335
|
+
return [];
|
|
3336
|
+
}
|
|
3337
|
+
const sections = item["sections"];
|
|
3338
|
+
if (!Array.isArray(sections) ||
|
|
3339
|
+
!sections.some((section) => isUnknownRecord(section) &&
|
|
3340
|
+
typeof section["secType"] === "string" &&
|
|
3341
|
+
section["secType"].trim().toUpperCase() === "OPT")) {
|
|
3342
|
+
return [];
|
|
3343
|
+
}
|
|
3344
|
+
const conid = Number(item["conid"]);
|
|
3345
|
+
return Number.isSafeInteger(conid) && conid > 0 ? [{ conid, symbol }] : [];
|
|
3346
|
+
});
|
|
3347
|
+
const unique = [
|
|
3348
|
+
...new Map(candidates.map((candidate) => [candidate.conid, candidate])).values(),
|
|
3349
|
+
];
|
|
3350
|
+
if (unique.length !== 1) {
|
|
3351
|
+
throw new Error(`IBKR option underlying identity is ${unique.length ? "ambiguous" : "missing"} for ${symbol}`);
|
|
3352
|
+
}
|
|
3353
|
+
const [underlying] = unique;
|
|
3354
|
+
if (underlying === undefined)
|
|
3355
|
+
throw new Error(`IBKR lost the selected underlying for ${symbol}`);
|
|
3356
|
+
return underlying;
|
|
3357
|
+
}
|
|
3358
|
+
async loadOptionContracts(symbol, month) {
|
|
3359
|
+
const underlying = await this.discoverOptionUnderlying(symbol);
|
|
3181
3360
|
const strikes = await this.req({
|
|
3182
3361
|
path: "iserver/secdef/strikes",
|
|
3183
3362
|
params: { conid: String(underlying.conid), sectype: "OPT", month },
|
|
@@ -3204,7 +3383,7 @@ export class IbkrClient {
|
|
|
3204
3383
|
for (const raw of responses.flat()) {
|
|
3205
3384
|
const contract = normalizeOptionContract({
|
|
3206
3385
|
conid: raw.conid,
|
|
3207
|
-
symbol: raw.symbol ?? underlying.symbol
|
|
3386
|
+
symbol: raw.symbol ?? underlying.symbol,
|
|
3208
3387
|
maturityDate: raw.maturityDate,
|
|
3209
3388
|
right: raw.right,
|
|
3210
3389
|
strike: raw.strike,
|
|
@@ -3259,6 +3438,8 @@ export class IbkrClient {
|
|
|
3259
3438
|
delta,
|
|
3260
3439
|
volume,
|
|
3261
3440
|
openInterest,
|
|
3441
|
+
availability: normalizeDerivativeDataAvailability(snapshot?.["6509"]),
|
|
3442
|
+
timestamp: snapshot ? this.snapshotTimestamp(snapshot) : null,
|
|
3262
3443
|
});
|
|
3263
3444
|
}
|
|
3264
3445
|
}
|
|
@@ -3573,6 +3754,8 @@ export class IbkrClient {
|
|
|
3573
3754
|
const totalVolume = this.snapshotVolume(snapshot) ?? this.historyVolume(history, latestBar);
|
|
3574
3755
|
return {
|
|
3575
3756
|
symbol,
|
|
3757
|
+
availability: normalizeDerivativeDataAvailability(snapshot["6509"]),
|
|
3758
|
+
timestamp: this.snapshotTimestamp(snapshot),
|
|
3576
3759
|
reference: {
|
|
3577
3760
|
...(description !== undefined ? { description } : {}),
|
|
3578
3761
|
...(exchange !== undefined ? { exchange, exchangeName: exchange } : {}),
|