@quantform/core 0.3.267 → 0.4.5
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 +4 -5
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/backtester/backtester-adapter.d.ts +5 -5
- package/dist/adapter/backtester/backtester-adapter.js +3 -7
- 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 +1 -1
- package/dist/adapter/paper/index.js +1 -1
- package/dist/adapter/paper/index.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.d.ts +3 -3
- package/dist/adapter/paper/paper-adapter.js +4 -7
- package/dist/adapter/paper/paper-adapter.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.spec.js +3 -5
- package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +1 -1
- package/dist/adapter/paper/simulator/paper-margin-simulator.js +6 -6
- package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-simulator.d.ts +1 -1
- package/dist/adapter/paper/simulator/paper-simulator.js +3 -3
- package/dist/adapter/paper/simulator/paper-simulator.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +2 -2
- package/dist/adapter/paper/simulator/paper-spot-simulator.js +12 -12
- package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +8 -9
- package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +1 -1
- 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 +3 -4
- 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 +1 -1
- 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 +6 -13
- 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 +4 -5
- package/src/adapter/backtester/backtester-adapter.ts +6 -6
- 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 +1 -1
- package/src/adapter/paper/paper-adapter.spec.ts +3 -5
- package/src/adapter/paper/paper-adapter.ts +3 -5
- package/src/adapter/paper/simulator/paper-margin-simulator.ts +3 -3
- package/src/adapter/paper/simulator/paper-simulator.ts +3 -3
- package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +12 -13
- package/src/adapter/paper/simulator/paper-spot-simulator.ts +4 -4
- 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 +3 -4
- 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 +2 -2
- 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 +6 -13
- package/src/tests/session.spec.ts +0 -3
- 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/wma.ts
CHANGED
package/src/ipc.spec.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { of, take, tap } from 'rxjs';
|
|
3
|
+
import { Adapter, AdapterContext, PaperAdapter, PaperSpotSimulator } from './adapter';
|
|
3
4
|
import { PaperSimulator } from './adapter/paper/simulator/paper-simulator';
|
|
4
5
|
import { run } from './ipc';
|
|
5
6
|
import { task } from './shared';
|
|
6
|
-
import { EventEmitter } from 'events';
|
|
7
|
-
import { of, take, tap } from 'rxjs';
|
|
8
7
|
|
|
9
8
|
class DefaultAdapter extends Adapter {
|
|
10
9
|
name = 'default';
|
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
|
|
|
@@ -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
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { Asset, Commission, instrumentOf } from '../domain';
|
|
2
|
-
import { InMemoryStorage, Feed } from '../storage';
|
|
3
|
-
import { Store } from '../store';
|
|
4
|
-
import { InstrumentPatchEvent, TradePatchEvent } from '../store/event';
|
|
5
1
|
import { Adapter, AdapterContext } from '../adapter/adapter';
|
|
6
|
-
import { PaperSpotSimulator } from '../adapter/paper';
|
|
7
|
-
import { PaperSimulator } from '../adapter/paper/simulator/paper-simulator';
|
|
8
|
-
import { PaperAdapter } from '../adapter/paper/paper-adapter';
|
|
9
2
|
import { BacktesterAdapter } from '../adapter/backtester/backtester-adapter';
|
|
10
3
|
import { BacktesterStreamer } from '../adapter/backtester/backtester-streamer';
|
|
4
|
+
import { PaperSpotSimulator } from '../adapter/paper';
|
|
5
|
+
import { PaperAdapter } from '../adapter/paper/paper-adapter';
|
|
6
|
+
import { PaperSimulator } from '../adapter/paper/simulator/paper-simulator';
|
|
7
|
+
import { Asset, Commission, instrumentOf } from '../domain';
|
|
8
|
+
import { Feed, InMemoryStorage } from '../storage';
|
|
9
|
+
import { InstrumentPatchEvent, Store, TradePatchEvent } from '../store';
|
|
11
10
|
|
|
12
11
|
const base = new Asset('btc', 'binance', 8);
|
|
13
12
|
const quote = new Asset('usdt', 'binance', 4);
|
|
@@ -48,9 +47,6 @@ describe('backtester adapter tests', () => {
|
|
|
48
47
|
const sut = new BacktesterAdapter(
|
|
49
48
|
adapter,
|
|
50
49
|
new BacktesterStreamer(store, feed, {
|
|
51
|
-
balance: {
|
|
52
|
-
['binance:usdt']: 1000
|
|
53
|
-
},
|
|
54
50
|
from: 1,
|
|
55
51
|
to: 100
|
|
56
52
|
})
|
|
@@ -65,9 +61,6 @@ describe('backtester adapter tests', () => {
|
|
|
65
61
|
store,
|
|
66
62
|
feed,
|
|
67
63
|
{
|
|
68
|
-
balance: {
|
|
69
|
-
['binance:usdt']: 1000
|
|
70
|
-
},
|
|
71
64
|
from: 0,
|
|
72
65
|
to: 100
|
|
73
66
|
},
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { timestamp } from '../shared';
|
|
3
|
-
import { Candle } from './candle';
|
|
4
|
-
export declare class CandleBuilder {
|
|
5
|
-
readonly timeframe: number;
|
|
6
|
-
private _candle;
|
|
7
|
-
get candle(): Candle;
|
|
8
|
-
constructor(timeframe: number);
|
|
9
|
-
append(value: number, timestamp: timestamp): Candle;
|
|
10
|
-
}
|
|
11
|
-
export declare function candle<T extends {
|
|
12
|
-
timestamp: number;
|
|
13
|
-
}>(timeframe: number, fn: (x: T) => number): (source: Observable<T>) => Observable<Candle>;
|
|
14
|
-
export declare function mergeCandle<T extends {
|
|
15
|
-
timestamp: number;
|
|
16
|
-
}>(timeframe: number, fn: (x: T) => number, history$: Observable<Candle>): (source$: Observable<T>) => Observable<Candle>;
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mergeCandle = exports.candle = exports.CandleBuilder = void 0;
|
|
4
|
-
const rxjs_1 = require("rxjs");
|
|
5
|
-
const operators_1 = require("rxjs/operators");
|
|
6
|
-
const candle_1 = require("./candle");
|
|
7
|
-
const timeframe_1 = require("./timeframe");
|
|
8
|
-
class CandleBuilder {
|
|
9
|
-
constructor(timeframe) {
|
|
10
|
-
this.timeframe = timeframe;
|
|
11
|
-
}
|
|
12
|
-
get candle() {
|
|
13
|
-
return this._candle;
|
|
14
|
-
}
|
|
15
|
-
append(value, timestamp) {
|
|
16
|
-
const frame = (0, timeframe_1.tf)(timestamp, this.timeframe);
|
|
17
|
-
if (!this._candle) {
|
|
18
|
-
this._candle = new candle_1.Candle(frame, value, value, value, value);
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
if (this.candle.timestamp == frame) {
|
|
22
|
-
this.candle.apply(value);
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
const previous = this._candle;
|
|
26
|
-
this._candle = new candle_1.Candle(frame, value, value, value, value);
|
|
27
|
-
return previous;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
exports.CandleBuilder = CandleBuilder;
|
|
31
|
-
function candle(timeframe, fn) {
|
|
32
|
-
return function (source) {
|
|
33
|
-
const builder = new CandleBuilder(timeframe);
|
|
34
|
-
let candle;
|
|
35
|
-
return source.pipe((0, operators_1.filter)(it => {
|
|
36
|
-
return (candle = builder.append(fn(it), it.timestamp)) != null;
|
|
37
|
-
}), (0, operators_1.map)(_ => candle), (0, operators_1.share)());
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
exports.candle = candle;
|
|
41
|
-
function mergeCandle(timeframe, fn, history$) {
|
|
42
|
-
return function (source$) {
|
|
43
|
-
const builder = new CandleBuilder(timeframe);
|
|
44
|
-
let hasMergedHistory = false;
|
|
45
|
-
return (0, rxjs_1.concat)(history$.pipe((0, operators_1.skipLast)(1)), source$.pipe((0, operators_1.withLatestFrom)(history$.pipe((0, operators_1.last)())), (0, operators_1.mergeMap)(([it, history]) => {
|
|
46
|
-
const completed = builder.append(fn(it), it.timestamp);
|
|
47
|
-
if (completed) {
|
|
48
|
-
if (completed.timestamp == history.timestamp) {
|
|
49
|
-
completed.open = history.open;
|
|
50
|
-
completed.high = Math.max(completed.high, history.high);
|
|
51
|
-
completed.low = Math.min(completed.low, history.low);
|
|
52
|
-
hasMergedHistory = true;
|
|
53
|
-
}
|
|
54
|
-
else if (completed.timestamp > history.timestamp) {
|
|
55
|
-
if (!hasMergedHistory) {
|
|
56
|
-
hasMergedHistory = true;
|
|
57
|
-
return [history, completed];
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else if (completed.timestamp < history.timestamp) {
|
|
61
|
-
throw new Error('invalid candle sequence, input data is to old.');
|
|
62
|
-
}
|
|
63
|
-
return [completed];
|
|
64
|
-
}
|
|
65
|
-
return [];
|
|
66
|
-
})));
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
exports.mergeCandle = mergeCandle;
|
|
70
|
-
//# sourceMappingURL=candle-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"candle-builder.js","sourceRoot":"","sources":["../../src/domain/candle-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Adapter } from '../adapter';
|
|
2
|
-
import { Measurement } from '../storage/measurement';
|
|
3
|
-
import { Feed } from '../storage';
|
|
4
|
-
import { BacktesterOptions } from '../adapter/backtester';
|
|
5
|
-
import { PaperOptions } from '../adapter/paper';
|
|
6
|
-
export interface SessionDescriptor {
|
|
7
|
-
id?: number;
|
|
8
|
-
adapter: Adapter[];
|
|
9
|
-
feed?: Feed;
|
|
10
|
-
measurement?: Measurement;
|
|
11
|
-
options?: {
|
|
12
|
-
backtester?: BacktesterOptions;
|
|
13
|
-
paper?: PaperOptions;
|
|
14
|
-
};
|
|
15
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-descriptor.js","sourceRoot":"","sources":["../../src/domain/session-descriptor.ts"],"names":[],"mappings":""}
|