@huskly/ibkr-client 0.22.0 → 0.24.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 +5 -3
- package/dist/ibkr/ibkrApiTypes.d.ts +16 -3
- package/dist/ibkr/ibkrApiTypes.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.d.ts +28 -0
- package/dist/ibkr/ibkrClient.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.js +202 -30
- package/dist/ibkr/ibkrClient.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -342,9 +342,11 @@ nodes by position. A failed synchronous response retains a readable `text` or `w
|
|
|
342
342
|
`errors` and recovery reasons when IBKR supplies one.
|
|
343
343
|
`recoverDerivativeOrderGraph(...)` reconstructs the exact graph from its root client ID, any
|
|
344
344
|
known member broker ID, and terminal evidence keyed by the durable root client ID. It searches
|
|
345
|
-
normal active and filtered filled, canceled, and inactive order snapshots before
|
|
346
|
-
execution evidence
|
|
347
|
-
|
|
345
|
+
normal active and filtered filled, canceled, and inactive order snapshots before it uses recent
|
|
346
|
+
execution evidence. It queries an exact broker ID even if execution history is unavailable. When the
|
|
347
|
+
caller supplies a durable broker ID, the exact status read can identify only that member without a
|
|
348
|
+
client order ID. The account and broker ID must match, and the complete ticket must match exactly one
|
|
349
|
+
requested node. Conflicting identity or listing evidence still fails closed.
|
|
348
350
|
It requires complete active and filtered terminal snapshot markers, traverses both nested child
|
|
349
351
|
collection aliases, and rejects contradictory aliases within a broker response before correlation.
|
|
350
352
|
It correlates the root by the transmitted client ID and its complete ticket. It correlates each
|
|
@@ -144,6 +144,9 @@ export interface IbkrLiveOrder {
|
|
|
144
144
|
limit_price?: string | number;
|
|
145
145
|
limitPrice?: string | number;
|
|
146
146
|
stopPrice?: string | number;
|
|
147
|
+
stop_price?: string | number;
|
|
148
|
+
auxPrice?: string | number;
|
|
149
|
+
aux_price?: string | number;
|
|
147
150
|
orderDescription?: string;
|
|
148
151
|
order_description?: string;
|
|
149
152
|
orderDesc?: string;
|
|
@@ -269,12 +272,22 @@ export interface IbkrSecdefContract {
|
|
|
269
272
|
export interface IbkrSecdefResponse {
|
|
270
273
|
secdef?: IbkrSecdefContract[];
|
|
271
274
|
}
|
|
272
|
-
/** `trsrv/secdef`
|
|
273
|
-
export
|
|
275
|
+
/** One contract definition as `trsrv/secdef` describes it. */
|
|
276
|
+
export interface IbkrSecdefContract {
|
|
274
277
|
conid?: number;
|
|
275
278
|
symbol?: string;
|
|
279
|
+
ticker?: string;
|
|
280
|
+
undSym?: string;
|
|
276
281
|
expiry?: string;
|
|
282
|
+
maturityDate?: string;
|
|
277
283
|
putOrCall?: string;
|
|
278
284
|
strike?: string | number;
|
|
279
|
-
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* `trsrv/secdef` answers with a `secdef` array. Older IBKR gateway builds answer with a map keyed
|
|
288
|
+
* by conid, so both shapes are accepted.
|
|
289
|
+
*/
|
|
290
|
+
export type IbkrSecdefByConidResponse = {
|
|
291
|
+
secdef?: IbkrSecdefContract[];
|
|
292
|
+
} & Record<string, IbkrSecdefContract | IbkrSecdefContract[] | undefined>;
|
|
280
293
|
//# sourceMappingURL=ibkrApiTypes.d.ts.map
|
|
@@ -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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"}
|
|
@@ -47,7 +47,21 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
47
47
|
private isTerminalRecoveryOrder;
|
|
48
48
|
private findRecoveryGraphTerminalCandidates;
|
|
49
49
|
private recoveryGraphOrderIsAttached;
|
|
50
|
+
private orderHasRecoveryAttachmentEvidence;
|
|
50
51
|
private recoveryGraphOrderMayBeAttached;
|
|
52
|
+
/**
|
|
53
|
+
* IBKR echoes an attached child's `parentId` as the parent's own broker-assigned order ID, not
|
|
54
|
+
* as the client order ID the graph was submitted with, and it echoes it as a number. Both are
|
|
55
|
+
* evidence of the same attachment, so this rewrites such an echo back to the parent member's
|
|
56
|
+
* client order ID before any identity comparison, using only orders observed in the same
|
|
57
|
+
* snapshot.
|
|
58
|
+
*
|
|
59
|
+
* Nothing is inferred: a broker order ID is translated only when exactly one observed order of
|
|
60
|
+
* this graph carries it, and every other alias is left untouched, so an unexplained parent still
|
|
61
|
+
* fails closed.
|
|
62
|
+
*/
|
|
63
|
+
private resolveGraphParentAliases;
|
|
64
|
+
private resolveFlattenedGraphParentAliases;
|
|
51
65
|
private recoveryGraphAttachmentKey;
|
|
52
66
|
private terminalOrderTicketConflicts;
|
|
53
67
|
private terminalOrderTicketIsValid;
|
|
@@ -89,12 +103,26 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
89
103
|
private validateComboPreview;
|
|
90
104
|
private validateOrderGraph;
|
|
91
105
|
private validateGraphSingleNode;
|
|
106
|
+
/**
|
|
107
|
+
* IBKR's order snapshot reports a DAY order's time in force as `CLOSE` ("good until the close"),
|
|
108
|
+
* while the order it was submitted with, and `iserver/account/order/status`, both say `DAY`.
|
|
109
|
+
* They are the same instruction, so recovery must not read the two spellings as different
|
|
110
|
+
* orders. Every other value is passed through unchanged and still has to match exactly.
|
|
111
|
+
*/
|
|
112
|
+
private canonicalTimeInForce;
|
|
113
|
+
/**
|
|
114
|
+
* A stop price reaches this client under four spellings. IBKR sends `stop_price` and `auxPrice`
|
|
115
|
+
* on the order snapshot, `stopPrice` on some payloads, and an empty `price` string for the same
|
|
116
|
+
* order - an empty string means "not applicable here", never zero.
|
|
117
|
+
*/
|
|
118
|
+
private observedStopPrice;
|
|
92
119
|
private graphClientOrderId;
|
|
93
120
|
private graphClientOrderIds;
|
|
94
121
|
private graphParentClientOrderId;
|
|
95
122
|
private graphOrderTicket;
|
|
96
123
|
private liveOrderMatchesGraphNode;
|
|
97
124
|
private recoveryOrderMatchesGraphNode;
|
|
125
|
+
private exactStatusTicketMatchesGraphNode;
|
|
98
126
|
private terminalOrderMatchesGraphNode;
|
|
99
127
|
private validateSingleOrder;
|
|
100
128
|
private validateSingleOrderFields;
|
|
@@ -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
|
@@ -395,7 +395,7 @@ export class IbkrClient {
|
|
|
395
395
|
path: "iserver/account/orders",
|
|
396
396
|
params: { accountId: input.accountId },
|
|
397
397
|
});
|
|
398
|
-
const flattenedActiveSnapshot = this.flattenCompleteOrderSnapshot(response);
|
|
398
|
+
const flattenedActiveSnapshot = this.resolveFlattenedGraphParentAliases(request, this.flattenCompleteOrderSnapshot(response));
|
|
399
399
|
const activeSnapshotIncomplete = flattenedActiveSnapshot === null;
|
|
400
400
|
const invalidActiveAccountEvidence = flattenedActiveSnapshot?.some(({ order }) => !this.orderHasExactAccount(order, input.accountId)) ?? false;
|
|
401
401
|
const invalidNestedActiveEvidence = flattenedActiveSnapshot?.some(({ order, nestedParent }) => nestedParent !== null &&
|
|
@@ -405,9 +405,11 @@ export class IbkrClient {
|
|
|
405
405
|
.map(({ order }) => order)
|
|
406
406
|
.filter((order) => this.orderHasExactAccount(order, input.accountId));
|
|
407
407
|
const activeMatchesByMember = new Map();
|
|
408
|
+
const knownActiveOrders = accountOrders.filter((order) => input.orderId !== undefined && this.recoveryOrderId(order) === input.orderId);
|
|
409
|
+
const conflictingKnownActiveOrders = knownActiveOrders.filter((order) => !this.recoveryGraphOrderMayBeAttached(request, order));
|
|
408
410
|
const observedCandidates = activeSnapshotIncomplete || invalidActiveAccountEvidence || invalidNestedActiveEvidence
|
|
409
411
|
? [response]
|
|
410
|
-
: [];
|
|
412
|
+
: [...conflictingKnownActiveOrders];
|
|
411
413
|
observedCandidates.push(...accountOrders.filter((order) => this.recoveryGraphOrderMayBeAttached(request, order)));
|
|
412
414
|
for (const node of request.nodes) {
|
|
413
415
|
const matches = accountOrders.filter((order) => this.terminalOrderTicketIsValid(order) &&
|
|
@@ -432,6 +434,8 @@ export class IbkrClient {
|
|
|
432
434
|
}
|
|
433
435
|
const unresolved = request.nodes.filter((node) => !selected.has(node.memberId));
|
|
434
436
|
const terminalEvidence = await this.findRecoveryGraphTerminalCandidates(input.accountId, request, input.orderId);
|
|
437
|
+
const conflictingKnownActiveTickets = knownActiveOrders.filter((activeOrder) => terminalEvidence.linkedOrders.some((terminalOrder) => this.recoveryOrderId(terminalOrder) === input.orderId &&
|
|
438
|
+
this.terminalOrderTicketConflicts(activeOrder, terminalOrder)));
|
|
435
439
|
this.reconcileSelectedGraphMembers(request, selected, terminalEvidence);
|
|
436
440
|
if (unresolved.length > 0) {
|
|
437
441
|
const assignments = this.assignRecoveryGraphCandidates(unresolved, terminalEvidence.byNode, usedOrderIds);
|
|
@@ -495,6 +499,8 @@ export class IbkrClient {
|
|
|
495
499
|
activeSnapshotIncomplete ||
|
|
496
500
|
invalidActiveAccountEvidence ||
|
|
497
501
|
invalidNestedActiveEvidence ||
|
|
502
|
+
conflictingKnownActiveOrders.length > 0 ||
|
|
503
|
+
conflictingKnownActiveTickets.length > 0 ||
|
|
498
504
|
terminalEvidence.invalidAttachedEvidence ||
|
|
499
505
|
terminalEvidence.terminalSnapshotLookupFailed ||
|
|
500
506
|
members.some(({ status }) => status === "UNKNOWN" || status === "WARNING_PENDING")) {
|
|
@@ -562,13 +568,14 @@ export class IbkrClient {
|
|
|
562
568
|
if (knownOrderId !== undefined)
|
|
563
569
|
candidateOrderIds.add(knownOrderId);
|
|
564
570
|
const terminalOrdersById = new Map();
|
|
571
|
+
const exactStatusAttachmentOrderIds = new Set();
|
|
565
572
|
for (const filter of RECOVERY_TERMINAL_ORDER_FILTERS) {
|
|
566
573
|
try {
|
|
567
574
|
const response = await this.req({
|
|
568
575
|
path: "iserver/account/orders",
|
|
569
576
|
params: { accountId, filters: filter },
|
|
570
577
|
});
|
|
571
|
-
const flattenedSnapshot = this.flattenCompleteOrderSnapshot(response);
|
|
578
|
+
const flattenedSnapshot = this.resolveFlattenedGraphParentAliases(request, this.flattenCompleteOrderSnapshot(response));
|
|
572
579
|
if (flattenedSnapshot === null) {
|
|
573
580
|
terminalSnapshotLookupFailed = true;
|
|
574
581
|
observedResponses.push({ source: "terminal_order_snapshot", filter, response });
|
|
@@ -576,6 +583,11 @@ export class IbkrClient {
|
|
|
576
583
|
}
|
|
577
584
|
for (const { order, nestedParent } of flattenedSnapshot) {
|
|
578
585
|
if (!this.recoveryGraphOrderMayBeAttached(request, order)) {
|
|
586
|
+
if (knownOrderId !== undefined && this.recoveryOrderId(order) === knownOrderId) {
|
|
587
|
+
observedResponses.push(order);
|
|
588
|
+
invalidAttachedEvidence = true;
|
|
589
|
+
continue;
|
|
590
|
+
}
|
|
579
591
|
if (nestedParent === null ||
|
|
580
592
|
!this.recoveryGraphOrderIsAttached(request, nestedParent)) {
|
|
581
593
|
continue;
|
|
@@ -690,12 +702,17 @@ export class IbkrClient {
|
|
|
690
702
|
invalidAttachedEvidence = true;
|
|
691
703
|
continue;
|
|
692
704
|
}
|
|
693
|
-
|
|
705
|
+
// Prefer graph attachment from a snapshot when it exists. IBKR's exact status response can
|
|
706
|
+
// omit every client-order identity field. The caller's durable broker ID can establish that
|
|
707
|
+
// one member's attachment when the status response contains no conflicting attachment
|
|
708
|
+
// evidence and its complete ticket identifies exactly one requested node below.
|
|
709
|
+
const resolvedOrder = terminalOrder === undefined ? order : { ...terminalOrder, ...order };
|
|
710
|
+
if (!this.orderHasValidRecoveryStatus(resolvedOrder)) {
|
|
694
711
|
invalidAttachedEvidence = true;
|
|
695
712
|
terminalOrdersById.delete(orderId);
|
|
696
713
|
continue;
|
|
697
714
|
}
|
|
698
|
-
if (!this.terminalOrderTicketIsValid(
|
|
715
|
+
if (!this.terminalOrderTicketIsValid(resolvedOrder)) {
|
|
699
716
|
invalidAttachedEvidence = true;
|
|
700
717
|
terminalOrdersById.delete(orderId);
|
|
701
718
|
continue;
|
|
@@ -708,17 +725,22 @@ export class IbkrClient {
|
|
|
708
725
|
}
|
|
709
726
|
if (terminalOrder !== undefined &&
|
|
710
727
|
this.recoveryGraphAttachmentKey(request, terminalOrder) !==
|
|
711
|
-
this.recoveryGraphAttachmentKey(request,
|
|
728
|
+
this.recoveryGraphAttachmentKey(request, resolvedOrder)) {
|
|
712
729
|
invalidAttachedEvidence = true;
|
|
713
730
|
terminalOrdersById.delete(orderId);
|
|
714
731
|
continue;
|
|
715
732
|
}
|
|
716
|
-
if (!this.recoveryGraphOrderIsAttached(request,
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
733
|
+
if (!this.recoveryGraphOrderIsAttached(request, resolvedOrder)) {
|
|
734
|
+
const callerNamedStatusWithoutAttachment = orderId === knownOrderId &&
|
|
735
|
+
terminalOrder === undefined &&
|
|
736
|
+
!this.orderHasRecoveryAttachmentEvidence(order);
|
|
737
|
+
if (!callerNamedStatusWithoutAttachment) {
|
|
738
|
+
invalidAttachedEvidence = true;
|
|
739
|
+
terminalOrdersById.delete(orderId);
|
|
740
|
+
continue;
|
|
741
|
+
}
|
|
742
|
+
exactStatusAttachmentOrderIds.add(orderId);
|
|
720
743
|
}
|
|
721
|
-
const resolvedOrder = terminalOrder === undefined ? order : { ...terminalOrder, ...order };
|
|
722
744
|
terminalOrdersById.set(orderId, resolvedOrder);
|
|
723
745
|
if (terminalOrder === undefined)
|
|
724
746
|
linkedOrders.push(resolvedOrder);
|
|
@@ -745,6 +767,18 @@ export class IbkrClient {
|
|
|
745
767
|
invalidAttachedEvidence = true;
|
|
746
768
|
continue;
|
|
747
769
|
}
|
|
770
|
+
if (exactStatusAttachmentOrderIds.has(orderId)) {
|
|
771
|
+
const matchingNodes = request.nodes.filter((node) => this.exactStatusTicketMatchesGraphNode(request, node, resolvedOrder));
|
|
772
|
+
const [matchingNode] = matchingNodes;
|
|
773
|
+
if (matchingNodes.length !== 1 || matchingNode === undefined) {
|
|
774
|
+
invalidAttachedEvidence = true;
|
|
775
|
+
continue;
|
|
776
|
+
}
|
|
777
|
+
const existing = byNode.get(matchingNode.memberId);
|
|
778
|
+
if (existing !== undefined)
|
|
779
|
+
existing.push(resolvedOrder);
|
|
780
|
+
continue;
|
|
781
|
+
}
|
|
748
782
|
for (const node of request.nodes) {
|
|
749
783
|
if (this.terminalOrderMatchesGraphNode(request, node, resolvedOrder)) {
|
|
750
784
|
const existing = byNode.get(node.memberId);
|
|
@@ -764,6 +798,16 @@ export class IbkrClient {
|
|
|
764
798
|
recoveryGraphOrderIsAttached(request, order) {
|
|
765
799
|
return this.recoveryGraphAttachmentKey(request, order) !== null;
|
|
766
800
|
}
|
|
801
|
+
orderHasRecoveryAttachmentEvidence(order) {
|
|
802
|
+
return [
|
|
803
|
+
order.cOID,
|
|
804
|
+
order.order_ref,
|
|
805
|
+
order.parentId,
|
|
806
|
+
order.parent_id,
|
|
807
|
+
order.parentClientOrderId,
|
|
808
|
+
order.parent_order_ref,
|
|
809
|
+
].some((value) => value !== undefined);
|
|
810
|
+
}
|
|
767
811
|
recoveryGraphOrderMayBeAttached(request, order) {
|
|
768
812
|
const graphClientOrderIds = this.graphClientOrderIds(request);
|
|
769
813
|
return [
|
|
@@ -776,6 +820,71 @@ export class IbkrClient {
|
|
|
776
820
|
].some((value) => (typeof value === "string" || typeof value === "number") &&
|
|
777
821
|
graphClientOrderIds.has(String(value).trim()));
|
|
778
822
|
}
|
|
823
|
+
/**
|
|
824
|
+
* IBKR echoes an attached child's `parentId` as the parent's own broker-assigned order ID, not
|
|
825
|
+
* as the client order ID the graph was submitted with, and it echoes it as a number. Both are
|
|
826
|
+
* evidence of the same attachment, so this rewrites such an echo back to the parent member's
|
|
827
|
+
* client order ID before any identity comparison, using only orders observed in the same
|
|
828
|
+
* snapshot.
|
|
829
|
+
*
|
|
830
|
+
* Nothing is inferred: a broker order ID is translated only when exactly one observed order of
|
|
831
|
+
* this graph carries it, and every other alias is left untouched, so an unexplained parent still
|
|
832
|
+
* fails closed.
|
|
833
|
+
*/
|
|
834
|
+
resolveGraphParentAliases(request, orders) {
|
|
835
|
+
const graphClientOrderIds = this.graphClientOrderIds(request);
|
|
836
|
+
const memberClientOrderIdByOrderId = new Map();
|
|
837
|
+
for (const order of orders) {
|
|
838
|
+
const identity = this.consistentStringAliases(order.cOID, order.order_ref);
|
|
839
|
+
if (!identity.valid || identity.value === undefined)
|
|
840
|
+
continue;
|
|
841
|
+
if (!graphClientOrderIds.has(identity.value))
|
|
842
|
+
continue;
|
|
843
|
+
const orderId = this.recoveryOrderId(order);
|
|
844
|
+
if (orderId === undefined)
|
|
845
|
+
continue;
|
|
846
|
+
const existing = memberClientOrderIdByOrderId.get(orderId);
|
|
847
|
+
memberClientOrderIdByOrderId.set(orderId, existing === undefined || existing === identity.value ? identity.value : null);
|
|
848
|
+
}
|
|
849
|
+
if (memberClientOrderIdByOrderId.size === 0)
|
|
850
|
+
return [...orders];
|
|
851
|
+
const translate = (value) => {
|
|
852
|
+
if (typeof value !== "string" && typeof value !== "number")
|
|
853
|
+
return value;
|
|
854
|
+
return memberClientOrderIdByOrderId.get(String(value).trim()) ?? value;
|
|
855
|
+
};
|
|
856
|
+
return orders.map((order) => {
|
|
857
|
+
const aliases = [
|
|
858
|
+
order.parentId,
|
|
859
|
+
order.parent_id,
|
|
860
|
+
order.parentClientOrderId,
|
|
861
|
+
order.parent_order_ref,
|
|
862
|
+
];
|
|
863
|
+
if (aliases.every((alias) => alias === undefined))
|
|
864
|
+
return order;
|
|
865
|
+
const resolved = { ...order };
|
|
866
|
+
if (order.parentId !== undefined)
|
|
867
|
+
resolved.parentId = translate(order.parentId);
|
|
868
|
+
if (order.parent_id !== undefined)
|
|
869
|
+
resolved.parent_id = translate(order.parent_id);
|
|
870
|
+
if (order.parentClientOrderId !== undefined) {
|
|
871
|
+
resolved.parentClientOrderId = translate(order.parentClientOrderId);
|
|
872
|
+
}
|
|
873
|
+
if (order.parent_order_ref !== undefined) {
|
|
874
|
+
resolved.parent_order_ref = translate(order.parent_order_ref);
|
|
875
|
+
}
|
|
876
|
+
return resolved;
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
resolveFlattenedGraphParentAliases(request, flattened) {
|
|
880
|
+
if (flattened === null)
|
|
881
|
+
return null;
|
|
882
|
+
const resolved = this.resolveGraphParentAliases(request, flattened.map(({ order }) => order));
|
|
883
|
+
return flattened.map((entry, index) => ({
|
|
884
|
+
order: resolved[index] ?? entry.order,
|
|
885
|
+
nestedParent: entry.nestedParent,
|
|
886
|
+
}));
|
|
887
|
+
}
|
|
779
888
|
recoveryGraphAttachmentKey(request, order) {
|
|
780
889
|
const parentIdentity = this.consistentStringAliases(order.parentId, order.parent_id, order.parentClientOrderId, order.parent_order_ref);
|
|
781
890
|
const clientIdentity = this.consistentStringAliases(order.cOID, order.order_ref);
|
|
@@ -803,7 +912,10 @@ export class IbkrClient {
|
|
|
803
912
|
const ticket = {};
|
|
804
913
|
const malformed = "__MALFORMED_TERMINAL_TICKET_FIELD__";
|
|
805
914
|
const addAliases = (field, values, normalize) => {
|
|
806
|
-
|
|
915
|
+
// An empty string is IBKR's "this field does not apply to this order", not a value that
|
|
916
|
+
// conflicts with its own aliases: a stop order carries `price: ""` next to a real
|
|
917
|
+
// `stop_price`. Treating it as provided marked every such ticket malformed.
|
|
918
|
+
const provided = values.filter((value) => value !== undefined && !(typeof value === "string" && value.trim() === ""));
|
|
807
919
|
if (provided.length === 0)
|
|
808
920
|
return;
|
|
809
921
|
const normalized = provided.map(normalize);
|
|
@@ -830,9 +942,20 @@ export class IbkrClient {
|
|
|
830
942
|
}
|
|
831
943
|
addAliases("orderType", [order.order_type, order.orderType], (value) => typeof value === "string" ? this.normalizeOrderType(value) : undefined);
|
|
832
944
|
addAliases("side", [order.side], (value) => typeof value === "string" ? this.normalizeOrderSide(value) : undefined);
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
945
|
+
// `size` is IBKR's remaining size, not an alias of the ticket quantity: a filled order reports
|
|
946
|
+
// `size: "0.0"` next to `total_size: "1.0"`. Comparing the two marked every filled ticket
|
|
947
|
+
// malformed, which is exactly the evidence recovery needs most.
|
|
948
|
+
addAliases("quantity", [order.total_size, order.totalSize], normalizeNumber);
|
|
949
|
+
addAliases("price", [
|
|
950
|
+
order.limitPrice,
|
|
951
|
+
order.limit_price,
|
|
952
|
+
order.stopPrice,
|
|
953
|
+
order.stop_price,
|
|
954
|
+
order.auxPrice,
|
|
955
|
+
order.aux_price,
|
|
956
|
+
order.price,
|
|
957
|
+
], normalizeNumber);
|
|
958
|
+
addAliases("tif", [order.tif, order.timeInForce], (value) => this.canonicalTimeInForce(value));
|
|
836
959
|
addAliases("outsideRTH", [order.outsideRTH, order.outside_rth], (value) => typeof value === "boolean" ? value : undefined);
|
|
837
960
|
return ticket;
|
|
838
961
|
}
|
|
@@ -1384,6 +1507,28 @@ export class IbkrClient {
|
|
|
1384
1507
|
throw new Error("STOP order requires a positive stop price");
|
|
1385
1508
|
this.cmeOperatorMetadata(node.contract.assetClass, node);
|
|
1386
1509
|
}
|
|
1510
|
+
/**
|
|
1511
|
+
* IBKR's order snapshot reports a DAY order's time in force as `CLOSE` ("good until the close"),
|
|
1512
|
+
* while the order it was submitted with, and `iserver/account/order/status`, both say `DAY`.
|
|
1513
|
+
* They are the same instruction, so recovery must not read the two spellings as different
|
|
1514
|
+
* orders. Every other value is passed through unchanged and still has to match exactly.
|
|
1515
|
+
*/
|
|
1516
|
+
canonicalTimeInForce(value) {
|
|
1517
|
+
if (typeof value !== "string")
|
|
1518
|
+
return undefined;
|
|
1519
|
+
const upper = value.trim().toUpperCase();
|
|
1520
|
+
if (upper === "")
|
|
1521
|
+
return undefined;
|
|
1522
|
+
return upper === "CLOSE" ? "DAY" : upper;
|
|
1523
|
+
}
|
|
1524
|
+
/**
|
|
1525
|
+
* A stop price reaches this client under four spellings. IBKR sends `stop_price` and `auxPrice`
|
|
1526
|
+
* on the order snapshot, `stopPrice` on some payloads, and an empty `price` string for the same
|
|
1527
|
+
* order - an empty string means "not applicable here", never zero.
|
|
1528
|
+
*/
|
|
1529
|
+
observedStopPrice(order) {
|
|
1530
|
+
return this.firstNumber(order.stopPrice, order.stop_price, order.auxPrice, order.aux_price);
|
|
1531
|
+
}
|
|
1387
1532
|
graphClientOrderId(request, node) {
|
|
1388
1533
|
return node.parentMemberId === undefined
|
|
1389
1534
|
? request.rootClientOrderId
|
|
@@ -1456,11 +1601,11 @@ export class IbkrClient {
|
|
|
1456
1601
|
const quantity = this.firstPositiveNumber(order.total_size, order.totalSize, order.size);
|
|
1457
1602
|
const price = node.orderType === "LMT"
|
|
1458
1603
|
? this.firstNumber(order.limitPrice, order.limit_price, order.price)
|
|
1459
|
-
: this.
|
|
1604
|
+
: this.observedStopPrice(order);
|
|
1460
1605
|
const amount = node.orderType === "LMT" ? node.limit : node.stopPrice;
|
|
1461
1606
|
const expectedPrice = node.priceEffect === "CREDIT" ? -amount : amount;
|
|
1462
1607
|
const outsideRth = order.outsideRTH ?? order.outside_rth;
|
|
1463
|
-
const tif = order.tif ?? order.timeInForce;
|
|
1608
|
+
const tif = this.canonicalTimeInForce(order.tif ?? order.timeInForce);
|
|
1464
1609
|
return (liveLegs.length === node.legs.length &&
|
|
1465
1610
|
node.legs.every((leg, index) => {
|
|
1466
1611
|
const liveLeg = liveLegs[index];
|
|
@@ -1470,7 +1615,7 @@ export class IbkrClient {
|
|
|
1470
1615
|
side === "BUY" &&
|
|
1471
1616
|
quantity === node.quantity &&
|
|
1472
1617
|
price === expectedPrice &&
|
|
1473
|
-
(tif === undefined || tif
|
|
1618
|
+
(tif === undefined || tif === node.tif) &&
|
|
1474
1619
|
(outsideRth === undefined || outsideRth === (node.session === "OVERNIGHT")));
|
|
1475
1620
|
}
|
|
1476
1621
|
const orderType = this.normalizeOrderType(order.order_type ?? order.orderType);
|
|
@@ -1480,17 +1625,17 @@ export class IbkrClient {
|
|
|
1480
1625
|
const price = node.orderType === "LMT"
|
|
1481
1626
|
? this.firstNumber(order.limitPrice, order.limit_price, order.price)
|
|
1482
1627
|
: node.orderType === "STP"
|
|
1483
|
-
? this.
|
|
1628
|
+
? this.observedStopPrice(order)
|
|
1484
1629
|
: undefined;
|
|
1485
1630
|
const expectedPrice = node.orderType === "LMT" ? node.limit : node.orderType === "STP" ? node.stopPrice : undefined;
|
|
1486
1631
|
const outsideRth = order.outsideRTH ?? order.outside_rth;
|
|
1487
|
-
const tif = order.tif ?? order.timeInForce;
|
|
1632
|
+
const tif = this.canonicalTimeInForce(order.tif ?? order.timeInForce);
|
|
1488
1633
|
return (order.conid === node.contract.conid &&
|
|
1489
1634
|
orderType === expectedOrderType &&
|
|
1490
1635
|
side === node.side &&
|
|
1491
1636
|
quantity === node.quantity &&
|
|
1492
1637
|
price === expectedPrice &&
|
|
1493
|
-
(tif === undefined || tif
|
|
1638
|
+
(tif === undefined || tif === node.tif) &&
|
|
1494
1639
|
(outsideRth === undefined || outsideRth === (node.session === "OVERNIGHT")));
|
|
1495
1640
|
}
|
|
1496
1641
|
recoveryOrderMatchesGraphNode(request, node, order) {
|
|
@@ -1501,14 +1646,24 @@ export class IbkrClient {
|
|
|
1501
1646
|
return false;
|
|
1502
1647
|
}
|
|
1503
1648
|
}
|
|
1649
|
+
exactStatusTicketMatchesGraphNode(request, node, order) {
|
|
1650
|
+
if (this.orderHasRecoveryAttachmentEvidence(order))
|
|
1651
|
+
return false;
|
|
1652
|
+
const parentClientOrderId = this.graphParentClientOrderId(request, node);
|
|
1653
|
+
const orderWithExpectedAttachment = parentClientOrderId === undefined
|
|
1654
|
+
? { ...order, cOID: this.graphClientOrderId(request, node) }
|
|
1655
|
+
: { ...order, parentId: parentClientOrderId };
|
|
1656
|
+
return this.terminalOrderMatchesGraphNode(request, node, orderWithExpectedAttachment);
|
|
1657
|
+
}
|
|
1504
1658
|
terminalOrderMatchesGraphNode(request, node, order) {
|
|
1505
1659
|
try {
|
|
1506
1660
|
const tif = order.tif ?? order.timeInForce;
|
|
1507
|
-
const outsideRth = order.outsideRTH ?? order.outside_rth;
|
|
1508
1661
|
const status = order.order_status ?? order.orderStatus ?? order.status;
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1662
|
+
// IBKR never reports `outsideRTH` on the order snapshot, so requiring it here made terminal
|
|
1663
|
+
// evidence unusable for every real order. Identity still rests on the client order ID, the
|
|
1664
|
+
// conidex, the order type, the side, the quantity, the price, and the time in force, all of
|
|
1665
|
+
// which `recoveryOrderMatchesGraphNode` compares exactly below.
|
|
1666
|
+
if (typeof tif !== "string" || typeof status !== "string") {
|
|
1512
1667
|
return false;
|
|
1513
1668
|
}
|
|
1514
1669
|
return this.recoveryOrderMatchesGraphNode(request, node, order);
|
|
@@ -2012,7 +2167,15 @@ export class IbkrClient {
|
|
|
2012
2167
|
normalizeDerivativeOrderLifecycle(accountId, orderId, order) {
|
|
2013
2168
|
const quantity = this.firstPositiveNumber(order.total_size, order.totalSize, order.size);
|
|
2014
2169
|
const filledQuantity = this.firstNumber(order.cum_fill, order.cumFill, order.filledQuantity, order.filled);
|
|
2015
|
-
|
|
2170
|
+
// `iserver/account/order/status/{orderId}` never carries a remaining-quantity field: it
|
|
2171
|
+
// reports only `total_size` and `cum_fill`. Derive the remainder from those two authoritative
|
|
2172
|
+
// values, exactly as `normalizeActiveDerivativeOrder` already does for the order snapshot.
|
|
2173
|
+
// Nothing is invented here - if either input is missing, this stays `undefined` and the
|
|
2174
|
+
// lifecycle read still fails closed below.
|
|
2175
|
+
const remainingQuantity = this.firstNumber(order.remainingQuantity, order.remaining_size, order.remaining) ??
|
|
2176
|
+
(quantity !== undefined && filledQuantity !== undefined && filledQuantity >= 0
|
|
2177
|
+
? Math.max(0, quantity - filledQuantity)
|
|
2178
|
+
: undefined);
|
|
2016
2179
|
if (quantity === undefined ||
|
|
2017
2180
|
filledQuantity === undefined ||
|
|
2018
2181
|
filledQuantity < 0 ||
|
|
@@ -2131,7 +2294,7 @@ export class IbkrClient {
|
|
|
2131
2294
|
: "UNKNOWN",
|
|
2132
2295
|
orderType: this.normalizeOrderType(order.order_type ?? order.orderType) ?? null,
|
|
2133
2296
|
limitPrice: this.firstNumber(order.limitPrice, order.limit_price, order.price) ?? null,
|
|
2134
|
-
stopPrice: this.firstNumber(order.stopPrice) ?? null,
|
|
2297
|
+
stopPrice: this.firstNumber(order.stopPrice, order.stop_price) ?? null,
|
|
2135
2298
|
enteredAt: orderTime,
|
|
2136
2299
|
updatedAt: order.lastExecutionTime_r !== undefined || order.lastExecutionTime !== undefined
|
|
2137
2300
|
? orderTime
|
|
@@ -2808,13 +2971,22 @@ export class IbkrClient {
|
|
|
2808
2971
|
path: "trsrv/secdef",
|
|
2809
2972
|
params: { conids: String(conid) },
|
|
2810
2973
|
});
|
|
2811
|
-
|
|
2974
|
+
// IBKR answers with `{ secdef: [contract] }`; the keyed-by-conid shape is kept for gateway
|
|
2975
|
+
// builds that still answer that way. An entry that names a different conid is not evidence
|
|
2976
|
+
// about this one, so it is ignored rather than trusted.
|
|
2977
|
+
const keyed = response[String(conid)];
|
|
2978
|
+
const candidates = [
|
|
2979
|
+
...(Array.isArray(response.secdef) ? response.secdef : []),
|
|
2980
|
+
...(Array.isArray(keyed) ? keyed : keyed === undefined ? [] : [keyed]),
|
|
2981
|
+
];
|
|
2982
|
+
const raw = candidates.find((candidate) => candidate.conid === undefined || candidate.conid === conid);
|
|
2812
2983
|
if (!raw)
|
|
2813
2984
|
return null;
|
|
2814
2985
|
return normalizeOptionContract({
|
|
2815
2986
|
conid: raw.conid ?? conid,
|
|
2816
|
-
symbol
|
|
2817
|
-
|
|
2987
|
+
// `symbol` is absent on this payload; IBKR names the underlying `ticker`/`undSym` here.
|
|
2988
|
+
symbol: raw.symbol ?? raw.ticker ?? raw.undSym,
|
|
2989
|
+
maturityDate: raw.expiry ?? raw.maturityDate,
|
|
2818
2990
|
right: raw.putOrCall,
|
|
2819
2991
|
strike: raw.strike,
|
|
2820
2992
|
});
|