@quantform/core 0.3.242 → 0.3.248

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 (42) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +11 -5
  2. package/dist/adapter/adapter-aggregate.js +38 -8
  3. package/dist/adapter/adapter-aggregate.js.map +1 -1
  4. package/dist/adapter/backtester/backtester-adapter.d.ts +1 -2
  5. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  6. package/dist/adapter/backtester/backtester-streamer.d.ts +2 -1
  7. package/dist/adapter/backtester/backtester-streamer.js +8 -7
  8. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  9. package/dist/adapter/backtester/backtester-streamer.spec.js +9 -10
  10. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  11. package/dist/bin.d.ts +3 -4
  12. package/dist/bin.js +6 -6
  13. package/dist/bin.js.map +1 -1
  14. package/dist/ipc.d.ts +6 -12
  15. package/dist/ipc.js +64 -54
  16. package/dist/ipc.js.map +1 -1
  17. package/dist/ipc.spec.js +9 -9
  18. package/dist/ipc.spec.js.map +1 -1
  19. package/dist/session/session-descriptor.d.ts +6 -3
  20. package/dist/session/session.d.ts +2 -2
  21. package/dist/session/session.js +9 -25
  22. package/dist/session/session.js.map +1 -1
  23. package/dist/session/session.spec.js +1 -5
  24. package/dist/session/session.spec.js.map +1 -1
  25. package/dist/store/event/store-order.event.js +0 -8
  26. package/dist/store/event/store-order.event.js.map +1 -1
  27. package/dist/tests/backtester-adapter.spec.js +7 -8
  28. package/dist/tests/backtester-adapter.spec.js.map +1 -1
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +2 -1
  31. package/src/adapter/adapter-aggregate.ts +110 -13
  32. package/src/adapter/backtester/backtester-adapter.ts +2 -3
  33. package/src/adapter/backtester/backtester-streamer.spec.ts +10 -6
  34. package/src/adapter/backtester/backtester-streamer.ts +8 -7
  35. package/src/bin.ts +21 -11
  36. package/src/ipc.spec.ts +9 -8
  37. package/src/ipc.ts +90 -89
  38. package/src/session/session-descriptor.ts +7 -4
  39. package/src/session/session.spec.ts +1 -5
  40. package/src/session/session.ts +10 -49
  41. package/src/store/event/store-order.event.ts +0 -12
  42. package/src/tests/backtester-adapter.spec.ts +11 -7
@@ -1,8 +1,8 @@
1
1
  import { Adapter } from '../adapter';
2
- import { Session } from '.';
3
2
  import { Measurement } from '../storage/measurement';
4
3
  import { Feed } from '../storage';
5
- import { Observable } from 'rxjs';
4
+ import { BacktesterOptions } from './../adapter/backtester';
5
+ import { PaperOptions } from './../adapter/paper';
6
6
 
7
7
  /**
8
8
  * Describes a single session.
@@ -44,7 +44,10 @@ export interface SessionDescriptor {
44
44
  measurement?: Measurement;
45
45
 
46
46
  /**
47
- * Describes your trading strategy.
47
+ * Session additional options.
48
48
  */
49
- describe?: (session: Session) => Observable<any>;
49
+ options?: {
50
+ backtester?: BacktesterOptions;
51
+ paper?: PaperOptions;
52
+ };
50
53
  }
@@ -13,11 +13,7 @@ describe('session tests', () => {
13
13
  };
14
14
 
15
15
  test('should trigger once', done => {
16
- const session = paper(descriptor, {
17
- balance: {
18
- ['binance:btc']: 1.23
19
- }
20
- });
16
+ const session = paper(descriptor);
21
17
 
22
18
  session.instruments().subscribe({
23
19
  next: it => {
@@ -26,12 +26,6 @@ import { AdapterAggregate } from '../adapter/adapter-aggregate';
26
26
  import { Worker, now } from '../shared';
27
27
  import { Trade } from '../domain/trade';
28
28
  import { SessionDescriptor } from './session-descriptor';
29
- import {
30
- AdapterHistoryQuery,
31
- AdapterOrderCancelCommand,
32
- AdapterOrderOpenCommand,
33
- AdapterSubscribeCommand
34
- } from '../adapter';
35
29
 
36
30
  type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
37
31
 
@@ -57,7 +51,7 @@ export class Session {
57
51
  }
58
52
  }
59
53
 
60
- async awake(idle: boolean = false): Promise<void> {
54
+ async awake(describe: (session: Session) => Observable<any>): Promise<void> {
61
55
  if (this.initialized) {
62
56
  return;
63
57
  }
@@ -65,10 +59,10 @@ export class Session {
65
59
  this.initialized = true;
66
60
 
67
61
  // awake all adapters and synchronize trading accounts with store.
68
- await this.aggregate.awake(this.descriptor != null);
62
+ await this.aggregate.awake();
69
63
 
70
- if (!idle && this.descriptor?.describe) {
71
- this.subscription = this.descriptor.describe(this).subscribe();
64
+ if (describe) {
65
+ this.subscription = describe(this).subscribe();
72
66
  }
73
67
  }
74
68
 
@@ -147,24 +141,8 @@ export class Session {
147
141
  * Subscribes to specific instrument. Usually forces adapter to subscribe
148
142
  * for orderbook and ticker streams.
149
143
  */
150
- async subscribe(instrument: Array<InstrumentSelector>): Promise<void> {
151
- const grouped = instrument
152
- .filter(it => it != null)
153
- .reduce((aggregate, it) => {
154
- const adapter = it.base.adapter;
155
-
156
- if (aggregate[adapter]) {
157
- aggregate[adapter].push(it);
158
- } else {
159
- aggregate[adapter] = [it];
160
- }
161
-
162
- return aggregate;
163
- }, {});
164
-
165
- for (const group in grouped) {
166
- this.aggregate.dispatch(group, new AdapterSubscribeCommand(grouped[group]));
167
- }
144
+ subscribe(instrument: Array<InstrumentSelector>): Promise<void> {
145
+ return this.aggregate.subscribe(instrument);
168
146
  }
169
147
 
170
148
  /**
@@ -173,24 +151,14 @@ export class Session {
173
151
  * session.open(Order.buyMarket(instrument, 100));
174
152
  */
175
153
  async open(...orders: Order[]): Promise<void> {
176
- await Promise.all(
177
- orders.map(it =>
178
- this.aggregate.dispatch<AdapterOrderOpenCommand, void>(
179
- it.instrument.base.adapter,
180
- new AdapterOrderOpenCommand(it)
181
- )
182
- )
183
- );
154
+ await Promise.all(orders.map(it => this.aggregate.open(it)));
184
155
  }
185
156
 
186
157
  /**
187
158
  * Cancels specific order.
188
159
  */
189
160
  cancel(order: Order): Promise<void> {
190
- return this.aggregate.dispatch(
191
- order.instrument.base.adapter,
192
- new AdapterOrderCancelCommand(order)
193
- );
161
+ return this.aggregate.cancel(order);
194
162
  }
195
163
 
196
164
  /**
@@ -352,7 +320,7 @@ export class Session {
352
320
  );
353
321
  }
354
322
 
355
- balance(selector?: AssetSelector): Observable<Balance> {
323
+ balance(selector: AssetSelector): Observable<Balance> {
356
324
  return this.store.changes$.pipe(
357
325
  startWith(selector ? this.store.snapshot.balance[selector.toString()] : null),
358
326
  filter(
@@ -372,14 +340,7 @@ export class Session {
372
340
  return this.store.changes$.pipe(
373
341
  startWith(this.store.snapshot.universe.instrument[selector.toString()]),
374
342
  filter(it => it instanceof Instrument && it.toString() == selector.toString()),
375
- switchMap(() =>
376
- from(
377
- this.aggregate.dispatch<AdapterHistoryQuery, Candle[]>(
378
- selector.base.adapter,
379
- new AdapterHistoryQuery(selector, timeframe, length)
380
- )
381
- )
382
- ),
343
+ switchMap(() => from(this.aggregate.history(selector, timeframe, length))),
383
344
  take(1),
384
345
  shareReplay(),
385
346
  mergeMap(it => it)
@@ -12,12 +12,6 @@ export class OrderLoadEvent implements StoreEvent {
12
12
  }
13
13
 
14
14
  export function OrderLoadEventHandler(event: OrderLoadEvent, state: State) {
15
- const instrumentKey = event.order.instrument.toString();
16
-
17
- if (!(instrumentKey in state.subscription.instrument)) {
18
- throw new Error(`Trying to load order for unsubscribed instrument: ${instrumentKey}`);
19
- }
20
-
21
15
  event.order.timestamp = event.timestamp;
22
16
 
23
17
  switch (event.order.state) {
@@ -48,12 +42,6 @@ export class OrderNewEvent implements StoreEvent {
48
42
  }
49
43
 
50
44
  export function OrderNewEventHandler(event: OrderNewEvent, state: State) {
51
- const instrumentKey = event.order.instrument.toString();
52
-
53
- if (!(instrumentKey in state.subscription.instrument)) {
54
- throw new Error(`Trying to order for unsubscribed instrument: ${instrumentKey}`);
55
- }
56
-
57
45
  if (event.order.state != 'NEW') {
58
46
  throw new Error(`Order is not new`);
59
47
  }
@@ -63,13 +63,17 @@ describe('backtester adapter tests', () => {
63
63
  });
64
64
 
65
65
  test('should stream data from input array', done => {
66
- const streamer = new BacktesterStreamer(store, feed, {
67
- balance: {
68
- ['binance:usdt']: 1000
66
+ const streamer = new BacktesterStreamer(
67
+ store,
68
+ feed,
69
+ {
70
+ balance: {
71
+ ['binance:usdt']: 1000
72
+ },
73
+ from: 0,
74
+ to: 100
69
75
  },
70
- from: 0,
71
- to: 100,
72
- listener: {
76
+ {
73
77
  onBacktestCompleted: () => {
74
78
  expect(store.snapshot.timestamp).toEqual(1);
75
79
  expect(store.snapshot.trade[instrument.toString()].rate).toEqual(100);
@@ -78,7 +82,7 @@ describe('backtester adapter tests', () => {
78
82
  done();
79
83
  }
80
84
  }
81
- });
85
+ );
82
86
 
83
87
  feed.save(instrument, [new TradePatchEvent(instrument, 100, 10, 1)]);
84
88