@quantform/core 0.5.23 → 0.6.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 (555) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/adapter/adapter-aggregate.d.ts +36 -1
  3. package/dist/adapter/adapter-aggregate.d.ts.map +1 -0
  4. package/dist/adapter/adapter-aggregate.js +110 -50
  5. package/dist/adapter/adapter.d.ts +25 -0
  6. package/dist/adapter/adapter.d.ts.map +1 -0
  7. package/dist/adapter/adapter.js +4 -1
  8. package/dist/adapter/backtester/backtester-adapter.d.ts +1 -0
  9. package/dist/adapter/backtester/backtester-adapter.d.ts.map +1 -0
  10. package/dist/adapter/backtester/backtester-adapter.js +26 -13
  11. package/dist/adapter/backtester/backtester-cursor.d.ts +2 -1
  12. package/dist/adapter/backtester/backtester-cursor.d.ts.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.js +24 -14
  14. package/dist/adapter/backtester/backtester-streamer.d.ts +20 -1
  15. package/dist/adapter/backtester/backtester-streamer.d.ts.map +1 -0
  16. package/dist/adapter/backtester/backtester-streamer.js +54 -30
  17. package/dist/adapter/backtester/error.d.ts +3 -0
  18. package/dist/adapter/backtester/error.d.ts.map +1 -0
  19. package/dist/adapter/backtester/error.js +11 -0
  20. package/dist/adapter/backtester/index.d.ts +1 -0
  21. package/dist/adapter/backtester/index.d.ts.map +1 -0
  22. package/dist/adapter/backtester/index.js +0 -1
  23. package/dist/adapter/error.d.ts +2 -0
  24. package/dist/adapter/error.d.ts.map +1 -0
  25. package/dist/adapter/error.js +5 -2
  26. package/dist/adapter/index.d.ts +1 -0
  27. package/dist/adapter/index.d.ts.map +1 -0
  28. package/dist/adapter/index.js +0 -1
  29. package/dist/adapter/paper/engine/paper-engine.d.ts +1 -0
  30. package/dist/adapter/paper/engine/paper-engine.d.ts.map +1 -0
  31. package/dist/adapter/paper/engine/paper-engine.js +18 -13
  32. package/dist/adapter/paper/index.d.ts +1 -0
  33. package/dist/adapter/paper/index.d.ts.map +1 -0
  34. package/dist/adapter/paper/index.js +0 -1
  35. package/dist/adapter/paper/paper-adapter.d.ts +4 -3
  36. package/dist/adapter/paper/paper-adapter.d.ts.map +1 -0
  37. package/dist/adapter/paper/paper-adapter.js +44 -21
  38. package/dist/cli/build.d.ts +1 -0
  39. package/dist/cli/build.d.ts.map +1 -0
  40. package/dist/cli/build.js +18 -8
  41. package/dist/cli/dev.d.ts +1 -0
  42. package/dist/cli/dev.d.ts.map +1 -0
  43. package/dist/cli/dev.js +52 -12
  44. package/dist/cli/error.d.ts +2 -0
  45. package/dist/cli/error.d.ts.map +1 -0
  46. package/dist/cli/error.js +7 -0
  47. package/dist/cli/index.d.ts +1 -0
  48. package/dist/cli/index.d.ts.map +1 -0
  49. package/dist/cli/index.js +21 -10
  50. package/dist/cli/internal/workspace.d.ts +1 -7
  51. package/dist/cli/internal/workspace.d.ts.map +1 -0
  52. package/dist/cli/internal/workspace.js +1 -6
  53. package/dist/cli/pull.d.ts +1 -0
  54. package/dist/cli/pull.d.ts.map +1 -0
  55. package/dist/cli/pull.js +68 -38
  56. package/dist/cli/run.d.ts +2 -1
  57. package/dist/cli/run.d.ts.map +1 -0
  58. package/dist/cli/run.js +52 -14
  59. package/dist/cli/test.d.ts +2 -1
  60. package/dist/cli/test.d.ts.map +1 -0
  61. package/dist/cli/test.js +59 -34
  62. package/dist/domain/asset.d.ts +20 -0
  63. package/dist/domain/asset.d.ts.map +1 -0
  64. package/dist/domain/asset.js +19 -1
  65. package/dist/domain/{balance.operator.d.ts → balance-operator.d.ts} +1 -0
  66. package/dist/domain/balance-operator.d.ts.map +1 -0
  67. package/dist/domain/{balance.operator.js → balance-operator.js} +0 -1
  68. package/dist/domain/balance.d.ts +27 -3
  69. package/dist/domain/balance.d.ts.map +1 -0
  70. package/dist/domain/balance.js +31 -3
  71. package/dist/domain/{candle.operator.d.ts → candle-operator.d.ts} +1 -0
  72. package/dist/domain/candle-operator.d.ts.map +1 -0
  73. package/dist/domain/{candle.operator.js → candle-operator.js} +11 -5
  74. package/dist/domain/candle.d.ts +3 -2
  75. package/dist/domain/candle.d.ts.map +1 -0
  76. package/dist/domain/candle.js +0 -1
  77. package/dist/domain/commission.d.ts +2 -0
  78. package/dist/domain/commission.d.ts.map +1 -0
  79. package/dist/domain/commission.js +2 -1
  80. package/dist/domain/component.d.ts +1 -0
  81. package/dist/domain/component.d.ts.map +1 -0
  82. package/dist/domain/component.js +0 -1
  83. package/dist/domain/error.d.ts +4 -3
  84. package/dist/domain/error.d.ts.map +1 -0
  85. package/dist/domain/error.js +3 -4
  86. package/dist/domain/index.d.ts +9 -7
  87. package/dist/domain/index.d.ts.map +1 -0
  88. package/dist/domain/index.js +8 -8
  89. package/dist/domain/{instrument.operator.d.ts → instrument-operator.d.ts} +1 -0
  90. package/dist/domain/instrument-operator.d.ts.map +1 -0
  91. package/dist/domain/{instrument.operator.js → instrument-operator.js} +0 -1
  92. package/dist/domain/instrument.d.ts +9 -6
  93. package/dist/domain/instrument.d.ts.map +1 -0
  94. package/dist/domain/instrument.js +7 -3
  95. package/dist/domain/{order.operator.d.ts → order-operator.d.ts} +1 -0
  96. package/dist/domain/order-operator.d.ts.map +1 -0
  97. package/dist/domain/order-operator.js +16 -0
  98. package/dist/domain/order.d.ts +15 -20
  99. package/dist/domain/order.d.ts.map +1 -0
  100. package/dist/domain/order.js +16 -28
  101. package/dist/domain/{orderbook.operator.d.ts → orderbook-operator.d.ts} +1 -0
  102. package/dist/domain/orderbook-operator.d.ts.map +1 -0
  103. package/dist/domain/{orderbook.operator.js → orderbook-operator.js} +0 -1
  104. package/dist/domain/orderbook.d.ts +10 -6
  105. package/dist/domain/orderbook.d.ts.map +1 -0
  106. package/dist/domain/orderbook.js +7 -2
  107. package/dist/domain/{position.operator.d.ts → position-operator.d.ts} +4 -2
  108. package/dist/domain/position-operator.d.ts.map +1 -0
  109. package/dist/domain/{position.operator.js → position-operator.js} +10 -3
  110. package/dist/domain/position.d.ts +5 -4
  111. package/dist/domain/position.d.ts.map +1 -0
  112. package/dist/domain/position.js +2 -2
  113. package/dist/domain/session-builder.d.ts +54 -0
  114. package/dist/domain/session-builder.d.ts.map +1 -0
  115. package/dist/domain/session-builder.js +105 -0
  116. package/dist/domain/session.d.ts +54 -13
  117. package/dist/domain/session.d.ts.map +1 -0
  118. package/dist/domain/session.js +103 -39
  119. package/dist/domain/timeframe.d.ts +1 -0
  120. package/dist/domain/timeframe.d.ts.map +1 -0
  121. package/dist/domain/timeframe.js +0 -1
  122. package/dist/domain/{trade.operator.d.ts → trade-operator.d.ts} +1 -0
  123. package/dist/domain/trade-operator.d.ts.map +1 -0
  124. package/dist/domain/{trade.operator.js → trade-operator.js} +0 -1
  125. package/dist/domain/trade.d.ts +10 -5
  126. package/dist/domain/trade.d.ts.map +1 -0
  127. package/dist/domain/trade.js +8 -2
  128. package/dist/index.d.ts +2 -2
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +1 -3
  131. package/dist/shared/collections.d.ts +9 -6
  132. package/dist/shared/collections.d.ts.map +1 -0
  133. package/dist/shared/collections.js +21 -13
  134. package/dist/shared/datetime.d.ts +1 -0
  135. package/dist/shared/datetime.d.ts.map +1 -0
  136. package/dist/shared/datetime.js +0 -1
  137. package/dist/shared/decimals.d.ts +13 -0
  138. package/dist/shared/decimals.d.ts.map +1 -0
  139. package/dist/shared/decimals.js +12 -1
  140. package/dist/shared/environment.d.ts +3 -0
  141. package/dist/shared/environment.d.ts.map +1 -0
  142. package/dist/shared/environment.js +15 -0
  143. package/dist/shared/index.d.ts +2 -1
  144. package/dist/shared/index.d.ts.map +1 -0
  145. package/dist/shared/index.js +1 -2
  146. package/dist/shared/logger.d.ts +5 -7
  147. package/dist/shared/logger.d.ts.map +1 -0
  148. package/dist/shared/logger.js +24 -8
  149. package/dist/shared/pipe.d.ts +1 -0
  150. package/dist/shared/pipe.d.ts.map +1 -0
  151. package/dist/shared/pipe.js +0 -1
  152. package/dist/shared/policy.d.ts +1 -0
  153. package/dist/shared/policy.d.ts.map +1 -0
  154. package/dist/shared/policy.js +0 -1
  155. package/dist/storage/cache.d.ts +1 -0
  156. package/dist/storage/cache.d.ts.map +1 -0
  157. package/dist/storage/cache.js +30 -19
  158. package/dist/storage/feed.d.ts +25 -0
  159. package/dist/storage/feed.d.ts.map +1 -0
  160. package/dist/storage/feed.js +56 -19
  161. package/dist/storage/index.d.ts +1 -0
  162. package/dist/storage/index.d.ts.map +1 -0
  163. package/dist/storage/index.js +0 -1
  164. package/dist/storage/measurement.d.ts +20 -0
  165. package/dist/storage/measurement.d.ts.map +1 -0
  166. package/dist/storage/measurement.js +41 -10
  167. package/dist/storage/storage.d.ts +41 -0
  168. package/dist/storage/storage.d.ts.map +1 -0
  169. package/dist/storage/storage.js +69 -33
  170. package/dist/store/error.d.ts +9 -0
  171. package/dist/store/error.d.ts.map +1 -0
  172. package/dist/store/error.js +31 -0
  173. package/dist/store/index.d.ts +8 -7
  174. package/dist/store/index.d.ts.map +1 -0
  175. package/dist/store/index.js +7 -8
  176. package/dist/store/{store-balance.event.d.ts → store-balance-event.d.ts} +14 -1
  177. package/dist/store/store-balance-event.d.ts.map +1 -0
  178. package/dist/store/{store-balance.event.js → store-balance-event.js} +54 -10
  179. package/dist/store/{store.event.d.ts → store-event.d.ts} +1 -0
  180. package/dist/store/store-event.d.ts.map +1 -0
  181. package/dist/store/{store.event.js → store-event.js} +0 -1
  182. package/dist/store/{store-instrument.event.d.ts → store-instrument-event.d.ts} +5 -4
  183. package/dist/store/store-instrument-event.d.ts.map +1 -0
  184. package/dist/store/{store-instrument.event.js → store-instrument-event.js} +13 -5
  185. package/dist/store/{store-order.event.d.ts → store-order-event.d.ts} +7 -2
  186. package/dist/store/store-order-event.d.ts.map +1 -0
  187. package/dist/store/{store-order.event.js → store-order-event.js} +24 -20
  188. package/dist/store/{store-orderbook.event.d.ts → store-orderbook-event.d.ts} +2 -1
  189. package/dist/store/store-orderbook-event.d.ts.map +1 -0
  190. package/dist/store/{store-orderbook.event.js → store-orderbook-event.js} +6 -5
  191. package/dist/store/{store-position.event.d.ts → store-position-event.d.ts} +3 -2
  192. package/dist/store/store-position-event.d.ts.map +1 -0
  193. package/dist/store/{store-position.event.js → store-position-event.js} +13 -6
  194. package/dist/store/store-state.d.ts +3 -2
  195. package/dist/store/store-state.d.ts.map +1 -0
  196. package/dist/store/store-state.js +1 -1
  197. package/dist/store/{store-trade.event.d.ts → store-trade-event.d.ts} +6 -1
  198. package/dist/store/store-trade-event.d.ts.map +1 -0
  199. package/dist/store/{store-trade.event.js → store-trade-event.js} +12 -3
  200. package/dist/store/store.d.ts +2 -1
  201. package/dist/store/store.d.ts.map +1 -0
  202. package/dist/store/store.js +0 -1
  203. package/dist/strategy.d.ts +8 -0
  204. package/dist/strategy.d.ts.map +1 -0
  205. package/dist/strategy.js +44 -0
  206. package/jest.config.ts +13 -0
  207. package/package.json +19 -32
  208. package/src/adapter/adapter-aggregate.ts +41 -18
  209. package/src/adapter/backtester/backtester-adapter.ts +0 -2
  210. package/src/adapter/backtester/backtester-cursor.ts +2 -2
  211. package/src/adapter/backtester/backtester-streamer.spec.ts +5 -3
  212. package/src/adapter/backtester/backtester-streamer.ts +16 -8
  213. package/src/adapter/backtester/error.ts +7 -0
  214. package/src/adapter/error.ts +4 -0
  215. package/src/adapter/paper/engine/paper-engine.spec.ts +38 -21
  216. package/src/adapter/paper/engine/paper-engine.ts +44 -35
  217. package/src/adapter/paper/paper-adapter.ts +13 -4
  218. package/src/cli/build.ts +1 -1
  219. package/src/cli/dev.ts +15 -7
  220. package/src/cli/error.ts +5 -0
  221. package/src/cli/internal/workspace.ts +0 -11
  222. package/src/cli/pull.ts +22 -31
  223. package/src/cli/run.ts +14 -11
  224. package/src/cli/test.ts +24 -37
  225. package/src/domain/asset.ts +1 -1
  226. package/src/domain/{balance.operator.spec.ts → balance-operator.spec.ts} +4 -3
  227. package/src/domain/{balance.operator.ts → balance-operator.ts} +0 -0
  228. package/src/domain/balance.spec.ts +15 -12
  229. package/src/domain/balance.ts +7 -6
  230. package/src/domain/{candle.operator.spec.ts → candle-operator.spec.ts} +1 -1
  231. package/src/domain/{candle.operator.ts → candle-operator.ts} +21 -5
  232. package/src/domain/commission.ts +3 -1
  233. package/src/domain/error.ts +3 -3
  234. package/src/domain/index.ts +8 -7
  235. package/src/domain/{instrument.operator.spec.ts → instrument-operator.spec.ts} +9 -2
  236. package/src/domain/{instrument.operator.ts → instrument-operator.ts} +0 -0
  237. package/src/domain/instrument.spec.ts +8 -1
  238. package/src/domain/instrument.ts +11 -8
  239. package/src/domain/{order.operator.spec.ts → order-operator.spec.ts} +9 -6
  240. package/src/domain/{order.operator.ts → order-operator.ts} +2 -2
  241. package/src/domain/order.spec.ts +8 -9
  242. package/src/domain/order.ts +22 -52
  243. package/src/domain/{orderbook.operator.spec.ts → orderbook-operator.spec.ts} +15 -3
  244. package/src/domain/{orderbook.operator.ts → orderbook-operator.ts} +0 -0
  245. package/src/domain/orderbook.spec.ts +11 -2
  246. package/src/domain/orderbook.ts +10 -9
  247. package/src/domain/{position.operator.spec.ts → position-operator.spec.ts} +11 -6
  248. package/src/domain/{position.operator.ts → position-operator.ts} +13 -6
  249. package/src/domain/position.spec.ts +7 -4
  250. package/src/domain/position.ts +3 -3
  251. package/src/domain/session-builder.ts +158 -0
  252. package/src/domain/session.spec.ts +2 -9
  253. package/src/domain/session.ts +84 -69
  254. package/src/domain/{trade.operator.spec.ts → trade-operator.spec.ts} +7 -3
  255. package/src/domain/{trade.operator.ts → trade-operator.ts} +0 -0
  256. package/src/domain/trade.spec.ts +6 -2
  257. package/src/domain/trade.ts +9 -7
  258. package/src/index.ts +1 -2
  259. package/src/shared/collections.spec.ts +10 -6
  260. package/src/shared/collections.ts +29 -16
  261. package/src/shared/environment.ts +13 -0
  262. package/src/shared/index.ts +1 -1
  263. package/src/shared/logger.ts +35 -7
  264. package/src/shared/pipe.ts +1 -1
  265. package/src/storage/cache.ts +3 -1
  266. package/src/storage/feed.ts +2 -0
  267. package/src/storage/storage.ts +10 -8
  268. package/src/store/error.ts +36 -0
  269. package/src/store/index.ts +7 -7
  270. package/src/store/{store-balance.event.spec.ts → store-balance-event.spec.ts} +3 -3
  271. package/src/store/{store-balance.event.ts → store-balance-event.ts} +54 -11
  272. package/src/store/{store.event.ts → store-event.ts} +0 -0
  273. package/src/store/{store-instrument.event.spec.ts → store-instrument-event.spec.ts} +6 -5
  274. package/src/store/{store-instrument.event.ts → store-instrument-event.ts} +17 -6
  275. package/src/store/store-order-event.spec.ts +32 -0
  276. package/src/store/{store-order.event.ts → store-order-event.ts} +25 -20
  277. package/src/store/{store-orderbook.event.spec.ts → store-orderbook-event.spec.ts} +11 -9
  278. package/src/store/{store-orderbook.event.ts → store-orderbook-event.ts} +7 -5
  279. package/src/store/{store-position.event.ts → store-position-event.ts} +14 -7
  280. package/src/store/store-state.ts +3 -3
  281. package/src/store/{store-trade.event.spec.ts → store-trade-event.spec.ts} +7 -5
  282. package/src/store/{store-trade.event.ts → store-trade-event.ts} +10 -4
  283. package/src/store/store.spec.ts +13 -11
  284. package/src/store/store.ts +1 -1
  285. package/src/strategy.ts +47 -0
  286. package/tsconfig.json +12 -5
  287. package/dist/adapter/adapter-aggregate.js.map +0 -1
  288. package/dist/adapter/adapter.js.map +0 -1
  289. package/dist/adapter/backtester/backtester-adapter.js.map +0 -1
  290. package/dist/adapter/backtester/backtester-adapter.spec.d.ts +0 -1
  291. package/dist/adapter/backtester/backtester-adapter.spec.js +0 -83
  292. package/dist/adapter/backtester/backtester-adapter.spec.js.map +0 -1
  293. package/dist/adapter/backtester/backtester-cursor.js.map +0 -1
  294. package/dist/adapter/backtester/backtester-cursor.spec.d.ts +0 -1
  295. package/dist/adapter/backtester/backtester-cursor.spec.js +0 -39
  296. package/dist/adapter/backtester/backtester-cursor.spec.js.map +0 -1
  297. package/dist/adapter/backtester/backtester-streamer.js.map +0 -1
  298. package/dist/adapter/backtester/backtester-streamer.spec.d.ts +0 -1
  299. package/dist/adapter/backtester/backtester-streamer.spec.js +0 -45
  300. package/dist/adapter/backtester/backtester-streamer.spec.js.map +0 -1
  301. package/dist/adapter/backtester/index.js.map +0 -1
  302. package/dist/adapter/error.js.map +0 -1
  303. package/dist/adapter/index.js.map +0 -1
  304. package/dist/adapter/paper/engine/paper-engine.js.map +0 -1
  305. package/dist/adapter/paper/engine/paper-engine.spec.d.ts +0 -1
  306. package/dist/adapter/paper/engine/paper-engine.spec.js +0 -54
  307. package/dist/adapter/paper/engine/paper-engine.spec.js.map +0 -1
  308. package/dist/adapter/paper/index.js.map +0 -1
  309. package/dist/adapter/paper/paper-adapter.js.map +0 -1
  310. package/dist/adapter/paper/paper-adapter.spec.d.ts +0 -1
  311. package/dist/adapter/paper/paper-adapter.spec.js +0 -70
  312. package/dist/adapter/paper/paper-adapter.spec.js.map +0 -1
  313. package/dist/bootstrap.d.ts +0 -11
  314. package/dist/bootstrap.js +0 -73
  315. package/dist/bootstrap.js.map +0 -1
  316. package/dist/cli/build.js.map +0 -1
  317. package/dist/cli/dev.js.map +0 -1
  318. package/dist/cli/index.js.map +0 -1
  319. package/dist/cli/internal/workspace.js.map +0 -1
  320. package/dist/cli/pull.js.map +0 -1
  321. package/dist/cli/run.js.map +0 -1
  322. package/dist/cli/test.js.map +0 -1
  323. package/dist/domain/asset.js.map +0 -1
  324. package/dist/domain/asset.spec.d.ts +0 -1
  325. package/dist/domain/asset.spec.js +0 -55
  326. package/dist/domain/asset.spec.js.map +0 -1
  327. package/dist/domain/balance.js.map +0 -1
  328. package/dist/domain/balance.operator.js.map +0 -1
  329. package/dist/domain/balance.operator.spec.d.ts +0 -1
  330. package/dist/domain/balance.operator.spec.js +0 -23
  331. package/dist/domain/balance.operator.spec.js.map +0 -1
  332. package/dist/domain/balance.spec.d.ts +0 -1
  333. package/dist/domain/balance.spec.js +0 -83
  334. package/dist/domain/balance.spec.js.map +0 -1
  335. package/dist/domain/candle.js.map +0 -1
  336. package/dist/domain/candle.operator.js.map +0 -1
  337. package/dist/domain/candle.operator.spec.d.ts +0 -1
  338. package/dist/domain/candle.operator.spec.js +0 -112
  339. package/dist/domain/candle.operator.spec.js.map +0 -1
  340. package/dist/domain/candle.spec.d.ts +0 -1
  341. package/dist/domain/candle.spec.js +0 -26
  342. package/dist/domain/candle.spec.js.map +0 -1
  343. package/dist/domain/commission.js.map +0 -1
  344. package/dist/domain/commission.spec.d.ts +0 -1
  345. package/dist/domain/commission.spec.js +0 -31
  346. package/dist/domain/commission.spec.js.map +0 -1
  347. package/dist/domain/component.js.map +0 -1
  348. package/dist/domain/error.js.map +0 -1
  349. package/dist/domain/index.js.map +0 -1
  350. package/dist/domain/instrument.js.map +0 -1
  351. package/dist/domain/instrument.operator.js.map +0 -1
  352. package/dist/domain/instrument.operator.spec.d.ts +0 -1
  353. package/dist/domain/instrument.operator.spec.js +0 -24
  354. package/dist/domain/instrument.operator.spec.js.map +0 -1
  355. package/dist/domain/instrument.spec.d.ts +0 -1
  356. package/dist/domain/instrument.spec.js +0 -49
  357. package/dist/domain/instrument.spec.js.map +0 -1
  358. package/dist/domain/order.js.map +0 -1
  359. package/dist/domain/order.operator.js +0 -14
  360. package/dist/domain/order.operator.js.map +0 -1
  361. package/dist/domain/order.operator.spec.d.ts +0 -1
  362. package/dist/domain/order.operator.spec.js +0 -65
  363. package/dist/domain/order.operator.spec.js.map +0 -1
  364. package/dist/domain/order.spec.d.ts +0 -1
  365. package/dist/domain/order.spec.js +0 -34
  366. package/dist/domain/order.spec.js.map +0 -1
  367. package/dist/domain/orderbook.js.map +0 -1
  368. package/dist/domain/orderbook.operator.js.map +0 -1
  369. package/dist/domain/orderbook.operator.spec.d.ts +0 -1
  370. package/dist/domain/orderbook.operator.spec.js +0 -22
  371. package/dist/domain/orderbook.operator.spec.js.map +0 -1
  372. package/dist/domain/orderbook.spec.d.ts +0 -1
  373. package/dist/domain/orderbook.spec.js +0 -13
  374. package/dist/domain/orderbook.spec.js.map +0 -1
  375. package/dist/domain/position.js.map +0 -1
  376. package/dist/domain/position.operator.js.map +0 -1
  377. package/dist/domain/position.operator.spec.d.ts +0 -1
  378. package/dist/domain/position.operator.spec.js +0 -49
  379. package/dist/domain/position.operator.spec.js.map +0 -1
  380. package/dist/domain/position.spec.d.ts +0 -1
  381. package/dist/domain/position.spec.js +0 -31
  382. package/dist/domain/position.spec.js.map +0 -1
  383. package/dist/domain/session.js.map +0 -1
  384. package/dist/domain/session.spec.d.ts +0 -1
  385. package/dist/domain/session.spec.js +0 -23
  386. package/dist/domain/session.spec.js.map +0 -1
  387. package/dist/domain/timeframe.js.map +0 -1
  388. package/dist/domain/trade.js.map +0 -1
  389. package/dist/domain/trade.operator.js.map +0 -1
  390. package/dist/domain/trade.operator.spec.d.ts +0 -1
  391. package/dist/domain/trade.operator.spec.js +0 -24
  392. package/dist/domain/trade.operator.spec.js.map +0 -1
  393. package/dist/domain/trade.spec.d.ts +0 -1
  394. package/dist/domain/trade.spec.js +0 -13
  395. package/dist/domain/trade.spec.js.map +0 -1
  396. package/dist/index.js.map +0 -1
  397. package/dist/indicator/atr.d.ts +0 -4
  398. package/dist/indicator/atr.js +0 -16
  399. package/dist/indicator/atr.js.map +0 -1
  400. package/dist/indicator/cross.d.ts +0 -4
  401. package/dist/indicator/cross.js +0 -41
  402. package/dist/indicator/cross.js.map +0 -1
  403. package/dist/indicator/cross.spec.d.ts +0 -1
  404. package/dist/indicator/cross.spec.js +0 -102
  405. package/dist/indicator/cross.spec.js.map +0 -1
  406. package/dist/indicator/donchian.d.ts +0 -10
  407. package/dist/indicator/donchian.js +0 -16
  408. package/dist/indicator/donchian.js.map +0 -1
  409. package/dist/indicator/drawdown.d.ts +0 -3
  410. package/dist/indicator/drawdown.js +0 -28
  411. package/dist/indicator/drawdown.js.map +0 -1
  412. package/dist/indicator/ema.d.ts +0 -3
  413. package/dist/indicator/ema.js +0 -24
  414. package/dist/indicator/ema.js.map +0 -1
  415. package/dist/indicator/ema.spec.d.ts +0 -1
  416. package/dist/indicator/ema.spec.js +0 -24
  417. package/dist/indicator/ema.spec.js.map +0 -1
  418. package/dist/indicator/envelope.d.ts +0 -6
  419. package/dist/indicator/envelope.js +0 -18
  420. package/dist/indicator/envelope.js.map +0 -1
  421. package/dist/indicator/index.d.ts +0 -17
  422. package/dist/indicator/index.js +0 -34
  423. package/dist/indicator/index.js.map +0 -1
  424. package/dist/indicator/macd.d.ts +0 -3
  425. package/dist/indicator/macd.js +0 -13
  426. package/dist/indicator/macd.js.map +0 -1
  427. package/dist/indicator/min-max.d.ts +0 -6
  428. package/dist/indicator/min-max.js +0 -22
  429. package/dist/indicator/min-max.js.map +0 -1
  430. package/dist/indicator/ring-buffer.d.ts +0 -16
  431. package/dist/indicator/ring-buffer.js +0 -56
  432. package/dist/indicator/ring-buffer.js.map +0 -1
  433. package/dist/indicator/rma.d.ts +0 -3
  434. package/dist/indicator/rma.js +0 -24
  435. package/dist/indicator/rma.js.map +0 -1
  436. package/dist/indicator/sma.d.ts +0 -3
  437. package/dist/indicator/sma.js +0 -17
  438. package/dist/indicator/sma.js.map +0 -1
  439. package/dist/indicator/sma.spec.d.ts +0 -1
  440. package/dist/indicator/sma.spec.js +0 -20
  441. package/dist/indicator/sma.spec.js.map +0 -1
  442. package/dist/indicator/swma.d.ts +0 -3
  443. package/dist/indicator/swma.js +0 -24
  444. package/dist/indicator/swma.js.map +0 -1
  445. package/dist/indicator/tma.d.ts +0 -3
  446. package/dist/indicator/tma.js +0 -16
  447. package/dist/indicator/tma.js.map +0 -1
  448. package/dist/indicator/tma.spec.d.ts +0 -1
  449. package/dist/indicator/tma.spec.js +0 -20
  450. package/dist/indicator/tma.spec.js.map +0 -1
  451. package/dist/indicator/trailing.d.ts +0 -14
  452. package/dist/indicator/trailing.js +0 -68
  453. package/dist/indicator/trailing.js.map +0 -1
  454. package/dist/indicator/trailing.spec.d.ts +0 -1
  455. package/dist/indicator/trailing.spec.js +0 -70
  456. package/dist/indicator/trailing.spec.js.map +0 -1
  457. package/dist/indicator/true-range.d.ts +0 -4
  458. package/dist/indicator/true-range.js +0 -20
  459. package/dist/indicator/true-range.js.map +0 -1
  460. package/dist/indicator/true-range.spec.d.ts +0 -1
  461. package/dist/indicator/true-range.spec.js +0 -28
  462. package/dist/indicator/true-range.spec.js.map +0 -1
  463. package/dist/indicator/window.d.ts +0 -3
  464. package/dist/indicator/window.js +0 -22
  465. package/dist/indicator/window.js.map +0 -1
  466. package/dist/indicator/wma.d.ts +0 -3
  467. package/dist/indicator/wma.js +0 -23
  468. package/dist/indicator/wma.js.map +0 -1
  469. package/dist/indicator/wma.spec.d.ts +0 -1
  470. package/dist/indicator/wma.spec.js +0 -20
  471. package/dist/indicator/wma.spec.js.map +0 -1
  472. package/dist/shared/collections.js.map +0 -1
  473. package/dist/shared/collections.spec.d.ts +0 -1
  474. package/dist/shared/collections.spec.js +0 -28
  475. package/dist/shared/collections.spec.js.map +0 -1
  476. package/dist/shared/datetime.js.map +0 -1
  477. package/dist/shared/decimals.js.map +0 -1
  478. package/dist/shared/decimals.spec.d.ts +0 -1
  479. package/dist/shared/decimals.spec.js +0 -29
  480. package/dist/shared/decimals.spec.js.map +0 -1
  481. package/dist/shared/index.js.map +0 -1
  482. package/dist/shared/io.d.ts +0 -1
  483. package/dist/shared/io.js +0 -8
  484. package/dist/shared/io.js.map +0 -1
  485. package/dist/shared/logger.js.map +0 -1
  486. package/dist/shared/pipe.js.map +0 -1
  487. package/dist/shared/policy.js.map +0 -1
  488. package/dist/storage/cache.js.map +0 -1
  489. package/dist/storage/cache.spec.d.ts +0 -1
  490. package/dist/storage/cache.spec.js +0 -18
  491. package/dist/storage/cache.spec.js.map +0 -1
  492. package/dist/storage/feed.js.map +0 -1
  493. package/dist/storage/index.js.map +0 -1
  494. package/dist/storage/measurement.js.map +0 -1
  495. package/dist/storage/storage.js.map +0 -1
  496. package/dist/store/index.js.map +0 -1
  497. package/dist/store/store-balance.event.js.map +0 -1
  498. package/dist/store/store-balance.event.spec.d.ts +0 -1
  499. package/dist/store/store-balance.event.spec.js +0 -26
  500. package/dist/store/store-balance.event.spec.js.map +0 -1
  501. package/dist/store/store-instrument.event.js.map +0 -1
  502. package/dist/store/store-instrument.event.spec.d.ts +0 -1
  503. package/dist/store/store-instrument.event.spec.js +0 -22
  504. package/dist/store/store-instrument.event.spec.js.map +0 -1
  505. package/dist/store/store-order.event.js.map +0 -1
  506. package/dist/store/store-order.event.spec.d.ts +0 -1
  507. package/dist/store/store-order.event.spec.js +0 -21
  508. package/dist/store/store-order.event.spec.js.map +0 -1
  509. package/dist/store/store-orderbook.event.js.map +0 -1
  510. package/dist/store/store-orderbook.event.spec.d.ts +0 -1
  511. package/dist/store/store-orderbook.event.spec.js +0 -28
  512. package/dist/store/store-orderbook.event.spec.js.map +0 -1
  513. package/dist/store/store-position.event.js.map +0 -1
  514. package/dist/store/store-state.js.map +0 -1
  515. package/dist/store/store-trade.event.js.map +0 -1
  516. package/dist/store/store-trade.event.spec.d.ts +0 -1
  517. package/dist/store/store-trade.event.spec.js +0 -44
  518. package/dist/store/store-trade.event.spec.js.map +0 -1
  519. package/dist/store/store.event.js.map +0 -1
  520. package/dist/store/store.js.map +0 -1
  521. package/dist/store/store.spec.d.ts +0 -1
  522. package/dist/store/store.spec.js +0 -119
  523. package/dist/store/store.spec.js.map +0 -1
  524. package/dist/tsconfig.tsbuildinfo +0 -1
  525. package/jestconfig.json +0 -13
  526. package/src/adapter/backtester/backtester-adapter.spec.ts +0 -133
  527. package/src/adapter/paper/paper-adapter.spec.ts +0 -114
  528. package/src/bootstrap.ts +0 -139
  529. package/src/indicator/atr.ts +0 -21
  530. package/src/indicator/cross.spec.ts +0 -136
  531. package/src/indicator/cross.ts +0 -59
  532. package/src/indicator/donchian.ts +0 -38
  533. package/src/indicator/drawdown.ts +0 -29
  534. package/src/indicator/ema.spec.ts +0 -39
  535. package/src/indicator/ema.ts +0 -27
  536. package/src/indicator/envelope.ts +0 -25
  537. package/src/indicator/index.ts +0 -17
  538. package/src/indicator/macd.ts +0 -22
  539. package/src/indicator/min-max.ts +0 -28
  540. package/src/indicator/ring-buffer.ts +0 -63
  541. package/src/indicator/rma.ts +0 -26
  542. package/src/indicator/sma.spec.ts +0 -21
  543. package/src/indicator/sma.ts +0 -25
  544. package/src/indicator/swma.ts +0 -28
  545. package/src/indicator/tma.spec.ts +0 -21
  546. package/src/indicator/tma.ts +0 -20
  547. package/src/indicator/trailing.spec.ts +0 -88
  548. package/src/indicator/trailing.ts +0 -81
  549. package/src/indicator/true-range.spec.ts +0 -32
  550. package/src/indicator/true-range.ts +0 -32
  551. package/src/indicator/window.ts +0 -28
  552. package/src/indicator/wma.spec.ts +0 -20
  553. package/src/indicator/wma.ts +0 -29
  554. package/src/shared/io.ts +0 -3
  555. package/src/store/store-order.event.spec.ts +0 -28
@@ -1,6 +1,12 @@
1
1
  import { AssetSelector, Balance, InstrumentSelector } from '../domain';
2
2
  import { decimal, timestamp } from '../shared';
3
- import { StoreEvent } from './store.event';
3
+ import {
4
+ assetNotSupportedError,
5
+ balanceNotFoundError,
6
+ instrumentNotSubscribedError,
7
+ orderNotFoundError
8
+ } from './error';
9
+ import { StoreEvent } from './store-event';
4
10
  import { State, StateChangeTracker } from './store-state';
5
11
 
6
12
  /**
@@ -15,13 +21,16 @@ export class BalancePatchEvent implements StoreEvent {
15
21
  ) {}
16
22
 
17
23
  handle(state: State, changes: StateChangeTracker) {
18
- // you can have not tradeable assets in wallet, skip them.
24
+ /*
25
+ * skip not tradeable assets (for example, you can have an unlisted
26
+ * asset in your wallet).
27
+ */
19
28
  const asset = state.universe.asset.get(this.asset.id);
20
29
  if (!asset) {
21
30
  return;
22
31
  }
23
32
 
24
- const balance = state.balance.tryGetOrSet(this.asset.id, () => new Balance(asset));
33
+ const balance = state.balance.tryGetOrSet(this.asset.id, () => new Balance(0, asset));
25
34
 
26
35
  balance.timestamp = this.timestamp;
27
36
  balance.set(this.free, this.freezed);
@@ -31,6 +40,7 @@ export class BalancePatchEvent implements StoreEvent {
31
40
  changes.commit(balance);
32
41
  }
33
42
  }
43
+
34
44
  /**
35
45
  *
36
46
  */
@@ -42,11 +52,12 @@ export class BalanceTransactEvent implements StoreEvent {
42
52
  ) {}
43
53
 
44
54
  handle(state: State, changes: StateChangeTracker) {
45
- const balance = state.balance.tryGetOrSet(this.asset.id, () => {
46
- const asset = state.universe.asset.get(this.asset.id);
55
+ const asset = state.universe.asset.get(this.asset.id);
56
+ if (!asset) {
57
+ throw assetNotSupportedError(this.asset);
58
+ }
47
59
 
48
- return new Balance(asset);
49
- });
60
+ const balance = state.balance.tryGetOrSet(this.asset.id, () => new Balance(0, asset));
50
61
 
51
62
  balance.timestamp = this.timestamp;
52
63
  balance.account(this.amount);
@@ -68,22 +79,38 @@ export class BalanceLockOrderEvent implements StoreEvent {
68
79
  ) {}
69
80
 
70
81
  handle(state: State, changes: StateChangeTracker) {
71
- const order = state.order.get(this.instrument.id).get(this.orderId);
82
+ const orders = state.order.get(this.instrument.id);
83
+ if (!orders) {
84
+ throw instrumentNotSubscribedError(this.instrument);
85
+ }
86
+
87
+ const order = orders.get(this.orderId);
88
+ if (!order) {
89
+ throw orderNotFoundError(this.orderId);
90
+ }
91
+
72
92
  const base = state.balance.get(order.instrument.base.id);
93
+ if (!base) {
94
+ throw balanceNotFoundError(order.instrument.base);
95
+ }
96
+
73
97
  const quote = state.balance.get(order.instrument.quote.id);
98
+ if (!quote) {
99
+ throw balanceNotFoundError(order.instrument.quote);
100
+ }
74
101
 
75
102
  const balanceToLock = order.calculateBalanceToLock(base, quote);
76
103
 
77
104
  state.timestamp = this.timestamp;
78
105
 
79
- if (balanceToLock.base.greaterThan(0)) {
106
+ if (balanceToLock.base?.greaterThan(0)) {
80
107
  base.timestamp = this.timestamp;
81
108
  base.lock(this.orderId, balanceToLock.base);
82
109
 
83
110
  changes.commit(base);
84
111
  }
85
112
 
86
- if (balanceToLock.quote.greaterThan(0)) {
113
+ if (balanceToLock.quote?.greaterThan(0)) {
87
114
  quote.timestamp = this.timestamp;
88
115
  quote.lock(this.orderId, balanceToLock.quote);
89
116
 
@@ -103,9 +130,25 @@ export class BalanceUnlockOrderEvent implements StoreEvent {
103
130
  ) {}
104
131
 
105
132
  handle(state: State, changes: StateChangeTracker) {
106
- const order = state.order.get(this.instrument.id).get(this.orderId);
133
+ const orders = state.order.get(this.instrument.id);
134
+ if (!orders) {
135
+ throw instrumentNotSubscribedError(this.instrument);
136
+ }
137
+
138
+ const order = orders.get(this.orderId);
139
+ if (!order) {
140
+ throw orderNotFoundError(this.orderId);
141
+ }
142
+
107
143
  const base = state.balance.get(order.instrument.base.id);
144
+ if (!base) {
145
+ throw balanceNotFoundError(order.instrument.base);
146
+ }
147
+
108
148
  const quote = state.balance.get(order.instrument.quote.id);
149
+ if (!quote) {
150
+ throw balanceNotFoundError(order.instrument.quote);
151
+ }
109
152
 
110
153
  state.timestamp = this.timestamp;
111
154
 
File without changes
@@ -1,7 +1,7 @@
1
- import { Store } from '..';
2
1
  import { Asset, Commission } from '../domain';
3
2
  import { d, now } from '../shared';
4
- import { InstrumentPatchEvent } from './store-instrument.event';
3
+ import { Store } from './store';
4
+ import { InstrumentPatchEvent } from './store-instrument-event';
5
5
 
6
6
  describe('InstrumentPatchEvent', () => {
7
7
  test('should patch a store', () => {
@@ -15,10 +15,11 @@ describe('InstrumentPatchEvent', () => {
15
15
  );
16
16
 
17
17
  const { universe } = store.snapshot;
18
+ const instrument = universe.instrument.get('cex:de30-usd') ?? fail();
18
19
 
19
- expect(universe.instrument.get('cex:de30-usd').base).toEqual(base);
20
- expect(universe.instrument.get('cex:de30-usd').quote).toEqual(quote);
21
- expect(universe.instrument.get('cex:de30-usd').timestamp).toEqual(timestamp);
20
+ expect(instrument.base).toEqual(base);
21
+ expect(instrument.quote).toEqual(quote);
22
+ expect(instrument.timestamp).toEqual(timestamp);
22
23
  expect(universe.instrument.asReadonlyArray().length).toEqual(1);
23
24
  expect(universe.asset.asReadonlyArray().length).toEqual(2);
24
25
  });
@@ -1,7 +1,8 @@
1
1
  import { Asset, Commission, Instrument, InstrumentSelector } from '../domain';
2
2
  import { timestamp } from '../shared';
3
- import { State, StateChangeTracker } from '../store';
4
- import { StoreEvent } from './store.event';
3
+ import { State, StateChangeTracker } from '.';
4
+ import { assetNotSupportedError, instrumentNotSupportedError } from './error';
5
+ import { StoreEvent } from './store-event';
5
6
  import { InnerSet } from './store-state';
6
7
 
7
8
  export class InstrumentPatchEvent implements StoreEvent {
@@ -34,7 +35,7 @@ export class InstrumentPatchEvent implements StoreEvent {
34
35
 
35
36
  state.order.tryGetOrSet(selector.id, () => new InnerSet(selector.id));
36
37
 
37
- return new Instrument(this.base, this.quote, this.raw);
38
+ return new Instrument(0, this.base, this.quote, this.raw, Commission.Zero);
38
39
  });
39
40
 
40
41
  instrument.timestamp = this.timestamp;
@@ -58,13 +59,23 @@ export class InstrumentSubscriptionEvent implements StoreEvent {
58
59
  handle(state: State, changes: StateChangeTracker): void {
59
60
  const instrument = state.universe.instrument.get(this.instrument.id);
60
61
  if (!instrument) {
61
- throw new Error('invalid instrument');
62
+ throw instrumentNotSupportedError(this.instrument);
62
63
  }
63
64
 
64
65
  if (this.subscribed) {
66
+ const base = state.universe.asset.get(instrument.base.id);
67
+ if (!base) {
68
+ throw assetNotSupportedError(instrument.base);
69
+ }
70
+
71
+ const quote = state.universe.asset.get(instrument.quote.id);
72
+ if (!quote) {
73
+ throw assetNotSupportedError(instrument.quote);
74
+ }
75
+
65
76
  state.subscription.instrument.upsert(instrument);
66
- state.subscription.asset.upsert(state.universe.asset.get(instrument.base.id));
67
- state.subscription.asset.upsert(state.universe.asset.get(instrument.quote.id));
77
+ state.subscription.asset.upsert(base);
78
+ state.subscription.asset.upsert(quote);
68
79
  }
69
80
 
70
81
  changes.commit(instrument);
@@ -0,0 +1,32 @@
1
+ import { Asset, Commission, Instrument, Order } from '../domain';
2
+ import { d, now } from '../shared';
3
+ import { Store } from '.';
4
+ import { OrderLoadEvent } from './store-order-event';
5
+
6
+ describe('OrderLoadEvent', () => {
7
+ const instrument = new Instrument(
8
+ 0,
9
+ new Asset('btc', 'binance', 8),
10
+ new Asset('usdt', 'binance', 2),
11
+ 'binance:btc-usdt',
12
+ Commission.Zero
13
+ );
14
+
15
+ test('should load order to store', () => {
16
+ const timestamp = now();
17
+ const store = new Store();
18
+ const order = new Order(0, '1', instrument, d(1.0), 0);
19
+
20
+ order.state = 'PENDING';
21
+
22
+ store.snapshot.universe.instrument.upsert(instrument);
23
+ store.snapshot.subscription.instrument.upsert(instrument);
24
+
25
+ store.dispatch(new OrderLoadEvent(order, timestamp));
26
+
27
+ const pendingOrder = store.snapshot.order.get(instrument.id)?.get('1') ?? fail();
28
+
29
+ expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
30
+ expect(pendingOrder).toEqual(order);
31
+ });
32
+ });
@@ -1,12 +1,17 @@
1
1
  import { InstrumentSelector, Order } from '../domain';
2
2
  import { decimal, timestamp } from '../shared';
3
- import { StoreEvent } from './store.event';
3
+ import { orderInvalidStateError, orderNotFoundError } from './error';
4
+ import { StoreEvent } from './store-event';
4
5
  import { InnerSet, State, StateChangeTracker } from './store-state';
5
6
 
7
+ /**
8
+ * Patches a store with an existing pending order.
9
+ * No store changing events are propagated.
10
+ */
6
11
  export class OrderLoadEvent implements StoreEvent {
7
12
  constructor(readonly order: Order, readonly timestamp: timestamp) {}
8
13
 
9
- handle(state: State, changes: StateChangeTracker): void {
14
+ handle(state: State): void {
10
15
  this.order.timestamp = this.timestamp;
11
16
 
12
17
  const orderByInstrument = state.order.tryGetOrSet(
@@ -23,7 +28,7 @@ export class OrderNewEvent implements StoreEvent {
23
28
 
24
29
  handle(state: State, changes: StateChangeTracker): void {
25
30
  if (this.order.state != 'NEW') {
26
- throw new Error(`Order is not new`);
31
+ throw orderInvalidStateError(this.order.state, ['NEW']);
27
32
  }
28
33
 
29
34
  this.order.createdAt = this.timestamp;
@@ -50,14 +55,14 @@ export class OrderPendingEvent implements StoreEvent {
50
55
  handle(state: State, changes: StateChangeTracker): void {
51
56
  const order = state.order
52
57
  .tryGetOrSet(this.instrument.id, () => {
53
- throw new Error(`Trying to patch unknown order: ${this.id}`);
58
+ throw orderNotFoundError(this.id);
54
59
  })
55
60
  .tryGetOrSet(this.id, () => {
56
- throw new Error(`Trying to patch unknown order: ${this.id}`);
61
+ throw orderNotFoundError(this.id);
57
62
  });
58
63
 
59
64
  if (order.state != 'NEW') {
60
- throw new Error(`Order is not NEW: ${order.state}`);
65
+ throw orderInvalidStateError(order.state, ['NEW']);
61
66
  }
62
67
 
63
68
  order.state = 'PENDING';
@@ -78,14 +83,14 @@ export class OrderFilledEvent implements StoreEvent {
78
83
  handle(state: State, changes: StateChangeTracker): void {
79
84
  const order = state.order
80
85
  .tryGetOrSet(this.instrument.id, () => {
81
- throw new Error(`Trying to patch unknown order: ${this.id}`);
86
+ throw orderNotFoundError(this.id);
82
87
  })
83
88
  .tryGetOrSet(this.id, () => {
84
- throw new Error(`Trying to patch unknown order: ${this.id}`);
89
+ throw orderNotFoundError(this.id);
85
90
  });
86
91
 
87
92
  if (order.state != 'PENDING' && order.state != 'CANCELING') {
88
- throw new Error(`Order is not PENDING or CANCELING: ${order.state}`);
93
+ throw orderInvalidStateError(order.state, ['PENDING', 'CANCELING']);
89
94
  }
90
95
 
91
96
  order.state = 'FILLED';
@@ -107,10 +112,10 @@ export class OrderCancelingEvent implements StoreEvent {
107
112
  handle(state: State, changes: StateChangeTracker): void {
108
113
  const order = state.order
109
114
  .tryGetOrSet(this.instrument.id, () => {
110
- throw new Error(`Trying to patch unknown order: ${this.id}`);
115
+ throw orderNotFoundError(this.id);
111
116
  })
112
117
  .tryGetOrSet(this.id, () => {
113
- throw new Error(`Trying to patch unknown order: ${this.id}`);
118
+ throw orderNotFoundError(this.id);
114
119
  });
115
120
 
116
121
  if (order.state == 'CANCELING' || order.state == 'CANCELED') {
@@ -118,7 +123,7 @@ export class OrderCancelingEvent implements StoreEvent {
118
123
  }
119
124
 
120
125
  if (order.state != 'PENDING') {
121
- throw new Error(`Order is not PENDING: ${order.state}`);
126
+ throw orderInvalidStateError(order.state, ['PENDING']);
122
127
  }
123
128
 
124
129
  order.state = 'CANCELING';
@@ -138,10 +143,10 @@ export class OrderCanceledEvent implements StoreEvent {
138
143
  handle(state: State, changes: StateChangeTracker): void {
139
144
  const order = state.order
140
145
  .tryGetOrSet(this.instrument.id, () => {
141
- throw new Error(`Trying to patch unknown order: ${this.id}`);
146
+ throw orderNotFoundError(this.id);
142
147
  })
143
148
  .tryGetOrSet(this.id, () => {
144
- throw new Error(`Trying to patch unknown order: ${this.id}`);
149
+ throw orderNotFoundError(this.id);
145
150
  });
146
151
 
147
152
  if (order.state == 'CANCELED') {
@@ -149,7 +154,7 @@ export class OrderCanceledEvent implements StoreEvent {
149
154
  }
150
155
 
151
156
  if (order.state != 'CANCELING') {
152
- throw new Error(`Order is not CANCELING: ${order.state}`);
157
+ throw orderInvalidStateError(order.state, ['CANCELING']);
153
158
  }
154
159
 
155
160
  order.state = 'CANCELED';
@@ -169,10 +174,10 @@ export class OrderCancelFailedEvent implements StoreEvent {
169
174
  handle(state: State, changes: StateChangeTracker): void {
170
175
  const order = state.order
171
176
  .tryGetOrSet(this.instrument.id, () => {
172
- throw new Error(`Trying to patch unknown order: ${this.id}`);
177
+ throw orderNotFoundError(this.id);
173
178
  })
174
179
  .tryGetOrSet(this.id, () => {
175
- throw new Error(`Trying to patch unknown order: ${this.id}`);
180
+ throw orderNotFoundError(this.id);
176
181
  });
177
182
 
178
183
  if (order.state != 'CANCELING') {
@@ -196,14 +201,14 @@ export class OrderRejectedEvent implements StoreEvent {
196
201
  handle(state: State, changes: StateChangeTracker): void {
197
202
  const order = state.order
198
203
  .tryGetOrSet(this.instrument.id, () => {
199
- throw new Error(`Trying to patch unknown order: ${this.id}`);
204
+ throw orderNotFoundError(this.id);
200
205
  })
201
206
  .tryGetOrSet(this.id, () => {
202
- throw new Error(`Trying to patch unknown order: ${this.id}`);
207
+ throw orderNotFoundError(this.id);
203
208
  });
204
209
 
205
210
  if (order.state != 'NEW') {
206
- throw new Error(`Order is not NEW: ${order.state}`);
211
+ throw orderInvalidStateError(order.state, ['NEW']);
207
212
  }
208
213
 
209
214
  order.state = 'REJECTED';
@@ -1,15 +1,17 @@
1
- import { Store } from '..';
2
- import { Asset, Instrument, Liquidity } from '../domain';
1
+ import { Asset, Commission, Instrument, Liquidity } from '../domain';
3
2
  import { d, now } from '../shared';
4
3
  import { OrderbookPatchEvent } from '.';
5
-
6
- const instrument = new Instrument(
7
- new Asset('btc', 'binance', 8),
8
- new Asset('usdt', 'binance', 2),
9
- 'binance:btc-usdt'
10
- );
4
+ import { Store } from './store';
11
5
 
12
6
  describe('OrderbookPatchEvent', () => {
7
+ const instrument = new Instrument(
8
+ 0,
9
+ new Asset('btc', 'binance', 8),
10
+ new Asset('usdt', 'binance', 2),
11
+ 'binance:btc-usdt',
12
+ Commission.Zero
13
+ );
14
+
13
15
  let store: Store;
14
16
 
15
17
  beforeEach(() => {
@@ -26,7 +28,7 @@ describe('OrderbookPatchEvent', () => {
26
28
 
27
29
  store.dispatch(new OrderbookPatchEvent(instrument, ask, bid, timestamp));
28
30
 
29
- const orderbook = store.snapshot.orderbook.get(instrument.id);
31
+ const orderbook = store.snapshot.orderbook.get(instrument.id) ?? fail();
30
32
 
31
33
  expect(orderbook.timestamp).toEqual(timestamp);
32
34
  expect(orderbook.instrument.id).toEqual(orderbook.instrument.id);
@@ -1,6 +1,7 @@
1
1
  import { InstrumentSelector, Liquidity, Orderbook } from '../domain';
2
2
  import { timestamp } from '../shared';
3
- import { StoreEvent } from './store.event';
3
+ import { instrumentNotSupportedError, liquidationError } from './error';
4
+ import { StoreEvent } from './store-event';
4
5
  import { State, StateChangeTracker } from './store-state';
5
6
 
6
7
  export class OrderbookPatchEvent implements StoreEvent {
@@ -12,13 +13,14 @@ export class OrderbookPatchEvent implements StoreEvent {
12
13
  ) {}
13
14
 
14
15
  handle(state: State, changes: StateChangeTracker): void {
15
- if (!state.subscription.instrument.get(this.instrument.id)) {
16
- throw new Error(`Trying to patch unsubscribed instrument: ${this.instrument.id}`);
16
+ const instrument = state.universe.instrument.get(this.instrument.id);
17
+ if (!instrument) {
18
+ throw instrumentNotSupportedError(this.instrument);
17
19
  }
18
20
 
19
21
  const orderbook = state.orderbook.tryGetOrSet(
20
22
  this.instrument.id,
21
- () => new Orderbook(state.universe.instrument.get(this.instrument.id))
23
+ () => new Orderbook(0, instrument, this.ask, this.bid)
22
24
  );
23
25
 
24
26
  state.timestamp = this.timestamp;
@@ -45,7 +47,7 @@ export class OrderbookPatchEvent implements StoreEvent {
45
47
  }
46
48
 
47
49
  if (quote.total.lessThan(0)) {
48
- throw new Error('You have been liquidated.');
50
+ throw liquidationError();
49
51
  }
50
52
  }
51
53
 
@@ -1,25 +1,27 @@
1
1
  import { Instrument, Position, PositionMode } from '../domain';
2
2
  import { decimal, timestamp } from '../shared';
3
- import { StoreEvent } from './store.event';
3
+ import { balanceNotFoundError, instrumentNotSubscribedError } from './error';
4
+ import { StoreEvent } from './store-event';
4
5
  import { State, StateChangeTracker } from './store-state';
5
6
 
6
7
  export class PositionLoadEvent implements StoreEvent {
7
8
  constructor(readonly position: Position, readonly timestamp: timestamp) {}
8
9
 
9
- handle(state: State, changes: StateChangeTracker): void {
10
+ handle(state: State): void {
10
11
  if (!state.subscription.instrument.get(this.position.instrument.id)) {
11
- throw new Error(
12
- `Trying to patch unsubscribed instrument: ${this.position.instrument.id}`
13
- );
12
+ throw instrumentNotSubscribedError(this.position.instrument);
14
13
  }
15
14
 
16
15
  this.position.timestamp = this.timestamp;
17
16
 
18
17
  const balance = state.balance.get(this.position.instrument.quote.id);
19
- const orderbook = state.orderbook.get(this.position.instrument.id);
18
+ if (!balance) {
19
+ throw balanceNotFoundError(this.position.instrument.quote);
20
+ }
20
21
 
21
22
  balance.position[this.position.id] = this.position;
22
23
 
24
+ const orderbook = state.orderbook.get(this.position.instrument.id);
23
25
  if (orderbook) {
24
26
  const rate = this.position.size.greaterThanOrEqualTo(0)
25
27
  ? orderbook.bids.rate
@@ -46,10 +48,14 @@ export class PositionPatchEvent implements StoreEvent {
46
48
  // eslint-disable-next-line complexity
47
49
  handle(state: State, changes: StateChangeTracker): void {
48
50
  if (!state.subscription.instrument.get(this.instrument.id)) {
49
- throw new Error(`Trying to patch unsubscribed instrument: ${this.instrument.id}`);
51
+ throw instrumentNotSubscribedError(this.instrument);
50
52
  }
51
53
 
52
54
  const balance = state.balance.get(this.instrument.quote.id);
55
+ if (!balance) {
56
+ throw balanceNotFoundError(this.instrument.quote);
57
+ }
58
+
53
59
  const orderbook = state.orderbook.get(this.instrument.id);
54
60
 
55
61
  let position = balance.position[this.id];
@@ -83,6 +89,7 @@ export class PositionPatchEvent implements StoreEvent {
83
89
 
84
90
  if (!position) {
85
91
  position = new Position(
92
+ this.timestamp,
86
93
  this.id,
87
94
  this.instrument,
88
95
  this.mode,
@@ -12,8 +12,8 @@ import {
12
12
  import { Set, timestamp } from '../shared';
13
13
 
14
14
  export interface StateChangeTracker {
15
- commit(component: Component);
16
- commitPendingChanges();
15
+ commit(component: Component): void;
16
+ commitPendingChanges(): void;
17
17
  }
18
18
 
19
19
  export class InnerSet<T extends { id: string }> extends Set<T> {
@@ -23,7 +23,7 @@ export class InnerSet<T extends { id: string }> extends Set<T> {
23
23
  }
24
24
 
25
25
  export class State {
26
- timestamp: timestamp;
26
+ timestamp: timestamp = 0;
27
27
 
28
28
  universe: {
29
29
  asset: Set<Asset>;
@@ -1,12 +1,14 @@
1
- import { Store } from '..';
2
- import { Asset, Instrument } from '../domain';
1
+ import { Asset, Commission, Instrument } from '../domain';
3
2
  import { d, now } from '../shared';
4
3
  import { TradePatchEvent } from '.';
4
+ import { Store } from './store';
5
5
 
6
6
  const instrument = new Instrument(
7
+ 0,
7
8
  new Asset('btc', 'binance', 8),
8
9
  new Asset('usdt', 'binance', 2),
9
- 'binance:btc-usdt'
10
+ 'binance:btc-usdt',
11
+ Commission.Zero
10
12
  );
11
13
 
12
14
  describe('TradePatchEvent', () => {
@@ -19,7 +21,7 @@ describe('TradePatchEvent', () => {
19
21
 
20
22
  store.dispatch(new TradePatchEvent(instrument, d(1000), d(0.1), timestamp));
21
23
 
22
- const trade = store.snapshot.trade.get(instrument.id);
24
+ const trade = store.snapshot.trade.get(instrument.id) ?? fail();
23
25
 
24
26
  expect(trade.timestamp).toEqual(timestamp);
25
27
  expect(trade.instrument.id).toEqual(trade.instrument.id);
@@ -37,7 +39,7 @@ describe('TradePatchEvent', () => {
37
39
 
38
40
  store.dispatch(new TradePatchEvent(instrument, d(1000), d(0.1), timestamp));
39
41
 
40
- const trade = store.snapshot.trade.get(instrument.id);
42
+ const trade = store.snapshot.trade.get(instrument.id) ?? fail();
41
43
 
42
44
  store.dispatch(new TradePatchEvent(instrument, d(2000), d(0.2), timestamp));
43
45
 
@@ -1,6 +1,7 @@
1
1
  import { InstrumentSelector, Trade } from '../domain';
2
- import { decimal, timestamp } from '../shared';
3
- import { StoreEvent } from './store.event';
2
+ import { d, decimal, timestamp } from '../shared';
3
+ import { instrumentNotSubscribedError, instrumentNotSupportedError } from './error';
4
+ import { StoreEvent } from './store-event';
4
5
  import { State, StateChangeTracker } from './store-state';
5
6
 
6
7
  /**
@@ -17,12 +18,17 @@ export class TradePatchEvent implements StoreEvent {
17
18
 
18
19
  handle(state: State, changes: StateChangeTracker): void {
19
20
  if (!state.subscription.instrument.get(this.instrument.id)) {
20
- throw new Error(`Trying to patch unsubscribed instrument: ${this.instrument.id}`);
21
+ throw instrumentNotSubscribedError(this.instrument);
22
+ }
23
+
24
+ const instrument = state.universe.instrument.get(this.instrument.id);
25
+ if (!instrument) {
26
+ throw instrumentNotSupportedError(this.instrument);
21
27
  }
22
28
 
23
29
  const trade = state.trade.tryGetOrSet(
24
30
  this.instrument.id,
25
- () => new Trade(state.universe.instrument.get(this.instrument.id))
31
+ () => new Trade(0, instrument, d.Zero, d.Zero)
26
32
  );
27
33
 
28
34
  state.timestamp = this.timestamp;
@@ -1,9 +1,9 @@
1
1
  import { withLatestFrom } from 'rxjs';
2
2
 
3
- import { Asset, balance, Instrument, Order, order } from '../domain';
3
+ import { Asset, balance, Commission, Instrument, Order, order } from '../domain';
4
4
  import { d, now } from '../shared';
5
5
  import { Store } from './store';
6
- import { BalanceTransactEvent } from './store-balance.event';
6
+ import { BalanceTransactEvent } from './store-balance-event';
7
7
  import {
8
8
  OrderCanceledEvent,
9
9
  OrderCancelingEvent,
@@ -11,12 +11,14 @@ import {
11
11
  OrderLoadEvent,
12
12
  OrderNewEvent,
13
13
  OrderPendingEvent
14
- } from './store-order.event';
14
+ } from './store-order-event';
15
15
 
16
16
  const instrument = new Instrument(
17
+ 0,
17
18
  new Asset('abc', 'xyz', 4),
18
19
  new Asset('def', 'xyz', 4),
19
- 'abc-def'
20
+ 'abc-def',
21
+ Commission.Zero
20
22
  );
21
23
 
22
24
  describe('Store', () => {
@@ -35,7 +37,7 @@ describe('Store', () => {
35
37
  }
36
38
  });
37
39
 
38
- store.dispatch(new OrderLoadEvent(Order.market(instrument, d(10)), now()));
40
+ store.dispatch(new OrderLoadEvent(new Order(0, '1', instrument, d(10), 0), now()));
39
41
 
40
42
  expect(hasUpdatedOrder).toBe(false);
41
43
  });
@@ -49,7 +51,7 @@ describe('Store', () => {
49
51
  }
50
52
  });
51
53
 
52
- store.dispatch(new OrderNewEvent(Order.market(instrument, d(10)), now()));
54
+ store.dispatch(new OrderNewEvent(new Order(0, '1', instrument, d(10), 0), now()));
53
55
 
54
56
  expect(hasUpdatedOrder).toBe(true);
55
57
  });
@@ -63,7 +65,7 @@ describe('Store', () => {
63
65
  }
64
66
  });
65
67
 
66
- const buyOrder = Order.market(instrument, d(10));
68
+ const buyOrder = new Order(0, '1', instrument, d(10), 0);
67
69
 
68
70
  store.dispatch(new OrderNewEvent(buyOrder, now()));
69
71
  store.dispatch(new OrderPendingEvent(buyOrder.id, instrument, now()));
@@ -81,7 +83,7 @@ describe('Store', () => {
81
83
  }
82
84
  });
83
85
 
84
- const buyOrder = Order.market(instrument, d(10));
86
+ const buyOrder = new Order(0, '1', instrument, d(10), 0);
85
87
 
86
88
  store.dispatch(new OrderNewEvent(buyOrder, now()));
87
89
  store.dispatch(new OrderPendingEvent(buyOrder.id, instrument, now()));
@@ -101,7 +103,7 @@ describe('Store', () => {
101
103
  }
102
104
  });
103
105
 
104
- const buyOrder = Order.market(instrument, d(10));
106
+ const buyOrder = new Order(0, '1', instrument, d(10), 0);
105
107
 
106
108
  store.dispatch(new OrderNewEvent(buyOrder, now()));
107
109
  store.dispatch(new OrderPendingEvent(buyOrder.id, instrument, now()));
@@ -130,7 +132,7 @@ describe('Store', () => {
130
132
  }
131
133
  });
132
134
 
133
- const buyOrder = Order.market(instrument, d(10));
135
+ const buyOrder = new Order(0, '1', instrument, d(10), 0);
134
136
 
135
137
  store.dispatch(
136
138
  new OrderNewEvent(buyOrder, now()),
@@ -169,7 +171,7 @@ describe('Store', () => {
169
171
  }
170
172
  });
171
173
 
172
- const buyOrder = Order.market(instrument, d(10));
174
+ const buyOrder = new Order(0, '1', instrument, d(10), 0);
173
175
 
174
176
  store.dispatch(
175
177
  new OrderNewEvent(buyOrder, now()),