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.
- package/CHANGELOG.md +36 -0
- package/README.md +219 -0
- package/dist/auth/CredentialAbstraction.d.ts +25 -0
- package/dist/auth/CredentialAbstraction.d.ts.map +1 -0
- package/dist/auth/CredentialAbstraction.js +46 -0
- package/dist/auth/CredentialAbstraction.js.map +1 -0
- package/dist/auth/EmailPasswordAuth.d.ts +11 -0
- package/dist/auth/EmailPasswordAuth.d.ts.map +1 -0
- package/dist/auth/EmailPasswordAuth.js +36 -0
- package/dist/auth/EmailPasswordAuth.js.map +1 -0
- package/dist/auth/SessionManager.d.ts +14 -0
- package/dist/auth/SessionManager.d.ts.map +1 -0
- package/dist/auth/SessionManager.js +51 -0
- package/dist/auth/SessionManager.js.map +1 -0
- package/dist/auth/SsidAuth.d.ts +10 -0
- package/dist/auth/SsidAuth.d.ts.map +1 -0
- package/dist/auth/SsidAuth.js +26 -0
- package/dist/auth/SsidAuth.js.map +1 -0
- package/dist/client/IQOptionClient.d.ts +58 -0
- package/dist/client/IQOptionClient.d.ts.map +1 -0
- package/dist/client/IQOptionClient.js +125 -0
- package/dist/client/IQOptionClient.js.map +1 -0
- package/dist/errors/index.d.ts +22 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +53 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/index.d.ts +6 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +33 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/market-data/AssetCatalog.d.ts +16 -0
- package/dist/market-data/AssetCatalog.d.ts.map +1 -0
- package/dist/market-data/AssetCatalog.js +45 -0
- package/dist/market-data/AssetCatalog.js.map +1 -0
- package/dist/market-data/CandleBuffer.d.ts +12 -0
- package/dist/market-data/CandleBuffer.d.ts.map +1 -0
- package/dist/market-data/CandleBuffer.js +44 -0
- package/dist/market-data/CandleBuffer.js.map +1 -0
- package/dist/market-data/CandleStream.d.ts +19 -0
- package/dist/market-data/CandleStream.d.ts.map +1 -0
- package/dist/market-data/CandleStream.js +73 -0
- package/dist/market-data/CandleStream.js.map +1 -0
- package/dist/market-data/HistoricalCandles.d.ts +11 -0
- package/dist/market-data/HistoricalCandles.d.ts.map +1 -0
- package/dist/market-data/HistoricalCandles.js +32 -0
- package/dist/market-data/HistoricalCandles.js.map +1 -0
- package/dist/market-data/TickAggregator.d.ts +13 -0
- package/dist/market-data/TickAggregator.d.ts.map +1 -0
- package/dist/market-data/TickAggregator.js +40 -0
- package/dist/market-data/TickAggregator.js.map +1 -0
- package/dist/market-data/TickStream.d.ts +18 -0
- package/dist/market-data/TickStream.d.ts.map +1 -0
- package/dist/market-data/TickStream.js +68 -0
- package/dist/market-data/TickStream.js.map +1 -0
- package/dist/protocol/V1Adapter.d.ts +20 -0
- package/dist/protocol/V1Adapter.d.ts.map +1 -0
- package/dist/protocol/V1Adapter.js +21 -0
- package/dist/protocol/V1Adapter.js.map +1 -0
- package/dist/trading/BinaryOptions.d.ts +31 -0
- package/dist/trading/BinaryOptions.d.ts.map +1 -0
- package/dist/trading/BinaryOptions.js +107 -0
- package/dist/trading/BinaryOptions.js.map +1 -0
- package/dist/trading/DigitalOptions.d.ts +31 -0
- package/dist/trading/DigitalOptions.d.ts.map +1 -0
- package/dist/trading/DigitalOptions.js +107 -0
- package/dist/trading/DigitalOptions.js.map +1 -0
- package/dist/trading/OrderCache.d.ts +17 -0
- package/dist/trading/OrderCache.d.ts.map +1 -0
- package/dist/trading/OrderCache.js +39 -0
- package/dist/trading/OrderCache.js.map +1 -0
- package/dist/trading/OrderHistory.d.ts +9 -0
- package/dist/trading/OrderHistory.d.ts.map +1 -0
- package/dist/trading/OrderHistory.js +17 -0
- package/dist/trading/OrderHistory.js.map +1 -0
- package/dist/transformers/entities.d.ts +8 -0
- package/dist/transformers/entities.d.ts.map +1 -0
- package/dist/transformers/entities.js +51 -0
- package/dist/transformers/entities.js.map +1 -0
- package/dist/transformers/toCamelCase.d.ts +2 -0
- package/dist/transformers/toCamelCase.d.ts.map +1 -0
- package/dist/transformers/toCamelCase.js +18 -0
- package/dist/transformers/toCamelCase.js.map +1 -0
- package/dist/transport/MessageRouter.d.ts +17 -0
- package/dist/transport/MessageRouter.d.ts.map +1 -0
- package/dist/transport/MessageRouter.js +87 -0
- package/dist/transport/MessageRouter.js.map +1 -0
- package/dist/transport/ReconnectionManager.d.ts +25 -0
- package/dist/transport/ReconnectionManager.d.ts.map +1 -0
- package/dist/transport/ReconnectionManager.js +63 -0
- package/dist/transport/ReconnectionManager.js.map +1 -0
- package/dist/transport/WebSocketTransport.d.ts +21 -0
- package/dist/transport/WebSocketTransport.d.ts.map +1 -0
- package/dist/transport/WebSocketTransport.js +68 -0
- package/dist/transport/WebSocketTransport.js.map +1 -0
- package/dist/types/logger.d.ts +7 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/logger.js +3 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/market-data.d.ts +38 -0
- package/dist/types/market-data.d.ts.map +1 -0
- package/dist/types/market-data.js +3 -0
- package/dist/types/market-data.js.map +1 -0
- package/dist/types/messages.d.ts +8 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +3 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/primitives.d.ts +29 -0
- package/dist/types/primitives.d.ts.map +1 -0
- package/dist/types/primitives.js +29 -0
- package/dist/types/primitives.js.map +1 -0
- package/dist/types/profile.d.ts +24 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +3 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/raw/asset.d.ts +20 -0
- package/dist/types/raw/asset.d.ts.map +1 -0
- package/dist/types/raw/asset.js +3 -0
- package/dist/types/raw/asset.js.map +1 -0
- package/dist/types/raw/candle.d.ts +15 -0
- package/dist/types/raw/candle.d.ts.map +1 -0
- package/dist/types/raw/candle.js +3 -0
- package/dist/types/raw/candle.js.map +1 -0
- package/dist/types/raw/order.d.ts +31 -0
- package/dist/types/raw/order.d.ts.map +1 -0
- package/dist/types/raw/order.js +3 -0
- package/dist/types/raw/order.js.map +1 -0
- package/dist/types/raw/tick.d.ts +9 -0
- package/dist/types/raw/tick.d.ts.map +1 -0
- package/dist/types/raw/tick.js +3 -0
- package/dist/types/raw/tick.js.map +1 -0
- package/dist/types/trading.d.ts +38 -0
- package/dist/types/trading.d.ts.map +1 -0
- package/dist/types/trading.js +3 -0
- package/dist/types/trading.js.map +1 -0
- package/dist/validators/malformedMessage.d.ts +16 -0
- package/dist/validators/malformedMessage.d.ts.map +1 -0
- package/dist/validators/malformedMessage.js +15 -0
- package/dist/validators/malformedMessage.js.map +1 -0
- package/dist/validators/messageSchema.d.ts +7 -0
- package/dist/validators/messageSchema.d.ts.map +1 -0
- package/dist/validators/messageSchema.js +25 -0
- package/dist/validators/messageSchema.js.map +1 -0
- 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"}
|