@quantform/core 0.3.264 → 0.3.272
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 +2 -2
- package/dist/adapter/adapter-aggregate.js.map +1 -1
- package/dist/adapter/adapter.d.ts +5 -6
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/backtester/backtester-adapter.d.ts +6 -6
- package/dist/adapter/backtester/backtester-adapter.js +5 -9
- package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
- package/dist/adapter/backtester/backtester-cursor.d.ts +2 -2
- package/dist/adapter/backtester/backtester-cursor.spec.js +9 -9
- package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.d.ts +6 -4
- package/dist/adapter/backtester/backtester-streamer.js +5 -5
- package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
- package/dist/adapter/backtester/backtester-streamer.spec.js +9 -11
- package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
- package/dist/adapter/index.d.ts +2 -0
- package/dist/adapter/index.js +2 -0
- package/dist/adapter/index.js.map +1 -1
- package/dist/adapter/paper/index.d.ts +2 -2
- package/dist/adapter/paper/index.js +2 -2
- package/dist/adapter/paper/index.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.d.ts +5 -5
- package/dist/adapter/paper/paper-adapter.js +9 -12
- package/dist/adapter/paper/paper-adapter.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.spec.js +5 -7
- package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
- package/dist/adapter/paper/{executor/paper-margin-executor.d.ts → simulator/paper-margin-simulator.d.ts} +3 -3
- package/dist/adapter/paper/{executor/paper-margin-executor.js → simulator/paper-margin-simulator.js} +11 -11
- package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +1 -0
- package/dist/adapter/paper/{executor/paper-executor.d.ts → simulator/paper-simulator.d.ts} +2 -2
- package/dist/adapter/paper/{executor/paper-executor.js → simulator/paper-simulator.js} +7 -7
- package/dist/adapter/paper/simulator/paper-simulator.js.map +1 -0
- package/dist/adapter/paper/{executor/paper-spot-executor.d.ts → simulator/paper-spot-simulator.d.ts} +3 -3
- package/dist/adapter/paper/{executor/paper-spot-executor.js → simulator/paper-spot-simulator.js} +17 -17
- package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +1 -0
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.d.ts +1 -0
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +49 -0
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +1 -0
- package/dist/bootstrap.d.ts +1 -1
- package/dist/bootstrap.js +3 -5
- package/dist/bootstrap.js.map +1 -1
- package/dist/domain/balance.d.ts +1 -1
- package/dist/domain/candle.d.ts +14 -0
- package/dist/domain/candle.js +65 -1
- package/dist/domain/candle.js.map +1 -1
- package/dist/domain/candle.spec.js +11 -13
- package/dist/domain/candle.spec.js.map +1 -1
- package/dist/domain/index.d.ts +6 -8
- package/dist/domain/index.js +6 -8
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/order.d.ts +1 -1
- package/dist/domain/order.js.map +1 -1
- package/dist/domain/orderbook.d.ts +1 -1
- package/dist/domain/position.d.ts +2 -2
- package/dist/domain/position.js +3 -3
- package/dist/domain/position.js.map +1 -1
- package/dist/domain/session.d.ts +14 -3
- package/dist/domain/session.js +17 -18
- package/dist/domain/session.js.map +1 -1
- package/dist/domain/session.spec.js +3 -3
- package/dist/domain/session.spec.js.map +1 -1
- package/dist/domain/statement.d.ts +1 -2
- package/dist/domain/statement.js.map +1 -1
- package/dist/domain/trade.d.ts +1 -1
- package/dist/index.d.ts +4 -7
- package/dist/index.js +4 -7
- package/dist/index.js.map +1 -1
- package/dist/indicator/atr.js +3 -3
- package/dist/indicator/atr.js.map +1 -1
- package/dist/indicator/cross.js +3 -3
- package/dist/indicator/cross.js.map +1 -1
- package/dist/indicator/donchian.js +3 -4
- package/dist/indicator/donchian.js.map +1 -1
- package/dist/indicator/drawdown.js +3 -3
- package/dist/indicator/drawdown.js.map +1 -1
- package/dist/indicator/ema.js +3 -3
- package/dist/indicator/ema.js.map +1 -1
- package/dist/indicator/envelope.js +3 -3
- package/dist/indicator/envelope.js.map +1 -1
- package/dist/indicator/index.d.ts +3 -3
- package/dist/indicator/index.js +3 -3
- package/dist/indicator/index.js.map +1 -1
- package/dist/indicator/macd.js +2 -3
- package/dist/indicator/macd.js.map +1 -1
- package/dist/indicator/min-max.js +3 -3
- package/dist/indicator/min-max.js.map +1 -1
- package/dist/indicator/rma.js +3 -3
- package/dist/indicator/rma.js.map +1 -1
- package/dist/indicator/sma.js +2 -3
- package/dist/indicator/sma.js.map +1 -1
- package/dist/indicator/swma.js +3 -3
- package/dist/indicator/swma.js.map +1 -1
- package/dist/indicator/tma.js +3 -3
- package/dist/indicator/tma.js.map +1 -1
- package/dist/indicator/trailing.js +3 -3
- package/dist/indicator/trailing.js.map +1 -1
- package/dist/indicator/truerange.js +3 -3
- package/dist/indicator/truerange.js.map +1 -1
- package/dist/indicator/truerange.spec.js +2 -2
- package/dist/indicator/truerange.spec.js.map +1 -1
- package/dist/indicator/wma.js +3 -3
- package/dist/indicator/wma.js.map +1 -1
- package/dist/ipc.d.ts +1 -1
- package/dist/ipc.js +3 -3
- package/dist/ipc.js.map +1 -1
- package/dist/ipc.spec.js +4 -5
- package/dist/ipc.spec.js.map +1 -1
- package/dist/shared/index.d.ts +4 -4
- package/dist/shared/index.js +4 -4
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/policy.js +1 -1
- package/dist/shared/policy.js.map +1 -1
- package/dist/storage/feed.d.ts +1 -1
- package/dist/storage/feed.js.map +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.js +1 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/measurement.js.map +1 -1
- package/dist/storage/storage.js.map +1 -1
- package/dist/store/event/index.d.ts +4 -4
- package/dist/store/event/index.js +4 -4
- package/dist/store/event/index.js.map +1 -1
- package/dist/store/event/store-balance.event.d.ts +1 -1
- package/dist/store/event/store-balance.event.js +1 -1
- package/dist/store/event/store-balance.event.js.map +1 -1
- package/dist/store/event/store-balance.event.spec.js +3 -3
- package/dist/store/event/store-balance.event.spec.js.map +1 -1
- package/dist/store/event/store-candle.event.d.ts +2 -2
- package/dist/store/event/store-candle.event.js +2 -2
- package/dist/store/event/store-candle.event.js.map +1 -1
- package/dist/store/event/store-candle.event.spec.js +1 -1
- package/dist/store/event/store-candle.event.spec.js.map +1 -1
- package/dist/store/event/store-instrument.event.d.ts +1 -1
- package/dist/store/event/store-instrument.event.js +1 -1
- package/dist/store/event/store-instrument.event.js.map +1 -1
- package/dist/store/event/store-instrument.event.spec.js +1 -1
- package/dist/store/event/store-instrument.event.spec.js.map +1 -1
- package/dist/store/event/store-order.event.d.ts +1 -1
- package/dist/store/event/store-order.event.js +6 -6
- package/dist/store/event/store-order.event.js.map +1 -1
- package/dist/store/event/store-order.event.spec.js +2 -2
- package/dist/store/event/store-order.event.spec.js.map +1 -1
- package/dist/store/event/store-orderbook.event.d.ts +1 -1
- package/dist/store/event/store-orderbook.event.js +1 -1
- package/dist/store/event/store-orderbook.event.js.map +1 -1
- package/dist/store/event/store-position.event.d.ts +1 -1
- package/dist/store/event/store-position.event.js +1 -1
- package/dist/store/event/store-position.event.js.map +1 -1
- package/dist/store/event/store-trade.event.d.ts +1 -1
- package/dist/store/event/store-trade.event.js +1 -1
- package/dist/store/event/store-trade.event.js.map +1 -1
- package/dist/store/event/store-trade.event.spec.js +2 -2
- package/dist/store/event/store-trade.event.spec.js.map +1 -1
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/store.d.ts +2 -5
- package/dist/store/store.js +4 -8
- package/dist/store/store.js.map +1 -1
- package/dist/store/store.state.d.ts +1 -1
- package/dist/tests/backtester-adapter.spec.js +8 -15
- package/dist/tests/backtester-adapter.spec.js.map +1 -1
- package/dist/tests/session.spec.d.ts +0 -1
- package/dist/tests/session.spec.js +0 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/adapter/adapter-aggregate.ts +2 -3
- package/src/adapter/adapter.ts +5 -6
- package/src/adapter/backtester/backtester-adapter.ts +8 -8
- package/src/adapter/backtester/backtester-cursor.spec.ts +1 -1
- package/src/adapter/backtester/backtester-cursor.ts +2 -2
- package/src/adapter/backtester/backtester-streamer.spec.ts +1 -3
- package/src/adapter/backtester/backtester-streamer.ts +7 -8
- package/src/adapter/index.ts +2 -0
- package/src/adapter/paper/index.ts +2 -2
- package/src/adapter/paper/paper-adapter.spec.ts +6 -8
- package/src/adapter/paper/paper-adapter.ts +9 -11
- package/src/adapter/paper/{executor/paper-margin-executor.ts → simulator/paper-margin-simulator.ts} +5 -5
- package/src/adapter/paper/{executor/paper-executor.ts → simulator/paper-simulator.ts} +4 -4
- package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +87 -0
- package/src/adapter/paper/{executor/paper-spot-executor.ts → simulator/paper-spot-simulator.ts} +6 -6
- package/src/bootstrap.ts +4 -4
- package/src/domain/balance.ts +1 -1
- package/src/domain/candle.spec.ts +3 -5
- package/src/domain/candle.ts +103 -0
- package/src/domain/index.ts +6 -8
- package/src/domain/order.ts +2 -2
- package/src/domain/orderbook.ts +1 -1
- package/src/domain/position.ts +2 -3
- package/src/domain/session.spec.ts +3 -3
- package/src/domain/session.ts +61 -8
- package/src/domain/statement.ts +1 -2
- package/src/domain/trade.ts +1 -1
- package/src/index.ts +4 -7
- package/src/indicator/atr.ts +1 -2
- package/src/indicator/cross.ts +3 -4
- package/src/indicator/donchian.ts +2 -3
- package/src/indicator/drawdown.ts +2 -3
- package/src/indicator/ema.ts +1 -2
- package/src/indicator/envelope.ts +1 -2
- package/src/indicator/index.ts +3 -3
- package/src/indicator/macd.ts +1 -2
- package/src/indicator/min-max.ts +1 -2
- package/src/indicator/rma.ts +1 -2
- package/src/indicator/sma.ts +1 -2
- package/src/indicator/swma.ts +1 -2
- package/src/indicator/tma.ts +1 -2
- package/src/indicator/trailing.ts +3 -4
- package/src/indicator/truerange.spec.ts +2 -2
- package/src/indicator/truerange.ts +1 -2
- package/src/indicator/window.ts +1 -1
- package/src/indicator/wma.ts +1 -2
- package/src/ipc.spec.ts +6 -7
- package/src/ipc.ts +6 -6
- package/src/shared/index.ts +4 -4
- package/src/shared/policy.ts +1 -1
- package/src/shared/topic.spec.ts +1 -1
- package/src/storage/feed.ts +20 -1
- package/src/storage/index.ts +1 -1
- package/src/storage/measurement.ts +19 -0
- package/src/storage/storage.ts +37 -0
- package/src/store/event/index.ts +4 -4
- package/src/store/event/store-balance.event.spec.ts +3 -3
- package/src/store/event/store-balance.event.ts +2 -2
- package/src/store/event/store-candle.event.spec.ts +1 -1
- package/src/store/event/store-candle.event.ts +5 -5
- package/src/store/event/store-instrument.event.spec.ts +1 -1
- package/src/store/event/store-instrument.event.ts +2 -2
- package/src/store/event/store-order.event.spec.ts +2 -2
- package/src/store/event/store-order.event.ts +7 -7
- package/src/store/event/store-orderbook.event.ts +2 -2
- package/src/store/event/store-position.event.ts +2 -2
- package/src/store/event/store-trade.event.spec.ts +2 -2
- package/src/store/event/store-trade.event.ts +2 -2
- package/src/store/index.ts +1 -0
- package/src/store/store.state.ts +7 -7
- package/src/store/store.ts +6 -9
- package/src/tests/backtester-adapter.spec.ts +8 -15
- package/src/tests/session.spec.ts +0 -3
- package/dist/adapter/paper/executor/paper-executor.js.map +0 -1
- package/dist/adapter/paper/executor/paper-margin-executor.js.map +0 -1
- package/dist/adapter/paper/executor/paper-spot-executor.js.map +0 -1
- package/dist/domain/candle-builder.d.ts +0 -16
- package/dist/domain/candle-builder.js +0 -70
- package/dist/domain/candle-builder.js.map +0 -1
- package/dist/domain/session-descriptor.d.ts +0 -15
- package/dist/domain/session-descriptor.js +0 -3
- package/dist/domain/session-descriptor.js.map +0 -1
- package/src/domain/candle-builder.ts +0 -104
- package/src/domain/session-descriptor.ts +0 -53
package/src/indicator/index.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
export * from './atr';
|
|
1
2
|
export * from './cross';
|
|
3
|
+
export * from './donchian';
|
|
4
|
+
export * from './drawdown';
|
|
2
5
|
export * from './ema';
|
|
3
6
|
export * from './envelope';
|
|
4
7
|
export * from './macd';
|
|
@@ -12,6 +15,3 @@ export * from './trailing';
|
|
|
12
15
|
export * from './truerange';
|
|
13
16
|
export * from './window';
|
|
14
17
|
export * from './wma';
|
|
15
|
-
export * from './donchian';
|
|
16
|
-
export * from './atr';
|
|
17
|
-
export * from './drawdown';
|
package/src/indicator/macd.ts
CHANGED
package/src/indicator/min-max.ts
CHANGED
package/src/indicator/rma.ts
CHANGED
package/src/indicator/sma.ts
CHANGED
package/src/indicator/swma.ts
CHANGED
package/src/indicator/tma.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { filter } from 'rxjs/operators';
|
|
1
|
+
import { filter, Observable } from 'rxjs';
|
|
3
2
|
|
|
4
3
|
export class Trailing {
|
|
5
4
|
private triggered = false;
|
|
@@ -56,7 +55,7 @@ export class Trailing {
|
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
export function trailingup<T>(trigger: number, buffer: number, value: (it: T) => number) {
|
|
59
|
-
return function(source: Observable<T>): Observable<T> {
|
|
58
|
+
return function (source: Observable<T>): Observable<T> {
|
|
60
59
|
const trailing = new Trailing(trigger, buffer);
|
|
61
60
|
|
|
62
61
|
return source.pipe(filter(it => trailing.up(value(it))));
|
|
@@ -68,7 +67,7 @@ export function trailingdown<T>(
|
|
|
68
67
|
buffer: number,
|
|
69
68
|
value: (it: T) => number
|
|
70
69
|
) {
|
|
71
|
-
return function(source: Observable<T>): Observable<T> {
|
|
70
|
+
return function (source: Observable<T>): Observable<T> {
|
|
72
71
|
const trailing = new Trailing(trigger, buffer);
|
|
73
72
|
|
|
74
73
|
return source.pipe(filter(it => trailing.down(value(it))));
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { from } from 'rxjs';
|
|
2
2
|
import { Candle } from '../domain';
|
|
3
|
-
import { truerange } from './truerange';
|
|
4
|
-
import { sma } from './sma';
|
|
5
3
|
import { now } from '../shared';
|
|
4
|
+
import { sma } from './sma';
|
|
5
|
+
import { truerange } from './truerange';
|
|
6
6
|
|
|
7
7
|
describe('truerange atr tests', () => {
|
|
8
8
|
test('should return expected value', done => {
|
package/src/indicator/window.ts
CHANGED
package/src/indicator/wma.ts
CHANGED
package/src/ipc.spec.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { Adapter, AdapterContext } from './adapter';
|
|
2
|
-
import { PaperAdapter, PaperSpotExecutor } from './adapter/paper';
|
|
3
|
-
import { PaperExecutor } from './adapter/paper/executor/paper-executor';
|
|
4
|
-
import { run } from './ipc';
|
|
5
|
-
import { task } from './shared';
|
|
6
1
|
import { EventEmitter } from 'events';
|
|
7
2
|
import { of, take, tap } from 'rxjs';
|
|
3
|
+
import { Adapter, AdapterContext, PaperAdapter, PaperSpotSimulator } from './adapter';
|
|
4
|
+
import { PaperSimulator } from './adapter/paper/simulator/paper-simulator';
|
|
5
|
+
import { run } from './ipc';
|
|
6
|
+
import { task } from './shared';
|
|
8
7
|
|
|
9
8
|
class DefaultAdapter extends Adapter {
|
|
10
9
|
name = 'default';
|
|
@@ -13,8 +12,8 @@ class DefaultAdapter extends Adapter {
|
|
|
13
12
|
return 123;
|
|
14
13
|
}
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
return new
|
|
15
|
+
createPaperSimulator(adapter: PaperAdapter): PaperSimulator {
|
|
16
|
+
return new PaperSpotSimulator(adapter);
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
awake(context: AdapterContext): Promise<void> {
|
package/src/ipc.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Session, SessionDescriptor, instrumentOf } from './domain';
|
|
2
|
-
import { Topic, event, handler } from './shared/topic';
|
|
3
|
-
import { runTask, Logger } from './shared';
|
|
4
|
-
import { Bootstrap } from './bootstrap';
|
|
5
|
-
import { BacktesterStreamer } from './adapter/backtester';
|
|
6
|
-
import { Observable } from 'rxjs';
|
|
7
1
|
import { EventEmitter } from 'events';
|
|
8
2
|
import { join } from 'path';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { BacktesterStreamer } from './adapter/backtester';
|
|
5
|
+
import { Bootstrap } from './bootstrap';
|
|
6
|
+
import { instrumentOf, Session, SessionDescriptor } from './domain';
|
|
7
|
+
import { Logger, runTask } from './shared';
|
|
8
|
+
import { event, handler, Topic } from './shared/topic';
|
|
9
9
|
import minimist = require('minimist');
|
|
10
10
|
import dotenv = require('dotenv');
|
|
11
11
|
|
package/src/shared/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './decimals';
|
|
2
|
-
export * from './logger';
|
|
3
1
|
export * from './datetime';
|
|
2
|
+
export * from './decimals';
|
|
4
3
|
export * from './io';
|
|
5
|
-
export * from './
|
|
4
|
+
export * from './logger';
|
|
6
5
|
export * from './policy';
|
|
7
|
-
export * from './worker';
|
|
8
6
|
export * from './task';
|
|
7
|
+
export * from './topic';
|
|
8
|
+
export * from './worker';
|
package/src/shared/policy.ts
CHANGED
package/src/shared/topic.spec.ts
CHANGED
package/src/storage/feed.ts
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
|
-
import { StoreEvent } from '../store/event';
|
|
2
1
|
import { InstrumentSelector } from '../domain';
|
|
2
|
+
import { StoreEvent } from '../store';
|
|
3
3
|
import { Storage, StorageQueryOptions } from './storage';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Represents a storage supposed to store historical data.
|
|
7
|
+
* You can use CLI to fetch and save data in the Feed.
|
|
8
|
+
*/
|
|
5
9
|
export class Feed {
|
|
6
10
|
constructor(private readonly storage: Storage) {}
|
|
7
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Returns all instrument names stored in the feed.
|
|
14
|
+
*/
|
|
8
15
|
index(): Promise<Array<string>> {
|
|
9
16
|
return this.storage.index();
|
|
10
17
|
}
|
|
11
18
|
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @param instrument
|
|
22
|
+
* @param events
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
12
25
|
save(instrument: InstrumentSelector, events: StoreEvent[]): Promise<void> {
|
|
13
26
|
return this.storage.save(
|
|
14
27
|
instrument.toString(),
|
|
@@ -22,6 +35,12 @@ export class Feed {
|
|
|
22
35
|
);
|
|
23
36
|
}
|
|
24
37
|
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @param instrument
|
|
41
|
+
* @param options
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
25
44
|
async query(
|
|
26
45
|
instrument: InstrumentSelector,
|
|
27
46
|
options: StorageQueryOptions
|
package/src/storage/index.ts
CHANGED
|
@@ -7,13 +7,26 @@ export interface Measure {
|
|
|
7
7
|
payload: any;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
10
13
|
export class Measurement {
|
|
11
14
|
constructor(private readonly storage: Storage) {}
|
|
12
15
|
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
13
20
|
async index(): Promise<Array<number>> {
|
|
14
21
|
return (await this.storage.index()).map(it => Number(it));
|
|
15
22
|
}
|
|
16
23
|
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @param session
|
|
27
|
+
* @param measurements
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
17
30
|
save(session: number, measurements: Measure[]): Promise<void> {
|
|
18
31
|
return this.storage.save(
|
|
19
32
|
session.toString(),
|
|
@@ -25,6 +38,12 @@ export class Measurement {
|
|
|
25
38
|
);
|
|
26
39
|
}
|
|
27
40
|
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
* @param session
|
|
44
|
+
* @param options
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
28
47
|
async query(session: number, options: StorageQueryOptions): Promise<Measure[]> {
|
|
29
48
|
const rows = await this.storage.query(session.toString(), options);
|
|
30
49
|
|
package/src/storage/storage.ts
CHANGED
|
@@ -11,21 +11,50 @@ export type StorageQueryOptions = {
|
|
|
11
11
|
count: number;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
14
17
|
export interface Storage {
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
15
21
|
index(): Promise<Array<string>>;
|
|
16
22
|
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @param library
|
|
26
|
+
* @param documents
|
|
27
|
+
*/
|
|
17
28
|
save(library: string, documents: StorageDocument[]): Promise<void>;
|
|
18
29
|
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @param library
|
|
33
|
+
* @param options
|
|
34
|
+
*/
|
|
19
35
|
query(library: string, options: StorageQueryOptions): Promise<StorageDocument[]>;
|
|
20
36
|
}
|
|
21
37
|
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
22
41
|
export class InMemoryStorage implements Storage {
|
|
23
42
|
private tables: Record<string, StorageDocument[]> = {};
|
|
24
43
|
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @returns
|
|
47
|
+
*/
|
|
25
48
|
async index(): Promise<Array<string>> {
|
|
26
49
|
return Object.keys(this.tables);
|
|
27
50
|
}
|
|
28
51
|
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
* @param library
|
|
55
|
+
* @param options
|
|
56
|
+
* @returns
|
|
57
|
+
*/
|
|
29
58
|
async query(library: string, options: StorageQueryOptions): Promise<StorageDocument[]> {
|
|
30
59
|
if (!this.tables[library]) {
|
|
31
60
|
return [];
|
|
@@ -56,6 +85,11 @@ export class InMemoryStorage implements Storage {
|
|
|
56
85
|
return query;
|
|
57
86
|
}
|
|
58
87
|
|
|
88
|
+
/**
|
|
89
|
+
*
|
|
90
|
+
* @param library
|
|
91
|
+
* @param documents
|
|
92
|
+
*/
|
|
59
93
|
async save(library: string, documents: StorageDocument[]): Promise<void> {
|
|
60
94
|
if (!this.tables[library]) {
|
|
61
95
|
this.tables[library] = [];
|
|
@@ -70,6 +104,9 @@ export class InMemoryStorage implements Storage {
|
|
|
70
104
|
buffer.sort((lhs, rhs) => lhs.timestamp - rhs.timestamp);
|
|
71
105
|
}
|
|
72
106
|
|
|
107
|
+
/**
|
|
108
|
+
*
|
|
109
|
+
*/
|
|
73
110
|
clear() {
|
|
74
111
|
this.tables = {};
|
|
75
112
|
}
|
package/src/store/event/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './store.event';
|
|
2
|
-
export * from './store-orderbook.event';
|
|
3
|
-
export * from './store-order.event';
|
|
4
1
|
export * from './store-balance.event';
|
|
2
|
+
export * from './store-candle.event';
|
|
5
3
|
export * from './store-instrument.event';
|
|
4
|
+
export * from './store-order.event';
|
|
5
|
+
export * from './store-orderbook.event';
|
|
6
6
|
export * from './store-position.event';
|
|
7
7
|
export * from './store-trade.event';
|
|
8
|
-
export * from './store
|
|
8
|
+
export * from './store.event';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Asset, Commission } from '../../domain';
|
|
2
1
|
import { BalancePatchEvent } from '.';
|
|
3
|
-
import { InstrumentPatchEvent } from './store-instrument.event';
|
|
4
|
-
import { now } from '../../shared';
|
|
5
2
|
import { Store } from '..';
|
|
3
|
+
import { Asset, Commission } from '../../domain';
|
|
4
|
+
import { now } from '../../shared';
|
|
5
|
+
import { InstrumentPatchEvent } from './store-instrument.event';
|
|
6
6
|
|
|
7
7
|
describe('balance event tests', () => {
|
|
8
8
|
test('should patch a store', () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { event } from '../../shared/topic';
|
|
2
|
-
import { timestamp } from '../../shared';
|
|
3
1
|
import { AssetSelector } from '../../domain/asset';
|
|
4
2
|
import { Balance } from '../../domain/balance';
|
|
3
|
+
import { timestamp } from '../../shared';
|
|
4
|
+
import { event } from '../../shared/topic';
|
|
5
5
|
import { State, StateChangeTracker } from '../store.state';
|
|
6
6
|
import { StoreEvent } from './store.event';
|
|
7
7
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { OrderbookPatchEventHandler } from './store-orderbook.event';
|
|
3
|
-
import { timestamp } from '../../shared/datetime';
|
|
1
|
+
import { StateChangeTracker } from '..';
|
|
4
2
|
import { InstrumentSelector } from '../../domain';
|
|
3
|
+
import { timestamp } from '../../shared/datetime';
|
|
4
|
+
import { event } from '../../shared/topic';
|
|
5
5
|
import { State } from '../store.state';
|
|
6
|
+
import { OrderbookPatchEventHandler } from './store-orderbook.event';
|
|
7
|
+
import { TradePatchEventHandler } from './store-trade.event';
|
|
6
8
|
import { StoreEvent } from './store.event';
|
|
7
|
-
import { event } from '../../shared/topic';
|
|
8
|
-
import { StateChangeTracker } from '..';
|
|
9
9
|
|
|
10
10
|
@event
|
|
11
11
|
export class CandleEvent implements StoreEvent {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Store } from '..';
|
|
2
|
-
import { now } from '../../shared';
|
|
3
2
|
import { Asset, Commission } from '../../domain';
|
|
3
|
+
import { now } from '../../shared';
|
|
4
4
|
import { InstrumentPatchEvent } from './store-instrument.event';
|
|
5
5
|
|
|
6
6
|
describe('instrument patch event tests', () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { event } from '../../shared/topic';
|
|
2
|
-
import { timestamp } from '../../shared';
|
|
3
1
|
import { Asset, Commission } from '../../domain';
|
|
4
2
|
import { Instrument, InstrumentSelector } from '../../domain/instrument';
|
|
3
|
+
import { timestamp } from '../../shared';
|
|
4
|
+
import { event } from '../../shared/topic';
|
|
5
5
|
import { State, StateChangeTracker } from '../../store';
|
|
6
6
|
import { StoreEvent } from './store.event';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { now } from '../../shared';
|
|
2
1
|
import { Asset, Instrument, Order } from '../../domain';
|
|
3
|
-
import {
|
|
2
|
+
import { now } from '../../shared';
|
|
4
3
|
import { Store } from '../store';
|
|
4
|
+
import { OrderLoadEvent } from './store-order.event';
|
|
5
5
|
|
|
6
6
|
const instrument = new Instrument(
|
|
7
7
|
new Asset('btc', 'binance', 8),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { event } from '../../shared/topic';
|
|
2
|
-
import { timestamp } from '../../shared';
|
|
3
1
|
import { Order } from '../../domain';
|
|
2
|
+
import { timestamp } from '../../shared';
|
|
3
|
+
import { event } from '../../shared/topic';
|
|
4
4
|
import { State, StateChangeTracker } from '../store.state';
|
|
5
5
|
import { StoreEvent } from './store.event';
|
|
6
6
|
|
|
@@ -66,7 +66,7 @@ export function OrderPendingEventHandler(
|
|
|
66
66
|
const order = state.order[event.id];
|
|
67
67
|
|
|
68
68
|
if (order.state != 'NEW') {
|
|
69
|
-
throw new Error(`Order is not
|
|
69
|
+
throw new Error(`Order is not NEW: ${order.state}`);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
order.state = 'PENDING';
|
|
@@ -98,7 +98,7 @@ export function OrderFilledEventHandler(
|
|
|
98
98
|
const order = state.order[event.id];
|
|
99
99
|
|
|
100
100
|
if (order.state != 'PENDING' && order.state != 'CANCELING') {
|
|
101
|
-
throw new Error(
|
|
101
|
+
throw new Error(`Order is not PENDING or CANCELING: ${order.state}`);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
order.state = 'FILLED';
|
|
@@ -132,7 +132,7 @@ export function OrderCancelingEventHandler(
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
if (order.state != 'PENDING') {
|
|
135
|
-
throw new Error(`Order is not
|
|
135
|
+
throw new Error(`Order is not PENDING: ${order.state}`);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
order.state = 'CANCELING';
|
|
@@ -160,7 +160,7 @@ export function OrderCanceledEventHandler(
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
if (order.state != 'CANCELING') {
|
|
163
|
-
throw new Error(
|
|
163
|
+
throw new Error(`Order is not CANCELING: ${order.state}`);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
order.state = 'CANCELED';
|
|
@@ -208,7 +208,7 @@ export function OrderRejectedEventHandler(
|
|
|
208
208
|
const order = state.order[event.id];
|
|
209
209
|
|
|
210
210
|
if (order.state != 'NEW') {
|
|
211
|
-
throw new Error(
|
|
211
|
+
throw new Error(`Order is not NEW: ${order.state}`);
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
order.state = 'REJECTED';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { event } from '../../shared/topic';
|
|
2
|
-
import { timestamp } from '../../shared';
|
|
3
1
|
import { InstrumentSelector } from '../../domain/instrument';
|
|
4
2
|
import { Orderbook } from '../../domain/orderbook';
|
|
3
|
+
import { timestamp } from '../../shared';
|
|
4
|
+
import { event } from '../../shared/topic';
|
|
5
5
|
import { State, StateChangeTracker } from '../store.state';
|
|
6
6
|
import { StoreEvent } from './store.event';
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Instrument, Position, PositionMode } from '../../domain';
|
|
2
2
|
import { timestamp } from '../../shared';
|
|
3
|
-
import {
|
|
3
|
+
import { event } from '../../shared/topic';
|
|
4
4
|
import { State, StateChangeTracker } from '../store.state';
|
|
5
5
|
import { StoreEvent } from './store.event';
|
|
6
6
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Asset, Instrument } from '../../domain';
|
|
2
1
|
import { TradePatchEvent } from '.';
|
|
3
|
-
import { now } from '../../shared';
|
|
4
2
|
import { Store } from '..';
|
|
3
|
+
import { Asset, Instrument } from '../../domain';
|
|
4
|
+
import { now } from '../../shared';
|
|
5
5
|
|
|
6
6
|
const instrument = new Instrument(
|
|
7
7
|
new Asset('btc', 'binance', 8),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { event } from '../../shared/topic';
|
|
2
|
-
import { timestamp } from '../../shared';
|
|
3
1
|
import { Trade } from '../../domain';
|
|
4
2
|
import { InstrumentSelector } from '../../domain/instrument';
|
|
3
|
+
import { timestamp } from '../../shared';
|
|
4
|
+
import { event } from '../../shared/topic';
|
|
5
5
|
import { State, StateChangeTracker } from '../store.state';
|
|
6
6
|
import { StoreEvent } from './store.event';
|
|
7
7
|
|
package/src/store/index.ts
CHANGED
package/src/store/store.state.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { timestamp } from '../shared';
|
|
2
1
|
import {
|
|
3
|
-
Instrument,
|
|
4
|
-
Balance,
|
|
5
|
-
Order,
|
|
6
|
-
Orderbook,
|
|
7
2
|
Asset,
|
|
8
|
-
Trade,
|
|
9
3
|
AssetSelector,
|
|
4
|
+
Balance,
|
|
5
|
+
Component,
|
|
6
|
+
Instrument,
|
|
10
7
|
InstrumentSelector,
|
|
11
|
-
|
|
8
|
+
Order,
|
|
9
|
+
Orderbook,
|
|
10
|
+
Trade
|
|
12
11
|
} from '../domain';
|
|
12
|
+
import { timestamp } from '../shared';
|
|
13
13
|
|
|
14
14
|
export interface StateChangeTracker {
|
|
15
15
|
commit(component: Component);
|
package/src/store/store.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { BehaviorSubject, Observable, Subject } from 'rxjs';
|
|
2
|
-
import { State, StateChangeTracker } from './store.state';
|
|
3
|
-
import { Component } from '../domain';
|
|
4
2
|
import { Set } from 'typescript-collections';
|
|
5
|
-
import {
|
|
3
|
+
import { Component } from '../domain';
|
|
6
4
|
import { handler, Topic } from '../shared/topic';
|
|
7
|
-
import { TradePatchEvent, TradePatchEventHandler } from './event/store-trade.event';
|
|
8
5
|
import {
|
|
9
6
|
BalanceFreezEvent,
|
|
10
7
|
BalanceFreezEventHandler,
|
|
@@ -41,18 +38,18 @@ import {
|
|
|
41
38
|
PositionLoadEvent,
|
|
42
39
|
PositionLoadEventHandler,
|
|
43
40
|
PositionPatchEvent,
|
|
44
|
-
PositionPatchEventHandler
|
|
41
|
+
PositionPatchEventHandler,
|
|
42
|
+
StoreEvent,
|
|
43
|
+
TradePatchEvent,
|
|
44
|
+
TradePatchEventHandler
|
|
45
45
|
} from './event';
|
|
46
|
+
import { State, StateChangeTracker } from './store.state';
|
|
46
47
|
|
|
47
48
|
export class Store extends Topic<StoreEvent, any> implements StateChangeTracker {
|
|
48
49
|
private readonly pendingChanges = new Set<Component>();
|
|
49
50
|
private readonly changes = new Subject<Component>();
|
|
50
51
|
private readonly state = new BehaviorSubject<State>(new State());
|
|
51
52
|
|
|
52
|
-
get state$(): Observable<State> {
|
|
53
|
-
return this.state.asObservable();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
53
|
get changes$(): Observable<Component> {
|
|
57
54
|
return this.changes.asObservable();
|
|
58
55
|
}
|