@quantform/core 0.6.5 → 0.6.7

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 (336) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +2 -2
  2. package/dist/adapter/adapter-aggregate.d.ts.map +1 -1
  3. package/dist/adapter/adapter-aggregate.js +12 -11
  4. package/dist/adapter/adapter.d.ts +2 -3
  5. package/dist/adapter/adapter.d.ts.map +1 -1
  6. package/dist/adapter/backtester/backtester-adapter.d.ts +1 -5
  7. package/dist/adapter/backtester/backtester-adapter.d.ts.map +1 -1
  8. package/dist/adapter/backtester/backtester-adapter.js +2 -2
  9. package/dist/adapter/backtester/backtester-cursor.d.ts.map +1 -1
  10. package/dist/adapter/backtester/backtester-cursor.js +2 -2
  11. package/dist/adapter/backtester/backtester-cursor.spec.d.ts +2 -0
  12. package/dist/adapter/backtester/backtester-cursor.spec.d.ts.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.spec.js +47 -0
  14. package/dist/adapter/backtester/backtester-streamer.d.ts +1 -1
  15. package/dist/adapter/backtester/backtester-streamer.d.ts.map +1 -1
  16. package/dist/adapter/backtester/backtester-streamer.js +4 -5
  17. package/dist/adapter/backtester/backtester-streamer.spec.d.ts +2 -0
  18. package/dist/adapter/backtester/backtester-streamer.spec.d.ts.map +1 -0
  19. package/dist/adapter/backtester/backtester-streamer.spec.js +45 -0
  20. package/dist/adapter/backtester/error.d.ts +6 -2
  21. package/dist/adapter/backtester/error.d.ts.map +1 -1
  22. package/dist/adapter/backtester/error.js +11 -7
  23. package/dist/adapter/backtester/index.d.ts +4 -2
  24. package/dist/adapter/backtester/index.d.ts.map +1 -1
  25. package/dist/adapter/backtester/index.js +4 -2
  26. package/dist/adapter/error.d.ts +9 -3
  27. package/dist/adapter/error.d.ts.map +1 -1
  28. package/dist/adapter/error.js +16 -10
  29. package/dist/adapter/index.d.ts +5 -4
  30. package/dist/adapter/index.d.ts.map +1 -1
  31. package/dist/adapter/index.js +5 -4
  32. package/dist/adapter/paper/engine/paper-engine.d.ts.map +1 -1
  33. package/dist/adapter/paper/engine/paper-engine.js +7 -8
  34. package/dist/adapter/paper/engine/paper-engine.spec.d.ts +2 -0
  35. package/dist/adapter/paper/engine/paper-engine.spec.d.ts.map +1 -0
  36. package/dist/adapter/paper/engine/paper-engine.spec.js +63 -0
  37. package/dist/adapter/paper/index.d.ts +2 -2
  38. package/dist/adapter/paper/index.d.ts.map +1 -1
  39. package/dist/adapter/paper/index.js +2 -2
  40. package/dist/adapter/paper/paper-adapter.d.ts +1 -3
  41. package/dist/adapter/paper/paper-adapter.d.ts.map +1 -1
  42. package/dist/adapter/paper/paper-adapter.js +8 -7
  43. package/dist/cli/build.js +1 -1
  44. package/dist/cli/dev.js +6 -6
  45. package/dist/cli/index.js +5 -5
  46. package/dist/cli/internal/workspace.js +1 -1
  47. package/dist/cli/pull.js +6 -6
  48. package/dist/cli/run.js +6 -6
  49. package/dist/cli/test.d.ts.map +1 -1
  50. package/dist/cli/test.js +9 -8
  51. package/dist/domain/asset.d.ts +5 -1
  52. package/dist/domain/asset.d.ts.map +1 -1
  53. package/dist/domain/asset.js +13 -7
  54. package/dist/domain/asset.spec.d.ts +2 -0
  55. package/dist/domain/asset.spec.d.ts.map +1 -0
  56. package/dist/domain/asset.spec.js +54 -0
  57. package/dist/domain/balance-operator.d.ts +1 -3
  58. package/dist/domain/balance-operator.d.ts.map +1 -1
  59. package/dist/domain/balance-operator.js +2 -2
  60. package/dist/domain/balance-operator.spec.d.ts +2 -0
  61. package/dist/domain/balance-operator.spec.d.ts.map +1 -0
  62. package/dist/domain/balance-operator.spec.js +21 -0
  63. package/dist/domain/balance.d.ts +14 -15
  64. package/dist/domain/balance.d.ts.map +1 -1
  65. package/dist/domain/balance.js +30 -48
  66. package/dist/domain/balance.spec.d.ts +2 -0
  67. package/dist/domain/balance.spec.d.ts.map +1 -0
  68. package/dist/domain/balance.spec.js +32 -0
  69. package/dist/domain/commission.d.ts.map +1 -1
  70. package/dist/domain/commission.spec.d.ts +2 -0
  71. package/dist/domain/commission.spec.d.ts.map +1 -0
  72. package/dist/domain/commission.spec.js +30 -0
  73. package/dist/domain/component.d.ts +2 -2
  74. package/dist/domain/component.d.ts.map +1 -1
  75. package/dist/domain/error.d.ts +15 -5
  76. package/dist/domain/error.d.ts.map +1 -1
  77. package/dist/domain/error.js +26 -16
  78. package/dist/domain/index.d.ts +21 -21
  79. package/dist/domain/index.d.ts.map +1 -1
  80. package/dist/domain/index.js +21 -21
  81. package/dist/domain/instrument-operator.d.ts +1 -2
  82. package/dist/domain/instrument-operator.d.ts.map +1 -1
  83. package/dist/domain/instrument-operator.js +3 -3
  84. package/dist/domain/instrument-operator.spec.d.ts +2 -0
  85. package/dist/domain/instrument-operator.spec.d.ts.map +1 -0
  86. package/dist/domain/instrument-operator.spec.js +21 -0
  87. package/dist/domain/instrument.d.ts +3 -3
  88. package/dist/domain/instrument.d.ts.map +1 -1
  89. package/dist/domain/instrument.js +10 -8
  90. package/dist/domain/instrument.spec.d.ts +2 -0
  91. package/dist/domain/instrument.spec.d.ts.map +1 -0
  92. package/dist/domain/instrument.spec.js +51 -0
  93. package/dist/domain/ohlc-operator.d.ts +1 -1
  94. package/dist/domain/ohlc-operator.d.ts.map +1 -1
  95. package/dist/domain/ohlc-operator.js +4 -5
  96. package/dist/domain/ohlc-operator.spec.d.ts +2 -0
  97. package/dist/domain/ohlc-operator.spec.d.ts.map +1 -0
  98. package/dist/domain/ohlc-operator.spec.js +110 -0
  99. package/dist/domain/ohlc.d.ts.map +1 -1
  100. package/dist/domain/ohlc.spec.d.ts +2 -0
  101. package/dist/domain/ohlc.spec.d.ts.map +1 -0
  102. package/dist/domain/ohlc.spec.js +25 -0
  103. package/dist/domain/order-operator.d.ts +1 -3
  104. package/dist/domain/order-operator.d.ts.map +1 -1
  105. package/dist/domain/order-operator.js +3 -3
  106. package/dist/domain/order-operator.spec.d.ts +2 -0
  107. package/dist/domain/order-operator.spec.d.ts.map +1 -0
  108. package/dist/domain/order-operator.spec.js +61 -0
  109. package/dist/domain/order.d.ts +5 -8
  110. package/dist/domain/order.d.ts.map +1 -1
  111. package/dist/domain/order.js +14 -22
  112. package/dist/domain/order.spec.d.ts +2 -0
  113. package/dist/domain/order.spec.d.ts.map +1 -0
  114. package/dist/domain/order.spec.js +27 -0
  115. package/dist/domain/orderbook-operator.d.ts +1 -3
  116. package/dist/domain/orderbook-operator.d.ts.map +1 -1
  117. package/dist/domain/orderbook-operator.js +2 -2
  118. package/dist/domain/orderbook-operator.spec.d.ts +2 -0
  119. package/dist/domain/orderbook-operator.spec.d.ts.map +1 -0
  120. package/dist/domain/orderbook-operator.spec.js +19 -0
  121. package/dist/domain/orderbook.d.ts +3 -2
  122. package/dist/domain/orderbook.d.ts.map +1 -1
  123. package/dist/domain/orderbook.js +3 -0
  124. package/dist/domain/orderbook.spec.d.ts +2 -0
  125. package/dist/domain/orderbook.spec.d.ts.map +1 -0
  126. package/dist/domain/orderbook.spec.js +11 -0
  127. package/dist/domain/position-operator.d.ts +1 -3
  128. package/dist/domain/position-operator.d.ts.map +1 -1
  129. package/dist/domain/position-operator.js +3 -4
  130. package/dist/domain/position-operator.spec.d.ts +2 -0
  131. package/dist/domain/position-operator.spec.d.ts.map +1 -0
  132. package/dist/domain/position-operator.spec.js +44 -0
  133. package/dist/domain/position.d.ts +3 -2
  134. package/dist/domain/position.d.ts.map +1 -1
  135. package/dist/domain/position.js +2 -0
  136. package/dist/domain/position.spec.d.ts +2 -0
  137. package/dist/domain/position.spec.d.ts.map +1 -0
  138. package/dist/domain/position.spec.js +28 -0
  139. package/dist/domain/session-builder.d.ts +8 -4
  140. package/dist/domain/session-builder.d.ts.map +1 -1
  141. package/dist/domain/session-builder.js +10 -15
  142. package/dist/domain/session.d.ts +1 -1
  143. package/dist/domain/session.d.ts.map +1 -1
  144. package/dist/domain/session.js +11 -17
  145. package/dist/domain/session.spec.d.ts +2 -0
  146. package/dist/domain/session.spec.d.ts.map +1 -0
  147. package/dist/domain/session.spec.js +17 -0
  148. package/dist/domain/trade-operator.d.ts +1 -3
  149. package/dist/domain/trade-operator.d.ts.map +1 -1
  150. package/dist/domain/trade-operator.js +2 -2
  151. package/dist/domain/trade-operator.spec.d.ts +2 -0
  152. package/dist/domain/trade-operator.spec.d.ts.map +1 -0
  153. package/dist/domain/trade-operator.spec.js +21 -0
  154. package/dist/domain/trade.d.ts +3 -2
  155. package/dist/domain/trade.d.ts.map +1 -1
  156. package/dist/domain/trade.js +3 -0
  157. package/dist/domain/trade.spec.d.ts +2 -0
  158. package/dist/domain/trade.spec.d.ts.map +1 -0
  159. package/dist/domain/trade.spec.js +11 -0
  160. package/dist/index.d.ts +2 -2
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +9 -8
  163. package/dist/shared/collections.spec.d.ts +2 -0
  164. package/dist/shared/collections.spec.d.ts.map +1 -0
  165. package/dist/shared/collections.spec.js +29 -0
  166. package/dist/shared/decimals.spec.d.ts +2 -0
  167. package/dist/shared/decimals.spec.d.ts.map +1 -0
  168. package/dist/shared/decimals.spec.js +28 -0
  169. package/dist/shared/hash.d.ts +2 -0
  170. package/dist/shared/hash.d.ts.map +1 -0
  171. package/dist/shared/hash.js +12 -0
  172. package/dist/shared/index.d.ts +7 -7
  173. package/dist/shared/index.d.ts.map +1 -1
  174. package/dist/shared/index.js +7 -7
  175. package/dist/shared/logger.d.ts +8 -5
  176. package/dist/shared/logger.d.ts.map +1 -1
  177. package/dist/shared/logger.js +23 -16
  178. package/dist/storage/cache.d.ts +1 -1
  179. package/dist/storage/cache.d.ts.map +1 -1
  180. package/dist/storage/cache.spec.d.ts +2 -0
  181. package/dist/storage/cache.spec.d.ts.map +1 -0
  182. package/dist/storage/cache.spec.js +25 -0
  183. package/dist/storage/feed.d.ts +1 -1
  184. package/dist/storage/feed.d.ts.map +1 -1
  185. package/dist/storage/index.d.ts +4 -4
  186. package/dist/storage/index.d.ts.map +1 -1
  187. package/dist/storage/index.js +4 -4
  188. package/dist/storage/measurement.d.ts +1 -1
  189. package/dist/storage/measurement.d.ts.map +1 -1
  190. package/dist/store/error.d.ts +21 -7
  191. package/dist/store/error.d.ts.map +1 -1
  192. package/dist/store/error.js +36 -22
  193. package/dist/store/index.d.ts +10 -9
  194. package/dist/store/index.d.ts.map +1 -1
  195. package/dist/store/index.js +10 -9
  196. package/dist/store/store-balance-event.d.ts +10 -30
  197. package/dist/store/store-balance-event.d.ts.map +1 -1
  198. package/dist/store/store-balance-event.js +19 -94
  199. package/dist/store/store-balance-event.spec.d.ts +2 -0
  200. package/dist/store/store-balance-event.spec.d.ts.map +1 -0
  201. package/dist/store/store-balance-event.spec.js +24 -0
  202. package/dist/store/store-event.d.ts +1 -1
  203. package/dist/store/store-event.d.ts.map +1 -1
  204. package/dist/store/store-instrument-event.d.ts +1 -2
  205. package/dist/store/store-instrument-event.d.ts.map +1 -1
  206. package/dist/store/store-instrument-event.js +5 -6
  207. package/dist/store/store-instrument-event.spec.d.ts +2 -0
  208. package/dist/store/store-instrument-event.spec.d.ts.map +1 -0
  209. package/dist/store/store-instrument-event.spec.js +22 -0
  210. package/dist/store/store-order-event.d.ts +1 -2
  211. package/dist/store/store-order-event.d.ts.map +1 -1
  212. package/dist/store/store-order-event.js +60 -22
  213. package/dist/store/store-order-event.spec.d.ts +2 -0
  214. package/dist/store/store-order-event.spec.d.ts.map +1 -0
  215. package/dist/store/store-order-event.spec.js +23 -0
  216. package/dist/store/store-orderbook-event.d.ts +1 -2
  217. package/dist/store/store-orderbook-event.d.ts.map +1 -1
  218. package/dist/store/store-orderbook-event.js +3 -3
  219. package/dist/store/store-orderbook-event.spec.d.ts +2 -0
  220. package/dist/store/store-orderbook-event.spec.d.ts.map +1 -0
  221. package/dist/store/store-orderbook-event.spec.js +27 -0
  222. package/dist/store/store-position-event.d.ts +1 -2
  223. package/dist/store/store-position-event.d.ts.map +1 -1
  224. package/dist/store/store-position-event.js +5 -5
  225. package/dist/store/store-state.d.ts.map +1 -1
  226. package/dist/store/store-trade-event.d.ts +1 -2
  227. package/dist/store/store-trade-event.d.ts.map +1 -1
  228. package/dist/store/store-trade-event.js +3 -3
  229. package/dist/store/store-trade-event.spec.d.ts +2 -0
  230. package/dist/store/store-trade-event.spec.d.ts.map +1 -0
  231. package/dist/store/store-trade-event.spec.js +44 -0
  232. package/dist/store/store.d.ts +1 -2
  233. package/dist/store/store.d.ts.map +1 -1
  234. package/dist/store/store.js +5 -2
  235. package/dist/store/store.spec.d.ts +2 -0
  236. package/dist/store/store.spec.d.ts.map +1 -0
  237. package/dist/store/store.spec.js +122 -0
  238. package/jest.config.ts +23 -2
  239. package/package.json +2 -2
  240. package/src/adapter/adapter-aggregate.ts +35 -21
  241. package/src/adapter/adapter.ts +6 -7
  242. package/src/adapter/backtester/backtester-adapter.ts +12 -8
  243. package/src/adapter/backtester/backtester-cursor.spec.ts +6 -6
  244. package/src/adapter/backtester/backtester-cursor.ts +5 -5
  245. package/src/adapter/backtester/backtester-streamer.spec.ts +6 -6
  246. package/src/adapter/backtester/backtester-streamer.ts +12 -9
  247. package/src/adapter/backtester/error.ts +8 -4
  248. package/src/adapter/backtester/index.ts +4 -2
  249. package/src/adapter/error.ts +14 -8
  250. package/src/adapter/index.ts +5 -4
  251. package/src/adapter/paper/engine/paper-engine.spec.ts +6 -12
  252. package/src/adapter/paper/engine/paper-engine.ts +13 -28
  253. package/src/adapter/paper/index.ts +2 -2
  254. package/src/adapter/paper/paper-adapter.ts +18 -11
  255. package/src/cli/build.ts +1 -1
  256. package/src/cli/dev.ts +5 -5
  257. package/src/cli/index.ts +5 -5
  258. package/src/cli/internal/workspace.ts +1 -1
  259. package/src/cli/pull.ts +7 -7
  260. package/src/cli/run.ts +5 -5
  261. package/src/cli/test.ts +8 -7
  262. package/src/domain/asset.spec.ts +4 -4
  263. package/src/domain/asset.ts +13 -6
  264. package/src/domain/balance-operator.spec.ts +3 -6
  265. package/src/domain/balance-operator.ts +5 -6
  266. package/src/domain/balance.spec.ts +7 -77
  267. package/src/domain/balance.ts +51 -64
  268. package/src/domain/commission.spec.ts +3 -3
  269. package/src/domain/commission.ts +1 -1
  270. package/src/domain/component.ts +3 -3
  271. package/src/domain/error.ts +23 -18
  272. package/src/domain/index.ts +21 -21
  273. package/src/domain/instrument-operator.spec.ts +10 -7
  274. package/src/domain/instrument-operator.ts +6 -6
  275. package/src/domain/instrument.spec.ts +11 -6
  276. package/src/domain/instrument.ts +16 -7
  277. package/src/domain/ohlc-operator.spec.ts +5 -6
  278. package/src/domain/ohlc-operator.ts +2 -3
  279. package/src/domain/ohlc.spec.ts +2 -2
  280. package/src/domain/ohlc.ts +2 -2
  281. package/src/domain/order-operator.spec.ts +14 -10
  282. package/src/domain/order-operator.ts +8 -7
  283. package/src/domain/order.spec.ts +3 -6
  284. package/src/domain/order.ts +26 -29
  285. package/src/domain/orderbook-operator.spec.ts +11 -9
  286. package/src/domain/orderbook-operator.ts +5 -6
  287. package/src/domain/orderbook.spec.ts +3 -6
  288. package/src/domain/orderbook.ts +5 -3
  289. package/src/domain/position-operator.spec.ts +14 -11
  290. package/src/domain/position-operator.ts +12 -9
  291. package/src/domain/position.spec.ts +3 -6
  292. package/src/domain/position.ts +5 -3
  293. package/src/domain/session-builder.ts +14 -14
  294. package/src/domain/session.spec.ts +4 -4
  295. package/src/domain/session.ts +20 -15
  296. package/src/domain/trade-operator.spec.ts +4 -9
  297. package/src/domain/trade-operator.ts +5 -6
  298. package/src/domain/trade.spec.ts +3 -6
  299. package/src/domain/trade.ts +5 -3
  300. package/src/index.ts +15 -14
  301. package/src/shared/collections.spec.ts +2 -2
  302. package/src/shared/decimals.spec.ts +1 -1
  303. package/src/shared/hash.ts +10 -0
  304. package/src/shared/index.ts +7 -7
  305. package/src/shared/logger.ts +22 -15
  306. package/src/storage/cache.spec.ts +2 -3
  307. package/src/storage/cache.ts +2 -2
  308. package/src/storage/feed.ts +4 -4
  309. package/src/storage/index.ts +4 -4
  310. package/src/storage/measurement.ts +2 -2
  311. package/src/store/error.ts +33 -22
  312. package/src/store/index.ts +10 -9
  313. package/src/store/store-balance-event.spec.ts +5 -7
  314. package/src/store/store-balance-event.ts +20 -115
  315. package/src/store/store-event.ts +2 -2
  316. package/src/store/store-instrument-event.spec.ts +4 -5
  317. package/src/store/store-instrument-event.ts +13 -9
  318. package/src/store/store-order-event.spec.ts +6 -5
  319. package/src/store/store-order-event.ts +92 -23
  320. package/src/store/store-orderbook-event.spec.ts +4 -5
  321. package/src/store/store-orderbook-event.ts +11 -7
  322. package/src/store/store-position-event.ts +13 -9
  323. package/src/store/store-state.ts +2 -2
  324. package/src/store/store-trade-event.spec.ts +4 -5
  325. package/src/store/store-trade-event.ts +11 -7
  326. package/src/store/store.spec.ts +45 -31
  327. package/src/store/store.ts +6 -3
  328. package/tsconfig.json +7 -4
  329. package/dist/cli/error.d.ts +0 -2
  330. package/dist/cli/error.d.ts.map +0 -1
  331. package/dist/cli/error.js +0 -7
  332. package/dist/shared/pipe.d.ts +0 -5
  333. package/dist/shared/pipe.d.ts.map +0 -1
  334. package/dist/shared/pipe.js +0 -8
  335. package/src/cli/error.ts +0 -5
  336. package/src/shared/pipe.ts +0 -12
@@ -1,15 +1,17 @@
1
1
  import { Subject } from 'rxjs';
2
2
 
3
- import { d } from '../shared';
4
- import { State } from '../store';
5
- import { Asset } from './asset';
6
- import { Commission } from './commission';
7
- import { Component } from './component';
8
- import { Instrument } from './instrument';
9
- import { Orderbook } from './orderbook';
10
- import { orderbook } from './orderbook-operator';
3
+ import {
4
+ Asset,
5
+ Commission,
6
+ Component,
7
+ Instrument,
8
+ Orderbook,
9
+ orderbook
10
+ } from '@lib/domain';
11
+ import { d } from '@lib/shared';
12
+ import { State } from '@lib/store';
11
13
 
12
- describe('orderbook', () => {
14
+ describe(orderbook.name, () => {
13
15
  const instrument = new Instrument(
14
16
  0,
15
17
  new Asset('abc', 'xyz', 4),
@@ -1,15 +1,14 @@
1
1
  import { filter, map, Observable, startWith } from 'rxjs';
2
2
 
3
- import { State } from '../store';
4
- import { Component } from './component';
5
- import { InstrumentSelector } from './instrument';
6
- import { Orderbook } from './orderbook';
3
+ import { Component, InstrumentSelector, Orderbook } from '@lib/domain';
4
+ import { State } from '@lib/store';
7
5
 
8
6
  export function orderbook(selector: InstrumentSelector, state: State) {
9
7
  return (source$: Observable<Component>) =>
10
8
  source$.pipe(
11
9
  startWith(state.orderbook.get(selector.id)),
12
- filter(it => it instanceof Orderbook && it.instrument.id == selector.id),
13
- map(it => it as Orderbook)
10
+ filter(it => it !== undefined && it.type === Orderbook.type),
11
+ map(it => it as Orderbook),
12
+ filter(it => it.instrument.id === selector.id)
14
13
  );
15
14
  }
@@ -1,10 +1,7 @@
1
- import { d } from '../shared';
2
- import { Asset } from './asset';
3
- import { Commission } from './commission';
4
- import { Instrument } from './instrument';
5
- import { Orderbook } from './orderbook';
1
+ import { Asset, Commission, Instrument, Orderbook } from '@lib/domain';
2
+ import { d } from '@lib/shared';
6
3
 
7
- describe('Orderbook', () => {
4
+ describe(Orderbook.name, () => {
8
5
  const instrument = new Instrument(
9
6
  0,
10
7
  new Asset('abc', 'xyz', 4),
@@ -1,6 +1,5 @@
1
- import { Instrument } from '../domain';
2
- import { decimal } from '../shared';
3
- import { Component } from './component';
1
+ import { Component, Instrument } from '@lib/domain';
2
+ import { decimal, hash } from '@lib/shared';
4
3
 
5
4
  export interface Liquidity {
6
5
  rate: decimal;
@@ -17,6 +16,9 @@ export const LiquidityBidComparer = (lhs: { rate: decimal }, rhs: { rate: decima
17
16
  * Provides an access to pending buy and sell orders on the specific market.
18
17
  */
19
18
  export class Orderbook implements Component {
19
+ static type = hash(Orderbook.name);
20
+ readonly type = Orderbook.type;
21
+
20
22
  readonly id: string;
21
23
 
22
24
  constructor(
@@ -1,14 +1,17 @@
1
1
  import { BehaviorSubject, Subject } from 'rxjs';
2
2
 
3
- import { d } from '../shared';
4
- import { State } from '../store';
5
- import { Asset } from './asset';
6
- import { Balance } from './balance';
7
- import { Commission } from './commission';
8
- import { Component } from './component';
9
- import { Instrument } from './instrument';
10
- import { Position } from './position';
11
- import { position, positions } from './position-operator';
3
+ import {
4
+ Asset,
5
+ Balance,
6
+ Commission,
7
+ Component,
8
+ Instrument,
9
+ Position,
10
+ position,
11
+ positions
12
+ } from '@lib/domain';
13
+ import { d } from '@lib/shared';
14
+ import { State } from '@lib/store';
12
15
 
13
16
  const instrument = new Instrument(
14
17
  0,
@@ -18,7 +21,7 @@ const instrument = new Instrument(
18
21
  Commission.Zero
19
22
  );
20
23
 
21
- describe('position', () => {
24
+ describe(position.name, () => {
22
25
  test('should pipe a position', done => {
23
26
  new BehaviorSubject<Component>(
24
27
  new Position(0, '1', instrument, 'CROSS', d(10), d(2), 3)
@@ -40,7 +43,7 @@ describe('position', () => {
40
43
  });
41
44
  });
42
45
 
43
- describe('positions', () => {
46
+ describe(positions.name, () => {
44
47
  const state = new State();
45
48
  const balance = new Balance(0, instrument.quote);
46
49
  const position1 = new Position(0, '1', instrument, 'CROSS', d(10), d(2), 3);
@@ -1,24 +1,27 @@
1
1
  import { filter, map, Observable, share, startWith } from 'rxjs';
2
2
 
3
- import { d, decimal, weightedMean } from '../shared';
4
- import { State } from '../store';
5
- import { Component } from './component';
6
- import { invalidInstrumentSelectorError } from './error';
7
- import { InstrumentSelector } from './instrument';
8
- import { Position } from './position';
3
+ import {
4
+ Component,
5
+ InstrumentSelector,
6
+ InvalidInstrumentSelectorError,
7
+ Position
8
+ } from '@lib/domain';
9
+ import { d, decimal, weightedMean } from '@lib/shared';
10
+ import { State } from '@lib/store';
9
11
 
10
12
  export function position(selector: InstrumentSelector) {
11
13
  return (source: Observable<Component>) =>
12
14
  source.pipe(
13
- filter(it => it instanceof Position && it.instrument.id == selector.id),
14
- map(it => it as Readonly<Position>)
15
+ filter(it => it.type === Position.type),
16
+ map(it => it as Readonly<Position>),
17
+ filter(it => it.instrument.id === selector.id)
15
18
  );
16
19
  }
17
20
 
18
21
  export function positions(selector: InstrumentSelector, state: State) {
19
22
  const balance = state.balance.get(selector.quote.id);
20
23
  if (!balance) {
21
- throw invalidInstrumentSelectorError(selector.id);
24
+ throw new InvalidInstrumentSelectorError(selector.id);
22
25
  }
23
26
 
24
27
  const getter = () =>
@@ -1,10 +1,7 @@
1
- import { d } from '../shared';
2
- import { Asset } from './asset';
3
- import { Commission } from './commission';
4
- import { Instrument } from './instrument';
5
- import { Position } from './position';
1
+ import { Asset, Commission, Instrument, Position } from '@lib/domain';
2
+ import { d } from '@lib/shared';
6
3
 
7
- describe('Position', () => {
4
+ describe(Position.name, () => {
8
5
  const instrument = new Instrument(
9
6
  0,
10
7
  new Asset('abc', 'xyz', 4),
@@ -1,10 +1,12 @@
1
- import { Instrument } from '../domain';
2
- import { decimal, pnl } from '../shared';
3
- import { Component } from './component';
1
+ import { Component, Instrument } from '@lib/domain';
2
+ import { decimal, hash, pnl } from '@lib/shared';
4
3
 
5
4
  export type PositionMode = 'CROSS' | 'ISOLATED';
6
5
 
7
6
  export class Position implements Component {
7
+ static type = hash(Position.name);
8
+ readonly type = Position.type;
9
+
8
10
  estimatedUnrealizedPnL?: decimal;
9
11
 
10
12
  get margin(): decimal {
@@ -6,30 +6,30 @@ import {
6
6
  createBacktesterAdapterFactory,
7
7
  createPaperAdapterFactory,
8
8
  DefaultTimeProvider
9
- } from '../adapter';
10
- import { decimal, now } from '../shared';
9
+ } from '@lib/adapter';
10
+ import { AssetSelector, Session } from '@lib/domain';
11
+ import { decimal, now } from '@lib/shared';
11
12
  import {
12
13
  Cache,
13
14
  Feed,
14
15
  inMemoryStorageFactory,
15
16
  Measurement,
16
17
  StorageFactory
17
- } from '../storage';
18
- import { Store } from '../store';
19
- import { AssetSelector } from './asset';
20
- import { Session } from './session';
18
+ } from '@lib/storage';
19
+ import { Store } from '@lib/store';
21
20
 
22
21
  export type SessionFeature = (builder: SessionBuilder) => void;
23
22
 
24
- export function deposit(selector: AssetSelector, amount: decimal): SessionFeature {
23
+ export function simulate({
24
+ period,
25
+ balance
26
+ }: {
27
+ period: { from: Date; to?: Date };
28
+ balance: [AssetSelector, decimal][];
29
+ }): SessionFeature {
25
30
  return (builder: SessionBuilder) => {
26
- builder.useBalance(selector, amount);
27
- };
28
- }
29
-
30
- export function period(from: Date, to?: Date): SessionFeature {
31
- return (builder: SessionBuilder) => {
32
- builder.usePeriod(from.getTime(), to?.getTime() ?? now());
31
+ builder.usePeriod(period.from.getTime(), period.to?.getTime() ?? now());
32
+ balance.forEach(([selector, amount]) => builder.useBalance(selector, amount));
33
33
  };
34
34
  }
35
35
 
@@ -1,8 +1,8 @@
1
- import { Asset, Commission, SessionBuilder } from '../domain';
2
- import { d, now } from '../shared';
3
- import { InstrumentPatchEvent } from '../store';
1
+ import { Asset, Commission, Session, SessionBuilder } from '@lib/domain';
2
+ import { d, now } from '@lib/shared';
3
+ import { InstrumentPatchEvent } from '@lib/store';
4
4
 
5
- describe('Session', () => {
5
+ describe(Session.name, () => {
6
6
  test('should trigger once', done => {
7
7
  const session = new SessionBuilder().paper();
8
8
 
@@ -16,28 +16,31 @@ import {
16
16
  } from 'rxjs';
17
17
  import { v4 } from 'uuid';
18
18
 
19
- import { AdapterAggregate } from '../adapter/adapter-aggregate';
19
+ import { AdapterAggregate } from '@lib/adapter';
20
20
  import {
21
21
  AssetSelector,
22
22
  Balance,
23
+ balance,
23
24
  Instrument,
25
+ instrument,
26
+ instruments,
24
27
  InstrumentSelector,
25
- invalidInstrumentSelectorError,
28
+ InvalidInstrumentSelectorError,
26
29
  Ohlc,
27
30
  Order,
31
+ order,
28
32
  Orderbook,
33
+ orderbook,
34
+ orders,
29
35
  Position,
30
- Trade
31
- } from '../domain';
32
- import { decimal } from '../shared';
33
- import { Measurement } from '../storage';
34
- import { Store } from '../store';
35
- import { balance } from './balance-operator';
36
- import { instrument, instruments } from './instrument-operator';
37
- import { order, orders } from './order-operator';
38
- import { orderbook } from './orderbook-operator';
39
- import { position, positions } from './position-operator';
40
- import { trade } from './trade-operator';
36
+ position,
37
+ positions,
38
+ Trade,
39
+ trade
40
+ } from '@lib/domain';
41
+ import { decimal } from '@lib/shared';
42
+ import { Measurement } from '@lib/storage';
43
+ import { Store } from '@lib/store';
41
44
 
42
45
  type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
43
46
 
@@ -96,7 +99,7 @@ export class Session {
96
99
  }): Observable<Readonly<Order>> {
97
100
  const instrument = this.store.snapshot.universe.instrument.get(order.instrument.id);
98
101
  if (!instrument) {
99
- throw invalidInstrumentSelectorError(order.instrument.id);
102
+ throw new InvalidInstrumentSelectorError(order.instrument.id);
100
103
  }
101
104
 
102
105
  const newOrder = new Order(
@@ -206,7 +209,9 @@ export class Session {
206
209
  ): Observable<Readonly<Ohlc>> {
207
210
  return this.store.changes$.pipe(
208
211
  startWith(this.store.snapshot.universe.instrument.get(selector.id)),
209
- filter(it => it instanceof Instrument && it.id == selector.id),
212
+ filter(it => it !== undefined && it.type === Instrument.type),
213
+ map(it => it as Instrument),
214
+ filter(it => it.id === selector.id),
210
215
  switchMap(() => from(this.aggregate.history(selector, timeframe, length))),
211
216
  take(1),
212
217
  shareReplay(),
@@ -1,15 +1,10 @@
1
1
  import { Subject } from 'rxjs';
2
2
 
3
- import { d } from '../shared';
4
- import { State } from '../store';
5
- import { Asset } from './asset';
6
- import { Commission } from './commission';
7
- import { Component } from './component';
8
- import { Instrument } from './instrument';
9
- import { Trade } from './trade';
10
- import { trade } from './trade-operator';
3
+ import { Asset, Commission, Component, Instrument, Trade, trade } from '@lib/domain';
4
+ import { d } from '@lib/shared';
5
+ import { State } from '@lib/store';
11
6
 
12
- describe('trade', () => {
7
+ describe(trade.name, () => {
13
8
  const instrument = new Instrument(
14
9
  0,
15
10
  new Asset('abc', 'xyz', 4),
@@ -1,15 +1,14 @@
1
1
  import { filter, map, Observable, startWith } from 'rxjs';
2
2
 
3
- import { State } from '../store';
4
- import { Component } from './component';
5
- import { InstrumentSelector } from './instrument';
6
- import { Trade } from './trade';
3
+ import { Component, InstrumentSelector, Trade } from '@lib/domain';
4
+ import { State } from '@lib/store';
7
5
 
8
6
  export function trade(selector: InstrumentSelector, state: State) {
9
7
  return (source$: Observable<Component>) =>
10
8
  source$.pipe(
11
9
  startWith(state.trade.get(selector.id)),
12
- filter(it => it instanceof Trade && it.instrument.id == selector.id),
13
- map(it => it as Trade)
10
+ filter(it => it !== undefined && it.type === Trade.type),
11
+ map(it => it as Trade),
12
+ filter(it => it.instrument.id === selector.id)
14
13
  );
15
14
  }
@@ -1,10 +1,7 @@
1
- import { d } from '../shared';
2
- import { Asset } from './asset';
3
- import { Commission } from './commission';
4
- import { Instrument } from './instrument';
5
- import { Trade } from './trade';
1
+ import { Asset, Commission, Instrument, Trade } from '@lib/domain';
2
+ import { d } from '@lib/shared';
6
3
 
7
- describe('Trade', () => {
4
+ describe(Trade.name, () => {
8
5
  const instrument = new Instrument(
9
6
  0,
10
7
  new Asset('abc', 'xyz', 4),
@@ -1,12 +1,14 @@
1
- import { decimal } from '../shared';
2
- import { Instrument } from '.';
3
- import { Component } from './component';
1
+ import { Component, Instrument } from '@lib/domain';
2
+ import { decimal, hash } from '@lib/shared';
4
3
 
5
4
  /**
6
5
  * Simple trade or ticker executed on the market, it's a match of buyer
7
6
  * and seller of the same asset.
8
7
  */
9
8
  export class Trade implements Component {
9
+ static type = hash(Trade.name);
10
+ readonly type = Trade.type;
11
+
10
12
  readonly id: string;
11
13
 
12
14
  constructor(
package/src/index.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import chalk from 'chalk';
2
2
  import { finalize, forkJoin, Observable, of, switchMap } from 'rxjs';
3
3
 
4
- import { Session, SessionBuilder, SessionFeature } from './domain';
5
- export * from './adapter';
6
- export * from './domain';
7
- export * from './shared';
8
- export * from './storage';
9
- export * from './store';
4
+ import { Session, SessionBuilder, SessionFeature } from '@lib/domain';
5
+ export * from '@lib/adapter';
6
+ export * from '@lib/domain';
7
+ export * from '@lib/shared';
8
+ export * from '@lib/storage';
9
+ export * from '@lib/store';
10
10
 
11
- import { Logger } from './shared';
11
+ import { log } from '@lib/shared';
12
12
 
13
13
  const registry: Record<string, () => Array<SessionFeature>> = {};
14
14
 
@@ -22,14 +22,14 @@ export let rule: (name: string | undefined, describe: SessionHook) => void;
22
22
  /**
23
23
  *
24
24
  */
25
- export let beforeAll: (describe: SessionHook) => void;
25
+ export let awake: (describe: SessionHook) => void;
26
26
 
27
27
  /**
28
28
  *
29
29
  * @param name
30
30
  * @param describe
31
31
  */
32
- export function describe(name: string, describe: () => Array<SessionFeature>) {
32
+ export function strategy(name: string, describe: () => Array<SessionFeature>) {
33
33
  registry[name] = describe;
34
34
  }
35
35
 
@@ -45,16 +45,17 @@ export async function spawn(name: string, builder: SessionBuilder) {
45
45
  throw new Error(`missing strategy: ${name}`);
46
46
  }
47
47
 
48
+ const logger = log(name);
48
49
  const ruleHooks = new Array<SessionHook>();
49
- const beforeAllHooks = new Array<SessionHook>();
50
+ const awakeHooks = new Array<SessionHook>();
50
51
 
51
- beforeAll = (describe: SessionHook) => {
52
- beforeAllHooks.push(describe);
52
+ awake = (describe: SessionHook) => {
53
+ awakeHooks.push(describe);
53
54
  };
54
55
 
55
56
  rule = (ruleName: string | undefined, describe: SessionHook) => {
56
57
  if (ruleName) {
57
- Logger.info(name, `${chalk.italic(ruleName)} rule found`);
58
+ logger.info(`${chalk.italic(ruleName)} rule found`);
58
59
  }
59
60
 
60
61
  ruleHooks.push(describe);
@@ -65,7 +66,7 @@ export async function spawn(name: string, builder: SessionBuilder) {
65
66
  }
66
67
 
67
68
  return (session: Session) => {
68
- const beforeAll$ = beforeAllHooks.map(it => it(session));
69
+ const beforeAll$ = awakeHooks.map(it => it(session));
69
70
  const rule$ = ruleHooks.map(it => it(session));
70
71
 
71
72
  if (!beforeAll$.length) {
@@ -1,5 +1,5 @@
1
- import { Liquidity, LiquidityAskComparer } from '../domain';
2
- import { d, PriorityList } from '.';
1
+ import { Liquidity, LiquidityAskComparer } from '@lib/domain';
2
+ import { d, PriorityList } from '@lib/shared';
3
3
 
4
4
  describe('PriorityList', () => {
5
5
  test('should patch a best bid and ask', () => {
@@ -1,4 +1,4 @@
1
- import { d } from './decimals';
1
+ import { d } from '@lib/shared';
2
2
 
3
3
  describe('decimals', () => {
4
4
  test('get precision tests', () => {
@@ -0,0 +1,10 @@
1
+ export function hash(str: string): number {
2
+ let hash = 7373;
3
+ let i = str.length;
4
+
5
+ while (i) {
6
+ hash = (hash * 77) ^ str.charCodeAt(--i);
7
+ }
8
+
9
+ return hash >>> 0;
10
+ }
@@ -1,7 +1,7 @@
1
- export * from './datetime';
2
- export * from './decimals';
3
- export * from './environment';
4
- export * from './logger';
5
- export * from './policy';
6
- export * from './collections';
7
- export * from './pipe';
1
+ export * from '@lib/shared/datetime';
2
+ export * from '@lib/shared/decimals';
3
+ export * from '@lib/shared/environment';
4
+ export * from '@lib/shared/logger';
5
+ export * from '@lib/shared/policy';
6
+ export * from '@lib/shared/collections';
7
+ export * from '@lib/shared/hash';
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
 
3
- import { now } from './datetime';
3
+ import { now } from '@lib/shared';
4
4
 
5
5
  const colorize = (content: string) => {
6
6
  let hash = 0x811c9dc5;
@@ -16,24 +16,31 @@ const colorize = (content: string) => {
16
16
  const time = () => chalk.gray(new Date(now()).toISOString());
17
17
 
18
18
  export class Logger {
19
- public static info = (context: string, message: string) =>
20
- console.info(`${this.prefix(context)}: ${message}`);
19
+ constructor(private readonly context: string) {}
21
20
 
22
- public static debug = (context: string, message: string) =>
23
- console.debug(`${this.prefix(context)}: ${message}`);
21
+ public info = (message: any, ...params: unknown[]) =>
22
+ params?.length
23
+ ? console.info(`${this.prefix()}: ${message}`, params)
24
+ : console.info(`${this.prefix()}: ${message}`);
24
25
 
25
- public static warn = (context: string, message: string) =>
26
- console.warn(`${this.prefix(context)}: ${message}`);
26
+ public debug = (message: any, ...params: unknown[]) =>
27
+ params?.length
28
+ ? console.debug(`${this.prefix()}: ${message}`, params)
29
+ : console.debug(`${this.prefix()}: ${message}`);
27
30
 
28
- public static error = (context: string, error: unknown) => {
29
- let message = 'Unknown Error';
31
+ public warn = (message: any, ...params: unknown[]) =>
32
+ params?.length
33
+ ? console.warn(`${this.prefix()}: ${message}`, params)
34
+ : console.warn(`${this.prefix()}: ${message}`);
30
35
 
31
- if (error instanceof Error) {
32
- message = error.message;
33
- }
36
+ public error = (message: any, ...params: unknown[]) =>
37
+ params?.length
38
+ ? console.error(`${this.prefix()}: ${message}`, params)
39
+ : console.error(`${this.prefix()}: ${message}`);
34
40
 
35
- console.error(`${this.prefix(context)}: ${message}`);
36
- };
41
+ public prefix = () => `${time()} ${colorize(this.context)}`;
42
+ }
37
43
 
38
- public static prefix = (context: string) => `${time()} ${colorize(context)}`;
44
+ export function log(context: string): Logger {
45
+ return new Logger(context);
39
46
  }
@@ -1,7 +1,6 @@
1
- import { Cache } from './cache';
2
- import { InMemoryStorage } from './storage';
1
+ import { Cache, InMemoryStorage } from '@lib/storage';
3
2
 
4
- describe('Cache', () => {
3
+ describe(Cache.name, () => {
5
4
  test('should return cached value', async () => {
6
5
  const cache = new Cache(new InMemoryStorage());
7
6
 
@@ -1,5 +1,5 @@
1
- import { now } from '../shared';
2
- import { Storage } from './storage';
1
+ import { now } from '@lib/shared';
2
+ import { Storage } from '@lib/storage';
3
3
 
4
4
  export class Cache {
5
5
  constructor(private readonly storage: Storage) {}
@@ -1,7 +1,7 @@
1
- import { InstrumentSelector } from '../domain';
2
- import { d } from '../shared';
3
- import { OrderbookPatchEvent, TradePatchEvent } from '../store';
4
- import { Storage, StorageDocument, StorageQueryOptions } from './storage';
1
+ import { InstrumentSelector } from '@lib/domain';
2
+ import { d } from '@lib/shared';
3
+ import { Storage, StorageDocument, StorageQueryOptions } from '@lib/storage';
4
+ import { OrderbookPatchEvent, TradePatchEvent } from '@lib/store';
5
5
 
6
6
  export type StorageEvent = TradePatchEvent | OrderbookPatchEvent;
7
7
 
@@ -1,4 +1,4 @@
1
- export * from './feed';
2
- export * from './measurement';
3
- export * from './storage';
4
- export * from './cache';
1
+ export * from '@lib/storage/feed';
2
+ export * from '@lib/storage/measurement';
3
+ export * from '@lib/storage/storage';
4
+ export * from '@lib/storage/cache';
@@ -1,5 +1,5 @@
1
- import { timestamp } from '../shared';
2
- import { Storage, StorageQueryOptions } from './storage';
1
+ import { timestamp } from '@lib/shared';
2
+ import { Storage, StorageQueryOptions } from '@lib/storage';
3
3
 
4
4
  export interface Measure {
5
5
  timestamp: timestamp;