iqoptionapi-node 1.0.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.
Files changed (147) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +219 -0
  3. package/dist/auth/CredentialAbstraction.d.ts +25 -0
  4. package/dist/auth/CredentialAbstraction.d.ts.map +1 -0
  5. package/dist/auth/CredentialAbstraction.js +46 -0
  6. package/dist/auth/CredentialAbstraction.js.map +1 -0
  7. package/dist/auth/EmailPasswordAuth.d.ts +11 -0
  8. package/dist/auth/EmailPasswordAuth.d.ts.map +1 -0
  9. package/dist/auth/EmailPasswordAuth.js +36 -0
  10. package/dist/auth/EmailPasswordAuth.js.map +1 -0
  11. package/dist/auth/SessionManager.d.ts +14 -0
  12. package/dist/auth/SessionManager.d.ts.map +1 -0
  13. package/dist/auth/SessionManager.js +51 -0
  14. package/dist/auth/SessionManager.js.map +1 -0
  15. package/dist/auth/SsidAuth.d.ts +10 -0
  16. package/dist/auth/SsidAuth.d.ts.map +1 -0
  17. package/dist/auth/SsidAuth.js +26 -0
  18. package/dist/auth/SsidAuth.js.map +1 -0
  19. package/dist/client/IQOptionClient.d.ts +58 -0
  20. package/dist/client/IQOptionClient.d.ts.map +1 -0
  21. package/dist/client/IQOptionClient.js +125 -0
  22. package/dist/client/IQOptionClient.js.map +1 -0
  23. package/dist/errors/index.d.ts +22 -0
  24. package/dist/errors/index.d.ts.map +1 -0
  25. package/dist/errors/index.js +53 -0
  26. package/dist/errors/index.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +22 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/logger/index.d.ts +6 -0
  32. package/dist/logger/index.d.ts.map +1 -0
  33. package/dist/logger/index.js +33 -0
  34. package/dist/logger/index.js.map +1 -0
  35. package/dist/market-data/AssetCatalog.d.ts +16 -0
  36. package/dist/market-data/AssetCatalog.d.ts.map +1 -0
  37. package/dist/market-data/AssetCatalog.js +45 -0
  38. package/dist/market-data/AssetCatalog.js.map +1 -0
  39. package/dist/market-data/CandleBuffer.d.ts +12 -0
  40. package/dist/market-data/CandleBuffer.d.ts.map +1 -0
  41. package/dist/market-data/CandleBuffer.js +44 -0
  42. package/dist/market-data/CandleBuffer.js.map +1 -0
  43. package/dist/market-data/CandleStream.d.ts +19 -0
  44. package/dist/market-data/CandleStream.d.ts.map +1 -0
  45. package/dist/market-data/CandleStream.js +73 -0
  46. package/dist/market-data/CandleStream.js.map +1 -0
  47. package/dist/market-data/HistoricalCandles.d.ts +11 -0
  48. package/dist/market-data/HistoricalCandles.d.ts.map +1 -0
  49. package/dist/market-data/HistoricalCandles.js +32 -0
  50. package/dist/market-data/HistoricalCandles.js.map +1 -0
  51. package/dist/market-data/TickAggregator.d.ts +13 -0
  52. package/dist/market-data/TickAggregator.d.ts.map +1 -0
  53. package/dist/market-data/TickAggregator.js +40 -0
  54. package/dist/market-data/TickAggregator.js.map +1 -0
  55. package/dist/market-data/TickStream.d.ts +18 -0
  56. package/dist/market-data/TickStream.d.ts.map +1 -0
  57. package/dist/market-data/TickStream.js +68 -0
  58. package/dist/market-data/TickStream.js.map +1 -0
  59. package/dist/protocol/V1Adapter.d.ts +20 -0
  60. package/dist/protocol/V1Adapter.d.ts.map +1 -0
  61. package/dist/protocol/V1Adapter.js +21 -0
  62. package/dist/protocol/V1Adapter.js.map +1 -0
  63. package/dist/trading/BinaryOptions.d.ts +31 -0
  64. package/dist/trading/BinaryOptions.d.ts.map +1 -0
  65. package/dist/trading/BinaryOptions.js +107 -0
  66. package/dist/trading/BinaryOptions.js.map +1 -0
  67. package/dist/trading/DigitalOptions.d.ts +31 -0
  68. package/dist/trading/DigitalOptions.d.ts.map +1 -0
  69. package/dist/trading/DigitalOptions.js +107 -0
  70. package/dist/trading/DigitalOptions.js.map +1 -0
  71. package/dist/trading/OrderCache.d.ts +17 -0
  72. package/dist/trading/OrderCache.d.ts.map +1 -0
  73. package/dist/trading/OrderCache.js +39 -0
  74. package/dist/trading/OrderCache.js.map +1 -0
  75. package/dist/trading/OrderHistory.d.ts +9 -0
  76. package/dist/trading/OrderHistory.d.ts.map +1 -0
  77. package/dist/trading/OrderHistory.js +17 -0
  78. package/dist/trading/OrderHistory.js.map +1 -0
  79. package/dist/transformers/entities.d.ts +8 -0
  80. package/dist/transformers/entities.d.ts.map +1 -0
  81. package/dist/transformers/entities.js +51 -0
  82. package/dist/transformers/entities.js.map +1 -0
  83. package/dist/transformers/toCamelCase.d.ts +2 -0
  84. package/dist/transformers/toCamelCase.d.ts.map +1 -0
  85. package/dist/transformers/toCamelCase.js +18 -0
  86. package/dist/transformers/toCamelCase.js.map +1 -0
  87. package/dist/transport/MessageRouter.d.ts +17 -0
  88. package/dist/transport/MessageRouter.d.ts.map +1 -0
  89. package/dist/transport/MessageRouter.js +87 -0
  90. package/dist/transport/MessageRouter.js.map +1 -0
  91. package/dist/transport/ReconnectionManager.d.ts +25 -0
  92. package/dist/transport/ReconnectionManager.d.ts.map +1 -0
  93. package/dist/transport/ReconnectionManager.js +63 -0
  94. package/dist/transport/ReconnectionManager.js.map +1 -0
  95. package/dist/transport/WebSocketTransport.d.ts +21 -0
  96. package/dist/transport/WebSocketTransport.d.ts.map +1 -0
  97. package/dist/transport/WebSocketTransport.js +68 -0
  98. package/dist/transport/WebSocketTransport.js.map +1 -0
  99. package/dist/types/logger.d.ts +7 -0
  100. package/dist/types/logger.d.ts.map +1 -0
  101. package/dist/types/logger.js +3 -0
  102. package/dist/types/logger.js.map +1 -0
  103. package/dist/types/market-data.d.ts +38 -0
  104. package/dist/types/market-data.d.ts.map +1 -0
  105. package/dist/types/market-data.js +3 -0
  106. package/dist/types/market-data.js.map +1 -0
  107. package/dist/types/messages.d.ts +8 -0
  108. package/dist/types/messages.d.ts.map +1 -0
  109. package/dist/types/messages.js +3 -0
  110. package/dist/types/messages.js.map +1 -0
  111. package/dist/types/primitives.d.ts +29 -0
  112. package/dist/types/primitives.d.ts.map +1 -0
  113. package/dist/types/primitives.js +29 -0
  114. package/dist/types/primitives.js.map +1 -0
  115. package/dist/types/profile.d.ts +24 -0
  116. package/dist/types/profile.d.ts.map +1 -0
  117. package/dist/types/profile.js +3 -0
  118. package/dist/types/profile.js.map +1 -0
  119. package/dist/types/raw/asset.d.ts +20 -0
  120. package/dist/types/raw/asset.d.ts.map +1 -0
  121. package/dist/types/raw/asset.js +3 -0
  122. package/dist/types/raw/asset.js.map +1 -0
  123. package/dist/types/raw/candle.d.ts +15 -0
  124. package/dist/types/raw/candle.d.ts.map +1 -0
  125. package/dist/types/raw/candle.js +3 -0
  126. package/dist/types/raw/candle.js.map +1 -0
  127. package/dist/types/raw/order.d.ts +31 -0
  128. package/dist/types/raw/order.d.ts.map +1 -0
  129. package/dist/types/raw/order.js +3 -0
  130. package/dist/types/raw/order.js.map +1 -0
  131. package/dist/types/raw/tick.d.ts +9 -0
  132. package/dist/types/raw/tick.d.ts.map +1 -0
  133. package/dist/types/raw/tick.js +3 -0
  134. package/dist/types/raw/tick.js.map +1 -0
  135. package/dist/types/trading.d.ts +38 -0
  136. package/dist/types/trading.d.ts.map +1 -0
  137. package/dist/types/trading.js +3 -0
  138. package/dist/types/trading.js.map +1 -0
  139. package/dist/validators/malformedMessage.d.ts +16 -0
  140. package/dist/validators/malformedMessage.d.ts.map +1 -0
  141. package/dist/validators/malformedMessage.js +15 -0
  142. package/dist/validators/malformedMessage.js.map +1 -0
  143. package/dist/validators/messageSchema.d.ts +7 -0
  144. package/dist/validators/messageSchema.d.ts.map +1 -0
  145. package/dist/validators/messageSchema.js +25 -0
  146. package/dist/validators/messageSchema.js.map +1 -0
  147. package/package.json +81 -0
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TickAggregator = void 0;
4
+ const DEFAULT_WINDOW_MS = 60_000;
5
+ const DEFAULT_MAX_TICKS = 1_000;
6
+ class TickAggregator {
7
+ windows = new Map();
8
+ windowMs;
9
+ maxTicks;
10
+ constructor(windowMs = DEFAULT_WINDOW_MS, maxTicks = DEFAULT_MAX_TICKS) {
11
+ this.windowMs = windowMs;
12
+ this.maxTicks = maxTicks;
13
+ }
14
+ push(tick) {
15
+ let ticks = this.windows.get(tick.assetId);
16
+ if (!ticks) {
17
+ ticks = [];
18
+ this.windows.set(tick.assetId, ticks);
19
+ }
20
+ ticks.push(tick);
21
+ // Evict by time window first, then by max count
22
+ const cutoff = tick.time - this.windowMs;
23
+ const firstValid = ticks.findIndex((t) => t.time >= cutoff);
24
+ if (firstValid > 0)
25
+ ticks.splice(0, firstValid);
26
+ if (ticks.length > this.maxTicks)
27
+ ticks.splice(0, ticks.length - this.maxTicks);
28
+ }
29
+ getWindow(assetId) {
30
+ return this.windows.get(assetId) ?? [];
31
+ }
32
+ clearAsset(assetId) {
33
+ this.windows.delete(assetId);
34
+ }
35
+ clear() {
36
+ this.windows.clear();
37
+ }
38
+ }
39
+ exports.TickAggregator = TickAggregator;
40
+ //# sourceMappingURL=TickAggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TickAggregator.js","sourceRoot":"","sources":["../../src/market-data/TickAggregator.ts"],"names":[],"mappings":";;;AAGA,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,MAAa,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IACxC,QAAQ,CAAS;IACjB,QAAQ,CAAS;IAElC,YAAY,QAAQ,GAAG,iBAAiB,EAAE,QAAQ,GAAG,iBAAiB;QACpE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,gDAAgD;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;QAC5D,IAAI,UAAU,GAAG,CAAC;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;IAED,SAAS,CAAC,OAAiB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,UAAU,CAAC,OAAiB;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AArCD,wCAqCC"}
@@ -0,0 +1,18 @@
1
+ import type { MessageRouter } from '../transport/MessageRouter';
2
+ import type { ReconnectionManager } from '../transport/ReconnectionManager';
3
+ import type { AssetCatalog } from './AssetCatalog';
4
+ import type { IQTick } from '../types/market-data';
5
+ import { TickAggregator } from './TickAggregator';
6
+ export declare class TickStream {
7
+ private readonly router;
8
+ private readonly catalog;
9
+ readonly aggregator: TickAggregator;
10
+ private readonly subs;
11
+ constructor(router: MessageRouter, catalog: AssetCatalog, reconnection: ReconnectionManager);
12
+ subscribe(symbol: string, callback: (tick: IQTick) => void): void;
13
+ unsubscribe(symbol: string): void;
14
+ private resubscribeAll;
15
+ private sendSubscribe;
16
+ private sendUnsubscribe;
17
+ }
18
+ //# sourceMappingURL=TickStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TickStream.d.ts","sourceRoot":"","sources":["../../src/market-data/TickStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWlD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;gBAE5C,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB;IAS3F,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAqBjE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUjC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,eAAe;CAMxB"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TickStream = void 0;
4
+ const TickAggregator_1 = require("./TickAggregator");
5
+ const entities_1 = require("../transformers/entities");
6
+ const errors_1 = require("../errors");
7
+ const V1Adapter_1 = require("../protocol/V1Adapter");
8
+ class TickStream {
9
+ router;
10
+ catalog;
11
+ aggregator;
12
+ subs = new Map();
13
+ constructor(router, catalog, reconnection) {
14
+ this.router = router;
15
+ this.catalog = catalog;
16
+ this.aggregator = new TickAggregator_1.TickAggregator();
17
+ reconnection.on('reconnected', () => {
18
+ this.resubscribeAll();
19
+ });
20
+ }
21
+ subscribe(symbol, callback) {
22
+ const key = symbol.toUpperCase();
23
+ if (this.subs.has(key))
24
+ return;
25
+ const asset = this.catalog.getAsset(symbol);
26
+ if (!asset)
27
+ throw new errors_1.ValidationError(`Unknown asset: ${symbol}`);
28
+ const handler = (msg) => {
29
+ const raw = msg.msg;
30
+ if (raw.active_id !== asset.activeId)
31
+ return;
32
+ const tick = (0, entities_1.transformTick)(raw);
33
+ this.aggregator.push(tick);
34
+ callback(tick);
35
+ };
36
+ this.router.registerHandler(V1Adapter_1.V1Adapter.quoteGenerated, handler);
37
+ this.sendSubscribe(asset.activeId);
38
+ this.subs.set(key, { activeId: asset.activeId, handler, callback });
39
+ }
40
+ unsubscribe(symbol) {
41
+ const key = symbol.toUpperCase();
42
+ const sub = this.subs.get(key);
43
+ if (!sub)
44
+ return;
45
+ this.router.unregisterHandler(V1Adapter_1.V1Adapter.quoteGenerated, sub.handler);
46
+ this.sendUnsubscribe(sub.activeId);
47
+ this.subs.delete(key);
48
+ }
49
+ resubscribeAll() {
50
+ for (const sub of this.subs.values()) {
51
+ this.sendSubscribe(sub.activeId);
52
+ }
53
+ }
54
+ sendSubscribe(activeId) {
55
+ this.router.sendMessage(V1Adapter_1.V1Adapter.subscribe, {
56
+ name: V1Adapter_1.V1Adapter.quoteGenerated,
57
+ params: { routingFilters: { active_id: activeId } },
58
+ });
59
+ }
60
+ sendUnsubscribe(activeId) {
61
+ this.router.sendMessage(V1Adapter_1.V1Adapter.unsubscribe, {
62
+ name: V1Adapter_1.V1Adapter.quoteGenerated,
63
+ params: { routingFilters: { active_id: activeId } },
64
+ });
65
+ }
66
+ }
67
+ exports.TickStream = TickStream;
68
+ //# sourceMappingURL=TickStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TickStream.js","sourceRoot":"","sources":["../../src/market-data/TickStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { MessageName } from '../types/messages';
2
+ export interface ProtocolAdapter {
3
+ readonly authorization: MessageName;
4
+ readonly ssid: MessageName;
5
+ readonly profile: MessageName;
6
+ readonly getCandles: MessageName;
7
+ readonly candles: MessageName;
8
+ readonly candleGenerated: MessageName;
9
+ readonly subscribe: MessageName;
10
+ readonly unsubscribe: MessageName;
11
+ readonly quoteGenerated: MessageName;
12
+ readonly initData: MessageName;
13
+ readonly buyV2: MessageName;
14
+ readonly buyComplete: MessageName;
15
+ readonly option: MessageName;
16
+ readonly digitalOrderBinary: MessageName;
17
+ readonly heartbeat: MessageName;
18
+ }
19
+ export declare const V1Adapter: ProtocolAdapter;
20
+ //# sourceMappingURL=V1Adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"V1Adapter.d.ts","sourceRoot":"","sources":["../../src/protocol/V1Adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;CACjC;AAED,eAAO,MAAM,SAAS,EAAE,eAgBd,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.V1Adapter = void 0;
4
+ exports.V1Adapter = {
5
+ authorization: 'authorization',
6
+ ssid: 'ssid',
7
+ profile: 'profile',
8
+ getCandles: 'get-candles',
9
+ candles: 'candles',
10
+ candleGenerated: 'candle-generated',
11
+ subscribe: 'subscribeMessage',
12
+ unsubscribe: 'unsubscribeMessage',
13
+ quoteGenerated: 'quote-generated',
14
+ initData: 'init_data',
15
+ buyV2: 'buyV2',
16
+ buyComplete: 'buy-complete',
17
+ option: 'option',
18
+ digitalOrderBinary: 'digital-options/place-order-binary',
19
+ heartbeat: 'heartbeat',
20
+ };
21
+ //# sourceMappingURL=V1Adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"V1Adapter.js","sourceRoot":"","sources":["../../src/protocol/V1Adapter.ts"],"names":[],"mappings":";;;AAoBa,QAAA,SAAS,GAAoB;IACxC,aAAa,EAAE,eAAe;IAC9B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,aAAa;IACzB,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,kBAAkB;IAC7B,WAAW,EAAE,oBAAoB;IACjC,cAAc,EAAE,iBAAiB;IACjC,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,cAAc;IAC3B,MAAM,EAAE,QAAQ;IAChB,kBAAkB,EAAE,oCAAoC;IACxD,SAAS,EAAE,WAAW;CACd,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { MessageRouter } from '../transport/MessageRouter';
3
+ import type { AssetCatalog } from '../market-data/AssetCatalog';
4
+ import type { OrderCache } from './OrderCache';
5
+ import type { BuyBinaryOptionParams, BinaryOptionResult } from '../types/trading';
6
+ export declare interface BinaryOptions {
7
+ on(event: 'tradingCircuitOpen', listener: (info: {
8
+ module: string;
9
+ failures: number;
10
+ }) => void): this;
11
+ emit(event: 'tradingCircuitOpen', info: {
12
+ module: string;
13
+ failures: number;
14
+ }): boolean;
15
+ }
16
+ export declare class BinaryOptions extends EventEmitter {
17
+ private readonly router;
18
+ private readonly catalog;
19
+ private readonly cache;
20
+ private consecutiveFailures;
21
+ private circuitOpen;
22
+ constructor(router: MessageRouter, catalog: AssetCatalog, cache: OrderCache);
23
+ buy(params: BuyBinaryOptionParams): Promise<{
24
+ orderId: string;
25
+ }>;
26
+ checkResult(orderId: string, timeoutMs?: number): Promise<BinaryOptionResult>;
27
+ resetCircuit(): void;
28
+ get isCircuitOpen(): boolean;
29
+ private recordFailure;
30
+ }
31
+ //# sourceMappingURL=BinaryOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryOptions.d.ts","sourceRoot":"","sources":["../../src/trading/BinaryOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAGnB,MAAM,kBAAkB,CAAC;AAc1B,MAAM,CAAC,OAAO,WAAW,aAAa;IACpC,EAAE,CACA,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC7D,IAAI,CAAC;IACR,IAAI,CAAC,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CACxF;AAGD,qBAAa,aAAc,SAAQ,YAAY;IAK3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,WAAW,CAAS;gBAGT,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU;IAK9B,GAAG,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0CtE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAA4B,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8BhG,YAAY,IAAI,IAAI;IAKpB,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,OAAO,CAAC,aAAa;CAUtB"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BinaryOptions = void 0;
4
+ const events_1 = require("events");
5
+ const V1Adapter_1 = require("../protocol/V1Adapter");
6
+ const errors_1 = require("../errors");
7
+ const CIRCUIT_BREAKER_THRESHOLD = 5;
8
+ const DEFAULT_RESULT_TIMEOUT_MS = 60_000;
9
+ function asActiveId(n) {
10
+ return n;
11
+ }
12
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
13
+ class BinaryOptions extends events_1.EventEmitter {
14
+ router;
15
+ catalog;
16
+ cache;
17
+ consecutiveFailures = 0;
18
+ circuitOpen = false;
19
+ constructor(router, catalog, cache) {
20
+ super();
21
+ this.router = router;
22
+ this.catalog = catalog;
23
+ this.cache = cache;
24
+ }
25
+ async buy(params) {
26
+ if (this.circuitOpen) {
27
+ throw new errors_1.TradingError('Circuit breaker is open — too many consecutive failures');
28
+ }
29
+ const asset = this.catalog.getAsset(params.symbol);
30
+ if (!asset)
31
+ throw new errors_1.ValidationError(`Unknown asset: ${params.symbol}`);
32
+ try {
33
+ const response = await this.router.sendRequest(V1Adapter_1.V1Adapter.buyV2, {
34
+ price: params.amount,
35
+ active_id: asset.activeId,
36
+ option_type_id: 1,
37
+ direction: params.direction,
38
+ expired: params.durationSeconds,
39
+ });
40
+ const raw = response.msg;
41
+ if (!raw.id)
42
+ throw new errors_1.TradingError('Buy response missing order ID');
43
+ const position = {
44
+ orderId: String(raw.id),
45
+ activeId: asActiveId(raw.active_id),
46
+ direction: params.direction,
47
+ amount: params.amount,
48
+ profitPercent: raw.profit_percent ?? 0,
49
+ status: 'open',
50
+ openTime: (raw.open_time ?? 0) * 1000,
51
+ closeTime: null,
52
+ profitAmount: null,
53
+ win: null,
54
+ };
55
+ this.cache.add(position);
56
+ this.consecutiveFailures = 0;
57
+ return { orderId: position.orderId };
58
+ }
59
+ catch (err) {
60
+ this.recordFailure();
61
+ throw err;
62
+ }
63
+ }
64
+ checkResult(orderId, timeoutMs = DEFAULT_RESULT_TIMEOUT_MS) {
65
+ return new Promise((resolve, reject) => {
66
+ const timer = setTimeout(() => {
67
+ this.router.unregisterHandler(V1Adapter_1.V1Adapter.option, handler);
68
+ reject(new errors_1.TimeoutError(`Timeout waiting for result of order ${orderId}`));
69
+ }, timeoutMs);
70
+ const handler = (msg) => {
71
+ const raw = msg.msg;
72
+ if (String(raw.id) !== orderId)
73
+ return;
74
+ clearTimeout(timer);
75
+ this.router.unregisterHandler(V1Adapter_1.V1Adapter.option, handler);
76
+ const win = (raw.win ?? 'loss');
77
+ const profitAmount = raw.profit_amount ?? null;
78
+ this.cache.close(orderId, {
79
+ win,
80
+ profitAmount,
81
+ closeTime: (raw.close_time ?? 0) * 1000,
82
+ });
83
+ resolve({ orderId, win, profitAmount });
84
+ };
85
+ this.router.registerHandler(V1Adapter_1.V1Adapter.option, handler);
86
+ });
87
+ }
88
+ resetCircuit() {
89
+ this.circuitOpen = false;
90
+ this.consecutiveFailures = 0;
91
+ }
92
+ get isCircuitOpen() {
93
+ return this.circuitOpen;
94
+ }
95
+ recordFailure() {
96
+ this.consecutiveFailures += 1;
97
+ if (this.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {
98
+ this.circuitOpen = true;
99
+ this.emit('tradingCircuitOpen', {
100
+ module: 'BinaryOptions',
101
+ failures: this.consecutiveFailures,
102
+ });
103
+ }
104
+ }
105
+ }
106
+ exports.BinaryOptions = BinaryOptions;
107
+ //# sourceMappingURL=BinaryOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryOptions.js","sourceRoot":"","sources":["../../src/trading/BinaryOptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { MessageRouter } from '../transport/MessageRouter';
3
+ import type { AssetCatalog } from '../market-data/AssetCatalog';
4
+ import type { OrderCache } from './OrderCache';
5
+ import type { BuyDigitalOptionParams, DigitalOptionResult } from '../types/trading';
6
+ export declare interface DigitalOptions {
7
+ on(event: 'tradingCircuitOpen', listener: (info: {
8
+ module: string;
9
+ failures: number;
10
+ }) => void): this;
11
+ emit(event: 'tradingCircuitOpen', info: {
12
+ module: string;
13
+ failures: number;
14
+ }): boolean;
15
+ }
16
+ export declare class DigitalOptions extends EventEmitter {
17
+ private readonly router;
18
+ private readonly catalog;
19
+ private readonly cache;
20
+ private consecutiveFailures;
21
+ private circuitOpen;
22
+ constructor(router: MessageRouter, catalog: AssetCatalog, cache: OrderCache);
23
+ buy(params: BuyDigitalOptionParams): Promise<{
24
+ orderId: string;
25
+ }>;
26
+ checkResult(orderId: string, timeoutMs?: number): Promise<DigitalOptionResult>;
27
+ resetCircuit(): void;
28
+ get isCircuitOpen(): boolean;
29
+ private recordFailure;
30
+ }
31
+ //# sourceMappingURL=DigitalOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DigitalOptions.d.ts","sourceRoot":"","sources":["../../src/trading/DigitalOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EAGpB,MAAM,kBAAkB,CAAC;AAc1B,MAAM,CAAC,OAAO,WAAW,cAAc;IACrC,EAAE,CACA,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC7D,IAAI,CAAC;IACR,IAAI,CAAC,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CACxF;AAGD,qBAAa,cAAe,SAAQ,YAAY;IAK5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,WAAW,CAAS;gBAGT,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU;IAK9B,GAAG,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA6CvE,WAAW,CACT,OAAO,EAAE,MAAM,EACf,SAAS,SAA4B,GACpC,OAAO,CAAC,mBAAmB,CAAC;IA8B/B,YAAY,IAAI,IAAI;IAKpB,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,OAAO,CAAC,aAAa;CAUtB"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitalOptions = void 0;
4
+ const events_1 = require("events");
5
+ const V1Adapter_1 = require("../protocol/V1Adapter");
6
+ const errors_1 = require("../errors");
7
+ const CIRCUIT_BREAKER_THRESHOLD = 5;
8
+ const DEFAULT_RESULT_TIMEOUT_MS = 60_000;
9
+ function asActiveId(n) {
10
+ return n;
11
+ }
12
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
13
+ class DigitalOptions extends events_1.EventEmitter {
14
+ router;
15
+ catalog;
16
+ cache;
17
+ consecutiveFailures = 0;
18
+ circuitOpen = false;
19
+ constructor(router, catalog, cache) {
20
+ super();
21
+ this.router = router;
22
+ this.catalog = catalog;
23
+ this.cache = cache;
24
+ }
25
+ async buy(params) {
26
+ if (this.circuitOpen) {
27
+ throw new errors_1.TradingError('Circuit breaker is open — too many consecutive failures');
28
+ }
29
+ const asset = this.catalog.getAsset(params.symbol);
30
+ if (!asset)
31
+ throw new errors_1.ValidationError(`Unknown asset: ${params.symbol}`);
32
+ try {
33
+ const response = await this.router.sendRequest(V1Adapter_1.V1Adapter.digitalOrderBinary, {
34
+ active_id: asset.activeId,
35
+ direction: params.direction,
36
+ amount: params.amount,
37
+ duration: params.durationSeconds,
38
+ instrument_type: 'digital-option',
39
+ });
40
+ const raw = response.msg;
41
+ if (!raw.id)
42
+ throw new errors_1.TradingError('Digital buy response missing order ID');
43
+ const position = {
44
+ orderId: String(raw.id),
45
+ activeId: asActiveId(raw.active_id),
46
+ direction: params.direction,
47
+ amount: params.amount,
48
+ profitPercent: 0,
49
+ status: 'open',
50
+ openTime: Date.now(),
51
+ closeTime: null,
52
+ profitAmount: null,
53
+ win: null,
54
+ };
55
+ this.cache.add(position);
56
+ this.consecutiveFailures = 0;
57
+ return { orderId: position.orderId };
58
+ }
59
+ catch (err) {
60
+ this.recordFailure();
61
+ throw err;
62
+ }
63
+ }
64
+ checkResult(orderId, timeoutMs = DEFAULT_RESULT_TIMEOUT_MS) {
65
+ return new Promise((resolve, reject) => {
66
+ const timer = setTimeout(() => {
67
+ this.router.unregisterHandler(V1Adapter_1.V1Adapter.option, handler);
68
+ reject(new errors_1.TimeoutError(`Timeout waiting for digital result of order ${orderId}`));
69
+ }, timeoutMs);
70
+ const handler = (msg) => {
71
+ const raw = msg.msg;
72
+ if (String(raw.id) !== orderId)
73
+ return;
74
+ clearTimeout(timer);
75
+ this.router.unregisterHandler(V1Adapter_1.V1Adapter.option, handler);
76
+ const win = (raw.win ?? 'loss');
77
+ const profitAmount = raw.profit ?? null;
78
+ this.cache.close(orderId, {
79
+ win,
80
+ profitAmount,
81
+ closeTime: (raw.close_time ?? 0) * 1000,
82
+ });
83
+ resolve({ orderId, win, profitAmount });
84
+ };
85
+ this.router.registerHandler(V1Adapter_1.V1Adapter.option, handler);
86
+ });
87
+ }
88
+ resetCircuit() {
89
+ this.circuitOpen = false;
90
+ this.consecutiveFailures = 0;
91
+ }
92
+ get isCircuitOpen() {
93
+ return this.circuitOpen;
94
+ }
95
+ recordFailure() {
96
+ this.consecutiveFailures += 1;
97
+ if (this.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {
98
+ this.circuitOpen = true;
99
+ this.emit('tradingCircuitOpen', {
100
+ module: 'DigitalOptions',
101
+ failures: this.consecutiveFailures,
102
+ });
103
+ }
104
+ }
105
+ }
106
+ exports.DigitalOptions = DigitalOptions;
107
+ //# sourceMappingURL=DigitalOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DigitalOptions.js","sourceRoot":"","sources":["../../src/trading/DigitalOptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { IQPosition } from '../types/trading';
3
+ export declare interface OrderCache {
4
+ on(event: 'orderClosed', listener: (position: IQPosition) => void): this;
5
+ emit(event: 'orderClosed', position: IQPosition): boolean;
6
+ }
7
+ export declare class OrderCache extends EventEmitter {
8
+ private readonly openOrders;
9
+ private readonly closedOrders;
10
+ add(position: IQPosition): void;
11
+ close(orderId: string, update: Partial<IQPosition>): IQPosition | null;
12
+ getOpen(): IQPosition[];
13
+ getClosed(limit?: number): IQPosition[];
14
+ has(orderId: string): boolean;
15
+ clear(): void;
16
+ }
17
+ //# sourceMappingURL=OrderCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderCache.d.ts","sourceRoot":"","sources":["../../src/trading/OrderCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,CAAC,OAAO,WAAW,UAAU;IACjC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC;CAC3D;AAGD,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IAEjD,GAAG,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI;IAI/B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI;IAWtE,OAAO,IAAI,UAAU,EAAE;IAIvB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAKvC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrderCache = void 0;
4
+ const events_1 = require("events");
5
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
6
+ class OrderCache extends events_1.EventEmitter {
7
+ openOrders = new Map();
8
+ closedOrders = [];
9
+ add(position) {
10
+ this.openOrders.set(position.orderId, position);
11
+ }
12
+ close(orderId, update) {
13
+ const existing = this.openOrders.get(orderId);
14
+ if (!existing)
15
+ return null;
16
+ const closed = { ...existing, ...update, status: 'closed' };
17
+ this.openOrders.delete(orderId);
18
+ this.closedOrders.push(closed);
19
+ this.emit('orderClosed', closed);
20
+ return closed;
21
+ }
22
+ getOpen() {
23
+ return Array.from(this.openOrders.values());
24
+ }
25
+ getClosed(limit) {
26
+ if (limit === undefined)
27
+ return [...this.closedOrders];
28
+ return this.closedOrders.slice(-limit);
29
+ }
30
+ has(orderId) {
31
+ return this.openOrders.has(orderId);
32
+ }
33
+ clear() {
34
+ this.openOrders.clear();
35
+ this.closedOrders.length = 0;
36
+ }
37
+ }
38
+ exports.OrderCache = OrderCache;
39
+ //# sourceMappingURL=OrderCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderCache.js","sourceRoot":"","sources":["../../src/trading/OrderCache.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AAStC,4EAA4E;AAC5E,MAAa,UAAW,SAAQ,qBAAY;IACzB,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,YAAY,GAAiB,EAAE,CAAC;IAEjD,GAAG,CAAC,QAAoB;QACtB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,MAA2B;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAe,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF;AApCD,gCAoCC"}
@@ -0,0 +1,9 @@
1
+ import type { OrderCache } from './OrderCache';
2
+ import type { IQPosition } from '../types/trading';
3
+ export declare class OrderHistory {
4
+ private readonly cache;
5
+ constructor(cache: OrderCache);
6
+ getOpenPositions(): IQPosition[];
7
+ getClosedPositions(limit?: number): IQPosition[];
8
+ }
9
+ //# sourceMappingURL=OrderHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderHistory.d.ts","sourceRoot":"","sources":["../../src/trading/OrderHistory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,UAAU;IAE9C,gBAAgB,IAAI,UAAU,EAAE;IAIhC,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;CAGjD"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrderHistory = void 0;
4
+ class OrderHistory {
5
+ cache;
6
+ constructor(cache) {
7
+ this.cache = cache;
8
+ }
9
+ getOpenPositions() {
10
+ return this.cache.getOpen();
11
+ }
12
+ getClosedPositions(limit) {
13
+ return this.cache.getClosed(limit);
14
+ }
15
+ }
16
+ exports.OrderHistory = OrderHistory;
17
+ //# sourceMappingURL=OrderHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderHistory.js","sourceRoot":"","sources":["../../src/trading/OrderHistory.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IACM;IAA7B,YAA6B,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;IAAG,CAAC;IAElD,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,kBAAkB,CAAC,KAAc;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;CACF;AAVD,oCAUC"}
@@ -0,0 +1,8 @@
1
+ import type { IQRawAsset } from '../types/raw/asset';
2
+ import type { IQRawCandle } from '../types/raw/candle';
3
+ import type { IQRawTick } from '../types/raw/tick';
4
+ import type { IQAsset, IQCandle, IQTick } from '../types/market-data';
5
+ export declare function transformCandle(raw: IQRawCandle): IQCandle;
6
+ export declare function transformAsset(raw: IQRawAsset): IQAsset;
7
+ export declare function transformTick(raw: IQRawTick): IQTick;
8
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/transformers/entities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAY,MAAM,sBAAsB,CAAC;AAMhF,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,CAW1D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAqBvD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAQpD"}