@huskly/ibkr-client 1.1.1 → 1.2.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 +41 -11
- package/dist/ibkr/ibkrClient.d.ts +9 -4
- package/dist/ibkr/ibkrClient.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.js +156 -127
- package/dist/ibkr/ibkrClient.js.map +1 -1
- package/dist/ibkr/requestScheduler.d.ts +19 -2
- package/dist/ibkr/requestScheduler.d.ts.map +1 -1
- package/dist/ibkr/requestScheduler.js +146 -24
- package/dist/ibkr/requestScheduler.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/package.json +1 -1
package/README.md
CHANGED
|
@@ -146,6 +146,29 @@ recovery.
|
|
|
146
146
|
does not identify one listing.
|
|
147
147
|
- `getOptionContract(conid)` maps a broker conid back to durable OSI identity.
|
|
148
148
|
|
|
149
|
+
The option discovery methods submit at most eight `secdef/info` definitions at one time. The next
|
|
150
|
+
chunk starts only after the current chunk succeeds. Multi-month expiry discovery completes one month
|
|
151
|
+
before it starts the next month. A terminal failure cancels queued definitions that belong to that
|
|
152
|
+
operation. It does not cancel definitions that belong to another operation. HTTP requests that
|
|
153
|
+
started before cancellation can settle normally.
|
|
154
|
+
|
|
155
|
+
Pass an `OptionDiscoveryOptions` value as the last argument to stop one operation with a standard
|
|
156
|
+
`AbortSignal`:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
const controller = new AbortController();
|
|
160
|
+
const expiries = client.getOptionExpiries("SPX", "C", from, to, {
|
|
161
|
+
signal: controller.signal,
|
|
162
|
+
});
|
|
163
|
+
controller.abort();
|
|
164
|
+
await expiries;
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`getOptionChain` and `getOptionChainSnapshot` accept the same final options argument. Their signal
|
|
168
|
+
applies to definition discovery and market-data snapshots. An aborted operation rejects with the
|
|
169
|
+
signal reason when it is an `Error`. A non-error custom reason is retained as the `cause` of an
|
|
170
|
+
`Error`. An `AbortController` without a custom reason uses the standard `AbortError`.
|
|
171
|
+
|
|
149
172
|
### Broker-neutral derivative discovery
|
|
150
173
|
|
|
151
174
|
`IbkrClient` implements the capability-specific `DerivativeDiscoveryClient` without adding
|
|
@@ -315,18 +338,23 @@ structured response in `BrokerErrorDetail.details`; transport exceptions are ret
|
|
|
315
338
|
|
|
316
339
|
Every authenticated request runs through one priority scheduler per `IbkrClient`. The default
|
|
317
340
|
limits allow at most ten requests globally. Stateful security-definition discovery stays at one
|
|
318
|
-
request at a time. Read-only `iserver/secdef/info` expansion
|
|
319
|
-
|
|
320
|
-
limit. Order preview, status,
|
|
321
|
-
|
|
341
|
+
request at a time. Read-only `iserver/secdef/info` expansion defaults to one concurrent request and
|
|
342
|
+
at least 250 ms between request starts. Configure these limits with `maxSecdefInfoConcurrent` and
|
|
343
|
+
`secdefInfoMinStartIntervalMs`; concurrency cannot exceed the global limit. Order preview, status,
|
|
344
|
+
warning, cancellation, and immediate-trade requests take priority over queued discovery, including
|
|
345
|
+
while definition work waits for its next allowed start. Multi-month derivative discovery also primes
|
|
346
|
+
each month serially. A session-level
|
|
322
347
|
transaction guard keeps each stateful security-definition search with its dependent strike request.
|
|
323
348
|
For option-chain discovery, independent definition reads run outside this guard after search and
|
|
324
349
|
strikes finish. An exact expiry/strike/right request expands only the requested contracts.
|
|
325
350
|
|
|
326
|
-
A 429
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
351
|
+
A `secdef/info` 429 extends one endpoint-wide wait and raises the effective minimum start interval.
|
|
352
|
+
It honors `Retry-After` and does not block execution requests. A 429 from another endpoint pauses the
|
|
353
|
+
shared queue behind one `Retry-After`-aware exponential backoff with jitter. Individual queued reads
|
|
354
|
+
do not start independent retry loops, and the retry count does not increase. Exhausted throttling
|
|
355
|
+
throws `IbkrRequestSchedulerError` with code `IBKR_THROTTLED`. A broker temporary-block response
|
|
356
|
+
opens a bounded circuit, rejects queued work, and throws code `IBKR_TEMPORARILY_BLOCKED` without a
|
|
357
|
+
retry.
|
|
330
358
|
|
|
331
359
|
A price-history read retries a 5xx response with bounded exponential backoff and jitter. No other
|
|
332
360
|
request retries a 5xx response. An explicit `Retry-After` value replaces the local backoff delay
|
|
@@ -340,9 +368,11 @@ safe `Retry-After` value when it is available. Callers do not have to parse the
|
|
|
340
368
|
|
|
341
369
|
`IbkrClient` accepts optional scheduler limits and an `onRequestTelemetry` callback. Scheduler
|
|
342
370
|
options also accept `now`, `sleep`, and `random` functions for controlled runtimes and tests.
|
|
343
|
-
|
|
344
|
-
`
|
|
345
|
-
|
|
371
|
+
Request telemetry contains only a sanitized endpoint category, event, attempt, applied delay, and
|
|
372
|
+
the effective `secdef/info` minimum start interval when it applies. It contains no parameters,
|
|
373
|
+
payloads, or account data. `onOptionDiscoveryTelemetry` reports search, strikes, definitions, and
|
|
374
|
+
snapshot phases. It includes the symbol, month, optional right, duration, definition request count,
|
|
375
|
+
and snapshot batch count. It
|
|
346
376
|
does not contain account IDs, order IDs, credentials, request payloads, or full URLs. A telemetry
|
|
347
377
|
observer failure does not change request scheduling or request settlement.
|
|
348
378
|
|
|
@@ -7,6 +7,11 @@ interface IbkrRequestInput {
|
|
|
7
7
|
params?: Record<string, string | number | boolean | null | undefined>;
|
|
8
8
|
data?: object;
|
|
9
9
|
}
|
|
10
|
+
/** Controls one option-chain or expiry-discovery operation. */
|
|
11
|
+
export interface OptionDiscoveryOptions {
|
|
12
|
+
/** Stop this operation without canceling work owned by another caller. */
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
10
15
|
export interface IbkrClientOptions {
|
|
11
16
|
requestScheduler?: Omit<IbkrRequestSchedulerOptions, "classifyError" | "onTelemetry">;
|
|
12
17
|
onRequestTelemetry?: (event: IbkrRequestTelemetry) => void;
|
|
@@ -244,11 +249,11 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
244
249
|
/** Quote the broker-linked underlying (for example, the Sep NQ future behind QN3). */
|
|
245
250
|
getDerivativeReferenceQuote(contract: DerivativeContract): Promise<DerivativeReferenceQuote>;
|
|
246
251
|
/** Discover every listed weekly/monthly expiry in the requested calendar range. */
|
|
247
|
-
getOptionExpiries(symbol: string, right: OptionRight, fromDate: string, toDate: string): Promise<string[]>;
|
|
252
|
+
getOptionExpiries(symbol: string, right: OptionRight, fromDate: string, toDate: string, options?: OptionDiscoveryOptions): Promise<string[]>;
|
|
248
253
|
/** Build one exact-expiry chain with canonical OSI symbols and required pricing/greeks. */
|
|
249
|
-
getOptionChain(symbol: string, expiry: string, right?: OptionRight): Promise<OptionMarketQuote[]>;
|
|
254
|
+
getOptionChain(symbol: string, expiry: string, right?: OptionRight, options?: OptionDiscoveryOptions): Promise<OptionMarketQuote[]>;
|
|
250
255
|
/** Return every qualified contract for one exact expiry and side without hiding sparse data. */
|
|
251
|
-
getOptionChainSnapshot(symbol: string, expiry: string, right: OptionRight): Promise<OptionChainSnapshot>;
|
|
256
|
+
getOptionChainSnapshot(symbol: string, expiry: string, right: OptionRight, options?: OptionDiscoveryOptions): Promise<OptionChainSnapshot>;
|
|
252
257
|
/** Fetch one exact option quote; null means the contract is not listed. */
|
|
253
258
|
getOptionQuote(input: OptionQuoteRequest): Promise<OptionMarketQuote | null>;
|
|
254
259
|
/** Resolve a conid back into the canonical OSI-bearing option contract. */
|
|
@@ -318,7 +323,7 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
318
323
|
private snapshotVolume;
|
|
319
324
|
/** Typed wrapper around the raw client's untyped `request()`. */
|
|
320
325
|
protected sendRequest<T>(input: IbkrRequestInput): Promise<T>;
|
|
321
|
-
protected req<T>(input: IbkrRequestInput): Promise<T>;
|
|
326
|
+
protected req<T>(input: IbkrRequestInput, signal?: AbortSignal, onTerminalFailure?: (error: unknown) => void): Promise<T>;
|
|
322
327
|
private historyRequest;
|
|
323
328
|
private singleAttemptRequest;
|
|
324
329
|
private scheduledRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"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"}
|
package/dist/ibkr/ibkrClient.js
CHANGED
|
@@ -55,7 +55,6 @@ const QUOTE_FIELDS = [
|
|
|
55
55
|
"6509", // Market data availability
|
|
56
56
|
"7762", // Unformatted volume
|
|
57
57
|
].join(",");
|
|
58
|
-
const OPTION_DISCOVERY_MONTH_CONCURRENCY = 1;
|
|
59
58
|
const OPTION_SECDEF_INFO_BATCH_SIZE = 8;
|
|
60
59
|
const OPTION_MARKETDATA_BATCH_SIZE = 100;
|
|
61
60
|
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
@@ -3279,14 +3278,13 @@ export class IbkrClient {
|
|
|
3279
3278
|
};
|
|
3280
3279
|
}
|
|
3281
3280
|
/** Discover every listed weekly/monthly expiry in the requested calendar range. */
|
|
3282
|
-
async getOptionExpiries(symbol, right, fromDate, toDate) {
|
|
3281
|
+
async getOptionExpiries(symbol, right, fromDate, toDate, options = {}) {
|
|
3283
3282
|
const normalized = symbol.trim().toUpperCase();
|
|
3284
3283
|
const months = monthCodes(fromDate, toDate);
|
|
3285
3284
|
const contracts = [];
|
|
3286
|
-
for (
|
|
3287
|
-
const
|
|
3288
|
-
|
|
3289
|
-
contracts.push(...batchContracts.flatMap((result) => result.contracts));
|
|
3285
|
+
for (const month of months) {
|
|
3286
|
+
const result = await this.discoverOptions(normalized, month, right, options);
|
|
3287
|
+
contracts.push(...result.contracts);
|
|
3290
3288
|
}
|
|
3291
3289
|
return [
|
|
3292
3290
|
...new Set(contracts
|
|
@@ -3295,10 +3293,10 @@ export class IbkrClient {
|
|
|
3295
3293
|
].sort();
|
|
3296
3294
|
}
|
|
3297
3295
|
/** Build one exact-expiry chain with canonical OSI symbols and required pricing/greeks. */
|
|
3298
|
-
async getOptionChain(symbol, expiry, right) {
|
|
3296
|
+
async getOptionChain(symbol, expiry, right, options = {}) {
|
|
3299
3297
|
const month = monthCode(expiry);
|
|
3300
3298
|
const normalized = symbol.trim().toUpperCase();
|
|
3301
|
-
const discovery = await this.discoverOptions(normalized, month, right);
|
|
3299
|
+
const discovery = await this.discoverOptions(normalized, month, right, options);
|
|
3302
3300
|
const contracts = discovery.contracts.filter((contract) => contract.expiry === expiry && (right === undefined || contract.right === right));
|
|
3303
3301
|
if (!contracts.length) {
|
|
3304
3302
|
throw new Error(`IBKR returned no option contracts for ${symbol} ${expiry}`);
|
|
@@ -3306,6 +3304,7 @@ export class IbkrClient {
|
|
|
3306
3304
|
const quoted = await this.fetchOptionQuotes(contracts, {
|
|
3307
3305
|
allowIncomplete: true,
|
|
3308
3306
|
telemetry: { symbol: normalized, month, right: right ?? null },
|
|
3307
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
3309
3308
|
});
|
|
3310
3309
|
if (!quoted.length) {
|
|
3311
3310
|
throw new Error(`IBKR returned no usable option quotes for ${symbol} ${expiry}`);
|
|
@@ -3313,19 +3312,15 @@ export class IbkrClient {
|
|
|
3313
3312
|
return quoted;
|
|
3314
3313
|
}
|
|
3315
3314
|
/** Return every qualified contract for one exact expiry and side without hiding sparse data. */
|
|
3316
|
-
async getOptionChainSnapshot(symbol, expiry, right) {
|
|
3315
|
+
async getOptionChainSnapshot(symbol, expiry, right, options = {}) {
|
|
3317
3316
|
const month = monthCode(expiry);
|
|
3318
3317
|
const normalized = symbol.trim().toUpperCase();
|
|
3319
|
-
const discovery = await this.discoverOptions(normalized, month, right);
|
|
3318
|
+
const discovery = await this.discoverOptions(normalized, month, right, options);
|
|
3320
3319
|
const contracts = discovery.contracts.filter((contract) => contract.expiry === expiry);
|
|
3321
3320
|
if (!contracts.length) {
|
|
3322
3321
|
throw new Error(`IBKR returned no ${right} option contracts for ${symbol} ${expiry}`);
|
|
3323
3322
|
}
|
|
3324
|
-
return this.fetchOptionChainSnapshot(contracts, discovery.malformedDefinitionCount, {
|
|
3325
|
-
symbol: normalized,
|
|
3326
|
-
month,
|
|
3327
|
-
right,
|
|
3328
|
-
});
|
|
3323
|
+
return this.fetchOptionChainSnapshot(contracts, discovery.malformedDefinitionCount, { symbol: normalized, month, right }, options.signal);
|
|
3329
3324
|
}
|
|
3330
3325
|
/** Fetch one exact option quote; null means the contract is not listed. */
|
|
3331
3326
|
async getOptionQuote(input) {
|
|
@@ -3579,30 +3574,41 @@ export class IbkrClient {
|
|
|
3579
3574
|
}
|
|
3580
3575
|
return result;
|
|
3581
3576
|
}
|
|
3582
|
-
discoverOptions(symbol, month, right) {
|
|
3577
|
+
discoverOptions(symbol, month, right, options = {}) {
|
|
3583
3578
|
const normalized = symbol.trim().toUpperCase();
|
|
3579
|
+
if (options.signal !== undefined) {
|
|
3580
|
+
return this.loadOptionContracts(normalized, month, right, options.signal);
|
|
3581
|
+
}
|
|
3584
3582
|
const key = `${normalized}:${month}:${right ?? "*"}`;
|
|
3585
|
-
|
|
3586
|
-
if (
|
|
3583
|
+
const cached = this.optionDiscovery.get(key);
|
|
3584
|
+
if (cached !== undefined)
|
|
3585
|
+
return cached;
|
|
3586
|
+
let discovery;
|
|
3587
|
+
if (right !== undefined) {
|
|
3587
3588
|
const complete = this.optionDiscovery.get(`${normalized}:${month}:*`);
|
|
3588
3589
|
if (complete !== undefined) {
|
|
3589
|
-
|
|
3590
|
+
discovery = complete.then((result) => ({
|
|
3590
3591
|
contracts: result.contracts.filter((contract) => contract.right === right),
|
|
3591
3592
|
malformedDefinitionCount: result.malformedDefinitionCount,
|
|
3592
3593
|
}));
|
|
3593
3594
|
}
|
|
3594
3595
|
}
|
|
3595
|
-
|
|
3596
|
+
discovery ??= this.loadOptionContracts(normalized, month, right);
|
|
3597
|
+
const pending = discovery.catch((error) => {
|
|
3598
|
+
if (this.optionDiscovery.get(key) === pending)
|
|
3599
|
+
this.optionDiscovery.delete(key);
|
|
3600
|
+
throw error;
|
|
3601
|
+
});
|
|
3596
3602
|
this.optionDiscovery.set(key, pending);
|
|
3597
3603
|
return pending;
|
|
3598
3604
|
}
|
|
3599
|
-
async loadOptionUnderlying(symbol) {
|
|
3605
|
+
async loadOptionUnderlying(symbol, signal) {
|
|
3600
3606
|
// This search is load-bearing: IBKR silently returns empty definitions unless the current
|
|
3601
3607
|
// session has first searched the underlying.
|
|
3602
3608
|
const search = this.parseSecdefSearchResponse(await this.req({
|
|
3603
3609
|
path: "iserver/secdef/search",
|
|
3604
3610
|
params: { symbol },
|
|
3605
|
-
}));
|
|
3611
|
+
}, signal));
|
|
3606
3612
|
const candidates = search.flatMap((item) => {
|
|
3607
3613
|
if (!isUnknownRecord(item))
|
|
3608
3614
|
return [];
|
|
@@ -3641,110 +3647,134 @@ export class IbkrClient {
|
|
|
3641
3647
|
throw new Error(`IBKR lost the selected underlying for ${symbol}`);
|
|
3642
3648
|
return underlying;
|
|
3643
3649
|
}
|
|
3644
|
-
async loadOptionContracts(symbol, month, right) {
|
|
3645
|
-
const
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
|
|
3651
|
-
|
|
3652
|
-
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3659
|
-
|
|
3660
|
-
|
|
3650
|
+
async loadOptionContracts(symbol, month, right, callerSignal) {
|
|
3651
|
+
const operation = new AbortController();
|
|
3652
|
+
const abortFromCaller = () => {
|
|
3653
|
+
operation.abort(callerSignal?.reason);
|
|
3654
|
+
};
|
|
3655
|
+
if (callerSignal?.aborted)
|
|
3656
|
+
abortFromCaller();
|
|
3657
|
+
else
|
|
3658
|
+
callerSignal?.addEventListener("abort", abortFromCaller, { once: true });
|
|
3659
|
+
try {
|
|
3660
|
+
const { underlying, requests } = await this.withSecdefPriming(async () => {
|
|
3661
|
+
const searchStarted = this.requestNow();
|
|
3662
|
+
const selectedUnderlying = await this.loadOptionUnderlying(symbol, operation.signal);
|
|
3663
|
+
this.emitOptionDiscoveryTelemetry({
|
|
3664
|
+
phase: "SEARCH",
|
|
3665
|
+
symbol,
|
|
3666
|
+
month,
|
|
3667
|
+
right: right ?? null,
|
|
3668
|
+
durationMs: this.elapsedSince(searchStarted),
|
|
3669
|
+
definitionRequestCount: 0,
|
|
3670
|
+
snapshotBatchCount: 0,
|
|
3671
|
+
});
|
|
3672
|
+
const strikesStarted = this.requestNow();
|
|
3673
|
+
const strikes = await this.req({
|
|
3674
|
+
path: "iserver/secdef/strikes",
|
|
3675
|
+
params: { conid: String(selectedUnderlying.conid), sectype: "OPT", month },
|
|
3676
|
+
}, operation.signal);
|
|
3677
|
+
this.emitOptionDiscoveryTelemetry({
|
|
3678
|
+
phase: "STRIKES",
|
|
3679
|
+
symbol,
|
|
3680
|
+
month,
|
|
3681
|
+
right: right ?? null,
|
|
3682
|
+
durationMs: this.elapsedSince(strikesStarted),
|
|
3683
|
+
definitionRequestCount: 0,
|
|
3684
|
+
snapshotBatchCount: 0,
|
|
3685
|
+
});
|
|
3686
|
+
const callStrikes = strikes.call ?? [];
|
|
3687
|
+
const putStrikes = strikes.put ?? [];
|
|
3688
|
+
if (callStrikes.length === 0 && putStrikes.length === 0) {
|
|
3689
|
+
throw new Error(`IBKR returned empty option strikes for ${symbol} ${month} after secdef/search priming`);
|
|
3690
|
+
}
|
|
3691
|
+
const definitionRequests = [
|
|
3692
|
+
...(right === undefined || right === "C"
|
|
3693
|
+
? callStrikes.map((strike) => ({ strike, right: "C" }))
|
|
3694
|
+
: []),
|
|
3695
|
+
...(right === undefined || right === "P"
|
|
3696
|
+
? putStrikes.map((strike) => ({ strike, right: "P" }))
|
|
3697
|
+
: []),
|
|
3698
|
+
];
|
|
3699
|
+
return { underlying: selectedUnderlying, requests: definitionRequests };
|
|
3661
3700
|
});
|
|
3701
|
+
const definitionsStarted = this.requestNow();
|
|
3702
|
+
const contracts = [];
|
|
3703
|
+
let malformedDefinitionCount = 0;
|
|
3704
|
+
for (const batch of chunks(requests, OPTION_SECDEF_INFO_BATCH_SIZE)) {
|
|
3705
|
+
let responses;
|
|
3706
|
+
try {
|
|
3707
|
+
responses = await Promise.all(batch.map(({ strike, right: requestRight }) => this.req({
|
|
3708
|
+
path: "iserver/secdef/info",
|
|
3709
|
+
params: {
|
|
3710
|
+
conid: String(underlying.conid),
|
|
3711
|
+
sectype: "OPT",
|
|
3712
|
+
month,
|
|
3713
|
+
strike,
|
|
3714
|
+
right: requestRight,
|
|
3715
|
+
},
|
|
3716
|
+
}, operation.signal, (error) => {
|
|
3717
|
+
operation.abort(error);
|
|
3718
|
+
})));
|
|
3719
|
+
}
|
|
3720
|
+
catch (error) {
|
|
3721
|
+
operation.abort(error);
|
|
3722
|
+
throw error;
|
|
3723
|
+
}
|
|
3724
|
+
for (const response of responses) {
|
|
3725
|
+
if (!Array.isArray(response)) {
|
|
3726
|
+
throw new Error(`IBKR returned malformed option definitions for ${symbol} ${month}`);
|
|
3727
|
+
}
|
|
3728
|
+
for (const raw of response) {
|
|
3729
|
+
if (!isUnknownRecord(raw)) {
|
|
3730
|
+
malformedDefinitionCount += 1;
|
|
3731
|
+
continue;
|
|
3732
|
+
}
|
|
3733
|
+
let contract;
|
|
3734
|
+
try {
|
|
3735
|
+
contract = normalizeOptionContract({
|
|
3736
|
+
conid: typeof raw["conid"] === "number" ? raw["conid"] : undefined,
|
|
3737
|
+
symbol: typeof raw["symbol"] === "string" ? raw["symbol"] : underlying.symbol,
|
|
3738
|
+
maturityDate: typeof raw["maturityDate"] === "string" ? raw["maturityDate"] : undefined,
|
|
3739
|
+
right: typeof raw["right"] === "string" ? raw["right"] : undefined,
|
|
3740
|
+
strike: typeof raw["strike"] === "string" || typeof raw["strike"] === "number"
|
|
3741
|
+
? raw["strike"]
|
|
3742
|
+
: undefined,
|
|
3743
|
+
});
|
|
3744
|
+
}
|
|
3745
|
+
catch {
|
|
3746
|
+
malformedDefinitionCount += 1;
|
|
3747
|
+
continue;
|
|
3748
|
+
}
|
|
3749
|
+
if (contract)
|
|
3750
|
+
contracts.push(contract);
|
|
3751
|
+
else
|
|
3752
|
+
malformedDefinitionCount += 1;
|
|
3753
|
+
}
|
|
3754
|
+
}
|
|
3755
|
+
}
|
|
3662
3756
|
this.emitOptionDiscoveryTelemetry({
|
|
3663
|
-
phase: "
|
|
3757
|
+
phase: "DEFINITIONS",
|
|
3664
3758
|
symbol,
|
|
3665
3759
|
month,
|
|
3666
3760
|
right: right ?? null,
|
|
3667
|
-
durationMs: this.elapsedSince(
|
|
3668
|
-
definitionRequestCount:
|
|
3761
|
+
durationMs: this.elapsedSince(definitionsStarted),
|
|
3762
|
+
definitionRequestCount: requests.length,
|
|
3669
3763
|
snapshotBatchCount: 0,
|
|
3670
3764
|
});
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
const definitionRequests = [
|
|
3677
|
-
...(right === undefined || right === "C"
|
|
3678
|
-
? callStrikes.map((strike) => ({ strike, right: "C" }))
|
|
3679
|
-
: []),
|
|
3680
|
-
...(right === undefined || right === "P"
|
|
3681
|
-
? putStrikes.map((strike) => ({ strike, right: "P" }))
|
|
3682
|
-
: []),
|
|
3683
|
-
];
|
|
3684
|
-
return { underlying: selectedUnderlying, requests: definitionRequests };
|
|
3685
|
-
});
|
|
3686
|
-
const definitionsStarted = this.requestNow();
|
|
3687
|
-
const responses = await Promise.all(requests.map(({ strike, right: requestRight }) => this.req({
|
|
3688
|
-
path: "iserver/secdef/info",
|
|
3689
|
-
params: {
|
|
3690
|
-
conid: String(underlying.conid),
|
|
3691
|
-
sectype: "OPT",
|
|
3692
|
-
month,
|
|
3693
|
-
strike,
|
|
3694
|
-
right: requestRight,
|
|
3695
|
-
},
|
|
3696
|
-
})));
|
|
3697
|
-
this.emitOptionDiscoveryTelemetry({
|
|
3698
|
-
phase: "DEFINITIONS",
|
|
3699
|
-
symbol,
|
|
3700
|
-
month,
|
|
3701
|
-
right: right ?? null,
|
|
3702
|
-
durationMs: this.elapsedSince(definitionsStarted),
|
|
3703
|
-
definitionRequestCount: requests.length,
|
|
3704
|
-
snapshotBatchCount: 0,
|
|
3705
|
-
});
|
|
3706
|
-
if (requests.length === 0)
|
|
3707
|
-
return { contracts: [], malformedDefinitionCount: 0 };
|
|
3708
|
-
const contracts = [];
|
|
3709
|
-
let malformedDefinitionCount = 0;
|
|
3710
|
-
for (const response of responses) {
|
|
3711
|
-
if (!Array.isArray(response)) {
|
|
3712
|
-
throw new Error(`IBKR returned malformed option definitions for ${symbol} ${month}`);
|
|
3713
|
-
}
|
|
3714
|
-
for (const raw of response) {
|
|
3715
|
-
if (!isUnknownRecord(raw)) {
|
|
3716
|
-
malformedDefinitionCount += 1;
|
|
3717
|
-
continue;
|
|
3718
|
-
}
|
|
3719
|
-
let contract;
|
|
3720
|
-
try {
|
|
3721
|
-
contract = normalizeOptionContract({
|
|
3722
|
-
conid: typeof raw["conid"] === "number" ? raw["conid"] : undefined,
|
|
3723
|
-
symbol: typeof raw["symbol"] === "string" ? raw["symbol"] : underlying.symbol,
|
|
3724
|
-
maturityDate: typeof raw["maturityDate"] === "string" ? raw["maturityDate"] : undefined,
|
|
3725
|
-
right: typeof raw["right"] === "string" ? raw["right"] : undefined,
|
|
3726
|
-
strike: typeof raw["strike"] === "string" || typeof raw["strike"] === "number"
|
|
3727
|
-
? raw["strike"]
|
|
3728
|
-
: undefined,
|
|
3729
|
-
});
|
|
3730
|
-
}
|
|
3731
|
-
catch {
|
|
3732
|
-
malformedDefinitionCount += 1;
|
|
3733
|
-
continue;
|
|
3734
|
-
}
|
|
3735
|
-
if (contract)
|
|
3736
|
-
contracts.push(contract);
|
|
3737
|
-
else
|
|
3738
|
-
malformedDefinitionCount += 1;
|
|
3765
|
+
if (requests.length === 0)
|
|
3766
|
+
return { contracts: [], malformedDefinitionCount: 0 };
|
|
3767
|
+
const unique = [...new Map(contracts.map((contract) => [contract.conid, contract])).values()];
|
|
3768
|
+
if (!unique.length) {
|
|
3769
|
+
throw new Error(`IBKR returned no usable option definitions for ${symbol} ${month} (${String(malformedDefinitionCount)} malformed)`);
|
|
3739
3770
|
}
|
|
3771
|
+
return { contracts: unique, malformedDefinitionCount };
|
|
3740
3772
|
}
|
|
3741
|
-
|
|
3742
|
-
|
|
3743
|
-
throw new Error(`IBKR returned no usable option definitions for ${symbol} ${month} (${String(malformedDefinitionCount)} malformed)`);
|
|
3773
|
+
finally {
|
|
3774
|
+
callerSignal?.removeEventListener("abort", abortFromCaller);
|
|
3744
3775
|
}
|
|
3745
|
-
return { contracts: unique, malformedDefinitionCount };
|
|
3746
3776
|
}
|
|
3747
|
-
async fetchOptionChainSnapshot(contracts, malformedDefinitionCount, telemetry) {
|
|
3777
|
+
async fetchOptionChainSnapshot(contracts, malformedDefinitionCount, telemetry, signal) {
|
|
3748
3778
|
const fields = [
|
|
3749
3779
|
"bid",
|
|
3750
3780
|
"ask",
|
|
@@ -3756,7 +3786,7 @@ export class IbkrClient {
|
|
|
3756
3786
|
"timestamp",
|
|
3757
3787
|
];
|
|
3758
3788
|
const missingFieldCounts = Object.fromEntries(fields.map((field) => [field, 0]));
|
|
3759
|
-
const quotes = await this.fetchNullableOptionQuotes(contracts, telemetry);
|
|
3789
|
+
const quotes = await this.fetchNullableOptionQuotes(contracts, telemetry, signal);
|
|
3760
3790
|
for (const quote of quotes) {
|
|
3761
3791
|
for (const field of fields) {
|
|
3762
3792
|
if (quote[field] === null)
|
|
@@ -3771,7 +3801,7 @@ export class IbkrClient {
|
|
|
3771
3801
|
};
|
|
3772
3802
|
return { quotes, diagnostics };
|
|
3773
3803
|
}
|
|
3774
|
-
async fetchNullableOptionQuotes(contracts, telemetry) {
|
|
3804
|
+
async fetchNullableOptionQuotes(contracts, telemetry, signal) {
|
|
3775
3805
|
const quotes = [];
|
|
3776
3806
|
const batches = chunks(contracts, OPTION_MARKETDATA_BATCH_SIZE);
|
|
3777
3807
|
const snapshotsStarted = this.requestNow();
|
|
@@ -3780,12 +3810,9 @@ export class IbkrClient {
|
|
|
3780
3810
|
conids: batch.map((contract) => contract.conid).join(","),
|
|
3781
3811
|
fields: OPTION_QUOTE_FIELDS,
|
|
3782
3812
|
};
|
|
3783
|
-
await this.req({ path: "iserver/marketdata/snapshot", params });
|
|
3813
|
+
await this.req({ path: "iserver/marketdata/snapshot", params }, signal);
|
|
3784
3814
|
await this.wait(2000);
|
|
3785
|
-
const response = await this.req({
|
|
3786
|
-
path: "iserver/marketdata/snapshot",
|
|
3787
|
-
params,
|
|
3788
|
-
});
|
|
3815
|
+
const response = await this.req({ path: "iserver/marketdata/snapshot", params }, signal);
|
|
3789
3816
|
if (!Array.isArray(response)) {
|
|
3790
3817
|
throw new Error("IBKR returned malformed option market-data snapshots");
|
|
3791
3818
|
}
|
|
@@ -3826,10 +3853,10 @@ export class IbkrClient {
|
|
|
3826
3853
|
return quotes;
|
|
3827
3854
|
}
|
|
3828
3855
|
async fetchOptionQuotes(contracts, options = {}) {
|
|
3829
|
-
const { allowIncomplete = false, telemetry } = options;
|
|
3856
|
+
const { allowIncomplete = false, telemetry, signal } = options;
|
|
3830
3857
|
const result = [];
|
|
3831
3858
|
const skipped = [];
|
|
3832
|
-
for (const quote of await this.fetchNullableOptionQuotes(contracts, telemetry)) {
|
|
3859
|
+
for (const quote of await this.fetchNullableOptionQuotes(contracts, telemetry, signal)) {
|
|
3833
3860
|
if (quote.bid === null || quote.ask === null || quote.delta === null) {
|
|
3834
3861
|
if (allowIncomplete) {
|
|
3835
3862
|
skipped.push(quote.symbol);
|
|
@@ -4516,8 +4543,8 @@ export class IbkrClient {
|
|
|
4516
4543
|
throw this.normalizeHttpError(error);
|
|
4517
4544
|
}
|
|
4518
4545
|
}
|
|
4519
|
-
req(input) {
|
|
4520
|
-
return this.scheduledRequest(input, "SAFE_READ");
|
|
4546
|
+
req(input, signal, onTerminalFailure) {
|
|
4547
|
+
return this.scheduledRequest(input, "SAFE_READ", signal, onTerminalFailure);
|
|
4521
4548
|
}
|
|
4522
4549
|
historyRequest(input) {
|
|
4523
4550
|
return this.scheduledRequest(input, "PRICE_HISTORY");
|
|
@@ -4525,13 +4552,15 @@ export class IbkrClient {
|
|
|
4525
4552
|
singleAttemptRequest(input) {
|
|
4526
4553
|
return this.scheduledRequest(input, "SINGLE_ATTEMPT");
|
|
4527
4554
|
}
|
|
4528
|
-
scheduledRequest(input, retryPolicy) {
|
|
4555
|
+
scheduledRequest(input, retryPolicy, signal, onTerminalFailure) {
|
|
4529
4556
|
return this.requestScheduler.schedule({
|
|
4530
4557
|
endpoint: this.requestEndpoint(input.path),
|
|
4531
4558
|
priority: this.requestPriority(input.path),
|
|
4532
4559
|
secdefInfo: input.path === "iserver/secdef/info",
|
|
4533
4560
|
retryable: retryPolicy !== "SINGLE_ATTEMPT",
|
|
4534
4561
|
retryServerErrors: retryPolicy === "PRICE_HISTORY",
|
|
4562
|
+
...(signal === undefined ? {} : { signal }),
|
|
4563
|
+
...(onTerminalFailure === undefined ? {} : { onTerminalFailure }),
|
|
4535
4564
|
}, async () => {
|
|
4536
4565
|
try {
|
|
4537
4566
|
return await this.sendRequest(input);
|