@huskly/ibkr-client 0.21.0 → 0.23.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/dist/ibkr/ibkrApiTypes.d.ts +16 -3
- package/dist/ibkr/ibkrApiTypes.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.d.ts +26 -0
- package/dist/ibkr/ibkrClient.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.js +167 -31
- package/dist/ibkr/ibkrClient.js.map +1 -1
- package/dist/types.d.ts +16 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAEhF,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC,CAAC;AAEhF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,2BAA2B,GACrC,yBAAyB,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;AAEnF,MAAM,WAAW,6BAA6B;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACvC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,6CAA6C;AAC7C,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACnC;AAED,iGAAiG;AACjG,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvE;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,
|
|
1
|
+
{"version":3,"file":"ibkrApiTypes.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrApiTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,19 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
48
48
|
private findRecoveryGraphTerminalCandidates;
|
|
49
49
|
private recoveryGraphOrderIsAttached;
|
|
50
50
|
private recoveryGraphOrderMayBeAttached;
|
|
51
|
+
/**
|
|
52
|
+
* IBKR echoes an attached child's `parentId` as the parent's own broker-assigned order ID, not
|
|
53
|
+
* as the client order ID the graph was submitted with, and it echoes it as a number. Both are
|
|
54
|
+
* evidence of the same attachment, so this rewrites such an echo back to the parent member's
|
|
55
|
+
* client order ID before any identity comparison, using only orders observed in the same
|
|
56
|
+
* snapshot.
|
|
57
|
+
*
|
|
58
|
+
* Nothing is inferred: a broker order ID is translated only when exactly one observed order of
|
|
59
|
+
* this graph carries it, and every other alias is left untouched, so an unexplained parent still
|
|
60
|
+
* fails closed.
|
|
61
|
+
*/
|
|
62
|
+
private resolveGraphParentAliases;
|
|
63
|
+
private resolveFlattenedGraphParentAliases;
|
|
51
64
|
private recoveryGraphAttachmentKey;
|
|
52
65
|
private terminalOrderTicketConflicts;
|
|
53
66
|
private terminalOrderTicketIsValid;
|
|
@@ -89,6 +102,19 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
|
|
|
89
102
|
private validateComboPreview;
|
|
90
103
|
private validateOrderGraph;
|
|
91
104
|
private validateGraphSingleNode;
|
|
105
|
+
/**
|
|
106
|
+
* IBKR's order snapshot reports a DAY order's time in force as `CLOSE` ("good until the close"),
|
|
107
|
+
* while the order it was submitted with, and `iserver/account/order/status`, both say `DAY`.
|
|
108
|
+
* They are the same instruction, so recovery must not read the two spellings as different
|
|
109
|
+
* orders. Every other value is passed through unchanged and still has to match exactly.
|
|
110
|
+
*/
|
|
111
|
+
private canonicalTimeInForce;
|
|
112
|
+
/**
|
|
113
|
+
* A stop price reaches this client under four spellings. IBKR sends `stop_price` and `auxPrice`
|
|
114
|
+
* on the order snapshot, `stopPrice` on some payloads, and an empty `price` string for the same
|
|
115
|
+
* order - an empty string means "not applicable here", never zero.
|
|
116
|
+
*/
|
|
117
|
+
private observedStopPrice;
|
|
92
118
|
private graphClientOrderId;
|
|
93
119
|
private graphClientOrderIds;
|
|
94
120
|
private graphParentClientOrderId;
|
|
@@ -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 &&
|
|
@@ -568,7 +568,7 @@ export class IbkrClient {
|
|
|
568
568
|
path: "iserver/account/orders",
|
|
569
569
|
params: { accountId, filters: filter },
|
|
570
570
|
});
|
|
571
|
-
const flattenedSnapshot = this.flattenCompleteOrderSnapshot(response);
|
|
571
|
+
const flattenedSnapshot = this.resolveFlattenedGraphParentAliases(request, this.flattenCompleteOrderSnapshot(response));
|
|
572
572
|
if (flattenedSnapshot === null) {
|
|
573
573
|
terminalSnapshotLookupFailed = true;
|
|
574
574
|
observedResponses.push({ source: "terminal_order_snapshot", filter, response });
|
|
@@ -690,12 +690,18 @@ export class IbkrClient {
|
|
|
690
690
|
invalidAttachedEvidence = true;
|
|
691
691
|
continue;
|
|
692
692
|
}
|
|
693
|
-
|
|
693
|
+
// `iserver/account/order/status/{orderId}` carries no client order ID at all, so it can
|
|
694
|
+
// never prove attachment on its own. Judge the record this account has actually observed:
|
|
695
|
+
// the exact status read merged over the snapshot record that already named this graph.
|
|
696
|
+
// When there is no snapshot record to merge with, the attachment stays unproven and this
|
|
697
|
+
// still fails closed below.
|
|
698
|
+
const resolvedOrder = terminalOrder === undefined ? order : { ...terminalOrder, ...order };
|
|
699
|
+
if (!this.orderHasValidRecoveryStatus(resolvedOrder)) {
|
|
694
700
|
invalidAttachedEvidence = true;
|
|
695
701
|
terminalOrdersById.delete(orderId);
|
|
696
702
|
continue;
|
|
697
703
|
}
|
|
698
|
-
if (!this.terminalOrderTicketIsValid(
|
|
704
|
+
if (!this.terminalOrderTicketIsValid(resolvedOrder)) {
|
|
699
705
|
invalidAttachedEvidence = true;
|
|
700
706
|
terminalOrdersById.delete(orderId);
|
|
701
707
|
continue;
|
|
@@ -708,17 +714,16 @@ export class IbkrClient {
|
|
|
708
714
|
}
|
|
709
715
|
if (terminalOrder !== undefined &&
|
|
710
716
|
this.recoveryGraphAttachmentKey(request, terminalOrder) !==
|
|
711
|
-
this.recoveryGraphAttachmentKey(request,
|
|
717
|
+
this.recoveryGraphAttachmentKey(request, resolvedOrder)) {
|
|
712
718
|
invalidAttachedEvidence = true;
|
|
713
719
|
terminalOrdersById.delete(orderId);
|
|
714
720
|
continue;
|
|
715
721
|
}
|
|
716
|
-
if (!this.recoveryGraphOrderIsAttached(request,
|
|
722
|
+
if (!this.recoveryGraphOrderIsAttached(request, resolvedOrder)) {
|
|
717
723
|
invalidAttachedEvidence = true;
|
|
718
724
|
terminalOrdersById.delete(orderId);
|
|
719
725
|
continue;
|
|
720
726
|
}
|
|
721
|
-
const resolvedOrder = terminalOrder === undefined ? order : { ...terminalOrder, ...order };
|
|
722
727
|
terminalOrdersById.set(orderId, resolvedOrder);
|
|
723
728
|
if (terminalOrder === undefined)
|
|
724
729
|
linkedOrders.push(resolvedOrder);
|
|
@@ -776,6 +781,71 @@ export class IbkrClient {
|
|
|
776
781
|
].some((value) => (typeof value === "string" || typeof value === "number") &&
|
|
777
782
|
graphClientOrderIds.has(String(value).trim()));
|
|
778
783
|
}
|
|
784
|
+
/**
|
|
785
|
+
* IBKR echoes an attached child's `parentId` as the parent's own broker-assigned order ID, not
|
|
786
|
+
* as the client order ID the graph was submitted with, and it echoes it as a number. Both are
|
|
787
|
+
* evidence of the same attachment, so this rewrites such an echo back to the parent member's
|
|
788
|
+
* client order ID before any identity comparison, using only orders observed in the same
|
|
789
|
+
* snapshot.
|
|
790
|
+
*
|
|
791
|
+
* Nothing is inferred: a broker order ID is translated only when exactly one observed order of
|
|
792
|
+
* this graph carries it, and every other alias is left untouched, so an unexplained parent still
|
|
793
|
+
* fails closed.
|
|
794
|
+
*/
|
|
795
|
+
resolveGraphParentAliases(request, orders) {
|
|
796
|
+
const graphClientOrderIds = this.graphClientOrderIds(request);
|
|
797
|
+
const memberClientOrderIdByOrderId = new Map();
|
|
798
|
+
for (const order of orders) {
|
|
799
|
+
const identity = this.consistentStringAliases(order.cOID, order.order_ref);
|
|
800
|
+
if (!identity.valid || identity.value === undefined)
|
|
801
|
+
continue;
|
|
802
|
+
if (!graphClientOrderIds.has(identity.value))
|
|
803
|
+
continue;
|
|
804
|
+
const orderId = this.recoveryOrderId(order);
|
|
805
|
+
if (orderId === undefined)
|
|
806
|
+
continue;
|
|
807
|
+
const existing = memberClientOrderIdByOrderId.get(orderId);
|
|
808
|
+
memberClientOrderIdByOrderId.set(orderId, existing === undefined || existing === identity.value ? identity.value : null);
|
|
809
|
+
}
|
|
810
|
+
if (memberClientOrderIdByOrderId.size === 0)
|
|
811
|
+
return [...orders];
|
|
812
|
+
const translate = (value) => {
|
|
813
|
+
if (typeof value !== "string" && typeof value !== "number")
|
|
814
|
+
return value;
|
|
815
|
+
return memberClientOrderIdByOrderId.get(String(value).trim()) ?? value;
|
|
816
|
+
};
|
|
817
|
+
return orders.map((order) => {
|
|
818
|
+
const aliases = [
|
|
819
|
+
order.parentId,
|
|
820
|
+
order.parent_id,
|
|
821
|
+
order.parentClientOrderId,
|
|
822
|
+
order.parent_order_ref,
|
|
823
|
+
];
|
|
824
|
+
if (aliases.every((alias) => alias === undefined))
|
|
825
|
+
return order;
|
|
826
|
+
const resolved = { ...order };
|
|
827
|
+
if (order.parentId !== undefined)
|
|
828
|
+
resolved.parentId = translate(order.parentId);
|
|
829
|
+
if (order.parent_id !== undefined)
|
|
830
|
+
resolved.parent_id = translate(order.parent_id);
|
|
831
|
+
if (order.parentClientOrderId !== undefined) {
|
|
832
|
+
resolved.parentClientOrderId = translate(order.parentClientOrderId);
|
|
833
|
+
}
|
|
834
|
+
if (order.parent_order_ref !== undefined) {
|
|
835
|
+
resolved.parent_order_ref = translate(order.parent_order_ref);
|
|
836
|
+
}
|
|
837
|
+
return resolved;
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
resolveFlattenedGraphParentAliases(request, flattened) {
|
|
841
|
+
if (flattened === null)
|
|
842
|
+
return null;
|
|
843
|
+
const resolved = this.resolveGraphParentAliases(request, flattened.map(({ order }) => order));
|
|
844
|
+
return flattened.map((entry, index) => ({
|
|
845
|
+
order: resolved[index] ?? entry.order,
|
|
846
|
+
nestedParent: entry.nestedParent,
|
|
847
|
+
}));
|
|
848
|
+
}
|
|
779
849
|
recoveryGraphAttachmentKey(request, order) {
|
|
780
850
|
const parentIdentity = this.consistentStringAliases(order.parentId, order.parent_id, order.parentClientOrderId, order.parent_order_ref);
|
|
781
851
|
const clientIdentity = this.consistentStringAliases(order.cOID, order.order_ref);
|
|
@@ -803,7 +873,10 @@ export class IbkrClient {
|
|
|
803
873
|
const ticket = {};
|
|
804
874
|
const malformed = "__MALFORMED_TERMINAL_TICKET_FIELD__";
|
|
805
875
|
const addAliases = (field, values, normalize) => {
|
|
806
|
-
|
|
876
|
+
// An empty string is IBKR's "this field does not apply to this order", not a value that
|
|
877
|
+
// conflicts with its own aliases: a stop order carries `price: ""` next to a real
|
|
878
|
+
// `stop_price`. Treating it as provided marked every such ticket malformed.
|
|
879
|
+
const provided = values.filter((value) => value !== undefined && !(typeof value === "string" && value.trim() === ""));
|
|
807
880
|
if (provided.length === 0)
|
|
808
881
|
return;
|
|
809
882
|
const normalized = provided.map(normalize);
|
|
@@ -830,9 +903,20 @@ export class IbkrClient {
|
|
|
830
903
|
}
|
|
831
904
|
addAliases("orderType", [order.order_type, order.orderType], (value) => typeof value === "string" ? this.normalizeOrderType(value) : undefined);
|
|
832
905
|
addAliases("side", [order.side], (value) => typeof value === "string" ? this.normalizeOrderSide(value) : undefined);
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
906
|
+
// `size` is IBKR's remaining size, not an alias of the ticket quantity: a filled order reports
|
|
907
|
+
// `size: "0.0"` next to `total_size: "1.0"`. Comparing the two marked every filled ticket
|
|
908
|
+
// malformed, which is exactly the evidence recovery needs most.
|
|
909
|
+
addAliases("quantity", [order.total_size, order.totalSize], normalizeNumber);
|
|
910
|
+
addAliases("price", [
|
|
911
|
+
order.limitPrice,
|
|
912
|
+
order.limit_price,
|
|
913
|
+
order.stopPrice,
|
|
914
|
+
order.stop_price,
|
|
915
|
+
order.auxPrice,
|
|
916
|
+
order.aux_price,
|
|
917
|
+
order.price,
|
|
918
|
+
], normalizeNumber);
|
|
919
|
+
addAliases("tif", [order.tif, order.timeInForce], (value) => this.canonicalTimeInForce(value));
|
|
836
920
|
addAliases("outsideRTH", [order.outsideRTH, order.outside_rth], (value) => typeof value === "boolean" ? value : undefined);
|
|
837
921
|
return ticket;
|
|
838
922
|
}
|
|
@@ -1295,9 +1379,17 @@ export class IbkrClient {
|
|
|
1295
1379
|
if (!Number.isSafeInteger(request.quantity) || request.quantity <= 0) {
|
|
1296
1380
|
throw new Error("Combo quantity must be a positive integer");
|
|
1297
1381
|
}
|
|
1298
|
-
|
|
1382
|
+
const orderType = request.orderType;
|
|
1383
|
+
if (orderType !== "LMT" && orderType !== "STP") {
|
|
1384
|
+
throw new Error("Combo order type must be LMT or STP");
|
|
1385
|
+
}
|
|
1386
|
+
if (request.orderType === "LMT" && (!Number.isFinite(request.limit) || request.limit <= 0)) {
|
|
1299
1387
|
throw new Error("Combo limit must be a positive number");
|
|
1300
1388
|
}
|
|
1389
|
+
if (request.orderType === "STP" &&
|
|
1390
|
+
(!Number.isFinite(request.stopPrice) || request.stopPrice <= 0)) {
|
|
1391
|
+
throw new Error("Combo stop order requires a positive stop price");
|
|
1392
|
+
}
|
|
1301
1393
|
const [first, second] = request.legs;
|
|
1302
1394
|
if (first.ratio === second.ratio)
|
|
1303
1395
|
throw new Error("Combo requires one long and one short leg");
|
|
@@ -1376,6 +1468,28 @@ export class IbkrClient {
|
|
|
1376
1468
|
throw new Error("STOP order requires a positive stop price");
|
|
1377
1469
|
this.cmeOperatorMetadata(node.contract.assetClass, node);
|
|
1378
1470
|
}
|
|
1471
|
+
/**
|
|
1472
|
+
* IBKR's order snapshot reports a DAY order's time in force as `CLOSE` ("good until the close"),
|
|
1473
|
+
* while the order it was submitted with, and `iserver/account/order/status`, both say `DAY`.
|
|
1474
|
+
* They are the same instruction, so recovery must not read the two spellings as different
|
|
1475
|
+
* orders. Every other value is passed through unchanged and still has to match exactly.
|
|
1476
|
+
*/
|
|
1477
|
+
canonicalTimeInForce(value) {
|
|
1478
|
+
if (typeof value !== "string")
|
|
1479
|
+
return undefined;
|
|
1480
|
+
const upper = value.trim().toUpperCase();
|
|
1481
|
+
if (upper === "")
|
|
1482
|
+
return undefined;
|
|
1483
|
+
return upper === "CLOSE" ? "DAY" : upper;
|
|
1484
|
+
}
|
|
1485
|
+
/**
|
|
1486
|
+
* A stop price reaches this client under four spellings. IBKR sends `stop_price` and `auxPrice`
|
|
1487
|
+
* on the order snapshot, `stopPrice` on some payloads, and an empty `price` string for the same
|
|
1488
|
+
* order - an empty string means "not applicable here", never zero.
|
|
1489
|
+
*/
|
|
1490
|
+
observedStopPrice(order) {
|
|
1491
|
+
return this.firstNumber(order.stopPrice, order.stop_price, order.auxPrice, order.aux_price);
|
|
1492
|
+
}
|
|
1379
1493
|
graphClientOrderId(request, node) {
|
|
1380
1494
|
return node.parentMemberId === undefined
|
|
1381
1495
|
? request.rootClientOrderId
|
|
@@ -1446,20 +1560,23 @@ export class IbkrClient {
|
|
|
1446
1560
|
const orderType = this.normalizeOrderType(order.order_type ?? order.orderType);
|
|
1447
1561
|
const side = this.normalizeOrderSide(order.side);
|
|
1448
1562
|
const quantity = this.firstPositiveNumber(order.total_size, order.totalSize, order.size);
|
|
1449
|
-
const price =
|
|
1450
|
-
|
|
1563
|
+
const price = node.orderType === "LMT"
|
|
1564
|
+
? this.firstNumber(order.limitPrice, order.limit_price, order.price)
|
|
1565
|
+
: this.observedStopPrice(order);
|
|
1566
|
+
const amount = node.orderType === "LMT" ? node.limit : node.stopPrice;
|
|
1567
|
+
const expectedPrice = node.priceEffect === "CREDIT" ? -amount : amount;
|
|
1451
1568
|
const outsideRth = order.outsideRTH ?? order.outside_rth;
|
|
1452
|
-
const tif = order.tif ?? order.timeInForce;
|
|
1569
|
+
const tif = this.canonicalTimeInForce(order.tif ?? order.timeInForce);
|
|
1453
1570
|
return (liveLegs.length === node.legs.length &&
|
|
1454
1571
|
node.legs.every((leg, index) => {
|
|
1455
1572
|
const liveLeg = liveLegs[index];
|
|
1456
1573
|
return liveLeg?.conid === leg.contract.conid && liveLeg.ratio === leg.ratio;
|
|
1457
1574
|
}) &&
|
|
1458
|
-
orderType === this.normalizeOrderType(
|
|
1575
|
+
orderType === this.normalizeOrderType(node.orderType) &&
|
|
1459
1576
|
side === "BUY" &&
|
|
1460
1577
|
quantity === node.quantity &&
|
|
1461
1578
|
price === expectedPrice &&
|
|
1462
|
-
(tif === undefined || tif
|
|
1579
|
+
(tif === undefined || tif === node.tif) &&
|
|
1463
1580
|
(outsideRth === undefined || outsideRth === (node.session === "OVERNIGHT")));
|
|
1464
1581
|
}
|
|
1465
1582
|
const orderType = this.normalizeOrderType(order.order_type ?? order.orderType);
|
|
@@ -1469,17 +1586,17 @@ export class IbkrClient {
|
|
|
1469
1586
|
const price = node.orderType === "LMT"
|
|
1470
1587
|
? this.firstNumber(order.limitPrice, order.limit_price, order.price)
|
|
1471
1588
|
: node.orderType === "STP"
|
|
1472
|
-
? this.
|
|
1589
|
+
? this.observedStopPrice(order)
|
|
1473
1590
|
: undefined;
|
|
1474
1591
|
const expectedPrice = node.orderType === "LMT" ? node.limit : node.orderType === "STP" ? node.stopPrice : undefined;
|
|
1475
1592
|
const outsideRth = order.outsideRTH ?? order.outside_rth;
|
|
1476
|
-
const tif = order.tif ?? order.timeInForce;
|
|
1593
|
+
const tif = this.canonicalTimeInForce(order.tif ?? order.timeInForce);
|
|
1477
1594
|
return (order.conid === node.contract.conid &&
|
|
1478
1595
|
orderType === expectedOrderType &&
|
|
1479
1596
|
side === node.side &&
|
|
1480
1597
|
quantity === node.quantity &&
|
|
1481
1598
|
price === expectedPrice &&
|
|
1482
|
-
(tif === undefined || tif
|
|
1599
|
+
(tif === undefined || tif === node.tif) &&
|
|
1483
1600
|
(outsideRth === undefined || outsideRth === (node.session === "OVERNIGHT")));
|
|
1484
1601
|
}
|
|
1485
1602
|
recoveryOrderMatchesGraphNode(request, node, order) {
|
|
@@ -1493,11 +1610,12 @@ export class IbkrClient {
|
|
|
1493
1610
|
terminalOrderMatchesGraphNode(request, node, order) {
|
|
1494
1611
|
try {
|
|
1495
1612
|
const tif = order.tif ?? order.timeInForce;
|
|
1496
|
-
const outsideRth = order.outsideRTH ?? order.outside_rth;
|
|
1497
1613
|
const status = order.order_status ?? order.orderStatus ?? order.status;
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1614
|
+
// IBKR never reports `outsideRTH` on the order snapshot, so requiring it here made terminal
|
|
1615
|
+
// evidence unusable for every real order. Identity still rests on the client order ID, the
|
|
1616
|
+
// conidex, the order type, the side, the quantity, the price, and the time in force, all of
|
|
1617
|
+
// which `recoveryOrderMatchesGraphNode` compares exactly below.
|
|
1618
|
+
if (typeof tif !== "string" || typeof status !== "string") {
|
|
1501
1619
|
return false;
|
|
1502
1620
|
}
|
|
1503
1621
|
return this.recoveryOrderMatchesGraphNode(request, node, order);
|
|
@@ -1569,13 +1687,14 @@ export class IbkrClient {
|
|
|
1569
1687
|
comboOrderTicket(request) {
|
|
1570
1688
|
const exchange = request.legs[0].contract.exchange;
|
|
1571
1689
|
const spreadConid = exchange === "SMART" ? "28812380" : `28812380@${exchange}`;
|
|
1690
|
+
const amount = request.orderType === "LMT" ? request.limit : request.stopPrice;
|
|
1572
1691
|
return {
|
|
1573
1692
|
acctId: request.accountId,
|
|
1574
1693
|
conidex: `${spreadConid};;;${request.legs
|
|
1575
1694
|
.map(({ contract, ratio }) => `${String(contract.conid)}/${String(ratio)}`)
|
|
1576
1695
|
.join(",")}`,
|
|
1577
|
-
orderType:
|
|
1578
|
-
price: request.priceEffect === "CREDIT" ? -
|
|
1696
|
+
orderType: request.orderType,
|
|
1697
|
+
price: request.priceEffect === "CREDIT" ? -amount : amount,
|
|
1579
1698
|
side: "BUY",
|
|
1580
1699
|
tif: request.tif,
|
|
1581
1700
|
quantity: request.quantity,
|
|
@@ -2000,7 +2119,15 @@ export class IbkrClient {
|
|
|
2000
2119
|
normalizeDerivativeOrderLifecycle(accountId, orderId, order) {
|
|
2001
2120
|
const quantity = this.firstPositiveNumber(order.total_size, order.totalSize, order.size);
|
|
2002
2121
|
const filledQuantity = this.firstNumber(order.cum_fill, order.cumFill, order.filledQuantity, order.filled);
|
|
2003
|
-
|
|
2122
|
+
// `iserver/account/order/status/{orderId}` never carries a remaining-quantity field: it
|
|
2123
|
+
// reports only `total_size` and `cum_fill`. Derive the remainder from those two authoritative
|
|
2124
|
+
// values, exactly as `normalizeActiveDerivativeOrder` already does for the order snapshot.
|
|
2125
|
+
// Nothing is invented here - if either input is missing, this stays `undefined` and the
|
|
2126
|
+
// lifecycle read still fails closed below.
|
|
2127
|
+
const remainingQuantity = this.firstNumber(order.remainingQuantity, order.remaining_size, order.remaining) ??
|
|
2128
|
+
(quantity !== undefined && filledQuantity !== undefined && filledQuantity >= 0
|
|
2129
|
+
? Math.max(0, quantity - filledQuantity)
|
|
2130
|
+
: undefined);
|
|
2004
2131
|
if (quantity === undefined ||
|
|
2005
2132
|
filledQuantity === undefined ||
|
|
2006
2133
|
filledQuantity < 0 ||
|
|
@@ -2119,7 +2246,7 @@ export class IbkrClient {
|
|
|
2119
2246
|
: "UNKNOWN",
|
|
2120
2247
|
orderType: this.normalizeOrderType(order.order_type ?? order.orderType) ?? null,
|
|
2121
2248
|
limitPrice: this.firstNumber(order.limitPrice, order.limit_price, order.price) ?? null,
|
|
2122
|
-
stopPrice: this.firstNumber(order.stopPrice) ?? null,
|
|
2249
|
+
stopPrice: this.firstNumber(order.stopPrice, order.stop_price) ?? null,
|
|
2123
2250
|
enteredAt: orderTime,
|
|
2124
2251
|
updatedAt: order.lastExecutionTime_r !== undefined || order.lastExecutionTime !== undefined
|
|
2125
2252
|
? orderTime
|
|
@@ -2796,13 +2923,22 @@ export class IbkrClient {
|
|
|
2796
2923
|
path: "trsrv/secdef",
|
|
2797
2924
|
params: { conids: String(conid) },
|
|
2798
2925
|
});
|
|
2799
|
-
|
|
2926
|
+
// IBKR answers with `{ secdef: [contract] }`; the keyed-by-conid shape is kept for gateway
|
|
2927
|
+
// builds that still answer that way. An entry that names a different conid is not evidence
|
|
2928
|
+
// about this one, so it is ignored rather than trusted.
|
|
2929
|
+
const keyed = response[String(conid)];
|
|
2930
|
+
const candidates = [
|
|
2931
|
+
...(Array.isArray(response.secdef) ? response.secdef : []),
|
|
2932
|
+
...(Array.isArray(keyed) ? keyed : keyed === undefined ? [] : [keyed]),
|
|
2933
|
+
];
|
|
2934
|
+
const raw = candidates.find((candidate) => candidate.conid === undefined || candidate.conid === conid);
|
|
2800
2935
|
if (!raw)
|
|
2801
2936
|
return null;
|
|
2802
2937
|
return normalizeOptionContract({
|
|
2803
2938
|
conid: raw.conid ?? conid,
|
|
2804
|
-
symbol
|
|
2805
|
-
|
|
2939
|
+
// `symbol` is absent on this payload; IBKR names the underlying `ticker`/`undSym` here.
|
|
2940
|
+
symbol: raw.symbol ?? raw.ticker ?? raw.undSym,
|
|
2941
|
+
maturityDate: raw.expiry ?? raw.maturityDate,
|
|
2806
2942
|
right: raw.putOrCall,
|
|
2807
2943
|
strike: raw.strike,
|
|
2808
2944
|
});
|