@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.
Files changed (250) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +2 -2
  2. package/dist/adapter/adapter-aggregate.js.map +1 -1
  3. package/dist/adapter/adapter.d.ts +5 -6
  4. package/dist/adapter/adapter.js.map +1 -1
  5. package/dist/adapter/backtester/backtester-adapter.d.ts +6 -6
  6. package/dist/adapter/backtester/backtester-adapter.js +5 -9
  7. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  8. package/dist/adapter/backtester/backtester-cursor.d.ts +2 -2
  9. package/dist/adapter/backtester/backtester-cursor.spec.js +9 -9
  10. package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
  11. package/dist/adapter/backtester/backtester-streamer.d.ts +6 -4
  12. package/dist/adapter/backtester/backtester-streamer.js +5 -5
  13. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  14. package/dist/adapter/backtester/backtester-streamer.spec.js +9 -11
  15. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  16. package/dist/adapter/index.d.ts +2 -0
  17. package/dist/adapter/index.js +2 -0
  18. package/dist/adapter/index.js.map +1 -1
  19. package/dist/adapter/paper/index.d.ts +2 -2
  20. package/dist/adapter/paper/index.js +2 -2
  21. package/dist/adapter/paper/index.js.map +1 -1
  22. package/dist/adapter/paper/paper-adapter.d.ts +5 -5
  23. package/dist/adapter/paper/paper-adapter.js +9 -12
  24. package/dist/adapter/paper/paper-adapter.js.map +1 -1
  25. package/dist/adapter/paper/paper-adapter.spec.js +5 -7
  26. package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
  27. package/dist/adapter/paper/{executor/paper-margin-executor.d.ts → simulator/paper-margin-simulator.d.ts} +3 -3
  28. package/dist/adapter/paper/{executor/paper-margin-executor.js → simulator/paper-margin-simulator.js} +11 -11
  29. package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +1 -0
  30. package/dist/adapter/paper/{executor/paper-executor.d.ts → simulator/paper-simulator.d.ts} +2 -2
  31. package/dist/adapter/paper/{executor/paper-executor.js → simulator/paper-simulator.js} +7 -7
  32. package/dist/adapter/paper/simulator/paper-simulator.js.map +1 -0
  33. package/dist/adapter/paper/{executor/paper-spot-executor.d.ts → simulator/paper-spot-simulator.d.ts} +3 -3
  34. package/dist/adapter/paper/{executor/paper-spot-executor.js → simulator/paper-spot-simulator.js} +17 -17
  35. package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +1 -0
  36. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.d.ts +1 -0
  37. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +49 -0
  38. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +1 -0
  39. package/dist/bootstrap.d.ts +1 -1
  40. package/dist/bootstrap.js +3 -5
  41. package/dist/bootstrap.js.map +1 -1
  42. package/dist/domain/balance.d.ts +1 -1
  43. package/dist/domain/candle.d.ts +14 -0
  44. package/dist/domain/candle.js +65 -1
  45. package/dist/domain/candle.js.map +1 -1
  46. package/dist/domain/candle.spec.js +11 -13
  47. package/dist/domain/candle.spec.js.map +1 -1
  48. package/dist/domain/index.d.ts +6 -8
  49. package/dist/domain/index.js +6 -8
  50. package/dist/domain/index.js.map +1 -1
  51. package/dist/domain/order.d.ts +1 -1
  52. package/dist/domain/order.js.map +1 -1
  53. package/dist/domain/orderbook.d.ts +1 -1
  54. package/dist/domain/position.d.ts +2 -2
  55. package/dist/domain/position.js +3 -3
  56. package/dist/domain/position.js.map +1 -1
  57. package/dist/domain/session.d.ts +14 -3
  58. package/dist/domain/session.js +17 -18
  59. package/dist/domain/session.js.map +1 -1
  60. package/dist/domain/session.spec.js +3 -3
  61. package/dist/domain/session.spec.js.map +1 -1
  62. package/dist/domain/statement.d.ts +1 -2
  63. package/dist/domain/statement.js.map +1 -1
  64. package/dist/domain/trade.d.ts +1 -1
  65. package/dist/index.d.ts +4 -7
  66. package/dist/index.js +4 -7
  67. package/dist/index.js.map +1 -1
  68. package/dist/indicator/atr.js +3 -3
  69. package/dist/indicator/atr.js.map +1 -1
  70. package/dist/indicator/cross.js +3 -3
  71. package/dist/indicator/cross.js.map +1 -1
  72. package/dist/indicator/donchian.js +3 -4
  73. package/dist/indicator/donchian.js.map +1 -1
  74. package/dist/indicator/drawdown.js +3 -3
  75. package/dist/indicator/drawdown.js.map +1 -1
  76. package/dist/indicator/ema.js +3 -3
  77. package/dist/indicator/ema.js.map +1 -1
  78. package/dist/indicator/envelope.js +3 -3
  79. package/dist/indicator/envelope.js.map +1 -1
  80. package/dist/indicator/index.d.ts +3 -3
  81. package/dist/indicator/index.js +3 -3
  82. package/dist/indicator/index.js.map +1 -1
  83. package/dist/indicator/macd.js +2 -3
  84. package/dist/indicator/macd.js.map +1 -1
  85. package/dist/indicator/min-max.js +3 -3
  86. package/dist/indicator/min-max.js.map +1 -1
  87. package/dist/indicator/rma.js +3 -3
  88. package/dist/indicator/rma.js.map +1 -1
  89. package/dist/indicator/sma.js +2 -3
  90. package/dist/indicator/sma.js.map +1 -1
  91. package/dist/indicator/swma.js +3 -3
  92. package/dist/indicator/swma.js.map +1 -1
  93. package/dist/indicator/tma.js +3 -3
  94. package/dist/indicator/tma.js.map +1 -1
  95. package/dist/indicator/trailing.js +3 -3
  96. package/dist/indicator/trailing.js.map +1 -1
  97. package/dist/indicator/truerange.js +3 -3
  98. package/dist/indicator/truerange.js.map +1 -1
  99. package/dist/indicator/truerange.spec.js +2 -2
  100. package/dist/indicator/truerange.spec.js.map +1 -1
  101. package/dist/indicator/wma.js +3 -3
  102. package/dist/indicator/wma.js.map +1 -1
  103. package/dist/ipc.d.ts +1 -1
  104. package/dist/ipc.js +3 -3
  105. package/dist/ipc.js.map +1 -1
  106. package/dist/ipc.spec.js +4 -5
  107. package/dist/ipc.spec.js.map +1 -1
  108. package/dist/shared/index.d.ts +4 -4
  109. package/dist/shared/index.js +4 -4
  110. package/dist/shared/index.js.map +1 -1
  111. package/dist/shared/policy.js +1 -1
  112. package/dist/shared/policy.js.map +1 -1
  113. package/dist/storage/feed.d.ts +1 -1
  114. package/dist/storage/feed.js.map +1 -1
  115. package/dist/storage/index.d.ts +1 -1
  116. package/dist/storage/index.js +1 -1
  117. package/dist/storage/index.js.map +1 -1
  118. package/dist/storage/measurement.js.map +1 -1
  119. package/dist/storage/storage.js.map +1 -1
  120. package/dist/store/event/index.d.ts +4 -4
  121. package/dist/store/event/index.js +4 -4
  122. package/dist/store/event/index.js.map +1 -1
  123. package/dist/store/event/store-balance.event.d.ts +1 -1
  124. package/dist/store/event/store-balance.event.js +1 -1
  125. package/dist/store/event/store-balance.event.js.map +1 -1
  126. package/dist/store/event/store-balance.event.spec.js +3 -3
  127. package/dist/store/event/store-balance.event.spec.js.map +1 -1
  128. package/dist/store/event/store-candle.event.d.ts +2 -2
  129. package/dist/store/event/store-candle.event.js +2 -2
  130. package/dist/store/event/store-candle.event.js.map +1 -1
  131. package/dist/store/event/store-candle.event.spec.js +1 -1
  132. package/dist/store/event/store-candle.event.spec.js.map +1 -1
  133. package/dist/store/event/store-instrument.event.d.ts +1 -1
  134. package/dist/store/event/store-instrument.event.js +1 -1
  135. package/dist/store/event/store-instrument.event.js.map +1 -1
  136. package/dist/store/event/store-instrument.event.spec.js +1 -1
  137. package/dist/store/event/store-instrument.event.spec.js.map +1 -1
  138. package/dist/store/event/store-order.event.d.ts +1 -1
  139. package/dist/store/event/store-order.event.js +6 -6
  140. package/dist/store/event/store-order.event.js.map +1 -1
  141. package/dist/store/event/store-order.event.spec.js +2 -2
  142. package/dist/store/event/store-order.event.spec.js.map +1 -1
  143. package/dist/store/event/store-orderbook.event.d.ts +1 -1
  144. package/dist/store/event/store-orderbook.event.js +1 -1
  145. package/dist/store/event/store-orderbook.event.js.map +1 -1
  146. package/dist/store/event/store-position.event.d.ts +1 -1
  147. package/dist/store/event/store-position.event.js +1 -1
  148. package/dist/store/event/store-position.event.js.map +1 -1
  149. package/dist/store/event/store-trade.event.d.ts +1 -1
  150. package/dist/store/event/store-trade.event.js +1 -1
  151. package/dist/store/event/store-trade.event.js.map +1 -1
  152. package/dist/store/event/store-trade.event.spec.js +2 -2
  153. package/dist/store/event/store-trade.event.spec.js.map +1 -1
  154. package/dist/store/index.d.ts +1 -0
  155. package/dist/store/index.js +1 -0
  156. package/dist/store/index.js.map +1 -1
  157. package/dist/store/store.d.ts +2 -5
  158. package/dist/store/store.js +4 -8
  159. package/dist/store/store.js.map +1 -1
  160. package/dist/store/store.state.d.ts +1 -1
  161. package/dist/tests/backtester-adapter.spec.js +8 -15
  162. package/dist/tests/backtester-adapter.spec.js.map +1 -1
  163. package/dist/tests/session.spec.d.ts +0 -1
  164. package/dist/tests/session.spec.js +0 -2
  165. package/dist/tsconfig.tsbuildinfo +1 -1
  166. package/package.json +1 -1
  167. package/src/adapter/adapter-aggregate.ts +2 -3
  168. package/src/adapter/adapter.ts +5 -6
  169. package/src/adapter/backtester/backtester-adapter.ts +8 -8
  170. package/src/adapter/backtester/backtester-cursor.spec.ts +1 -1
  171. package/src/adapter/backtester/backtester-cursor.ts +2 -2
  172. package/src/adapter/backtester/backtester-streamer.spec.ts +1 -3
  173. package/src/adapter/backtester/backtester-streamer.ts +7 -8
  174. package/src/adapter/index.ts +2 -0
  175. package/src/adapter/paper/index.ts +2 -2
  176. package/src/adapter/paper/paper-adapter.spec.ts +6 -8
  177. package/src/adapter/paper/paper-adapter.ts +9 -11
  178. package/src/adapter/paper/{executor/paper-margin-executor.ts → simulator/paper-margin-simulator.ts} +5 -5
  179. package/src/adapter/paper/{executor/paper-executor.ts → simulator/paper-simulator.ts} +4 -4
  180. package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +87 -0
  181. package/src/adapter/paper/{executor/paper-spot-executor.ts → simulator/paper-spot-simulator.ts} +6 -6
  182. package/src/bootstrap.ts +4 -4
  183. package/src/domain/balance.ts +1 -1
  184. package/src/domain/candle.spec.ts +3 -5
  185. package/src/domain/candle.ts +103 -0
  186. package/src/domain/index.ts +6 -8
  187. package/src/domain/order.ts +2 -2
  188. package/src/domain/orderbook.ts +1 -1
  189. package/src/domain/position.ts +2 -3
  190. package/src/domain/session.spec.ts +3 -3
  191. package/src/domain/session.ts +61 -8
  192. package/src/domain/statement.ts +1 -2
  193. package/src/domain/trade.ts +1 -1
  194. package/src/index.ts +4 -7
  195. package/src/indicator/atr.ts +1 -2
  196. package/src/indicator/cross.ts +3 -4
  197. package/src/indicator/donchian.ts +2 -3
  198. package/src/indicator/drawdown.ts +2 -3
  199. package/src/indicator/ema.ts +1 -2
  200. package/src/indicator/envelope.ts +1 -2
  201. package/src/indicator/index.ts +3 -3
  202. package/src/indicator/macd.ts +1 -2
  203. package/src/indicator/min-max.ts +1 -2
  204. package/src/indicator/rma.ts +1 -2
  205. package/src/indicator/sma.ts +1 -2
  206. package/src/indicator/swma.ts +1 -2
  207. package/src/indicator/tma.ts +1 -2
  208. package/src/indicator/trailing.ts +3 -4
  209. package/src/indicator/truerange.spec.ts +2 -2
  210. package/src/indicator/truerange.ts +1 -2
  211. package/src/indicator/window.ts +1 -1
  212. package/src/indicator/wma.ts +1 -2
  213. package/src/ipc.spec.ts +6 -7
  214. package/src/ipc.ts +6 -6
  215. package/src/shared/index.ts +4 -4
  216. package/src/shared/policy.ts +1 -1
  217. package/src/shared/topic.spec.ts +1 -1
  218. package/src/storage/feed.ts +20 -1
  219. package/src/storage/index.ts +1 -1
  220. package/src/storage/measurement.ts +19 -0
  221. package/src/storage/storage.ts +37 -0
  222. package/src/store/event/index.ts +4 -4
  223. package/src/store/event/store-balance.event.spec.ts +3 -3
  224. package/src/store/event/store-balance.event.ts +2 -2
  225. package/src/store/event/store-candle.event.spec.ts +1 -1
  226. package/src/store/event/store-candle.event.ts +5 -5
  227. package/src/store/event/store-instrument.event.spec.ts +1 -1
  228. package/src/store/event/store-instrument.event.ts +2 -2
  229. package/src/store/event/store-order.event.spec.ts +2 -2
  230. package/src/store/event/store-order.event.ts +7 -7
  231. package/src/store/event/store-orderbook.event.ts +2 -2
  232. package/src/store/event/store-position.event.ts +2 -2
  233. package/src/store/event/store-trade.event.spec.ts +2 -2
  234. package/src/store/event/store-trade.event.ts +2 -2
  235. package/src/store/index.ts +1 -0
  236. package/src/store/store.state.ts +7 -7
  237. package/src/store/store.ts +6 -9
  238. package/src/tests/backtester-adapter.spec.ts +8 -15
  239. package/src/tests/session.spec.ts +0 -3
  240. package/dist/adapter/paper/executor/paper-executor.js.map +0 -1
  241. package/dist/adapter/paper/executor/paper-margin-executor.js.map +0 -1
  242. package/dist/adapter/paper/executor/paper-spot-executor.js.map +0 -1
  243. package/dist/domain/candle-builder.d.ts +0 -16
  244. package/dist/domain/candle-builder.js +0 -70
  245. package/dist/domain/candle-builder.js.map +0 -1
  246. package/dist/domain/session-descriptor.d.ts +0 -15
  247. package/dist/domain/session-descriptor.js +0 -3
  248. package/dist/domain/session-descriptor.js.map +0 -1
  249. package/src/domain/candle-builder.ts +0 -104
  250. package/src/domain/session-descriptor.ts +0 -53
@@ -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';
@@ -1,5 +1,4 @@
1
- import { Observable, withLatestFrom } from 'rxjs';
2
- import { map, share } from 'rxjs/operators';
1
+ import { map, Observable, share, withLatestFrom } from 'rxjs';
3
2
  import { ema } from './ema';
4
3
 
5
4
  export function macd<T>(
@@ -1,5 +1,4 @@
1
- import { Observable } from 'rxjs';
2
- import { filter, map, share } from 'rxjs/operators';
1
+ import { filter, map, Observable, share } from 'rxjs';
3
2
  import { window } from './window';
4
3
 
5
4
  export function minMax<T>(length: number, fn: (it: T) => number) {
@@ -1,5 +1,4 @@
1
- import { Observable } from 'rxjs';
2
- import { map, share } from 'rxjs/operators';
1
+ import { map, Observable, share } from 'rxjs';
3
2
  import { sma } from '.';
4
3
 
5
4
  export function rma<T>(length: number, fn: (it: T) => number) {
@@ -1,5 +1,4 @@
1
- import { Observable, tap } from 'rxjs';
2
- import { filter, map, share } from 'rxjs/operators';
1
+ import { filter, map, Observable, share, tap } from 'rxjs';
3
2
  import { window } from './window';
4
3
 
5
4
  export function sma<T>(length: number, fn: (it: T) => number) {
@@ -1,5 +1,4 @@
1
- import { Observable } from 'rxjs';
2
- import { filter, map, share } from 'rxjs/operators';
1
+ import { filter, map, Observable, share } from 'rxjs';
3
2
  import { window } from './window';
4
3
 
5
4
  export function swma<T>(fn: (it: T) => number) {
@@ -1,5 +1,4 @@
1
- import { Observable } from 'rxjs';
2
- import { share, map } from 'rxjs/operators';
1
+ import { map, Observable, share } from 'rxjs';
3
2
  import { swma } from './swma';
4
3
  import { wma } from './wma';
5
4
 
@@ -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 => {
@@ -1,5 +1,4 @@
1
- import { Observable } from 'rxjs';
2
- import { map, share } from 'rxjs/operators';
1
+ import { map, Observable, share } from 'rxjs';
3
2
  import { Candle } from '../domain';
4
3
 
5
4
  export function truerange<T>(fn: (it: T) => Candle) {
@@ -1,4 +1,4 @@
1
- import { Observable, share, map } from 'rxjs';
1
+ import { map, Observable, share } from 'rxjs';
2
2
  import { RingBuffer } from './ring-buffer';
3
3
 
4
4
  export function window<T, Y>(length: number, fn: (value: T) => Y) {
@@ -1,5 +1,4 @@
1
- import { Observable } from 'rxjs';
2
- import { filter, map, share } from 'rxjs/operators';
1
+ import { filter, map, Observable, share } from 'rxjs';
3
2
  import { window } from './window';
4
3
 
5
4
  export function wma<T>(length: number, fn: (it: T) => number) {
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
- createPaperExecutor(adapter: PaperAdapter): PaperExecutor {
17
- return new PaperSpotExecutor(adapter);
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
 
@@ -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 './topic';
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';
@@ -1,5 +1,5 @@
1
- import { retryAsync } from 'ts-retry';
2
1
  import * as hash from 'object-hash';
2
+ import { retryAsync } from 'ts-retry';
3
3
 
4
4
  export function retry<T>(fn: () => Promise<T>): Promise<T> {
5
5
  return retryAsync(fn, { delay: 1000, maxTry: 3 });
@@ -1,4 +1,4 @@
1
- import { Topic, handler, event } from './topic';
1
+ import { event, handler, Topic } from './topic';
2
2
 
3
3
  describe('topic tests', () => {
4
4
  test('string as key cache', () => {
@@ -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
@@ -1,3 +1,3 @@
1
1
  export * from './feed';
2
- export * from './storage';
3
2
  export * from './measurement';
3
+ export * from './storage';
@@ -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
 
@@ -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
  }
@@ -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-candle.event';
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,5 +1,5 @@
1
- import { Asset, Instrument } from '../../domain';
2
1
  import { CandleEvent } from '.';
2
+ import { Asset, Instrument } from '../../domain';
3
3
  import { now } from '../../shared';
4
4
  import { Store } from '../store';
5
5
 
@@ -1,11 +1,11 @@
1
- import { TradePatchEventHandler } from './store-trade.event';
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 { OrderLoadEvent } from './store-order.event';
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 new`);
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('Order is not pending');
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 pending: ${order.state}`);
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('Order is not canceling');
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('Order is not new.');
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 { event } from '../../shared/topic';
1
+ import { Instrument, Position, PositionMode } from '../../domain';
2
2
  import { timestamp } from '../../shared';
3
- import { Position, Instrument, PositionMode } from '../../domain';
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
 
@@ -1,2 +1,3 @@
1
+ export * from './event';
1
2
  export * from './store';
2
3
  export * from './store.state';
@@ -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
- Component
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);
@@ -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 { StoreEvent } from './event/store.event';
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
  }