@quantform/core 0.6.6 → 0.7.0-beta.4

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 (521) hide show
  1. package/dist/as-readonly.d.ts +3 -0
  2. package/dist/as-readonly.d.ts.map +1 -0
  3. package/dist/as-readonly.js +8 -0
  4. package/dist/{domain → asset}/asset.d.ts +6 -1
  5. package/dist/asset/asset.d.ts.map +1 -0
  6. package/dist/{domain → asset}/asset.js +16 -7
  7. package/dist/asset/asset.spec.d.ts +2 -0
  8. package/dist/asset/asset.spec.d.ts.map +1 -0
  9. package/dist/asset/asset.spec.js +54 -0
  10. package/dist/asset/index.d.ts +2 -0
  11. package/dist/asset/index.d.ts.map +1 -0
  12. package/dist/{adapter/paper → asset}/index.js +1 -2
  13. package/dist/cli/build.js +1 -1
  14. package/dist/cli/dev.d.ts.map +1 -1
  15. package/dist/cli/dev.js +15 -11
  16. package/dist/cli/index.js +8 -8
  17. package/dist/cli/internal/workspace.js +1 -1
  18. package/dist/cli/pull.d.ts.map +1 -1
  19. package/dist/cli/pull.js +50 -20
  20. package/dist/cli/{test.d.ts → replay.d.ts} +1 -1
  21. package/dist/cli/replay.d.ts.map +1 -0
  22. package/dist/cli/{test.js → replay.js} +18 -20
  23. package/dist/cli/run.d.ts.map +1 -1
  24. package/dist/cli/run.js +16 -11
  25. package/dist/component/distinct-until-timesamp-changed.d.ts +5 -0
  26. package/dist/component/distinct-until-timesamp-changed.d.ts.map +1 -0
  27. package/dist/component/distinct-until-timesamp-changed.js +9 -0
  28. package/dist/component/error.d.ts +17 -0
  29. package/dist/component/error.d.ts.map +1 -0
  30. package/dist/component/error.js +33 -0
  31. package/dist/component/index.d.ts +8 -0
  32. package/dist/component/index.d.ts.map +1 -0
  33. package/dist/{store → component}/index.js +7 -9
  34. package/dist/{domain → component}/ohlc-operator.d.ts +1 -1
  35. package/dist/component/ohlc-operator.d.ts.map +1 -0
  36. package/dist/{domain → component}/ohlc-operator.js +4 -5
  37. package/dist/component/ohlc-operator.spec.d.ts +2 -0
  38. package/dist/component/ohlc-operator.spec.d.ts.map +1 -0
  39. package/dist/component/ohlc-operator.spec.js +110 -0
  40. package/dist/component/ohlc.d.ts.map +1 -0
  41. package/dist/component/ohlc.spec.d.ts +2 -0
  42. package/dist/component/ohlc.spec.d.ts.map +1 -0
  43. package/dist/component/ohlc.spec.js +25 -0
  44. package/dist/component/timeframe.d.ts.map +1 -0
  45. package/dist/core.d.ts +3 -0
  46. package/dist/core.d.ts.map +1 -0
  47. package/dist/core.js +15 -0
  48. package/dist/defined.d.ts +3 -0
  49. package/dist/defined.d.ts.map +1 -0
  50. package/dist/defined.js +8 -0
  51. package/dist/exclude.d.ts +3 -0
  52. package/dist/exclude.d.ts.map +1 -0
  53. package/dist/exclude.js +8 -0
  54. package/dist/index.d.ts +25 -27
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +25 -66
  57. package/dist/{domain → instrument/commission}/commission.d.ts +1 -1
  58. package/dist/instrument/commission/commission.d.ts.map +1 -0
  59. package/dist/{domain → instrument/commission}/commission.js +2 -2
  60. package/dist/instrument/commission/commission.spec.d.ts +2 -0
  61. package/dist/instrument/commission/commission.spec.d.ts.map +1 -0
  62. package/dist/instrument/commission/commission.spec.js +30 -0
  63. package/dist/instrument/index.d.ts +3 -0
  64. package/dist/instrument/index.d.ts.map +1 -0
  65. package/dist/{adapter → instrument}/index.js +2 -4
  66. package/dist/{domain → instrument}/instrument.d.ts +4 -4
  67. package/dist/instrument/instrument.d.ts.map +1 -0
  68. package/dist/{domain → instrument}/instrument.js +8 -5
  69. package/dist/instrument/instrument.spec.d.ts +2 -0
  70. package/dist/instrument/instrument.spec.d.ts.map +1 -0
  71. package/dist/instrument/instrument.spec.js +51 -0
  72. package/dist/make-test-module.d.ts +13 -0
  73. package/dist/make-test-module.d.ts.map +1 -0
  74. package/dist/make-test-module.js +46 -0
  75. package/dist/module.d.ts +57 -0
  76. package/dist/module.d.ts.map +1 -0
  77. package/dist/module.js +136 -0
  78. package/dist/module.spec.d.ts +2 -0
  79. package/dist/module.spec.d.ts.map +1 -0
  80. package/dist/module.spec.js +86 -0
  81. package/dist/not-found.d.ts +2 -0
  82. package/dist/not-found.d.ts.map +1 -0
  83. package/dist/{domain/component.js → not-found.js} +2 -0
  84. package/dist/replay/index.d.ts +7 -0
  85. package/dist/replay/index.d.ts.map +1 -0
  86. package/dist/replay/index.js +22 -0
  87. package/dist/replay/use-replay-coordinator.d.ts +10 -0
  88. package/dist/replay/use-replay-coordinator.d.ts.map +1 -0
  89. package/dist/replay/use-replay-coordinator.js +119 -0
  90. package/dist/replay/use-replay-options.d.ts +15 -0
  91. package/dist/replay/use-replay-options.d.ts.map +1 -0
  92. package/dist/replay/use-replay-options.js +20 -0
  93. package/dist/replay/use-replay-reader.d.ts +7 -0
  94. package/dist/replay/use-replay-reader.d.ts.map +1 -0
  95. package/dist/replay/use-replay-reader.js +32 -0
  96. package/dist/replay/use-replay-reader.spec.d.ts +2 -0
  97. package/dist/replay/use-replay-reader.spec.d.ts.map +1 -0
  98. package/dist/replay/use-replay-reader.spec.js +58 -0
  99. package/dist/replay/use-replay-storage.d.ts +10 -0
  100. package/dist/replay/use-replay-storage.d.ts.map +1 -0
  101. package/dist/replay/use-replay-storage.js +10 -0
  102. package/dist/replay/use-replay-writer.d.ts +6 -0
  103. package/dist/replay/use-replay-writer.d.ts.map +1 -0
  104. package/dist/replay/use-replay-writer.js +14 -0
  105. package/dist/replay/use-replay-writer.spec.d.ts +2 -0
  106. package/dist/replay/use-replay-writer.spec.d.ts.map +1 -0
  107. package/dist/replay/use-replay-writer.spec.js +53 -0
  108. package/dist/replay/use-replay.d.ts +10 -0
  109. package/dist/replay/use-replay.d.ts.map +1 -0
  110. package/dist/replay/use-replay.js +32 -0
  111. package/dist/replay/use-replay.spec.d.ts +2 -0
  112. package/dist/replay/use-replay.spec.d.ts.map +1 -0
  113. package/dist/replay/use-replay.spec.js +106 -0
  114. package/dist/replay/with-replay.d.ts +4 -0
  115. package/dist/replay/with-replay.d.ts.map +1 -0
  116. package/dist/replay/with-replay.js +8 -0
  117. package/dist/session/index.d.ts +4 -0
  118. package/dist/session/index.d.ts.map +1 -0
  119. package/dist/session/index.js +19 -0
  120. package/dist/session/use-session-object.d.ts +18 -0
  121. package/dist/session/use-session-object.d.ts.map +1 -0
  122. package/dist/session/use-session-object.js +13 -0
  123. package/dist/session/use-session-storage.d.ts +2 -0
  124. package/dist/session/use-session-storage.d.ts.map +1 -0
  125. package/dist/session/use-session-storage.js +10 -0
  126. package/dist/session/use-session.d.ts +4 -0
  127. package/dist/session/use-session.d.ts.map +1 -0
  128. package/dist/session/use-session.js +7 -0
  129. package/dist/shared/datetime.d.ts +1 -1
  130. package/dist/shared/datetime.d.ts.map +1 -1
  131. package/dist/shared/decimals.d.ts.map +1 -1
  132. package/dist/shared/decimals.js +5 -0
  133. package/dist/shared/decimals.spec.d.ts +2 -0
  134. package/dist/shared/decimals.spec.d.ts.map +1 -0
  135. package/dist/shared/decimals.spec.js +28 -0
  136. package/dist/shared/index.d.ts +3 -7
  137. package/dist/shared/index.d.ts.map +1 -1
  138. package/dist/shared/index.js +3 -7
  139. package/dist/simulator/index.d.ts +2 -0
  140. package/dist/simulator/index.d.ts.map +1 -0
  141. package/dist/{adapter/backtester → simulator}/index.js +1 -2
  142. package/dist/simulator/use-simulator.d.ts +2 -0
  143. package/dist/simulator/use-simulator.d.ts.map +1 -0
  144. package/dist/simulator/use-simulator.js +9 -0
  145. package/dist/simulator/use-simulator.spec.d.ts +2 -0
  146. package/dist/simulator/use-simulator.spec.d.ts.map +1 -0
  147. package/dist/simulator/use-simulator.spec.js +49 -0
  148. package/dist/storage/in-memory/in-memory-storage.d.ts +9 -0
  149. package/dist/storage/in-memory/in-memory-storage.d.ts.map +1 -0
  150. package/dist/storage/in-memory/in-memory-storage.factory.d.ts +6 -0
  151. package/dist/storage/in-memory/in-memory-storage.factory.d.ts.map +1 -0
  152. package/dist/storage/in-memory/in-memory-storage.factory.js +23 -0
  153. package/dist/storage/in-memory/in-memory-storage.js +72 -0
  154. package/dist/storage/in-memory/in-memory-storage.spec.d.ts +2 -0
  155. package/dist/storage/in-memory/in-memory-storage.spec.d.ts.map +1 -0
  156. package/dist/storage/in-memory/in-memory-storage.spec.js +167 -0
  157. package/dist/storage/in-memory/index.d.ts +3 -0
  158. package/dist/storage/in-memory/index.d.ts.map +1 -0
  159. package/dist/storage/in-memory/index.js +18 -0
  160. package/dist/storage/index.d.ts +3 -3
  161. package/dist/storage/index.d.ts.map +1 -1
  162. package/dist/storage/index.js +3 -3
  163. package/dist/storage/storage.d.ts +51 -61
  164. package/dist/storage/storage.d.ts.map +1 -1
  165. package/dist/storage/storage.js +20 -85
  166. package/dist/storage/use-cache.d.ts +4 -0
  167. package/dist/storage/use-cache.d.ts.map +1 -0
  168. package/dist/storage/use-cache.js +34 -0
  169. package/dist/storage/use-cache.spec.d.ts +2 -0
  170. package/dist/storage/use-cache.spec.d.ts.map +1 -0
  171. package/dist/storage/use-cache.spec.js +36 -0
  172. package/dist/storage/use-storage-factory.d.ts +10 -0
  173. package/dist/storage/use-storage-factory.d.ts.map +1 -0
  174. package/dist/storage/use-storage-factory.js +14 -0
  175. package/dist/storage/use-storage.d.ts +3 -0
  176. package/dist/storage/use-storage.d.ts.map +1 -0
  177. package/dist/storage/use-storage.js +11 -0
  178. package/dist/strat.d.ts +7 -0
  179. package/dist/strat.d.ts.map +1 -0
  180. package/dist/strat.js +7 -0
  181. package/dist/use-execution-mode.d.ts +29 -0
  182. package/dist/use-execution-mode.d.ts.map +1 -0
  183. package/dist/use-execution-mode.js +37 -0
  184. package/dist/use-hash.d.ts +5 -0
  185. package/dist/use-hash.d.ts.map +1 -0
  186. package/dist/use-hash.js +7 -0
  187. package/dist/use-hash.spec.d.ts +2 -0
  188. package/dist/use-hash.spec.d.ts.map +1 -0
  189. package/dist/use-hash.spec.js +16 -0
  190. package/dist/use-lock.d.ts +9 -0
  191. package/dist/use-lock.d.ts.map +1 -0
  192. package/dist/use-lock.js +40 -0
  193. package/dist/use-logger.d.ts +10 -0
  194. package/dist/use-logger.d.ts.map +1 -0
  195. package/dist/use-logger.js +37 -0
  196. package/dist/use-memo.d.ts +21 -0
  197. package/dist/use-memo.d.ts.map +1 -0
  198. package/dist/use-memo.js +35 -0
  199. package/dist/use-memo.spec.d.ts +2 -0
  200. package/dist/use-memo.spec.d.ts.map +1 -0
  201. package/dist/use-memo.spec.js +35 -0
  202. package/dist/use-request.d.ts +16 -0
  203. package/dist/use-request.d.ts.map +1 -0
  204. package/dist/use-request.js +27 -0
  205. package/dist/use-socket.d.ts +6 -0
  206. package/dist/use-socket.d.ts.map +1 -0
  207. package/dist/use-socket.js +52 -0
  208. package/dist/use-state.d.ts +4 -0
  209. package/dist/use-state.d.ts.map +1 -0
  210. package/dist/use-state.js +24 -0
  211. package/dist/use-state.spec.d.ts +2 -0
  212. package/dist/use-state.spec.d.ts.map +1 -0
  213. package/dist/use-state.spec.js +36 -0
  214. package/dist/use-timestamp.d.ts +2 -0
  215. package/dist/use-timestamp.d.ts.map +1 -0
  216. package/dist/use-timestamp.js +13 -0
  217. package/dist/use.d.ts +5 -0
  218. package/dist/use.d.ts.map +1 -0
  219. package/dist/use.js +20 -0
  220. package/dist/use.spec.d.ts +2 -0
  221. package/dist/use.spec.d.ts.map +1 -0
  222. package/dist/use.spec.js +47 -0
  223. package/jest.config.ts +23 -2
  224. package/package.json +14 -11
  225. package/src/as-readonly.ts +5 -0
  226. package/src/{domain → asset}/asset.spec.ts +4 -4
  227. package/src/{domain → asset}/asset.ts +17 -6
  228. package/src/asset/index.ts +1 -0
  229. package/src/cli/build.ts +1 -1
  230. package/src/cli/dev.ts +18 -13
  231. package/src/cli/index.ts +7 -7
  232. package/src/cli/internal/workspace.ts +1 -1
  233. package/src/cli/pull.ts +22 -10
  234. package/src/cli/replay.ts +31 -0
  235. package/src/cli/run.ts +17 -13
  236. package/src/component/distinct-until-timesamp-changed.ts +11 -0
  237. package/src/component/error.ts +32 -0
  238. package/src/component/index.ts +7 -0
  239. package/src/{domain → component}/ohlc-operator.spec.ts +5 -6
  240. package/src/{domain → component}/ohlc-operator.ts +2 -3
  241. package/src/{domain → component}/ohlc.spec.ts +2 -2
  242. package/src/{domain → component}/ohlc.ts +2 -2
  243. package/src/core.ts +14 -0
  244. package/src/defined.ts +6 -0
  245. package/src/exclude.ts +9 -0
  246. package/src/index.ts +27 -80
  247. package/src/{domain → instrument/commission}/commission.spec.ts +4 -3
  248. package/src/{domain → instrument/commission}/commission.ts +1 -1
  249. package/src/instrument/index.ts +2 -0
  250. package/src/{domain → instrument}/instrument.spec.ts +11 -6
  251. package/src/{domain → instrument}/instrument.ts +12 -8
  252. package/src/make-test-module.ts +46 -0
  253. package/src/module.spec.ts +74 -0
  254. package/src/module.ts +156 -0
  255. package/src/not-found.ts +1 -0
  256. package/src/replay/index.ts +6 -0
  257. package/src/replay/use-replay-coordinator.ts +142 -0
  258. package/src/replay/use-replay-options.ts +23 -0
  259. package/src/replay/use-replay-reader.spec.ts +64 -0
  260. package/src/replay/use-replay-reader.ts +23 -0
  261. package/src/replay/use-replay-storage.ts +8 -0
  262. package/src/replay/use-replay-writer.spec.ts +56 -0
  263. package/src/replay/use-replay-writer.ts +17 -0
  264. package/src/replay/use-replay.spec.ts +132 -0
  265. package/src/replay/use-replay.ts +34 -0
  266. package/src/replay/with-replay.ts +10 -0
  267. package/src/session/index.ts +3 -0
  268. package/src/session/use-session-object.ts +26 -0
  269. package/src/session/use-session-storage.ts +9 -0
  270. package/src/session/use-session.ts +5 -0
  271. package/src/shared/decimals.spec.ts +1 -1
  272. package/src/shared/decimals.ts +5 -0
  273. package/src/shared/index.ts +3 -7
  274. package/src/simulator/index.ts +1 -0
  275. package/src/simulator/use-simulator.spec.ts +54 -0
  276. package/src/simulator/use-simulator.ts +7 -0
  277. package/src/storage/in-memory/in-memory-storage.factory.ts +16 -0
  278. package/src/storage/in-memory/in-memory-storage.spec.ts +193 -0
  279. package/src/storage/in-memory/in-memory-storage.ts +80 -0
  280. package/src/storage/in-memory/index.ts +2 -0
  281. package/src/storage/index.ts +3 -3
  282. package/src/storage/storage.ts +63 -119
  283. package/src/storage/use-cache.spec.ts +31 -0
  284. package/src/storage/use-cache.ts +50 -0
  285. package/src/storage/use-storage-factory.ts +17 -0
  286. package/src/storage/use-storage.ts +11 -0
  287. package/src/strat.ts +7 -0
  288. package/src/use-execution-mode.ts +41 -0
  289. package/src/use-hash.spec.ts +16 -0
  290. package/src/use-hash.ts +5 -0
  291. package/src/use-lock.ts +52 -0
  292. package/src/use-logger.ts +47 -0
  293. package/src/use-memo.spec.ts +30 -0
  294. package/src/use-memo.ts +35 -0
  295. package/src/use-request.ts +47 -0
  296. package/src/use-socket.ts +59 -0
  297. package/src/use-state.spec.ts +31 -0
  298. package/src/use-state.ts +30 -0
  299. package/src/use-timestamp.ts +12 -0
  300. package/src/use.spec.ts +46 -0
  301. package/src/use.ts +33 -0
  302. package/tsconfig.json +7 -4
  303. package/dist/adapter/adapter-aggregate.d.ts +0 -57
  304. package/dist/adapter/adapter-aggregate.d.ts.map +0 -1
  305. package/dist/adapter/adapter-aggregate.js +0 -157
  306. package/dist/adapter/adapter.d.ts +0 -54
  307. package/dist/adapter/adapter.d.ts.map +0 -1
  308. package/dist/adapter/adapter.js +0 -20
  309. package/dist/adapter/backtester/backtester-adapter.d.ts +0 -30
  310. package/dist/adapter/backtester/backtester-adapter.d.ts.map +0 -1
  311. package/dist/adapter/backtester/backtester-adapter.js +0 -67
  312. package/dist/adapter/backtester/backtester-cursor.d.ts +0 -16
  313. package/dist/adapter/backtester/backtester-cursor.d.ts.map +0 -1
  314. package/dist/adapter/backtester/backtester-cursor.js +0 -52
  315. package/dist/adapter/backtester/backtester-streamer.d.ts +0 -50
  316. package/dist/adapter/backtester/backtester-streamer.d.ts.map +0 -1
  317. package/dist/adapter/backtester/backtester-streamer.js +0 -119
  318. package/dist/adapter/backtester/error.d.ts +0 -3
  319. package/dist/adapter/backtester/error.d.ts.map +0 -1
  320. package/dist/adapter/backtester/error.js +0 -11
  321. package/dist/adapter/backtester/index.d.ts +0 -3
  322. package/dist/adapter/backtester/index.d.ts.map +0 -1
  323. package/dist/adapter/error.d.ts +0 -4
  324. package/dist/adapter/error.d.ts.map +0 -1
  325. package/dist/adapter/error.js +0 -15
  326. package/dist/adapter/index.d.ts +0 -5
  327. package/dist/adapter/index.d.ts.map +0 -1
  328. package/dist/adapter/paper/engine/paper-engine.d.ts +0 -12
  329. package/dist/adapter/paper/engine/paper-engine.d.ts.map +0 -1
  330. package/dist/adapter/paper/engine/paper-engine.js +0 -109
  331. package/dist/adapter/paper/index.d.ts +0 -3
  332. package/dist/adapter/paper/index.d.ts.map +0 -1
  333. package/dist/adapter/paper/paper-adapter.d.ts +0 -30
  334. package/dist/adapter/paper/paper-adapter.d.ts.map +0 -1
  335. package/dist/adapter/paper/paper-adapter.js +0 -87
  336. package/dist/cli/error.d.ts +0 -2
  337. package/dist/cli/error.d.ts.map +0 -1
  338. package/dist/cli/error.js +0 -7
  339. package/dist/cli/test.d.ts.map +0 -1
  340. package/dist/domain/asset.d.ts.map +0 -1
  341. package/dist/domain/balance-operator.d.ts +0 -7
  342. package/dist/domain/balance-operator.d.ts.map +0 -1
  343. package/dist/domain/balance-operator.js +0 -9
  344. package/dist/domain/balance.d.ts +0 -47
  345. package/dist/domain/balance.d.ts.map +0 -1
  346. package/dist/domain/balance.js +0 -97
  347. package/dist/domain/commission.d.ts.map +0 -1
  348. package/dist/domain/component.d.ts +0 -6
  349. package/dist/domain/component.d.ts.map +0 -1
  350. package/dist/domain/error.d.ts +0 -7
  351. package/dist/domain/error.d.ts.map +0 -1
  352. package/dist/domain/error.js +0 -23
  353. package/dist/domain/index.d.ts +0 -22
  354. package/dist/domain/index.d.ts.map +0 -1
  355. package/dist/domain/index.js +0 -37
  356. package/dist/domain/instrument-operator.d.ts +0 -7
  357. package/dist/domain/instrument-operator.d.ts.map +0 -1
  358. package/dist/domain/instrument-operator.js +0 -13
  359. package/dist/domain/instrument.d.ts.map +0 -1
  360. package/dist/domain/ohlc-operator.d.ts.map +0 -1
  361. package/dist/domain/ohlc.d.ts.map +0 -1
  362. package/dist/domain/order-operator.d.ts +0 -8
  363. package/dist/domain/order-operator.d.ts.map +0 -1
  364. package/dist/domain/order-operator.js +0 -16
  365. package/dist/domain/order.d.ts +0 -24
  366. package/dist/domain/order.d.ts.map +0 -1
  367. package/dist/domain/order.js +0 -49
  368. package/dist/domain/orderbook-operator.d.ts +0 -7
  369. package/dist/domain/orderbook-operator.d.ts.map +0 -1
  370. package/dist/domain/orderbook-operator.js +0 -9
  371. package/dist/domain/orderbook.d.ts +0 -30
  372. package/dist/domain/orderbook.d.ts.map +0 -1
  373. package/dist/domain/orderbook.js +0 -20
  374. package/dist/domain/position-operator.d.ts +0 -13
  375. package/dist/domain/position-operator.d.ts.map +0 -1
  376. package/dist/domain/position-operator.js +0 -45
  377. package/dist/domain/position.d.ts +0 -18
  378. package/dist/domain/position.d.ts.map +0 -1
  379. package/dist/domain/position.js +0 -23
  380. package/dist/domain/session-builder.d.ts +0 -54
  381. package/dist/domain/session-builder.d.ts.map +0 -1
  382. package/dist/domain/session-builder.js +0 -106
  383. package/dist/domain/session.d.ts +0 -77
  384. package/dist/domain/session.d.ts.map +0 -1
  385. package/dist/domain/session.js +0 -162
  386. package/dist/domain/timeframe.d.ts.map +0 -1
  387. package/dist/domain/trade-operator.d.ts +0 -7
  388. package/dist/domain/trade-operator.d.ts.map +0 -1
  389. package/dist/domain/trade-operator.js +0 -9
  390. package/dist/domain/trade.d.ts +0 -16
  391. package/dist/domain/trade.d.ts.map +0 -1
  392. package/dist/domain/trade.js +0 -17
  393. package/dist/shared/collections.d.ts +0 -29
  394. package/dist/shared/collections.d.ts.map +0 -1
  395. package/dist/shared/collections.js +0 -123
  396. package/dist/shared/logger.d.ts +0 -8
  397. package/dist/shared/logger.d.ts.map +0 -1
  398. package/dist/shared/logger.js +0 -33
  399. package/dist/shared/pipe.d.ts +0 -5
  400. package/dist/shared/pipe.d.ts.map +0 -1
  401. package/dist/shared/pipe.js +0 -8
  402. package/dist/shared/policy.d.ts +0 -2
  403. package/dist/shared/policy.d.ts.map +0 -1
  404. package/dist/shared/policy.js +0 -8
  405. package/dist/storage/cache.d.ts +0 -10
  406. package/dist/storage/cache.d.ts.map +0 -1
  407. package/dist/storage/cache.js +0 -43
  408. package/dist/storage/feed.d.ts +0 -38
  409. package/dist/storage/feed.d.ts.map +0 -1
  410. package/dist/storage/feed.js +0 -108
  411. package/dist/storage/measurement.d.ts +0 -34
  412. package/dist/storage/measurement.d.ts.map +0 -1
  413. package/dist/storage/measurement.js +0 -59
  414. package/dist/store/error.d.ts +0 -9
  415. package/dist/store/error.d.ts.map +0 -1
  416. package/dist/store/error.js +0 -31
  417. package/dist/store/index.d.ts +0 -10
  418. package/dist/store/index.d.ts.map +0 -1
  419. package/dist/store/store-balance-event.d.ts +0 -46
  420. package/dist/store/store-balance-event.d.ts.map +0 -1
  421. package/dist/store/store-balance-event.js +0 -134
  422. package/dist/store/store-event.d.ts +0 -7
  423. package/dist/store/store-event.d.ts.map +0 -1
  424. package/dist/store/store-event.js +0 -2
  425. package/dist/store/store-instrument-event.d.ts +0 -22
  426. package/dist/store/store-instrument-event.d.ts.map +0 -1
  427. package/dist/store/store-instrument-event.js +0 -60
  428. package/dist/store/store-order-event.d.ts +0 -64
  429. package/dist/store/store-order-event.d.ts.map +0 -1
  430. package/dist/store/store-order-event.js +0 -185
  431. package/dist/store/store-orderbook-event.d.ts +0 -13
  432. package/dist/store/store-orderbook-event.d.ts.map +0 -1
  433. package/dist/store/store-orderbook-event.js +0 -43
  434. package/dist/store/store-position-event.d.ts +0 -22
  435. package/dist/store/store-position-event.d.ts.map +0 -1
  436. package/dist/store/store-position-event.js +0 -96
  437. package/dist/store/store-state.d.ts +0 -28
  438. package/dist/store/store-state.d.ts.map +0 -1
  439. package/dist/store/store-state.js +0 -29
  440. package/dist/store/store-trade-event.d.ts +0 -17
  441. package/dist/store/store-trade-event.d.ts.map +0 -1
  442. package/dist/store/store-trade-event.js +0 -34
  443. package/dist/store/store.d.ts +0 -15
  444. package/dist/store/store.d.ts.map +0 -1
  445. package/dist/store/store.js +0 -32
  446. package/src/adapter/adapter-aggregate.ts +0 -171
  447. package/src/adapter/adapter.ts +0 -83
  448. package/src/adapter/backtester/backtester-adapter.ts +0 -96
  449. package/src/adapter/backtester/backtester-cursor.spec.ts +0 -44
  450. package/src/adapter/backtester/backtester-cursor.ts +0 -47
  451. package/src/adapter/backtester/backtester-streamer.spec.ts +0 -60
  452. package/src/adapter/backtester/backtester-streamer.ts +0 -155
  453. package/src/adapter/backtester/error.ts +0 -7
  454. package/src/adapter/backtester/index.ts +0 -2
  455. package/src/adapter/error.ts +0 -13
  456. package/src/adapter/index.ts +0 -4
  457. package/src/adapter/paper/engine/paper-engine.spec.ts +0 -116
  458. package/src/adapter/paper/engine/paper-engine.ts +0 -151
  459. package/src/adapter/paper/index.ts +0 -2
  460. package/src/adapter/paper/paper-adapter.ts +0 -111
  461. package/src/cli/error.ts +0 -5
  462. package/src/cli/test.ts +0 -40
  463. package/src/domain/balance-operator.spec.ts +0 -26
  464. package/src/domain/balance-operator.ts +0 -15
  465. package/src/domain/balance.spec.ts +0 -116
  466. package/src/domain/balance.ts +0 -123
  467. package/src/domain/component.ts +0 -6
  468. package/src/domain/error.ts +0 -27
  469. package/src/domain/index.ts +0 -21
  470. package/src/domain/instrument-operator.spec.ts +0 -35
  471. package/src/domain/instrument-operator.ts +0 -25
  472. package/src/domain/order-operator.spec.ts +0 -85
  473. package/src/domain/order-operator.ts +0 -23
  474. package/src/domain/order.spec.ts +0 -43
  475. package/src/domain/order.ts +0 -68
  476. package/src/domain/orderbook-operator.spec.ts +0 -40
  477. package/src/domain/orderbook-operator.ts +0 -15
  478. package/src/domain/orderbook.spec.ts +0 -26
  479. package/src/domain/orderbook.ts +0 -30
  480. package/src/domain/position-operator.spec.ts +0 -64
  481. package/src/domain/position-operator.ts +0 -71
  482. package/src/domain/position.spec.ts +0 -43
  483. package/src/domain/position.ts +0 -31
  484. package/src/domain/session-builder.ts +0 -158
  485. package/src/domain/session.spec.ts +0 -33
  486. package/src/domain/session.ts +0 -256
  487. package/src/domain/trade-operator.spec.ts +0 -35
  488. package/src/domain/trade-operator.ts +0 -15
  489. package/src/domain/trade.spec.ts +0 -21
  490. package/src/domain/trade.ts +0 -20
  491. package/src/shared/collections.spec.ts +0 -34
  492. package/src/shared/collections.ts +0 -154
  493. package/src/shared/logger.ts +0 -39
  494. package/src/shared/pipe.ts +0 -12
  495. package/src/shared/policy.ts +0 -5
  496. package/src/storage/cache.spec.ts +0 -18
  497. package/src/storage/cache.ts +0 -37
  498. package/src/storage/feed.ts +0 -124
  499. package/src/storage/measurement.ts +0 -56
  500. package/src/store/error.ts +0 -36
  501. package/src/store/index.ts +0 -9
  502. package/src/store/store-balance-event.spec.ts +0 -30
  503. package/src/store/store-balance-event.ts +0 -167
  504. package/src/store/store-event.ts +0 -8
  505. package/src/store/store-instrument-event.spec.ts +0 -26
  506. package/src/store/store-instrument-event.ts +0 -83
  507. package/src/store/store-order-event.spec.ts +0 -32
  508. package/src/store/store-order-event.ts +0 -219
  509. package/src/store/store-orderbook-event.spec.ts +0 -39
  510. package/src/store/store-orderbook-event.ts +0 -56
  511. package/src/store/store-position-event.ts +0 -121
  512. package/src/store/store-state.ts +0 -48
  513. package/src/store/store-trade-event.spec.ts +0 -62
  514. package/src/store/store-trade-event.ts +0 -42
  515. package/src/store/store.spec.ts +0 -182
  516. package/src/store/store.ts +0 -37
  517. package/dist/{domain → component}/ohlc.d.ts +0 -0
  518. package/dist/{domain → component}/ohlc.js +0 -0
  519. package/dist/{domain → component}/timeframe.d.ts +0 -0
  520. package/dist/{domain → component}/timeframe.js +1 -1
  521. /package/src/{domain → component}/timeframe.ts +0 -0
@@ -1,71 +0,0 @@
1
- import { filter, map, Observable, share, startWith } from 'rxjs';
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';
9
-
10
- export function position(selector: InstrumentSelector) {
11
- return (source: Observable<Component>) =>
12
- source.pipe(
13
- filter(it => it instanceof Position && it.instrument.id == selector.id),
14
- map(it => it as Readonly<Position>)
15
- );
16
- }
17
-
18
- export function positions(selector: InstrumentSelector, state: State) {
19
- const balance = state.balance.get(selector.quote.id);
20
- if (!balance) {
21
- throw invalidInstrumentSelectorError(selector.id);
22
- }
23
-
24
- const getter = () =>
25
- Object.values(balance.position)
26
- .filter(it => it.instrument.id == selector.id)
27
- .map(it => it as Readonly<Position>);
28
-
29
- return (source: Observable<Component>) =>
30
- source.pipe(
31
- position(selector),
32
- map(() => getter()),
33
- startWith(getter())
34
- );
35
- }
36
-
37
- export function flatten() {
38
- return function (
39
- source: Observable<Position[]>
40
- ): Observable<{ size: decimal; rate: decimal }> {
41
- return source.pipe(
42
- map(it => {
43
- if (it.length > 1) {
44
- return {
45
- size: it.reduce(
46
- (aggregate, position) => aggregate.add(position.size),
47
- d.Zero
48
- ),
49
- rate: weightedMean(
50
- it.map(x => x.averageExecutionRate),
51
- it.map(x => x.size)
52
- )
53
- };
54
- }
55
-
56
- if (it.length == 1) {
57
- return {
58
- size: it[0].size,
59
- rate: it[0].averageExecutionRate
60
- };
61
- }
62
-
63
- return {
64
- size: d.Zero,
65
- rate: d.Zero
66
- };
67
- }),
68
- share()
69
- );
70
- };
71
- }
@@ -1,43 +0,0 @@
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';
6
-
7
- describe('Position', () => {
8
- const instrument = new Instrument(
9
- 0,
10
- new Asset('abc', 'xyz', 4),
11
- new Asset('def', 'xyz', 4),
12
- 'abc-def',
13
- Commission.Zero
14
- );
15
-
16
- test('should construct a position', () => {
17
- const sut = new Position(0, '1', instrument, 'CROSS', d(10), d(2), 3);
18
-
19
- expect(sut.id).toEqual('1');
20
- expect(sut.mode).toEqual('CROSS');
21
- expect(sut.averageExecutionRate).toEqual(d(10));
22
- expect(sut.size).toEqual(d(2));
23
- expect(sut.leverage).toEqual(3);
24
- expect(sut.estimatedUnrealizedPnL).toEqual(undefined);
25
- expect(sut.id).toEqual('1');
26
- });
27
-
28
- test('should calculate correct margin', () => {
29
- const sut = new Position(0, '1', instrument, 'CROSS', d(2511.81), d(10.31), 20);
30
-
31
- expect(sut.margin).toEqual(d(0.5155));
32
- expect(sut.estimatedUnrealizedPnL).toEqual(undefined);
33
- });
34
-
35
- test('should calculate correct unrealized pnl', () => {
36
- const sut = new Position(0, '1', instrument, 'CROSS', d(2511.81), d(10.31), 20);
37
-
38
- const pnl = sut.calculateEstimatedUnrealizedPnL(d(2576.44));
39
-
40
- expect(pnl).toEqual(d(0.2652));
41
- expect(sut.estimatedUnrealizedPnL).toEqual(d(0.2652));
42
- });
43
- });
@@ -1,31 +0,0 @@
1
- import { Instrument } from '../domain';
2
- import { decimal, pnl } from '../shared';
3
- import { Component } from './component';
4
-
5
- export type PositionMode = 'CROSS' | 'ISOLATED';
6
-
7
- export class Position implements Component {
8
- estimatedUnrealizedPnL?: decimal;
9
-
10
- get margin(): decimal {
11
- return this.instrument.quote.floor(this.size.abs().div(this.leverage));
12
- }
13
-
14
- constructor(
15
- public timestamp: number,
16
- readonly id: string,
17
- readonly instrument: Instrument,
18
- readonly mode: PositionMode,
19
- public averageExecutionRate: decimal,
20
- public size: decimal,
21
- public leverage: number
22
- ) {}
23
-
24
- calculateEstimatedUnrealizedPnL(rate: decimal): decimal {
25
- this.estimatedUnrealizedPnL = this.instrument.quote.floor(
26
- pnl(this.averageExecutionRate, rate, this.size)
27
- );
28
-
29
- return this.estimatedUnrealizedPnL;
30
- }
31
- }
@@ -1,158 +0,0 @@
1
- import {
2
- AdapterAggregate,
3
- AdapterFactory,
4
- BacktesterListener,
5
- BacktesterStreamer,
6
- createBacktesterAdapterFactory,
7
- createPaperAdapterFactory,
8
- DefaultTimeProvider
9
- } from '../adapter';
10
- import { decimal, now } from '../shared';
11
- import {
12
- Cache,
13
- Feed,
14
- inMemoryStorageFactory,
15
- Measurement,
16
- StorageFactory
17
- } from '../storage';
18
- import { Store } from '../store';
19
- import { AssetSelector } from './asset';
20
- import { Session } from './session';
21
-
22
- export type SessionFeature = (builder: SessionBuilder) => void;
23
-
24
- export function deposit(selector: AssetSelector, amount: decimal): SessionFeature {
25
- 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());
33
- };
34
- }
35
-
36
- export class SessionBuilder {
37
- public id: number = now();
38
- public adapter = new Array<AdapterFactory>();
39
- public storage: StorageFactory = inMemoryStorageFactory();
40
- public balance: Record<string, decimal> = {};
41
- public period = {
42
- from: 0,
43
- to: Number.MAX_VALUE
44
- };
45
-
46
- /**
47
- * Unique session identifier, used to identify session in the storage.
48
- * You can generate new id every time you start the new session or provide
49
- * session id explicitly to resume previous session (in code or via CLI).
50
- * If you don't provide session id, it will generate new one based on time.
51
- */
52
- useSessionId(id: number): SessionBuilder {
53
- this.id = id;
54
-
55
- return this;
56
- }
57
-
58
- /**
59
- * Collection of adapters used to connect to the exchanges.
60
- */
61
- useAdapter(adapter: AdapterFactory): SessionBuilder {
62
- this.adapter.push(adapter);
63
-
64
- return this;
65
- }
66
-
67
- /**
68
- * Provides historical data for backtest, it's not required for live and paper
69
- * sessions. Stores session variables i.e. indicators, orders, or any other type of time
70
- * series data. You can install @quantform/editor to render this data in your browser.
71
- */
72
- useStorage(storage: StorageFactory): SessionBuilder {
73
- this.storage = storage;
74
-
75
- return this;
76
- }
77
-
78
- useBalance(selector: AssetSelector, amount: decimal): SessionBuilder {
79
- this.balance[selector.id] = amount;
80
-
81
- return this;
82
- }
83
-
84
- usePeriod(from: number, to: number): SessionBuilder {
85
- this.period.from = from;
86
- this.period.to = to;
87
-
88
- return this;
89
- }
90
-
91
- /**
92
- * Starts a new backtest session.
93
- * @param listener backtest event listener.
94
- * @returns new session object.
95
- */
96
- backtest(listener?: BacktesterListener): [Session, BacktesterStreamer] {
97
- const store = new Store();
98
- const feed = new Feed(this.storage('feed'));
99
- const cache = new Cache(this.storage('cache'));
100
- const measurement = new Measurement(this.storage('measurement'));
101
-
102
- const streamer = new BacktesterStreamer(store, feed, this.period, listener);
103
-
104
- const aggregate = new AdapterAggregate(
105
- this.adapter.map(it =>
106
- createBacktesterAdapterFactory(
107
- createPaperAdapterFactory(it, { balance: this.balance }),
108
- streamer
109
- )
110
- ),
111
- streamer.getTimeProvider(),
112
- store,
113
- cache
114
- );
115
-
116
- const session = new Session(this.id, store, aggregate, measurement);
117
-
118
- return [session, streamer];
119
- }
120
-
121
- /**
122
- * Starts a new paper session.
123
- * @returns new session object.
124
- */
125
- paper(): Session {
126
- const store = new Store();
127
- const cache = new Cache(this.storage('cache'));
128
- const measurement = new Measurement(this.storage('measurement'));
129
-
130
- const aggregate = new AdapterAggregate(
131
- this.adapter.map(it => createPaperAdapterFactory(it, { balance: this.balance })),
132
- DefaultTimeProvider,
133
- store,
134
- cache
135
- );
136
-
137
- return new Session(this.id, store, aggregate, measurement);
138
- }
139
-
140
- /**
141
- * Starts a new live session.
142
- * @returns new session object.
143
- */
144
- live(): Session {
145
- const store = new Store();
146
- const cache = new Cache(this.storage('cache'));
147
- const measurement = new Measurement(this.storage('measurement'));
148
-
149
- const aggregate = new AdapterAggregate(
150
- this.adapter,
151
- DefaultTimeProvider,
152
- store,
153
- cache
154
- );
155
-
156
- return new Session(this.id, store, aggregate, measurement);
157
- }
158
- }
@@ -1,33 +0,0 @@
1
- import { Asset, Commission, SessionBuilder } from '../domain';
2
- import { d, now } from '../shared';
3
- import { InstrumentPatchEvent } from '../store';
4
-
5
- describe('Session', () => {
6
- test('should trigger once', done => {
7
- const session = new SessionBuilder().paper();
8
-
9
- session.instruments().subscribe({
10
- next: it => {
11
- expect(it.length).toEqual(2);
12
- },
13
- complete: done()
14
- });
15
-
16
- session.store.dispatch(
17
- new InstrumentPatchEvent(
18
- now(),
19
- new Asset('de30', 'cex', 2),
20
- new Asset('usd', 'cex', 2),
21
- new Commission(d.Zero, d.Zero),
22
- ''
23
- ),
24
- new InstrumentPatchEvent(
25
- now(),
26
- new Asset('wig20', 'cex', 2),
27
- new Asset('pln', 'cex', 2),
28
- new Commission(d.Zero, d.Zero),
29
- ''
30
- )
31
- );
32
- });
33
- });
@@ -1,256 +0,0 @@
1
- import {
2
- concat,
3
- defer,
4
- filter,
5
- from,
6
- map,
7
- mergeMap,
8
- Observable,
9
- of,
10
- ReplaySubject,
11
- share,
12
- shareReplay,
13
- startWith,
14
- switchMap,
15
- take
16
- } from 'rxjs';
17
- import { v4 } from 'uuid';
18
-
19
- import { AdapterAggregate } from '../adapter/adapter-aggregate';
20
- import {
21
- AssetSelector,
22
- Balance,
23
- Instrument,
24
- InstrumentSelector,
25
- invalidInstrumentSelectorError,
26
- Ohlc,
27
- Order,
28
- Orderbook,
29
- 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';
41
-
42
- type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
43
-
44
- export class Session {
45
- private initialized = false;
46
-
47
- get timestamp(): number {
48
- return this.store.snapshot.timestamp;
49
- }
50
-
51
- constructor(
52
- readonly id: number,
53
- readonly store: Store,
54
- readonly aggregate: AdapterAggregate,
55
- readonly measurement: Measurement | undefined
56
- ) {}
57
-
58
- async awake(): Promise<void> {
59
- if (this.initialized) {
60
- return;
61
- }
62
-
63
- this.initialized = true;
64
-
65
- // awake all adapters and synchronize trading accounts with store.
66
- await this.aggregate.awake();
67
- }
68
-
69
- async dispose(): Promise<void> {
70
- if (!this.initialized) {
71
- return;
72
- }
73
-
74
- this.store.dispose();
75
-
76
- await this.aggregate.dispose();
77
-
78
- this.initialized = false;
79
- }
80
-
81
- /**
82
- * Subscribes to specific instrument. Usually forces adapter to subscribe
83
- * for orderbook and ticker streams.
84
- */
85
- subscribe(instrument: Array<InstrumentSelector>): Promise<void> {
86
- return this.aggregate.subscribe(instrument);
87
- }
88
-
89
- /**
90
- * Opens a new order.
91
- */
92
- open(order: {
93
- instrument: InstrumentSelector;
94
- quantity: decimal;
95
- rate?: decimal;
96
- }): Observable<Readonly<Order>> {
97
- const instrument = this.store.snapshot.universe.instrument.get(order.instrument.id);
98
- if (!instrument) {
99
- throw invalidInstrumentSelectorError(order.instrument.id);
100
- }
101
-
102
- const newOrder = new Order(
103
- this.timestamp,
104
- v4(),
105
- instrument,
106
- order.quantity,
107
- this.timestamp,
108
- order.rate
109
- );
110
-
111
- return of(newOrder).pipe(
112
- switchMap(() => this.aggregate.open(newOrder)),
113
- switchMap(() =>
114
- this.order(order.instrument).pipe(filter(it => it.id == newOrder.id))
115
- )
116
- );
117
- }
118
-
119
- /**
120
- * Cancels specific order.
121
- */
122
- cancel(order: Order): Observable<Readonly<Order>> {
123
- return defer(() => from(this.aggregate.cancel(order))).pipe(
124
- switchMap(() => this.order(order.instrument).pipe(filter(it => it.id == order.id)))
125
- );
126
- }
127
-
128
- /**
129
- * Subscribes to specific instrument changes.
130
- * When adapter awake then it will fetch collection of all available instruments.
131
- */
132
- instrument(selector: InstrumentSelector): Observable<Readonly<Instrument>> {
133
- this.subscribe([selector]);
134
-
135
- return this.store.changes$.pipe(instrument(selector, this.store.snapshot));
136
- }
137
-
138
- /**
139
- * Subscribes to instruments changes.
140
- * When adapter awake then it will fetch collection of all available instruments.
141
- */
142
- instruments(): Observable<Readonly<Instrument[]>> {
143
- return this.store.changes$.pipe(instruments(this.store.snapshot));
144
- }
145
-
146
- /**
147
- * Subscribes to balance changes.
148
- */
149
- balance(selector: AssetSelector): Observable<Readonly<Balance>> {
150
- return this.store.changes$.pipe(balance(selector, this.store.snapshot));
151
- }
152
-
153
- /**
154
- * Subscribes to trade/ticker changes.
155
- */
156
- trade(selector: InstrumentSelector): Observable<Readonly<Trade>> {
157
- this.subscribe([selector]);
158
-
159
- return this.store.changes$.pipe(trade(selector, this.store.snapshot));
160
- }
161
-
162
- /**
163
- * Subscribes to orderbook changes.
164
- * Right now you can access only best bid and best ask.
165
- */
166
- orderbook(selector: InstrumentSelector): Observable<Readonly<Orderbook>> {
167
- this.subscribe([selector]);
168
-
169
- return this.store.changes$.pipe(orderbook(selector, this.store.snapshot));
170
- }
171
-
172
- /**
173
- * Subscribes to position on leveraged market.
174
- */
175
- position(selector: InstrumentSelector): Observable<Readonly<Position>> {
176
- this.subscribe([selector]);
177
-
178
- return this.store.changes$.pipe(position(selector));
179
- }
180
-
181
- /**
182
- * Subscribes to positions on leveraged markets.
183
- */
184
- positions(selector: InstrumentSelector): Observable<Readonly<Position[]>> {
185
- this.subscribe([selector]);
186
-
187
- return this.store.changes$.pipe(positions(selector, this.store.snapshot));
188
- }
189
-
190
- order(selector: InstrumentSelector): Observable<Readonly<Order>> {
191
- this.subscribe([selector]);
192
-
193
- return this.store.changes$.pipe(order(selector));
194
- }
195
-
196
- orders(selector: InstrumentSelector): Observable<Readonly<Order[]>> {
197
- this.subscribe([selector]);
198
-
199
- return this.store.changes$.pipe(orders(selector, this.store.snapshot));
200
- }
201
-
202
- history(
203
- selector: InstrumentSelector,
204
- timeframe: number,
205
- length: number
206
- ): Observable<Readonly<Ohlc>> {
207
- return this.store.changes$.pipe(
208
- startWith(this.store.snapshot.universe.instrument.get(selector.id)),
209
- filter(it => it instanceof Instrument && it.id == selector.id),
210
- switchMap(() => from(this.aggregate.history(selector, timeframe, length))),
211
- take(1),
212
- shareReplay(),
213
- mergeMap(it => it)
214
- );
215
- }
216
-
217
- measure<T extends { timestamp: number }>(
218
- spec: {
219
- kind: string;
220
- timestamp?: number;
221
- },
222
- defaultValue?: Optional<T, 'timestamp'>
223
- ): [Observable<T>, (value: T) => void] {
224
- if (!this.measurement) {
225
- throw new Error();
226
- }
227
-
228
- const changes$ = new ReplaySubject<Optional<T, 'timestamp'>>();
229
- const persisted$ = from(
230
- this.measurement.query(this.id, {
231
- to: spec.timestamp ?? this.timestamp,
232
- kind: spec.kind,
233
- count: 1
234
- })
235
- ).pipe(
236
- map(it =>
237
- it.length ? { timestamp: it[0].timestamp, ...it[0].payload } : defaultValue
238
- ),
239
- share()
240
- );
241
-
242
- const setter = (value: Optional<T, 'timestamp'>) => {
243
- const timestamp = value.timestamp ?? this.timestamp;
244
- const measure = { timestamp, kind: spec.kind, payload: value };
245
-
246
- this.measurement?.save(this.id, [measure]);
247
-
248
- changes$.next({ ...value, timestamp });
249
- };
250
-
251
- return [
252
- concat(persisted$, changes$.asObservable()).pipe(filter(it => it !== undefined)),
253
- setter
254
- ];
255
- }
256
- }
@@ -1,35 +0,0 @@
1
- import { Subject } from 'rxjs';
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';
11
-
12
- describe('trade', () => {
13
- const instrument = new Instrument(
14
- 0,
15
- new Asset('abc', 'xyz', 4),
16
- new Asset('def', 'xyz', 4),
17
- 'abc-def',
18
- Commission.Zero
19
- );
20
-
21
- const state = new State();
22
-
23
- beforeEach(() => {
24
- state.trade.upsert(new Trade(0, instrument, d.Zero, d.Zero));
25
- });
26
-
27
- test('should pipe an orderbook on subscription', done => {
28
- new Subject<Component>().pipe(trade(instrument, state)).subscribe({
29
- next: it => {
30
- expect(it.id).toEqual(instrument.id);
31
- done();
32
- }
33
- });
34
- });
35
- });
@@ -1,15 +0,0 @@
1
- import { filter, map, Observable, startWith } from 'rxjs';
2
-
3
- import { State } from '../store';
4
- import { Component } from './component';
5
- import { InstrumentSelector } from './instrument';
6
- import { Trade } from './trade';
7
-
8
- export function trade(selector: InstrumentSelector, state: State) {
9
- return (source$: Observable<Component>) =>
10
- source$.pipe(
11
- startWith(state.trade.get(selector.id)),
12
- filter(it => it instanceof Trade && it.instrument.id == selector.id),
13
- map(it => it as Trade)
14
- );
15
- }
@@ -1,21 +0,0 @@
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';
6
-
7
- describe('Trade', () => {
8
- const instrument = new Instrument(
9
- 0,
10
- new Asset('abc', 'xyz', 4),
11
- new Asset('def', 'xyz', 4),
12
- 'abc-def',
13
- Commission.Zero
14
- );
15
-
16
- test('should construct an empty trade', () => {
17
- const sut = new Trade(0, instrument, d.Zero, d.Zero);
18
-
19
- expect(sut.id).toEqual(instrument.id);
20
- });
21
- });
@@ -1,20 +0,0 @@
1
- import { decimal } from '../shared';
2
- import { Instrument } from '.';
3
- import { Component } from './component';
4
-
5
- /**
6
- * Simple trade or ticker executed on the market, it's a match of buyer
7
- * and seller of the same asset.
8
- */
9
- export class Trade implements Component {
10
- readonly id: string;
11
-
12
- constructor(
13
- public timestamp: number,
14
- public readonly instrument: Instrument,
15
- public rate: decimal,
16
- public quantity: decimal
17
- ) {
18
- this.id = instrument.id;
19
- }
20
- }