@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.
- package/dist/adapter/adapter.event.js +1 -1
- package/dist/adapter/adapter.event.js.map +1 -1
- package/dist/adapter/backtester/backtester-adapter.d.ts +2 -3
- package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.d.ts +6 -0
- package/dist/adapter/backtester/backtester-streamer.js +10 -7
- package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.spec.js +9 -7
- package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
- package/dist/domain/instrument.js.map +1 -1
- package/dist/domain/orderbook.d.ts +1 -0
- package/dist/domain/orderbook.js.map +1 -1
- package/dist/domain/trade.js.map +1 -1
- package/dist/ipc.js +43 -12
- package/dist/ipc.js.map +1 -1
- package/dist/ipc.spec.d.ts +1 -0
- package/dist/ipc.spec.js +67 -0
- package/dist/ipc.spec.js.map +1 -0
- package/dist/session/session.js +2 -1
- package/dist/session/session.js.map +1 -1
- package/dist/tests/backtester-adapter.spec.js +7 -5
- 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.event.ts +1 -1
- package/src/adapter/backtester/backtester-adapter.ts +2 -3
- package/src/adapter/backtester/backtester-streamer.spec.ts +9 -7
- package/src/adapter/backtester/backtester-streamer.ts +36 -7
- package/src/domain/asset.ts +3 -3
- package/src/domain/instrument.ts +3 -0
- package/src/domain/orderbook.ts +4 -1
- package/src/domain/trade.ts +4 -0
- package/src/ipc.spec.ts +56 -0
- package/src/ipc.ts +43 -17
- package/src/session/session.ts +1 -1
- package/src/tests/backtester-adapter.spec.ts +7 -5
package/src/domain/asset.ts
CHANGED
|
@@ -58,21 +58,21 @@ export class Asset extends AssetSelector {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
* Trims a number to the
|
|
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
|
|
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
|
|
75
|
+
* Rounds up a number to the asset precision.
|
|
76
76
|
*/
|
|
77
77
|
ceil(number: number): number {
|
|
78
78
|
return ceil(number, this.scale);
|
package/src/domain/instrument.ts
CHANGED
|
@@ -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;
|
package/src/domain/orderbook.ts
CHANGED
|
@@ -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
|
}
|
package/src/domain/trade.ts
CHANGED
|
@@ -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;
|
package/src/ipc.spec.ts
ADDED
|
@@ -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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
});
|
package/src/session/session.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
78
|
+
done();
|
|
79
|
+
}
|
|
78
80
|
}
|
|
79
81
|
});
|
|
80
82
|
|