@quantform/core 0.3.232 → 0.3.238

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 (36) hide show
  1. package/dist/adapter/adapter.event.js +1 -1
  2. package/dist/adapter/adapter.event.js.map +1 -1
  3. package/dist/adapter/backtester/backtester-adapter.d.ts +2 -3
  4. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  5. package/dist/adapter/backtester/backtester-streamer.d.ts +6 -0
  6. package/dist/adapter/backtester/backtester-streamer.js +10 -7
  7. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  8. package/dist/adapter/backtester/backtester-streamer.spec.js +9 -7
  9. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  10. package/dist/domain/instrument.js.map +1 -1
  11. package/dist/domain/orderbook.d.ts +1 -0
  12. package/dist/domain/orderbook.js.map +1 -1
  13. package/dist/domain/trade.js.map +1 -1
  14. package/dist/ipc.js +43 -12
  15. package/dist/ipc.js.map +1 -1
  16. package/dist/ipc.spec.d.ts +1 -0
  17. package/dist/ipc.spec.js +67 -0
  18. package/dist/ipc.spec.js.map +1 -0
  19. package/dist/session/session.js +2 -1
  20. package/dist/session/session.js.map +1 -1
  21. package/dist/tests/backtester-adapter.spec.js +7 -5
  22. package/dist/tests/backtester-adapter.spec.js.map +1 -1
  23. package/dist/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +1 -1
  25. package/src/adapter/adapter.event.ts +1 -1
  26. package/src/adapter/backtester/backtester-adapter.ts +2 -3
  27. package/src/adapter/backtester/backtester-streamer.spec.ts +9 -7
  28. package/src/adapter/backtester/backtester-streamer.ts +36 -7
  29. package/src/domain/asset.ts +3 -3
  30. package/src/domain/instrument.ts +3 -0
  31. package/src/domain/orderbook.ts +4 -1
  32. package/src/domain/trade.ts +4 -0
  33. package/src/ipc.spec.ts +56 -0
  34. package/src/ipc.ts +43 -17
  35. package/src/session/session.ts +1 -1
  36. package/src/tests/backtester-adapter.spec.ts +7 -5
@@ -58,21 +58,21 @@ export class Asset extends AssetSelector {
58
58
  }
59
59
 
60
60
  /**
61
- * Trims a number to the specified precision.
61
+ * Trims a number to the asset precision.
62
62
  */
63
63
  fixed(number: number): number {
64
64
  return fixed(number, this.scale);
65
65
  }
66
66
 
67
67
  /**
68
- * Rounds down a number to the specified precision.
68
+ * Rounds down a number to the asset precision.
69
69
  */
70
70
  floor(number: number): number {
71
71
  return floor(number, this.scale);
72
72
  }
73
73
 
74
74
  /**
75
- * Rounds up a number to the specified precision.
75
+ * Rounds up a number to the asset precision.
76
76
  */
77
77
  ceil(number: number): number {
78
78
  return ceil(number, this.scale);
@@ -21,6 +21,9 @@ export class InstrumentSelector {
21
21
  }
22
22
  }
23
23
 
24
+ /**
25
+ * Represents trading market which is made up by two trading assets (base and quoted).
26
+ */
24
27
  export class Instrument extends InstrumentSelector implements Component {
25
28
  timestamp: timestamp;
26
29
  commission: Commission;
@@ -2,13 +2,16 @@ import { timestamp } from '../shared';
2
2
  import { Instrument } from '../domain';
3
3
  import { Component } from './component';
4
4
 
5
+ /**
6
+ * Provides an access to pending buy and sell orders on the specific market.
7
+ */
5
8
  export class Orderbook implements Component {
6
9
  timestamp: timestamp;
7
10
  bestAskRate: number;
8
11
  bestAskQuantity: number;
9
12
  bestBidRate: number;
10
13
  bestBidQuantity: number;
11
-
14
+ az;
12
15
  get midRate(): number {
13
16
  return this.instrument.quote.fixed((this.bestAskRate + this.bestBidRate) / 2);
14
17
  }
@@ -2,6 +2,10 @@ import { timestamp } from '../shared';
2
2
  import { Instrument } from '.';
3
3
  import { Component } from './component';
4
4
 
5
+ /**
6
+ * Simple trade or ticker executed on the market, it's a match of buyer
7
+ * and seller of the same asset.
8
+ */
5
9
  export class Trade implements Component {
6
10
  timestamp: timestamp;
7
11
  rate: number;
@@ -0,0 +1,56 @@
1
+ import { Session } from './session';
2
+ import {
3
+ Adapter,
4
+ AdapterFeedCommand,
5
+ AdapterAwakeCommand,
6
+ AdapterAccountCommand
7
+ } from './adapter';
8
+ import { PaperAdapter, PaperSpotExecutor } from './adapter/paper';
9
+ import { PaperExecutor } from './adapter/paper/executor/paper-executor';
10
+ import { IpcFeedCommand, run } from './ipc';
11
+ import { Feed, InMemoryStorage } from './storage';
12
+ import { instrumentOf } from './domain';
13
+ import { handler } from './shared';
14
+
15
+ class DefaultAdapter extends Adapter {
16
+ name = 'default';
17
+
18
+ timestamp() {
19
+ return 123;
20
+ }
21
+
22
+ createPaperExecutor(adapter: PaperAdapter): PaperExecutor {
23
+ return new PaperSpotExecutor(adapter);
24
+ }
25
+
26
+ @handler(AdapterAwakeCommand)
27
+ onAwake(command: AdapterAwakeCommand) {}
28
+
29
+ @handler(AdapterAccountCommand)
30
+ onAccount(command: AdapterAccountCommand) {}
31
+
32
+ @handler(AdapterFeedCommand)
33
+ onFeed(command: AdapterFeedCommand) {}
34
+ }
35
+
36
+ describe('ipc feed tests', () => {
37
+ test('should trigger adapter feed command', async () => {
38
+ const command = {
39
+ type: 'feed',
40
+ instrument: 'default:btc-usdt',
41
+ from: 0,
42
+ to: 100
43
+ };
44
+
45
+ const session = await run(
46
+ {
47
+ adapter: [new DefaultAdapter()],
48
+ feed: new Feed(new InMemoryStorage()),
49
+ describe: (session: Session) => session.trade(instrumentOf('default:btc-usdt'))
50
+ },
51
+ command
52
+ );
53
+
54
+ expect(session.descriptor).toBeUndefined();
55
+ });
56
+ });
package/src/ipc.ts CHANGED
@@ -4,6 +4,7 @@ import { instrumentOf } from './domain';
4
4
  import { Topic, event, handler } from './shared/topic';
5
5
  import { Logger } from './shared';
6
6
  import { backtest, idle, live, paper } from './bin';
7
+ import { BacktesterStreamer } from './adapter/backtester';
7
8
  import minimist = require('minimist');
8
9
 
9
10
  /**
@@ -127,6 +128,11 @@ class IpcHandler extends Topic<{ type: string }, IpcSessionAccessor> {
127
128
 
128
129
  accessor.session = live(this.descriptor);
129
130
 
131
+ this.notify({
132
+ type: 'live:started',
133
+ session: accessor.session.descriptor?.id
134
+ });
135
+
130
136
  await accessor.session.awake();
131
137
  }
132
138
 
@@ -143,6 +149,11 @@ class IpcHandler extends Topic<{ type: string }, IpcSessionAccessor> {
143
149
  balance: command.balance
144
150
  });
145
151
 
152
+ this.notify({
153
+ type: 'paper:started',
154
+ session: accessor.session.descriptor?.id
155
+ });
156
+
146
157
  await accessor.session.awake();
147
158
  }
148
159
 
@@ -156,28 +167,43 @@ class IpcHandler extends Topic<{ type: string }, IpcSessionAccessor> {
156
167
  from: command.from,
157
168
  to: command.to,
158
169
  balance: command.balance,
159
- progress: timestamp =>
160
- this.notify({
161
- type: 'backtest:updated',
162
- timestamp,
163
- from: command.from,
164
- to: command.to
165
- }),
166
- completed: async () => {
167
- const statement = {};
168
-
169
- await accessor.session.dispose();
170
-
171
- this.notify({ type: 'backtest:completed', statement });
172
-
173
- resolve();
170
+ listener: {
171
+ onBacktestStarted: (streamer: BacktesterStreamer) => {
172
+ this.notify({
173
+ type: 'backtest:started',
174
+ session: session.descriptor?.id,
175
+ timestamp: streamer.timestamp,
176
+ from: command.from,
177
+ to: command.to
178
+ });
179
+ },
180
+ onBacktestUpdated: (streamer: BacktesterStreamer) => {
181
+ this.notify({
182
+ type: 'backtest:updated',
183
+ session: session.descriptor?.id,
184
+ timestamp: streamer.timestamp,
185
+ from: command.from,
186
+ to: command.to
187
+ });
188
+ },
189
+ onBacktestCompleted: async (streamer: BacktesterStreamer) => {
190
+ await accessor.session.dispose();
191
+
192
+ this.notify({
193
+ type: 'backtest:completed',
194
+ session: session.descriptor?.id,
195
+ timestamp: streamer.timestamp,
196
+ from: command.from,
197
+ to: command.to
198
+ });
199
+
200
+ resolve();
201
+ }
174
202
  }
175
203
  });
176
204
 
177
205
  accessor.session = session;
178
206
 
179
- this.notify({ type: 'backtest:started' });
180
-
181
207
  await accessor.session.awake();
182
208
  await streamer.tryContinue().catch(it => Logger.error(it));
183
209
  });
@@ -67,7 +67,7 @@ export class Session {
67
67
  // awake all adapters and synchronize trading accounts with store.
68
68
  await this.aggregate.awake(this.descriptor != null);
69
69
 
70
- if (this.descriptor.describe) {
70
+ if (this.descriptor?.describe) {
71
71
  this.subscription = this.descriptor.describe(this).subscribe();
72
72
  }
73
73
  }
@@ -69,12 +69,14 @@ describe('backtester adapter tests', () => {
69
69
  },
70
70
  from: 0,
71
71
  to: 100,
72
- completed: () => {
73
- expect(store.snapshot.timestamp).toEqual(1);
74
- expect(store.snapshot.trade[instrument.toString()].rate).toEqual(100);
75
- expect(store.snapshot.trade[instrument.toString()].quantity).toEqual(10);
72
+ listener: {
73
+ onBacktestCompleted: () => {
74
+ expect(store.snapshot.timestamp).toEqual(1);
75
+ expect(store.snapshot.trade[instrument.toString()].rate).toEqual(100);
76
+ expect(store.snapshot.trade[instrument.toString()].quantity).toEqual(10);
76
77
 
77
- done();
78
+ done();
79
+ }
78
80
  }
79
81
  });
80
82