@quantform/core 0.3.247 → 0.3.253
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/adapter/adapter-aggregate.d.ts +11 -5
- package/dist/adapter/adapter-aggregate.js +38 -8
- package/dist/adapter/adapter-aggregate.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.d.ts +3 -2
- package/dist/adapter/backtester/backtester-streamer.js +8 -1
- package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.spec.js +2 -1
- package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
- package/dist/bootstrap.d.ts +11 -0
- package/dist/bootstrap.js +58 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ipc.d.ts +2 -0
- package/dist/ipc.js +32 -35
- package/dist/ipc.js.map +1 -1
- package/dist/session/session.d.ts +2 -1
- package/dist/session/session.js +7 -22
- package/dist/session/session.js.map +1 -1
- package/dist/session/session.spec.js +2 -2
- package/dist/session/session.spec.js.map +1 -1
- package/dist/tests/backtester-adapter.spec.js +2 -2
- package/dist/tests/backtester-adapter.spec.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/adapter/adapter-aggregate.ts +110 -13
- package/src/adapter/backtester/backtester-streamer.spec.ts +2 -0
- package/src/adapter/backtester/backtester-streamer.ts +12 -1
- package/src/bootstrap.ts +108 -0
- package/src/index.ts +1 -1
- package/src/ipc.ts +55 -50
- package/src/session/session.spec.ts +2 -4
- package/src/session/session.ts +7 -46
- package/src/tests/backtester-adapter.spec.ts +3 -2
- package/dist/bin.d.ts +0 -5
- package/dist/bin.js +0 -28
- package/dist/bin.js.map +0 -1
- package/src/bin.ts +0 -71
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { Store } from '../store';
|
|
2
2
|
import { Adapter } from '.';
|
|
3
|
+
import { InstrumentSelector, Order, Candle } from '../domain';
|
|
4
|
+
import { Feed } from './../storage';
|
|
3
5
|
export declare class AdapterAggregate {
|
|
4
6
|
private readonly store;
|
|
5
7
|
private readonly adapter;
|
|
6
|
-
constructor(
|
|
7
|
-
|
|
8
|
+
constructor(adapters: Adapter[], store: Store);
|
|
9
|
+
get(adapterName: string): Adapter;
|
|
10
|
+
awake(): Promise<void>;
|
|
8
11
|
dispose(): Promise<any>;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
subscribe(selectors: InstrumentSelector[]): Promise<void>;
|
|
13
|
+
open(order: Order): Promise<void>;
|
|
14
|
+
cancel(order: Order): Promise<void>;
|
|
15
|
+
history(selector: InstrumentSelector, timeframe: number, length: number): Promise<Candle[]>;
|
|
16
|
+
feed(selector: InstrumentSelector, from: number, to: number, destination: Feed, callback: (timestamp: number) => void): Promise<void>;
|
|
17
|
+
private dispatch;
|
|
12
18
|
}
|
|
@@ -5,17 +5,18 @@ const _1 = require(".");
|
|
|
5
5
|
const shared_1 = require("../shared");
|
|
6
6
|
const adapter_event_1 = require("./adapter.event");
|
|
7
7
|
class AdapterAggregate {
|
|
8
|
-
constructor(
|
|
8
|
+
constructor(adapters, store) {
|
|
9
9
|
this.store = store;
|
|
10
10
|
this.adapter = {};
|
|
11
11
|
adapters.forEach(it => (this.adapter[it.name] = it));
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
get(adapterName) {
|
|
14
|
+
return this.adapter[adapterName];
|
|
15
|
+
}
|
|
16
|
+
async awake() {
|
|
14
17
|
for (const adapter in this.adapter) {
|
|
15
18
|
await this.dispatch(adapter, new adapter_event_1.AdapterAwakeCommand());
|
|
16
|
-
|
|
17
|
-
await this.dispatch(adapter, new adapter_event_1.AdapterAccountCommand());
|
|
18
|
-
}
|
|
19
|
+
await this.dispatch(adapter, new adapter_event_1.AdapterAccountCommand());
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
async dispose() {
|
|
@@ -23,13 +24,42 @@ class AdapterAggregate {
|
|
|
23
24
|
await this.dispatch(adapter, new adapter_event_1.AdapterDisposeCommand());
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
-
const
|
|
27
|
+
async subscribe(selectors) {
|
|
28
|
+
const grouped = selectors
|
|
29
|
+
.filter(it => it != null)
|
|
30
|
+
.reduce((aggregate, it) => {
|
|
31
|
+
const adapter = it.base.adapter;
|
|
32
|
+
if (aggregate[adapter]) {
|
|
33
|
+
aggregate[adapter].push(it);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
aggregate[adapter] = [it];
|
|
37
|
+
}
|
|
38
|
+
return aggregate;
|
|
39
|
+
}, {});
|
|
40
|
+
for (const adapterName in grouped) {
|
|
41
|
+
await this.dispatch(adapterName, new adapter_event_1.AdapterSubscribeCommand(grouped[adapterName]));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
open(order) {
|
|
45
|
+
return this.dispatch(order.instrument.base.adapter, new adapter_event_1.AdapterOrderOpenCommand(order));
|
|
46
|
+
}
|
|
47
|
+
cancel(order) {
|
|
48
|
+
return this.dispatch(order.instrument.base.adapter, new adapter_event_1.AdapterOrderCancelCommand(order));
|
|
49
|
+
}
|
|
50
|
+
history(selector, timeframe, length) {
|
|
51
|
+
return this.dispatch(selector.base.adapter, new adapter_event_1.AdapterHistoryQuery(selector, timeframe, length));
|
|
52
|
+
}
|
|
53
|
+
feed(selector, from, to, destination, callback) {
|
|
54
|
+
return this.dispatch(selector.base.adapter, new adapter_event_1.AdapterFeedCommand(selector, from, to, destination, callback));
|
|
55
|
+
}
|
|
56
|
+
dispatch(adapterName, command) {
|
|
57
|
+
const adapter = this.get(adapterName);
|
|
28
58
|
if (!adapter) {
|
|
29
59
|
throw new Error(`Unknown adapter: ${adapterName}. You should provide adapter in session descriptor.`);
|
|
30
60
|
}
|
|
31
61
|
try {
|
|
32
|
-
return adapter.dispatch(
|
|
62
|
+
return adapter.dispatch(command, new _1.AdapterContext(adapter, this.store));
|
|
33
63
|
}
|
|
34
64
|
catch (e) {
|
|
35
65
|
shared_1.Logger.error(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-aggregate.js","sourceRoot":"","sources":["../../src/adapter/adapter-aggregate.ts"],"names":[],"mappings":";;;AACA,wBAA4C;AAC5C,sCAAmC;AACnC,
|
|
1
|
+
{"version":3,"file":"adapter-aggregate.js","sourceRoot":"","sources":["../../src/adapter/adapter-aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { InstrumentSelector } from '../../domain';
|
|
2
2
|
import { Store } from '../../store';
|
|
3
|
-
import { timestamp } from '../../shared';
|
|
3
|
+
import { timestamp, Worker } from '../../shared';
|
|
4
4
|
import { Feed } from '../../storage';
|
|
5
5
|
import { BacktesterOptions } from './backtester-adapter';
|
|
6
6
|
export interface BacktesterListener {
|
|
@@ -9,6 +9,7 @@ export interface BacktesterListener {
|
|
|
9
9
|
onBacktestCompleted?(streamer: BacktesterStreamer): void;
|
|
10
10
|
}
|
|
11
11
|
export declare class BacktesterStreamer {
|
|
12
|
+
private readonly worker;
|
|
12
13
|
private readonly store;
|
|
13
14
|
private readonly feed;
|
|
14
15
|
private readonly options;
|
|
@@ -18,7 +19,7 @@ export declare class BacktesterStreamer {
|
|
|
18
19
|
private stopAcquire;
|
|
19
20
|
timestamp: timestamp;
|
|
20
21
|
sequence: number;
|
|
21
|
-
constructor(store: Store, feed: Feed, options: BacktesterOptions, listener?: BacktesterListener);
|
|
22
|
+
constructor(worker: Worker, store: Store, feed: Feed, options: BacktesterOptions, listener?: BacktesterListener);
|
|
22
23
|
subscribe(instrument: InstrumentSelector): void;
|
|
23
24
|
stop(): void;
|
|
24
25
|
tryContinue(): Promise<void>;
|
|
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.BacktesterStreamer = void 0;
|
|
4
4
|
const backtester_cursor_1 = require("./backtester-cursor");
|
|
5
5
|
class BacktesterStreamer {
|
|
6
|
-
constructor(store, feed, options, listener) {
|
|
6
|
+
constructor(worker, store, feed, options, listener) {
|
|
7
|
+
this.worker = worker;
|
|
7
8
|
this.store = store;
|
|
8
9
|
this.feed = feed;
|
|
9
10
|
this.options = options;
|
|
@@ -12,6 +13,9 @@ class BacktesterStreamer {
|
|
|
12
13
|
this.cursor = {};
|
|
13
14
|
this.stopAcquire = 1;
|
|
14
15
|
this.sequence = 0;
|
|
16
|
+
if (options.from == undefined || options.to == undefined) {
|
|
17
|
+
throw new Error('invalid backtest options, please provide from and to period.');
|
|
18
|
+
}
|
|
15
19
|
this.timestamp = this.options.from;
|
|
16
20
|
}
|
|
17
21
|
subscribe(instrument) {
|
|
@@ -34,12 +38,14 @@ class BacktesterStreamer {
|
|
|
34
38
|
}
|
|
35
39
|
if (this.sequence == 0) {
|
|
36
40
|
if (this.listener.onBacktestStarted) {
|
|
41
|
+
await this.worker.wait();
|
|
37
42
|
this.listener.onBacktestStarted(this);
|
|
38
43
|
}
|
|
39
44
|
}
|
|
40
45
|
while (await this.processNext()) {
|
|
41
46
|
if (this.sequence % this.sequenceUpdateBatch == 0) {
|
|
42
47
|
if (this.listener.onBacktestUpdated) {
|
|
48
|
+
await this.worker.wait();
|
|
43
49
|
this.listener.onBacktestUpdated(this);
|
|
44
50
|
}
|
|
45
51
|
}
|
|
@@ -48,6 +54,7 @@ class BacktesterStreamer {
|
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
if (this.listener.onBacktestCompleted) {
|
|
57
|
+
await this.worker.wait();
|
|
51
58
|
this.listener.onBacktestCompleted(this);
|
|
52
59
|
}
|
|
53
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backtester-streamer.js","sourceRoot":"","sources":["../../../src/adapter/backtester/backtester-streamer.ts"],"names":[],"mappings":";;;AACA,2DAAuD;AA0BvD,MAAa,kBAAkB;IAQ7B,YACmB,KAAY,EACZ,IAAU,EACV,OAA0B,EAC1B,QAA6B;
|
|
1
|
+
{"version":3,"file":"backtester-streamer.js","sourceRoot":"","sources":["../../../src/adapter/backtester/backtester-streamer.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ const domain_1 = require("../../domain");
|
|
|
5
5
|
const storage_1 = require("../../storage");
|
|
6
6
|
const event_1 = require("../../store/event");
|
|
7
7
|
const backtester_streamer_1 = require("./backtester-streamer");
|
|
8
|
+
const shared_1 = require("../../shared");
|
|
8
9
|
const instrument = new domain_1.Instrument(new domain_1.Asset('btc', 'binance', 8), new domain_1.Asset('usdt', 'binance', 2), 'binance:btc-usdt');
|
|
9
10
|
describe('backtester streamer tests', () => {
|
|
10
11
|
test('should repeat specific events', done => {
|
|
@@ -12,7 +13,7 @@ describe('backtester streamer tests', () => {
|
|
|
12
13
|
const store = new store_1.Store();
|
|
13
14
|
store.snapshot.universe.instrument[instrument.toString()] = instrument;
|
|
14
15
|
store.snapshot.subscription.instrument[instrument.toString()] = instrument;
|
|
15
|
-
const streamer = new backtester_streamer_1.BacktesterStreamer(store, feed, {
|
|
16
|
+
const streamer = new backtester_streamer_1.BacktesterStreamer(new shared_1.Worker(), store, feed, {
|
|
16
17
|
balance: {},
|
|
17
18
|
from: 0,
|
|
18
19
|
to: 10
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backtester-streamer.spec.js","sourceRoot":"","sources":["../../../src/adapter/backtester/backtester-streamer.spec.ts"],"names":[],"mappings":";;AAAA,uCAAoC;AACpC,yCAA4D;AAC5D,2CAAsD;AACtD,6CAAgD;AAChD,+DAA2D;
|
|
1
|
+
{"version":3,"file":"backtester-streamer.spec.js","sourceRoot":"","sources":["../../../src/adapter/backtester/backtester-streamer.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BacktesterListener, BacktesterStreamer } from './adapter/backtester';
|
|
2
|
+
import { Session, SessionDescriptor } from './session';
|
|
3
|
+
export declare class Bootstrap {
|
|
4
|
+
readonly descriptor: SessionDescriptor;
|
|
5
|
+
constructor(descriptor: SessionDescriptor);
|
|
6
|
+
useSessionId(id?: number): Bootstrap;
|
|
7
|
+
useBacktestPeriod(from?: number, to?: number): Bootstrap;
|
|
8
|
+
backtest(listener?: BacktesterListener): [Session, BacktesterStreamer];
|
|
9
|
+
paper(): Session;
|
|
10
|
+
live(): Session;
|
|
11
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Bootstrap = void 0;
|
|
4
|
+
const backtester_1 = require("./adapter/backtester");
|
|
5
|
+
const adapter_1 = require("./adapter");
|
|
6
|
+
const paper_1 = require("./adapter/paper");
|
|
7
|
+
const session_1 = require("./session");
|
|
8
|
+
const store_1 = require("./store");
|
|
9
|
+
class Bootstrap {
|
|
10
|
+
constructor(descriptor) {
|
|
11
|
+
this.descriptor = descriptor;
|
|
12
|
+
}
|
|
13
|
+
useSessionId(id) {
|
|
14
|
+
if (id) {
|
|
15
|
+
this.descriptor.id = id;
|
|
16
|
+
}
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
useBacktestPeriod(from, to) {
|
|
20
|
+
if (from) {
|
|
21
|
+
this.descriptor.options.backtester.from = from;
|
|
22
|
+
}
|
|
23
|
+
if (to) {
|
|
24
|
+
this.descriptor.options.backtester.to = to;
|
|
25
|
+
}
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
backtest(listener) {
|
|
29
|
+
const store = new store_1.Store();
|
|
30
|
+
const { feed } = this.descriptor;
|
|
31
|
+
const { backtester } = this.descriptor.options;
|
|
32
|
+
const aggregate = new adapter_1.AdapterAggregate(this.descriptor.adapter.map(it => new paper_1.PaperAdapter(new backtester_1.BacktesterAdapter(it, streamer), store, backtester)), store);
|
|
33
|
+
const session = new session_1.Session(store, aggregate, this.descriptor);
|
|
34
|
+
const streamer = new backtester_1.BacktesterStreamer(session.worker, store, feed, backtester, listener);
|
|
35
|
+
return [session, streamer];
|
|
36
|
+
}
|
|
37
|
+
paper() {
|
|
38
|
+
if (!this.descriptor.options) {
|
|
39
|
+
this.descriptor.options = {};
|
|
40
|
+
}
|
|
41
|
+
if (!this.descriptor.options.paper) {
|
|
42
|
+
this.descriptor.options.paper = {
|
|
43
|
+
balance: {}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const store = new store_1.Store();
|
|
47
|
+
const { paper } = this.descriptor.options;
|
|
48
|
+
const aggregate = new adapter_1.AdapterAggregate(this.descriptor.adapter.map(it => new paper_1.PaperAdapter(it, store, paper)), store);
|
|
49
|
+
return new session_1.Session(store, aggregate, this.descriptor);
|
|
50
|
+
}
|
|
51
|
+
live() {
|
|
52
|
+
const store = new store_1.Store();
|
|
53
|
+
const aggregate = new adapter_1.AdapterAggregate(this.descriptor.adapter, store);
|
|
54
|
+
return new session_1.Session(store, aggregate, this.descriptor);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.Bootstrap = Bootstrap;
|
|
58
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";;;AAAA,qDAI8B;AAC9B,uCAA6C;AAC7C,2CAA+C;AAC/C,uCAAuD;AACvD,mCAAgC;AAEhC,MAAa,SAAS;IACpB,YAAqB,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAMtD,YAAY,CAAC,EAAW;QACtB,IAAI,EAAE,EAAE;YACN,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;SACzB;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,iBAAiB,CAAC,IAAa,EAAE,EAAW;QAC1C,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;SAChD;QAED,IAAI,EAAE,EAAE;YACN,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;SAC5C;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,QAAQ,CAAC,QAA6B;QACpC,MAAM,KAAK,GAAG,IAAI,aAAK,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAE/C,MAAM,SAAS,GAAG,IAAI,0BAAgB,CACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CACzB,EAAE,CAAC,EAAE,CAAC,IAAI,oBAAY,CAAC,IAAI,8BAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAC/E,EACD,KAAK,CACN,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,+BAAkB,CACrC,OAAO,CAAC,MAAM,EACd,KAAK,EACL,IAAI,EACJ,UAAU,EACV,QAAQ,CACT,CAAC;QAEF,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAMD,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE;YAClC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,GAAG;gBAC9B,OAAO,EAAE,EAAE;aACZ,CAAC;SACH;QAED,MAAM,KAAK,GAAG,IAAI,aAAK,EAAE,CAAC;QAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAI,0BAAgB,CACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,oBAAY,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EACrE,KAAK,CACN,CAAC;QAEF,OAAO,IAAI,iBAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAMD,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,aAAK,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,0BAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEvE,OAAO,IAAI,iBAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;CACF;AAjGD,8BAiGC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -20,6 +20,6 @@ __exportStar(require("./session"), exports);
|
|
|
20
20
|
__exportStar(require("./storage"), exports);
|
|
21
21
|
__exportStar(require("./store"), exports);
|
|
22
22
|
__exportStar(require("./store/event"), exports);
|
|
23
|
-
__exportStar(require("./
|
|
23
|
+
__exportStar(require("./bootstrap"), exports);
|
|
24
24
|
__exportStar(require("./ipc"), exports);
|
|
25
25
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,4CAA0B;AAC1B,uDAAqC;AACrC,kDAAgC;AAChC,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,0CAAwB;AACxB,gDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,4CAA0B;AAC1B,uDAAqC;AACrC,kDAAgC;AAChC,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAC5B,wCAAsB"}
|
package/dist/ipc.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export declare class IpcPaperCommand implements IpcCommand {
|
|
|
14
14
|
}
|
|
15
15
|
export declare class IpcBacktestCommand implements IpcCommand {
|
|
16
16
|
type: string;
|
|
17
|
+
from?: number;
|
|
18
|
+
to?: number;
|
|
17
19
|
}
|
|
18
20
|
export declare class IpcFeedCommand implements IpcCommand {
|
|
19
21
|
type: string;
|
package/dist/ipc.js
CHANGED
|
@@ -10,11 +10,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.run = exports.IpcTaskCommand = exports.IpcFeedCommand = exports.IpcBacktestCommand = exports.IpcPaperCommand = exports.IpcLiveCommand = void 0;
|
|
13
|
-
const adapter_1 = require("./adapter");
|
|
14
13
|
const domain_1 = require("./domain");
|
|
15
14
|
const topic_1 = require("./shared/topic");
|
|
16
15
|
const shared_1 = require("./shared");
|
|
17
|
-
const
|
|
16
|
+
const bootstrap_1 = require("./bootstrap");
|
|
18
17
|
const path_1 = require("path");
|
|
19
18
|
const minimist = require("minimist");
|
|
20
19
|
const dotenv = require("dotenv");
|
|
@@ -67,17 +66,15 @@ exports.IpcTaskCommand = IpcTaskCommand;
|
|
|
67
66
|
class IpcSessionAccessor {
|
|
68
67
|
}
|
|
69
68
|
class IpcHandler extends topic_1.Topic {
|
|
70
|
-
constructor(
|
|
69
|
+
constructor(bootstrap, ipcSub) {
|
|
71
70
|
super();
|
|
72
|
-
this.
|
|
71
|
+
this.bootstrap = bootstrap;
|
|
72
|
+
this.ipcSub = ipcSub;
|
|
73
73
|
}
|
|
74
74
|
async onLiveMode(command, accessor) {
|
|
75
75
|
var _a;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
accessor.session = (0, bin_1.live)(this.descriptor);
|
|
80
|
-
this.notify({
|
|
76
|
+
accessor.session = this.bootstrap.useSessionId(command.id).live();
|
|
77
|
+
this.emit({
|
|
81
78
|
type: 'live:started',
|
|
82
79
|
session: (_a = accessor.session.descriptor) === null || _a === void 0 ? void 0 : _a.id
|
|
83
80
|
});
|
|
@@ -85,48 +82,47 @@ class IpcHandler extends topic_1.Topic {
|
|
|
85
82
|
}
|
|
86
83
|
async onPaperMode(command, accessor) {
|
|
87
84
|
var _a;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
accessor.session = (0, bin_1.paper)(this.descriptor);
|
|
92
|
-
this.notify({
|
|
85
|
+
accessor.session = this.bootstrap.useSessionId(command.id).paper();
|
|
86
|
+
this.emit({
|
|
93
87
|
type: 'paper:started',
|
|
94
88
|
session: (_a = accessor.session.descriptor) === null || _a === void 0 ? void 0 : _a.id
|
|
95
89
|
});
|
|
96
90
|
await accessor.session.awake(this.describe());
|
|
97
91
|
}
|
|
98
92
|
onBacktestMode(command, accessor) {
|
|
93
|
+
this.bootstrap.useBacktestPeriod(command.from, command.to).backtest();
|
|
94
|
+
const { from, to } = this.bootstrap.descriptor.options.backtester;
|
|
99
95
|
return new Promise(async (resolve) => {
|
|
100
|
-
const [session, streamer] =
|
|
96
|
+
const [session, streamer] = this.bootstrap.backtest({
|
|
101
97
|
onBacktestStarted: (streamer) => {
|
|
102
98
|
var _a;
|
|
103
|
-
this.
|
|
99
|
+
this.emit({
|
|
104
100
|
type: 'backtest:started',
|
|
105
101
|
session: (_a = session.descriptor) === null || _a === void 0 ? void 0 : _a.id,
|
|
106
102
|
timestamp: streamer.timestamp,
|
|
107
|
-
from
|
|
108
|
-
to
|
|
103
|
+
from,
|
|
104
|
+
to
|
|
109
105
|
});
|
|
110
106
|
},
|
|
111
107
|
onBacktestUpdated: (streamer) => {
|
|
112
108
|
var _a;
|
|
113
|
-
this.
|
|
109
|
+
this.emit({
|
|
114
110
|
type: 'backtest:updated',
|
|
115
111
|
session: (_a = session.descriptor) === null || _a === void 0 ? void 0 : _a.id,
|
|
116
112
|
timestamp: streamer.timestamp,
|
|
117
|
-
from
|
|
118
|
-
to
|
|
113
|
+
from,
|
|
114
|
+
to
|
|
119
115
|
});
|
|
120
116
|
},
|
|
121
117
|
onBacktestCompleted: async (streamer) => {
|
|
122
118
|
var _a;
|
|
123
119
|
await accessor.session.dispose();
|
|
124
|
-
this.
|
|
120
|
+
this.emit({
|
|
125
121
|
type: 'backtest:completed',
|
|
126
122
|
session: (_a = session.descriptor) === null || _a === void 0 ? void 0 : _a.id,
|
|
127
123
|
timestamp: streamer.timestamp,
|
|
128
|
-
from
|
|
129
|
-
to
|
|
124
|
+
from,
|
|
125
|
+
to
|
|
130
126
|
});
|
|
131
127
|
resolve();
|
|
132
128
|
}
|
|
@@ -138,24 +134,25 @@ class IpcHandler extends topic_1.Topic {
|
|
|
138
134
|
}
|
|
139
135
|
async onFeed(command, accessor) {
|
|
140
136
|
var _a;
|
|
141
|
-
accessor.session = (_a = accessor.session) !== null && _a !== void 0 ? _a :
|
|
137
|
+
accessor.session = (_a = accessor.session) !== null && _a !== void 0 ? _a : this.bootstrap.paper();
|
|
142
138
|
const instrument = (0, domain_1.instrumentOf)(command.instrument);
|
|
139
|
+
const { feed } = accessor.session.descriptor;
|
|
143
140
|
await accessor.session.awake(undefined);
|
|
144
|
-
this.
|
|
145
|
-
await accessor.session.aggregate.
|
|
141
|
+
this.emit({ type: 'feed:started' });
|
|
142
|
+
await accessor.session.aggregate.feed(instrument, command.from, command.to, feed, timestamp => this.emit({
|
|
146
143
|
type: 'feed:updated',
|
|
147
144
|
timestamp,
|
|
148
145
|
from: command.from,
|
|
149
146
|
to: command.to
|
|
150
|
-
}))
|
|
151
|
-
this.
|
|
147
|
+
}));
|
|
148
|
+
this.emit({ type: 'feed:completed' });
|
|
152
149
|
await accessor.session.dispose();
|
|
153
150
|
}
|
|
154
151
|
async onTask(query, accessor) {
|
|
155
152
|
var _a;
|
|
156
|
-
accessor.session = (_a = accessor.session) !== null && _a !== void 0 ? _a :
|
|
153
|
+
accessor.session = (_a = accessor.session) !== null && _a !== void 0 ? _a : this.bootstrap.live();
|
|
157
154
|
await accessor.session.awake(undefined);
|
|
158
|
-
this.
|
|
155
|
+
this.emit({ type: 'task:started', taskName: query.taskName });
|
|
159
156
|
let result = undefined;
|
|
160
157
|
try {
|
|
161
158
|
result = await (0, shared_1.runTask)(query.taskName, accessor.session);
|
|
@@ -163,7 +160,7 @@ class IpcHandler extends topic_1.Topic {
|
|
|
163
160
|
catch (e) {
|
|
164
161
|
result = e;
|
|
165
162
|
}
|
|
166
|
-
this.
|
|
163
|
+
this.emit({ type: 'task:completed', taskName: query.taskName, result });
|
|
167
164
|
await accessor.session.dispose();
|
|
168
165
|
}
|
|
169
166
|
describe() {
|
|
@@ -175,12 +172,12 @@ class IpcHandler extends topic_1.Topic {
|
|
|
175
172
|
}
|
|
176
173
|
return undefined;
|
|
177
174
|
}
|
|
178
|
-
|
|
175
|
+
emit(message) {
|
|
179
176
|
var _a;
|
|
180
177
|
if (process.send) {
|
|
181
178
|
process.send(message);
|
|
182
179
|
}
|
|
183
|
-
(_a = this.
|
|
180
|
+
(_a = this.ipcSub) === null || _a === void 0 ? void 0 : _a.emit('message', message);
|
|
184
181
|
}
|
|
185
182
|
}
|
|
186
183
|
__decorate([
|
|
@@ -214,7 +211,7 @@ __decorate([
|
|
|
214
211
|
__metadata("design:returntype", Promise)
|
|
215
212
|
], IpcHandler.prototype, "onTask", null);
|
|
216
213
|
async function run(descriptor, ...commands) {
|
|
217
|
-
const handler = new IpcHandler(descriptor);
|
|
214
|
+
const handler = new IpcHandler(new bootstrap_1.Bootstrap(descriptor), descriptor.ipcSub);
|
|
218
215
|
const accessor = new IpcSessionAccessor();
|
|
219
216
|
const argv = minimist(process.argv.slice(2));
|
|
220
217
|
if (argv.command) {
|
package/dist/ipc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { AssetSelector, Balance, Candle, Instrument, InstrumentSelector, Order,
|
|
|
2
2
|
import { Store } from '../store';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import { AdapterAggregate } from '../adapter/adapter-aggregate';
|
|
5
|
+
import { Worker } from '../shared';
|
|
5
6
|
import { Trade } from '../domain/trade';
|
|
6
7
|
import { SessionDescriptor } from './session-descriptor';
|
|
7
8
|
declare type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
|
|
@@ -11,9 +12,9 @@ export declare class Session {
|
|
|
11
12
|
readonly descriptor?: SessionDescriptor;
|
|
12
13
|
private initialized;
|
|
13
14
|
private subscription;
|
|
14
|
-
private worker;
|
|
15
15
|
get timestamp(): number;
|
|
16
16
|
readonly statement: Record<string, Record<string, any>>;
|
|
17
|
+
readonly worker: Worker;
|
|
17
18
|
constructor(store: Store, aggregate: AdapterAggregate, descriptor?: SessionDescriptor);
|
|
18
19
|
awake(describe: (session: Session) => Observable<any>): Promise<void>;
|
|
19
20
|
dispose(): Promise<void>;
|
package/dist/session/session.js
CHANGED
|
@@ -6,15 +6,14 @@ const domain_1 = require("../domain");
|
|
|
6
6
|
const rxjs_1 = require("rxjs");
|
|
7
7
|
const shared_1 = require("../shared");
|
|
8
8
|
const trade_1 = require("../domain/trade");
|
|
9
|
-
const adapter_1 = require("../adapter");
|
|
10
9
|
class Session {
|
|
11
10
|
constructor(store, aggregate, descriptor) {
|
|
12
11
|
this.store = store;
|
|
13
12
|
this.aggregate = aggregate;
|
|
14
13
|
this.descriptor = descriptor;
|
|
15
14
|
this.initialized = false;
|
|
16
|
-
this.worker = new shared_1.Worker();
|
|
17
15
|
this.statement = {};
|
|
16
|
+
this.worker = new shared_1.Worker();
|
|
18
17
|
if (descriptor && !descriptor.id) {
|
|
19
18
|
descriptor.id = (0, shared_1.now)();
|
|
20
19
|
}
|
|
@@ -27,7 +26,7 @@ class Session {
|
|
|
27
26
|
return;
|
|
28
27
|
}
|
|
29
28
|
this.initialized = true;
|
|
30
|
-
await this.aggregate.awake(
|
|
29
|
+
await this.aggregate.awake();
|
|
31
30
|
if (describe) {
|
|
32
31
|
this.subscription = describe(this).subscribe();
|
|
33
32
|
}
|
|
@@ -67,28 +66,14 @@ class Session {
|
|
|
67
66
|
useOptimizer(path) {
|
|
68
67
|
return undefined;
|
|
69
68
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
.filter(it => it != null)
|
|
73
|
-
.reduce((aggregate, it) => {
|
|
74
|
-
const adapter = it.base.adapter;
|
|
75
|
-
if (aggregate[adapter]) {
|
|
76
|
-
aggregate[adapter].push(it);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
aggregate[adapter] = [it];
|
|
80
|
-
}
|
|
81
|
-
return aggregate;
|
|
82
|
-
}, {});
|
|
83
|
-
for (const group in grouped) {
|
|
84
|
-
this.aggregate.dispatch(group, new adapter_1.AdapterSubscribeCommand(grouped[group]));
|
|
85
|
-
}
|
|
69
|
+
subscribe(instrument) {
|
|
70
|
+
return this.aggregate.subscribe(instrument);
|
|
86
71
|
}
|
|
87
72
|
async open(...orders) {
|
|
88
|
-
await Promise.all(orders.map(it => this.aggregate.
|
|
73
|
+
await Promise.all(orders.map(it => this.aggregate.open(it)));
|
|
89
74
|
}
|
|
90
75
|
cancel(order) {
|
|
91
|
-
return this.aggregate.
|
|
76
|
+
return this.aggregate.cancel(order);
|
|
92
77
|
}
|
|
93
78
|
instrument(selector) {
|
|
94
79
|
this.subscribe([selector]);
|
|
@@ -145,7 +130,7 @@ class Session {
|
|
|
145
130
|
(!selector || it.asset.toString() == selector.toString())), (0, operators_1.map)(it => it));
|
|
146
131
|
}
|
|
147
132
|
history(selector, timeframe, length) {
|
|
148
|
-
return this.store.changes$.pipe((0, operators_1.startWith)(this.store.snapshot.universe.instrument[selector.toString()]), (0, operators_1.filter)(it => it instanceof domain_1.Instrument && it.toString() == selector.toString()), (0, operators_1.switchMap)(() => (0, rxjs_1.from)(this.aggregate.
|
|
133
|
+
return this.store.changes$.pipe((0, operators_1.startWith)(this.store.snapshot.universe.instrument[selector.toString()]), (0, operators_1.filter)(it => it instanceof domain_1.Instrument && it.toString() == selector.toString()), (0, operators_1.switchMap)(() => (0, rxjs_1.from)(this.aggregate.history(selector, timeframe, length))), (0, operators_1.take)(1), (0, operators_1.shareReplay)(), (0, operators_1.mergeMap)(it => it));
|
|
149
134
|
}
|
|
150
135
|
}
|
|
151
136
|
exports.Session = Session;
|