@quantform/core 0.7.20 → 0.7.22

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 (104) hide show
  1. package/lib/cli/replay.d.ts +1 -0
  2. package/lib/cli/replay.d.ts.map +1 -1
  3. package/lib/cli/replay.js +4 -3
  4. package/lib/index.d.ts +1 -1
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +1 -1
  7. package/lib/replay/index.d.ts +3 -6
  8. package/lib/replay/index.d.ts.map +1 -1
  9. package/lib/replay/index.js +3 -6
  10. package/lib/replay/use-replay-options.d.ts +6 -1
  11. package/lib/replay/use-replay-options.d.ts.map +1 -1
  12. package/lib/replay/use-replay-options.js +1 -1
  13. package/lib/replay/{use-replay-manager.d.ts → use-replay-scheduler.d.ts} +4 -4
  14. package/lib/replay/use-replay-scheduler.d.ts.map +1 -0
  15. package/lib/{backtest/use-backtest-scheduler.js → replay/use-replay-scheduler.js} +6 -6
  16. package/lib/replay/{storage/use-replay-storage-buffer.d.ts → use-replay-storage-buffer.d.ts} +2 -2
  17. package/lib/replay/use-replay-storage-buffer.d.ts.map +1 -0
  18. package/lib/{backtest/use-backtest-storage-buffer.js → replay/use-replay-storage-buffer.js} +6 -6
  19. package/lib/{backtest/use-backtest-storage-cursor.d.ts → replay/use-replay-storage-cursor.d.ts} +4 -4
  20. package/lib/replay/use-replay-storage-cursor.d.ts.map +1 -0
  21. package/lib/{backtest/use-backtest-storage-cursor.js → replay/use-replay-storage-cursor.js} +4 -4
  22. package/lib/{backtest/use-backtest-storage.d.ts → replay/use-replay-storage.d.ts} +3 -3
  23. package/lib/replay/use-replay-storage.d.ts.map +1 -0
  24. package/lib/{backtest/use-backtest-storage.js → replay/use-replay-storage.js} +16 -9
  25. package/lib/replay/use-replay-sync.d.ts +3 -0
  26. package/lib/replay/use-replay-sync.d.ts.map +1 -0
  27. package/lib/{backtest/use-backtest-sync.js → replay/use-replay-sync.js} +5 -5
  28. package/lib/replay/use-replay.d.ts +1 -9
  29. package/lib/replay/use-replay.d.ts.map +1 -1
  30. package/lib/replay/use-replay.js +3 -14
  31. package/lib/replay/when-replay-finished.js +2 -2
  32. package/lib/use-timestamp.js +2 -2
  33. package/package.json +1 -1
  34. package/src/cli/replay.ts +3 -2
  35. package/src/index.ts +1 -1
  36. package/src/replay/index.ts +3 -6
  37. package/src/replay/use-replay-options.ts +10 -2
  38. package/src/{backtest/use-backtest-scheduler.ts → replay/use-replay-scheduler.ts} +8 -11
  39. package/src/{backtest/use-backtest-storage-buffer.ts → replay/use-replay-storage-buffer.ts} +5 -5
  40. package/src/{backtest/use-backtest-storage-cursor.ts → replay/use-replay-storage-cursor.ts} +7 -7
  41. package/src/replay/use-replay-storage.ts +101 -0
  42. package/src/{backtest/use-backtest-sync.ts → replay/use-replay-sync.ts} +3 -3
  43. package/src/replay/use-replay.ts +3 -24
  44. package/src/replay/when-replay-finished.ts +2 -2
  45. package/src/use-timestamp.ts +2 -2
  46. package/lib/backtest/index.d.ts +0 -7
  47. package/lib/backtest/index.d.ts.map +0 -1
  48. package/lib/backtest/index.js +0 -22
  49. package/lib/backtest/use-backtest-options.d.ts +0 -15
  50. package/lib/backtest/use-backtest-options.d.ts.map +0 -1
  51. package/lib/backtest/use-backtest-options.js +0 -20
  52. package/lib/backtest/use-backtest-scheduler.d.ts +0 -28
  53. package/lib/backtest/use-backtest-scheduler.d.ts.map +0 -1
  54. package/lib/backtest/use-backtest-storage-buffer.d.ts +0 -15
  55. package/lib/backtest/use-backtest-storage-buffer.d.ts.map +0 -1
  56. package/lib/backtest/use-backtest-storage-cursor.d.ts.map +0 -1
  57. package/lib/backtest/use-backtest-storage.d.ts.map +0 -1
  58. package/lib/backtest/use-backtest-sync.d.ts +0 -3
  59. package/lib/backtest/use-backtest-sync.d.ts.map +0 -1
  60. package/lib/backtest/use-backtest.d.ts +0 -2
  61. package/lib/backtest/use-backtest.d.ts.map +0 -1
  62. package/lib/backtest/use-backtest.js +0 -9
  63. package/lib/backtest/when-backtest-finished.d.ts +0 -2
  64. package/lib/backtest/when-backtest-finished.d.ts.map +0 -1
  65. package/lib/backtest/when-backtest-finished.js +0 -15
  66. package/lib/replay/replay-guard.d.ts +0 -10
  67. package/lib/replay/replay-guard.d.ts.map +0 -1
  68. package/lib/replay/replay-guard.js +0 -8
  69. package/lib/replay/replay.d.ts +0 -10
  70. package/lib/replay/replay.d.ts.map +0 -1
  71. package/lib/replay/replay.js +0 -9
  72. package/lib/replay/storage/use-replay-storage-buffer.d.ts.map +0 -1
  73. package/lib/replay/storage/use-replay-storage-buffer.js +0 -57
  74. package/lib/replay/storage/use-replay-storage-cursor.d.ts +0 -30
  75. package/lib/replay/storage/use-replay-storage-cursor.d.ts.map +0 -1
  76. package/lib/replay/storage/use-replay-storage-cursor.js +0 -49
  77. package/lib/replay/storage/use-replay-storage.d.ts +0 -13
  78. package/lib/replay/storage/use-replay-storage.d.ts.map +0 -1
  79. package/lib/replay/storage/use-replay-storage.js +0 -39
  80. package/lib/replay/storage/use-replay-storage.spec.d.ts +0 -2
  81. package/lib/replay/storage/use-replay-storage.spec.d.ts.map +0 -1
  82. package/lib/replay/storage/use-replay-storage.spec.js +0 -74
  83. package/lib/replay/use-replay-lock.d.ts +0 -3
  84. package/lib/replay/use-replay-lock.d.ts.map +0 -1
  85. package/lib/replay/use-replay-lock.js +0 -22
  86. package/lib/replay/use-replay-manager.d.ts.map +0 -1
  87. package/lib/replay/use-replay-manager.js +0 -68
  88. package/lib/replay/use-replay.spec.d.ts +0 -2
  89. package/lib/replay/use-replay.spec.d.ts.map +0 -1
  90. package/lib/replay/use-replay.spec.js +0 -130
  91. package/src/backtest/index.ts +0 -6
  92. package/src/backtest/use-backtest-options.ts +0 -23
  93. package/src/backtest/use-backtest-storage.ts +0 -87
  94. package/src/backtest/use-backtest.ts +0 -7
  95. package/src/backtest/when-backtest-finished.ts +0 -20
  96. package/src/replay/replay-guard.ts +0 -11
  97. package/src/replay/replay.ts +0 -13
  98. package/src/replay/storage/use-replay-storage-buffer.ts +0 -52
  99. package/src/replay/storage/use-replay-storage-cursor.ts +0 -44
  100. package/src/replay/storage/use-replay-storage.spec.ts +0 -84
  101. package/src/replay/storage/use-replay-storage.ts +0 -29
  102. package/src/replay/use-replay-lock.ts +0 -29
  103. package/src/replay/use-replay-manager.ts +0 -83
  104. package/src/replay/use-replay.spec.ts +0 -138
@@ -1,39 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.useReplayStorage = void 0;
13
- const storage_1 = require("../../storage");
14
- const use_hash_1 = require("../../use-hash");
15
- function useReplayStorage(dependencies) {
16
- const storage = (0, storage_1.useStorage)(['replay']);
17
- const storageObjectKey = (0, use_hash_1.useHash)(dependencies);
18
- const storageObject = storage_1.Storage.createObject(storageObjectKey, {
19
- timestamp: 'number',
20
- payload: 'string'
21
- });
22
- return {
23
- query(query) {
24
- return __awaiter(this, void 0, void 0, function* () {
25
- return (yield storage.query(storageObject, query)).map(it => ({
26
- timestamp: it.timestamp,
27
- payload: JSON.parse(it.payload)
28
- }));
29
- });
30
- },
31
- save(objects) {
32
- return storage.save(storageObject, objects.map(it => ({
33
- timestamp: it.timestamp,
34
- payload: JSON.stringify(it.payload)
35
- })));
36
- }
37
- };
38
- }
39
- exports.useReplayStorage = useReplayStorage;
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=use-replay-storage.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-replay-storage.spec.d.ts","sourceRoot":"","sources":["../../../src/replay/storage/use-replay-storage.spec.ts"],"names":[],"mappings":""}
@@ -1,74 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const make_test_module_1 = require("../../make-test-module");
13
- const storage_1 = require("../../storage");
14
- const use_replay_storage_1 = require("./use-replay-storage");
15
- jest.mock('@lib/storage', () => (Object.assign(Object.assign({}, jest.requireActual('@lib/storage')), { useStorage: jest.fn() })));
16
- describe(use_replay_storage_1.useReplayStorage.name, () => {
17
- let fixtures;
18
- beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
19
- fixtures = yield getFixtures();
20
- }));
21
- describe('query', () => {
22
- test('happy path', () => __awaiter(void 0, void 0, void 0, function* () {
23
- yield fixtures.given.stored(fixtures.sample);
24
- const sample = yield fixtures.when.queried({});
25
- expect(sample).toEqual(fixtures.sample);
26
- }));
27
- });
28
- describe('save', () => {
29
- test('happy path', () => __awaiter(void 0, void 0, void 0, function* () {
30
- yield fixtures.when.saved(fixtures.sample);
31
- yield fixtures.then.stored(fixtures.sample);
32
- }));
33
- });
34
- });
35
- function getFixtures() {
36
- return __awaiter(this, void 0, void 0, function* () {
37
- const { act } = yield (0, make_test_module_1.makeTestModule)([]);
38
- const dependencies = ['binance:btc-usdt', 'candle', 'h1'];
39
- const save = jest.fn();
40
- const query = jest.fn();
41
- (0, make_test_module_1.mockedFunc)(storage_1.useStorage).mockReturnValue({ save, query });
42
- return {
43
- sample: [
44
- { timestamp: 1, payload: { o: 1.1, h: 1.1, l: 1.1, c: 1.1 } },
45
- { timestamp: 2, payload: { o: 1.1, h: 2.2, l: 1.1, c: 2.2 } },
46
- { timestamp: 3, payload: { o: 1.1, h: 3.3, l: 1.1, c: 3.3 } }
47
- ],
48
- given: {
49
- stored(sample) {
50
- return query.mockReturnValue(Promise.resolve(sample.map(it => ({
51
- timestamp: it.timestamp,
52
- payload: JSON.stringify(it.payload)
53
- }))));
54
- }
55
- },
56
- when: {
57
- saved(sample) {
58
- return act(() => (0, use_replay_storage_1.useReplayStorage)(dependencies).save(sample));
59
- },
60
- queried(query) {
61
- return act(() => (0, use_replay_storage_1.useReplayStorage)(dependencies).query(query));
62
- }
63
- },
64
- then: {
65
- stored(sample) {
66
- expect(save).toHaveBeenCalledWith(expect.anything(), sample.map(it => ({
67
- timestamp: it.timestamp,
68
- payload: JSON.stringify(it.payload)
69
- })));
70
- }
71
- }
72
- };
73
- });
74
- }
@@ -1,3 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- export declare function useReplayLock<T>(input: Observable<T>): Observable<T>;
3
- //# sourceMappingURL=use-replay-lock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-replay-lock.d.ts","sourceRoot":"","sources":["../../src/replay/use-replay-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAE,MAAM,MAAM,CAAC;AAO5C,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAqBpE"}
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useReplayLock = void 0;
4
- const rxjs_1 = require("rxjs");
5
- const use_execution_mode_1 = require("../use-execution-mode");
6
- const use_logger_1 = require("../use-logger");
7
- const use_replay_manager_1 = require("./use-replay-manager");
8
- function useReplayLock(input) {
9
- const { isReplay } = (0, use_execution_mode_1.useExecutionMode)();
10
- if (!isReplay) {
11
- return input;
12
- }
13
- const { info } = (0, use_logger_1.useLogger)('replay');
14
- const { stop, tryContinue } = (0, use_replay_manager_1.useReplayManager)();
15
- info('lock acquired');
16
- stop();
17
- return input.pipe((0, rxjs_1.finalize)(() => {
18
- info('lock released');
19
- tryContinue();
20
- }));
21
- }
22
- exports.useReplayLock = useReplayLock;
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-replay-manager.d.ts","sourceRoot":"","sources":["../../src/replay/use-replay-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,UAAU,EAAW,MAAM,MAAM,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;mBAQqC,MAAM;iBAAW,GAAG;;;;;2BAoD3D,UAAU,EAAE;mBAA2B,MAAM;;;CAatE,CAAC"}
@@ -1,68 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.useReplayManager = void 0;
13
- const rxjs_1 = require("rxjs");
14
- const with_memo_1 = require("../with-memo");
15
- const use_replay_storage_cursor_1 = require("./storage/use-replay-storage-cursor");
16
- const use_replay_options_1 = require("./use-replay-options");
17
- exports.useReplayManager = (0, with_memo_1.withMemo)(() => {
18
- const { from } = (0, use_replay_options_1.useReplayOptions)();
19
- const { get, cursor } = (0, use_replay_storage_cursor_1.useReplayStorageCursor)();
20
- let timestamp = from;
21
- let stopAcquire = 1;
22
- const stream$ = new rxjs_1.Subject();
23
- const processNext = () => __awaiter(void 0, void 0, void 0, function* () {
24
- const storage = yield cursor();
25
- if (!storage || !storage.peek()) {
26
- stream$.complete();
27
- return false;
28
- }
29
- const sample = storage.dequeue();
30
- timestamp = sample.timestamp;
31
- stream$.next([storage, sample]);
32
- return true;
33
- });
34
- const next = () => __awaiter(void 0, void 0, void 0, function* () {
35
- if (yield processNext()) {
36
- if (stopAcquire === 0) {
37
- setImmediate(next);
38
- }
39
- }
40
- });
41
- const tryContinue = () => {
42
- if (stopAcquire == 0) {
43
- return;
44
- }
45
- stopAcquire = Math.max(0, stopAcquire - 1);
46
- if (stopAcquire != 0) {
47
- return;
48
- }
49
- next();
50
- };
51
- return {
52
- stream: stream$.asObservable(),
53
- timestamp() {
54
- return timestamp;
55
- },
56
- stop() {
57
- stopAcquire++;
58
- },
59
- tryContinue,
60
- watch(dependencies) {
61
- const storage = get(dependencies);
62
- return (0, rxjs_1.defer)(() => {
63
- tryContinue();
64
- return stream$.pipe((0, rxjs_1.filter)(([cur]) => cur === storage), (0, rxjs_1.map)(([, it]) => ({ timestamp: it.timestamp, payload: it.payload })));
65
- });
66
- }
67
- };
68
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=use-replay.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-replay.spec.d.ts","sourceRoot":"","sources":["../../src/replay/use-replay.spec.ts"],"names":[],"mappings":""}
@@ -1,130 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const use_replay_1 = require("./use-replay");
4
- describe(use_replay_1.useReplay.name, () => {
5
- test('happy path', () => {
6
- expect(true).toBe(true);
7
- });
8
- });
9
- /*
10
-
11
- describe.skip(useReplayCoordinator.name, () => {
12
- let fixtures: Awaited<ReturnType<typeof getFixtures>>;
13
-
14
- beforeEach(async () => {
15
- fixtures = await getFixtures();
16
- });
17
-
18
- test('return single data stream for single data source', async () => {
19
- fixtures.givenRecordingEnabled(false);
20
- await fixtures.givenSampleStored(fixtures.sample1, ['sample1']);
21
-
22
- const sample1 = fixtures.whenUseReplayCalled(fixtures.sample1, ['sample']);
23
- await fixtures.whenUseSampleStreamerStarted();
24
-
25
- expect(await sample1).toEqual(fixtures.sample1);
26
- });
27
-
28
- test('return combined data stream for multiple data sources', async () => {
29
- fixtures.givenRecordingEnabled(false);
30
- await fixtures.givenSampleStored(fixtures.sample1, ['sample1']);
31
- await fixtures.givenSampleStored(fixtures.sample2, ['sample2']);
32
-
33
- const sample1 = fixtures.whenUseReplayCalled(fixtures.sample1, ['sample1']);
34
- const sample2 = fixtures.whenUseReplayCalled(fixtures.sample2, ['sample2']);
35
- await fixtures.whenUseSampleStreamerStarted();
36
-
37
- expect(await sample1).toEqual(fixtures.sample1);
38
- expect(await sample2).toEqual(fixtures.sample2);
39
- });
40
-
41
- test('record and write data stream into storage', async () => {
42
- fixtures.givenRecordingEnabled(true);
43
- const sample1 = await fixtures.whenUseReplayCalled(fixtures.sample1, ['sample1x']);
44
- const sample2 = await fixtures.whenUseReplayCalled(fixtures.sample2, ['sample2x']);
45
-
46
- fixtures.thenReplaySampleStored(sample1, ['sample1x']);
47
- fixtures.thenReplaySampleStored(sample2, ['sample2x']);
48
- });
49
- });
50
-
51
- async function getFixtures() {
52
- const executionMode = replayExecutionMode();
53
-
54
- const { act } = await makeTestModule([
55
- executionMode,
56
- replayOptions({ from: 0, to: Number.MAX_VALUE })
57
- ]);
58
-
59
- return {
60
- sample1: [
61
- { timestamp: 1, payload: { o: 111, h: 112, l: 113, c: 114 } },
62
- { timestamp: 2, payload: { o: 121, h: 122, l: 123, c: 124 } },
63
- { timestamp: 3, payload: { o: 131, h: 132, l: 133, c: 134 } }
64
- ],
65
- sample2: [
66
- { timestamp: 1, payload: { o: 211, h: 212, l: 213, c: 214 } },
67
- { timestamp: 2, payload: { o: 221, h: 222, l: 223, c: 224 } },
68
- { timestamp: 3, payload: { o: 231, h: 232, l: 233, c: 234 } }
69
- ],
70
-
71
- givenRecordingEnabled(recording: boolean) {
72
- executionMode.useValue.recording = recording;
73
- },
74
-
75
- givenSampleStored<T>(
76
- sample: { timestamp: number; payload: T }[],
77
- dependencies: dependency[]
78
- ) {
79
- return act(() => {
80
- const writer = useReplayWriter(dependencies);
81
-
82
- return writer(sample);
83
- });
84
- },
85
-
86
- async whenUseReplayCalled<T>(
87
- input: { timestamp: number; payload: T }[],
88
- dependencies: dependency[]
89
- ) {
90
- const sample = Array.of<{ timestamp: number; payload: T }>();
91
-
92
- await act(() =>
93
- lastValueFrom(
94
- useReplay<T>(from(input), dependencies).pipe(tap(it => sample.push(it)))
95
- )
96
- );
97
-
98
- return sample;
99
- },
100
-
101
- whenUseSampleStreamerStarted() {
102
- act(() => {
103
- const { tryContinue } = useReplayCoordinator();
104
-
105
- tryContinue();
106
- });
107
- },
108
-
109
- async thenReplaySampleStored<T extends { timestamp: number }>(
110
- sample: T[],
111
- dependencies: dependency[]
112
- ) {
113
- const stored = await act(() => {
114
- const reader = useReplayReader(dependencies);
115
-
116
- return reader({
117
- where: {
118
- timestamp: between(
119
- sample[0].timestamp,
120
- sample[sample.length - 1].timestamp + 1
121
- )
122
- }
123
- });
124
- });
125
-
126
- expect(stored).toEqual(sample);
127
- }
128
- };
129
- }
130
- */
@@ -1,6 +0,0 @@
1
- export * from './use-backtest';
2
- export * from './use-backtest-options';
3
- export * from './use-backtest-scheduler';
4
- export * from './use-backtest-storage';
5
- export * from './use-backtest-sync';
6
- export * from './when-backtest-finished';
@@ -1,23 +0,0 @@
1
- import { Dependency, useContext } from '@lib/module';
2
-
3
- const injectionToken = Symbol('backtest-options');
4
-
5
- type BacktestOptions = {
6
- from: number;
7
- to: number;
8
- };
9
-
10
- /**
11
- *
12
- */
13
- export function backtestOptions(options: BacktestOptions): Dependency {
14
- return {
15
- provide: injectionToken,
16
- useValue: options
17
- };
18
- }
19
-
20
- /**
21
- * Will return current backtest execution options.
22
- */
23
- export const useBacktestOptions = () => useContext<BacktestOptions>(injectionToken);
@@ -1,87 +0,0 @@
1
- import { hashCode } from '@lib/hash-code';
2
- import {
3
- eq,
4
- InferQueryObject,
5
- Query,
6
- QueryObject,
7
- QueryObjectType,
8
- Storage,
9
- useStorage
10
- } from '@lib/storage';
11
- import { Uri } from '@lib/uri';
12
-
13
- import { useBacktestScheduler } from './use-backtest-scheduler';
14
-
15
- export type BacktestStorageQuery<V> = {
16
- sync: <T extends QueryObjectType<K>, K extends QueryObject>(
17
- query: Query<InferQueryObject<T>> & {
18
- where: { timestamp: { type: 'between'; min: number; max: number } };
19
- },
20
- storage: { save: (objects: { timestamp: number; payload: V }[]) => Promise<void> }
21
- ) => Promise<void>;
22
- };
23
-
24
- const storageIndexObject = Storage.createObject('index://range', {
25
- timestamp: 'number',
26
- uri: 'string',
27
- min: 'number',
28
- max: 'number'
29
- });
30
-
31
- export function useBacktestStorage<V, P extends Record<string, string | number>>(
32
- uri: Uri<P>,
33
- { sync }: BacktestStorageQuery<V>
34
- ) {
35
- const { watch } = useBacktestScheduler();
36
- const storage = useStorage(['backtest']);
37
- const storageObjectKey = uri.query;
38
- const storageObject = Storage.createObject(storageObjectKey, {
39
- timestamp: 'number',
40
- payload: 'string'
41
- });
42
-
43
- const id = hashCode(storageObjectKey);
44
-
45
- return {
46
- watch: () =>
47
- watch({
48
- async query(query) {
49
- const [index] = await storage.query(storageIndexObject, {
50
- limit: 1,
51
- where: { timestamp: eq(id) }
52
- });
53
-
54
- const { min, max } = query.where.timestamp;
55
-
56
- if (!index || min < index.min || max > index.max) {
57
- await sync(query, {
58
- async save(objects) {
59
- console.log('save');
60
- await storage.save(
61
- storageObject,
62
- objects.map(it => ({
63
- timestamp: it.timestamp,
64
- payload: JSON.stringify(it.payload)
65
- }))
66
- );
67
- }
68
- });
69
-
70
- await storage.save(storageIndexObject, [
71
- {
72
- timestamp: id,
73
- max,
74
- min,
75
- uri: storageObjectKey
76
- }
77
- ]);
78
- }
79
-
80
- return (await storage.query(storageObject, query)).map(it => ({
81
- timestamp: it.timestamp,
82
- payload: JSON.parse(it.payload) as V
83
- }));
84
- }
85
- })
86
- };
87
- }
@@ -1,7 +0,0 @@
1
- import { useExecutionMode } from '@lib/use-execution-mode';
2
-
3
- export function useBacktest<T>(backtest: T, real: T) {
4
- const { isReplay } = useExecutionMode();
5
-
6
- return isReplay ? backtest : real;
7
- }
@@ -1,20 +0,0 @@
1
- import { from, last, map, Subject } from 'rxjs';
2
-
3
- import { useExecutionMode } from '@lib/use-execution-mode';
4
-
5
- import { useBacktestScheduler } from './use-backtest-scheduler';
6
-
7
- export function whenBacktestFinished() {
8
- const { isReplay } = useExecutionMode();
9
-
10
- if (!isReplay) {
11
- return new Subject<boolean>().asObservable();
12
- }
13
-
14
- const { stream } = useBacktestScheduler();
15
-
16
- return from(stream).pipe(
17
- last(),
18
- map(() => true)
19
- );
20
- }
@@ -1,11 +0,0 @@
1
- import { Observable } from 'rxjs';
2
-
3
- import { dependency } from '@lib/use-hash';
4
-
5
- import { useReplayLock } from './use-replay-lock';
6
-
7
- export function replayGuard<T extends Array<dependency>, K>(
8
- fn: (...args: T) => Observable<{ timestamp: number; payload: K }>
9
- ): (...args: T) => Observable<{ timestamp: number; payload: K }> {
10
- return (...args: T) => useReplayLock(fn(...args));
11
- }
@@ -1,13 +0,0 @@
1
- import { Observable } from 'rxjs';
2
-
3
- import { dependency } from '@lib/use-hash';
4
- import { withMemo } from '@lib/with-memo';
5
-
6
- import { useReplay } from './use-replay';
7
-
8
- export function replay<T extends Array<dependency>, K>(
9
- fn: (...args: T) => Observable<{ timestamp: number; payload: K }>,
10
- dependencies: dependency[]
11
- ): (...args: T) => Observable<{ timestamp: number; payload: K }> {
12
- return withMemo((...args: T) => useReplay(fn(...args), [...dependencies, ...args]));
13
- }
@@ -1,52 +0,0 @@
1
- import { useReplayOptions } from '@lib/replay/use-replay-options';
2
- import { between } from '@lib/storage';
3
- import { dependency } from '@lib/use-hash';
4
- import { withMemo } from '@lib/with-memo';
5
-
6
- import { useReplayStorage } from './use-replay-storage';
7
-
8
- export const useReplayStorageBuffer = withMemo(<T>(dependencies: dependency[]) => {
9
- const { query } = useReplayStorage<T>(dependencies);
10
- const { from, to } = useReplayOptions();
11
-
12
- console.log(from, to);
13
-
14
- let page = new Array<{ timestamp: number; payload: T }>();
15
- let index = 0;
16
- let completed = false;
17
- let count = 0;
18
-
19
- return {
20
- size() {
21
- return page.length - index;
22
- },
23
- peek() {
24
- return page[index];
25
- },
26
- dequeue() {
27
- return page[index++];
28
- },
29
- completed() {
30
- return completed;
31
- },
32
- async fetchNextPage() {
33
- if (completed) {
34
- return;
35
- }
36
-
37
- index = 0;
38
-
39
- page = await query({
40
- where: {
41
- timestamp: between(from, to)
42
- },
43
- limit: 10000,
44
- offset: count,
45
- orderBy: 'ASC'
46
- });
47
-
48
- count += page.length;
49
- completed = page.length == 0;
50
- }
51
- };
52
- });
@@ -1,44 +0,0 @@
1
- import { dependency, useHash } from '@lib/use-hash';
2
- import { useLogger } from '@lib/use-logger';
3
- import { withMemo } from '@lib/with-memo';
4
-
5
- import { useReplayStorageBuffer } from './use-replay-storage-buffer';
6
-
7
- export const useReplayStorageCursor = withMemo(() => {
8
- const { info } = useLogger('useReplayStorageCursor');
9
- const storages = Array.of<ReturnType<typeof useReplayStorageBuffer<any>>>();
10
-
11
- return {
12
- get<T>(dependencies: dependency[]) {
13
- const storage = useReplayStorageBuffer<T>(dependencies);
14
-
15
- if (!storages.includes(storage)) {
16
- info('opening a new replay buffer', useHash(dependencies));
17
- storages.push(storage);
18
- }
19
-
20
- return storage;
21
- },
22
- async cursor() {
23
- let current: ReturnType<typeof useReplayStorageBuffer<any>> | undefined;
24
-
25
- for (const storage of storages) {
26
- if (storage.completed()) {
27
- continue;
28
- }
29
-
30
- if (storage.size() == 0) {
31
- await storage.fetchNextPage();
32
- }
33
-
34
- if (storage.peek()) {
35
- if (!current || current.peek().timestamp > storage.peek().timestamp) {
36
- current = storage;
37
- }
38
- }
39
- }
40
-
41
- return current;
42
- }
43
- };
44
- });