@quantform/core 0.5.13 → 0.5.23

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 (499) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +8 -5
  2. package/dist/adapter/adapter-aggregate.js +18 -20
  3. package/dist/adapter/adapter-aggregate.js.map +1 -1
  4. package/dist/adapter/adapter.d.ts +20 -32
  5. package/dist/adapter/adapter.js +8 -43
  6. package/dist/adapter/adapter.js.map +1 -1
  7. package/dist/adapter/backtester/backtester-adapter.d.ts +11 -9
  8. package/dist/adapter/backtester/backtester-adapter.js +17 -16
  9. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  10. package/dist/{tests → adapter/backtester}/backtester-adapter.spec.d.ts +0 -0
  11. package/dist/adapter/backtester/backtester-adapter.spec.js +83 -0
  12. package/dist/adapter/backtester/backtester-adapter.spec.js.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.d.ts +3 -4
  14. package/dist/adapter/backtester/backtester-cursor.js +2 -1
  15. package/dist/adapter/backtester/backtester-cursor.js.map +1 -1
  16. package/dist/adapter/backtester/backtester-cursor.spec.js +19 -18
  17. package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
  18. package/dist/adapter/backtester/backtester-streamer.d.ts +3 -1
  19. package/dist/adapter/backtester/backtester-streamer.js +25 -14
  20. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  21. package/dist/adapter/backtester/backtester-streamer.spec.js +17 -16
  22. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  23. package/dist/adapter/error.d.ts +2 -0
  24. package/dist/adapter/error.js +12 -0
  25. package/dist/adapter/error.js.map +1 -0
  26. package/dist/adapter/paper/engine/paper-engine.d.ts +11 -0
  27. package/dist/adapter/paper/engine/paper-engine.js +104 -0
  28. package/dist/adapter/paper/engine/paper-engine.js.map +1 -0
  29. package/dist/adapter/paper/{simulator/paper-spot-simulator.spec.d.ts → engine/paper-engine.spec.d.ts} +0 -0
  30. package/dist/adapter/paper/engine/paper-engine.spec.js +54 -0
  31. package/dist/adapter/paper/engine/paper-engine.spec.js.map +1 -0
  32. package/dist/adapter/paper/index.d.ts +1 -2
  33. package/dist/adapter/paper/index.js +1 -2
  34. package/dist/adapter/paper/index.js.map +1 -1
  35. package/dist/adapter/paper/paper-adapter.d.ts +10 -9
  36. package/dist/adapter/paper/paper-adapter.js +26 -23
  37. package/dist/adapter/paper/paper-adapter.js.map +1 -1
  38. package/dist/adapter/paper/paper-adapter.spec.js +36 -17
  39. package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
  40. package/dist/bootstrap.js +11 -10
  41. package/dist/bootstrap.js.map +1 -1
  42. package/dist/cli/pull.js +8 -11
  43. package/dist/cli/pull.js.map +1 -1
  44. package/dist/cli/test.js +5 -1
  45. package/dist/cli/test.js.map +1 -1
  46. package/dist/domain/asset.d.ts +10 -9
  47. package/dist/domain/asset.js +26 -23
  48. package/dist/domain/asset.js.map +1 -1
  49. package/dist/domain/asset.spec.js +36 -36
  50. package/dist/domain/asset.spec.js.map +1 -1
  51. package/dist/domain/balance.d.ts +13 -13
  52. package/dist/domain/balance.js +38 -32
  53. package/dist/domain/balance.js.map +1 -1
  54. package/dist/domain/balance.operator.d.ts +6 -0
  55. package/dist/domain/balance.operator.js +10 -0
  56. package/dist/domain/balance.operator.js.map +1 -0
  57. package/dist/{indicator/truerange.spec.d.ts → domain/balance.operator.spec.d.ts} +0 -0
  58. package/dist/domain/balance.operator.spec.js +23 -0
  59. package/dist/domain/balance.operator.spec.js.map +1 -0
  60. package/dist/domain/balance.spec.js +73 -12
  61. package/dist/domain/balance.spec.js.map +1 -1
  62. package/dist/domain/candle.d.ts +8 -23
  63. package/dist/domain/candle.js +6 -72
  64. package/dist/domain/candle.js.map +1 -1
  65. package/dist/domain/candle.operator.d.ts +10 -0
  66. package/dist/domain/candle.operator.js +64 -0
  67. package/dist/domain/candle.operator.js.map +1 -0
  68. package/dist/{shared/policy.spec.d.ts → domain/candle.operator.spec.d.ts} +0 -0
  69. package/dist/domain/candle.operator.spec.js +112 -0
  70. package/dist/domain/candle.operator.spec.js.map +1 -0
  71. package/dist/domain/candle.spec.js +16 -58
  72. package/dist/domain/candle.spec.js.map +1 -1
  73. package/dist/domain/commission.d.ts +12 -8
  74. package/dist/domain/commission.js +6 -6
  75. package/dist/domain/commission.js.map +1 -1
  76. package/dist/{shared/topic.spec.d.ts → domain/commission.spec.d.ts} +0 -0
  77. package/dist/domain/commission.spec.js +31 -0
  78. package/dist/domain/commission.spec.js.map +1 -0
  79. package/dist/domain/component.d.ts +1 -0
  80. package/dist/domain/error.d.ts +6 -0
  81. package/dist/domain/error.js +24 -0
  82. package/dist/domain/error.js.map +1 -0
  83. package/dist/domain/index.d.ts +8 -1
  84. package/dist/domain/index.js +8 -1
  85. package/dist/domain/index.js.map +1 -1
  86. package/dist/domain/instrument.d.ts +3 -2
  87. package/dist/domain/instrument.js +17 -9
  88. package/dist/domain/instrument.js.map +1 -1
  89. package/dist/domain/instrument.operator.d.ts +6 -0
  90. package/dist/domain/instrument.operator.js +14 -0
  91. package/dist/domain/instrument.operator.js.map +1 -0
  92. package/dist/{store/event/store-balance.event.spec.d.ts → domain/instrument.operator.spec.d.ts} +0 -0
  93. package/dist/domain/instrument.operator.spec.js +24 -0
  94. package/dist/domain/instrument.operator.spec.js.map +1 -0
  95. package/dist/domain/instrument.spec.js +22 -30
  96. package/dist/domain/instrument.spec.js.map +1 -1
  97. package/dist/domain/order.d.ts +16 -18
  98. package/dist/domain/order.js +39 -27
  99. package/dist/domain/order.js.map +1 -1
  100. package/dist/domain/order.operator.d.ts +7 -0
  101. package/dist/domain/order.operator.js +14 -0
  102. package/dist/domain/order.operator.js.map +1 -0
  103. package/dist/{store/event/store-candle.event.spec.d.ts → domain/order.operator.spec.d.ts} +0 -0
  104. package/dist/domain/order.operator.spec.js +65 -0
  105. package/dist/domain/order.operator.spec.js.map +1 -0
  106. package/dist/{store/event/store-instrument.event.spec.d.ts → domain/order.spec.d.ts} +0 -0
  107. package/dist/domain/order.spec.js +34 -0
  108. package/dist/domain/order.spec.js.map +1 -0
  109. package/dist/domain/orderbook.d.ts +19 -6
  110. package/dist/domain/orderbook.js +6 -4
  111. package/dist/domain/orderbook.js.map +1 -1
  112. package/dist/domain/orderbook.operator.d.ts +6 -0
  113. package/dist/domain/orderbook.operator.js +10 -0
  114. package/dist/domain/orderbook.operator.js.map +1 -0
  115. package/dist/{store/event/store-order.event.spec.d.ts → domain/orderbook.operator.spec.d.ts} +0 -0
  116. package/dist/domain/orderbook.operator.spec.js +22 -0
  117. package/dist/domain/orderbook.operator.spec.js.map +1 -0
  118. package/dist/{store/event/store-trade.event.spec.d.ts → domain/orderbook.spec.d.ts} +0 -0
  119. package/dist/domain/orderbook.spec.js +13 -0
  120. package/dist/domain/orderbook.spec.js.map +1 -0
  121. package/dist/domain/position.d.ts +9 -14
  122. package/dist/domain/position.js +9 -31
  123. package/dist/domain/position.js.map +1 -1
  124. package/dist/domain/position.operator.d.ts +11 -0
  125. package/dist/domain/position.operator.js +38 -0
  126. package/dist/domain/position.operator.js.map +1 -0
  127. package/dist/domain/position.operator.spec.d.ts +1 -0
  128. package/dist/domain/position.operator.spec.js +49 -0
  129. package/dist/domain/position.operator.spec.js.map +1 -0
  130. package/dist/domain/position.spec.js +22 -17
  131. package/dist/domain/position.spec.js.map +1 -1
  132. package/dist/domain/session.d.ts +15 -18
  133. package/dist/domain/session.js +21 -31
  134. package/dist/domain/session.js.map +1 -1
  135. package/dist/domain/session.spec.js +2 -2
  136. package/dist/domain/session.spec.js.map +1 -1
  137. package/dist/domain/trade.d.ts +4 -3
  138. package/dist/domain/trade.js +1 -0
  139. package/dist/domain/trade.js.map +1 -1
  140. package/dist/domain/trade.operator.d.ts +6 -0
  141. package/dist/domain/trade.operator.js +10 -0
  142. package/dist/domain/trade.operator.js.map +1 -0
  143. package/dist/domain/trade.operator.spec.d.ts +1 -0
  144. package/dist/domain/trade.operator.spec.js +24 -0
  145. package/dist/domain/trade.operator.spec.js.map +1 -0
  146. package/dist/domain/trade.spec.d.ts +1 -0
  147. package/dist/domain/trade.spec.js +13 -0
  148. package/dist/domain/trade.spec.js.map +1 -0
  149. package/dist/indicator/atr.d.ts +2 -1
  150. package/dist/indicator/atr.js +3 -3
  151. package/dist/indicator/atr.js.map +1 -1
  152. package/dist/indicator/cross.d.ts +3 -2
  153. package/dist/indicator/cross.js +13 -13
  154. package/dist/indicator/cross.js.map +1 -1
  155. package/dist/indicator/cross.spec.js +23 -22
  156. package/dist/indicator/cross.spec.js.map +1 -1
  157. package/dist/indicator/donchian.d.ts +3 -2
  158. package/dist/indicator/donchian.js.map +1 -1
  159. package/dist/indicator/drawdown.d.ts +2 -1
  160. package/dist/indicator/drawdown.js +3 -2
  161. package/dist/indicator/drawdown.js.map +1 -1
  162. package/dist/indicator/ema.d.ts +2 -1
  163. package/dist/indicator/ema.js +3 -2
  164. package/dist/indicator/ema.js.map +1 -1
  165. package/dist/indicator/ema.spec.js +4 -3
  166. package/dist/indicator/ema.spec.js.map +1 -1
  167. package/dist/indicator/envelope.d.ts +4 -3
  168. package/dist/indicator/envelope.js +4 -4
  169. package/dist/indicator/envelope.js.map +1 -1
  170. package/dist/indicator/index.d.ts +1 -1
  171. package/dist/indicator/index.js +1 -1
  172. package/dist/indicator/index.js.map +1 -1
  173. package/dist/indicator/macd.d.ts +2 -1
  174. package/dist/indicator/macd.js +1 -1
  175. package/dist/indicator/macd.js.map +1 -1
  176. package/dist/indicator/min-max.d.ts +4 -3
  177. package/dist/indicator/min-max.js +5 -4
  178. package/dist/indicator/min-max.js.map +1 -1
  179. package/dist/indicator/rma.d.ts +2 -1
  180. package/dist/indicator/rma.js +3 -2
  181. package/dist/indicator/rma.js.map +1 -1
  182. package/dist/indicator/sma.d.ts +2 -1
  183. package/dist/indicator/sma.js +4 -6
  184. package/dist/indicator/sma.js.map +1 -1
  185. package/dist/indicator/sma.spec.js +4 -3
  186. package/dist/indicator/sma.spec.js.map +1 -1
  187. package/dist/indicator/swma.d.ts +2 -1
  188. package/dist/indicator/swma.js +5 -1
  189. package/dist/indicator/swma.js.map +1 -1
  190. package/dist/indicator/tma.d.ts +2 -1
  191. package/dist/indicator/tma.js.map +1 -1
  192. package/dist/indicator/tma.spec.js +4 -3
  193. package/dist/indicator/tma.spec.js.map +1 -1
  194. package/dist/indicator/trailing.d.ts +8 -7
  195. package/dist/indicator/trailing.js +12 -11
  196. package/dist/indicator/trailing.js.map +1 -1
  197. package/dist/indicator/trailing.spec.js +15 -14
  198. package/dist/indicator/trailing.spec.js.map +1 -1
  199. package/dist/indicator/true-range.d.ts +4 -0
  200. package/dist/indicator/true-range.js +20 -0
  201. package/dist/indicator/true-range.js.map +1 -0
  202. package/dist/indicator/true-range.spec.d.ts +1 -0
  203. package/dist/indicator/true-range.spec.js +28 -0
  204. package/dist/indicator/true-range.spec.js.map +1 -0
  205. package/dist/indicator/window.d.ts +1 -1
  206. package/dist/indicator/window.js +1 -1
  207. package/dist/indicator/window.js.map +1 -1
  208. package/dist/indicator/wma.d.ts +2 -1
  209. package/dist/indicator/wma.js +6 -5
  210. package/dist/indicator/wma.js.map +1 -1
  211. package/dist/indicator/wma.spec.js +4 -3
  212. package/dist/indicator/wma.spec.js.map +1 -1
  213. package/dist/shared/collections.d.ts +26 -0
  214. package/dist/shared/collections.js +115 -0
  215. package/dist/shared/collections.js.map +1 -0
  216. package/dist/shared/collections.spec.d.ts +1 -0
  217. package/dist/shared/collections.spec.js +28 -0
  218. package/dist/shared/collections.spec.js.map +1 -0
  219. package/dist/shared/datetime.d.ts +0 -1
  220. package/dist/shared/datetime.js +1 -12
  221. package/dist/shared/datetime.js.map +1 -1
  222. package/dist/shared/decimals.d.ts +15 -6
  223. package/dist/shared/decimals.js +22 -36
  224. package/dist/shared/decimals.js.map +1 -1
  225. package/dist/shared/decimals.spec.js +18 -22
  226. package/dist/shared/decimals.spec.js.map +1 -1
  227. package/dist/shared/index.d.ts +2 -1
  228. package/dist/shared/index.js +2 -1
  229. package/dist/shared/index.js.map +1 -1
  230. package/dist/shared/io.js.map +1 -1
  231. package/dist/shared/pipe.d.ts +4 -0
  232. package/dist/shared/pipe.js +9 -0
  233. package/dist/shared/pipe.js.map +1 -0
  234. package/dist/shared/policy.d.ts +0 -1
  235. package/dist/shared/policy.js +1 -11
  236. package/dist/shared/policy.js.map +1 -1
  237. package/dist/storage/cache.js +1 -1
  238. package/dist/storage/cache.js.map +1 -1
  239. package/dist/storage/cache.spec.d.ts +1 -0
  240. package/dist/storage/cache.spec.js +18 -0
  241. package/dist/storage/cache.spec.js.map +1 -0
  242. package/dist/storage/feed.d.ts +7 -4
  243. package/dist/storage/feed.js +55 -8
  244. package/dist/storage/feed.js.map +1 -1
  245. package/dist/storage/storage.d.ts +2 -7
  246. package/dist/storage/storage.js +6 -11
  247. package/dist/storage/storage.js.map +1 -1
  248. package/dist/store/index.d.ts +8 -2
  249. package/dist/store/index.js +8 -2
  250. package/dist/store/index.js.map +1 -1
  251. package/dist/store/store-balance.event.d.ts +33 -0
  252. package/dist/store/store-balance.event.js +90 -0
  253. package/dist/store/store-balance.event.js.map +1 -0
  254. package/dist/store/store-balance.event.spec.d.ts +1 -0
  255. package/dist/store/{event/store-balance.event.spec.js → store-balance.event.spec.js} +10 -10
  256. package/dist/store/store-balance.event.spec.js.map +1 -0
  257. package/dist/store/{event/store-instrument.event.d.ts → store-instrument.event.d.ts} +5 -8
  258. package/dist/store/store-instrument.event.js +52 -0
  259. package/dist/store/store-instrument.event.js.map +1 -0
  260. package/dist/store/store-instrument.event.spec.d.ts +1 -0
  261. package/dist/store/store-instrument.event.spec.js +22 -0
  262. package/dist/store/store-instrument.event.spec.js.map +1 -0
  263. package/dist/store/store-order.event.d.ts +59 -0
  264. package/dist/store/store-order.event.js +181 -0
  265. package/dist/store/store-order.event.js.map +1 -0
  266. package/dist/store/store-order.event.spec.d.ts +1 -0
  267. package/dist/store/{event/store-order.event.spec.js → store-order.event.spec.js} +8 -8
  268. package/dist/store/store-order.event.spec.js.map +1 -0
  269. package/dist/store/store-orderbook.event.d.ts +12 -0
  270. package/dist/store/store-orderbook.event.js +42 -0
  271. package/dist/store/store-orderbook.event.js.map +1 -0
  272. package/dist/store/store-orderbook.event.spec.d.ts +1 -0
  273. package/dist/store/store-orderbook.event.spec.js +28 -0
  274. package/dist/store/store-orderbook.event.spec.js.map +1 -0
  275. package/dist/store/store-position.event.d.ts +21 -0
  276. package/dist/store/store-position.event.js +89 -0
  277. package/dist/store/store-position.event.js.map +1 -0
  278. package/dist/store/store-state.d.ts +27 -0
  279. package/dist/store/store-state.js +29 -0
  280. package/dist/store/store-state.js.map +1 -0
  281. package/dist/store/store-trade.event.d.ts +12 -0
  282. package/dist/store/store-trade.event.js +25 -0
  283. package/dist/store/store-trade.event.js.map +1 -0
  284. package/dist/store/store-trade.event.spec.d.ts +1 -0
  285. package/dist/store/store-trade.event.spec.js +44 -0
  286. package/dist/store/store-trade.event.spec.js.map +1 -0
  287. package/dist/store/store.d.ts +4 -25
  288. package/dist/store/store.event.d.ts +6 -0
  289. package/dist/store/{event/store.event.js → store.event.js} +0 -0
  290. package/dist/store/store.event.js.map +1 -0
  291. package/dist/store/store.js +7 -195
  292. package/dist/store/store.js.map +1 -1
  293. package/dist/store/store.spec.d.ts +1 -0
  294. package/dist/store/store.spec.js +119 -0
  295. package/dist/store/store.spec.js.map +1 -0
  296. package/dist/tsconfig.tsbuildinfo +1 -1
  297. package/{jestconfig.unit.json → jestconfig.json} +2 -2
  298. package/package.json +4 -6
  299. package/src/adapter/adapter-aggregate.ts +39 -38
  300. package/src/adapter/adapter.ts +39 -71
  301. package/src/adapter/backtester/backtester-adapter.spec.ts +133 -0
  302. package/src/adapter/backtester/backtester-adapter.ts +41 -21
  303. package/src/adapter/backtester/backtester-cursor.spec.ts +19 -18
  304. package/src/adapter/backtester/backtester-cursor.ts +7 -7
  305. package/src/adapter/backtester/backtester-streamer.spec.ts +23 -22
  306. package/src/adapter/backtester/backtester-streamer.ts +28 -15
  307. package/src/adapter/error.ts +9 -0
  308. package/src/adapter/paper/engine/paper-engine.spec.ts +99 -0
  309. package/src/adapter/paper/engine/paper-engine.ts +142 -0
  310. package/src/adapter/paper/index.ts +1 -2
  311. package/src/adapter/paper/paper-adapter.spec.ts +65 -20
  312. package/src/adapter/paper/paper-adapter.ts +42 -27
  313. package/src/bootstrap.ts +26 -19
  314. package/src/cli/pull.ts +11 -6
  315. package/src/cli/test.ts +5 -2
  316. package/src/domain/asset.spec.ts +37 -33
  317. package/src/domain/asset.ts +33 -34
  318. package/src/domain/balance.operator.spec.ts +25 -0
  319. package/src/domain/balance.operator.ts +15 -0
  320. package/src/domain/balance.spec.ts +101 -12
  321. package/src/domain/balance.ts +57 -51
  322. package/src/domain/candle.operator.spec.ts +126 -0
  323. package/src/domain/candle.operator.ts +107 -0
  324. package/src/domain/candle.spec.ts +18 -73
  325. package/src/domain/candle.ts +9 -121
  326. package/src/domain/commission.spec.ts +34 -0
  327. package/src/domain/commission.ts +13 -11
  328. package/src/domain/component.ts +1 -0
  329. package/src/domain/error.ts +27 -0
  330. package/src/domain/index.ts +8 -1
  331. package/src/domain/instrument.operator.spec.ts +28 -0
  332. package/src/domain/instrument.operator.ts +25 -0
  333. package/src/domain/instrument.spec.ts +22 -30
  334. package/src/domain/instrument.ts +20 -11
  335. package/src/domain/order.operator.spec.ts +82 -0
  336. package/src/domain/order.operator.ts +23 -0
  337. package/src/domain/order.spec.ts +44 -0
  338. package/src/domain/order.ts +55 -55
  339. package/src/domain/orderbook.operator.spec.ts +28 -0
  340. package/src/domain/orderbook.operator.ts +15 -0
  341. package/src/domain/orderbook.spec.ts +17 -0
  342. package/src/domain/orderbook.ts +18 -9
  343. package/src/domain/position.operator.spec.ts +59 -0
  344. package/src/domain/position.operator.ts +64 -0
  345. package/src/domain/position.spec.ts +28 -23
  346. package/src/domain/position.ts +17 -49
  347. package/src/domain/session.spec.ts +4 -4
  348. package/src/domain/session.ts +42 -134
  349. package/src/domain/trade.operator.spec.ts +31 -0
  350. package/src/domain/trade.operator.ts +15 -0
  351. package/src/domain/trade.spec.ts +17 -0
  352. package/src/domain/trade.ts +7 -4
  353. package/src/indicator/atr.ts +6 -5
  354. package/src/indicator/cross.spec.ts +33 -48
  355. package/src/indicator/cross.ts +18 -10
  356. package/src/indicator/donchian.ts +5 -4
  357. package/src/indicator/drawdown.ts +7 -5
  358. package/src/indicator/ema.spec.ts +5 -4
  359. package/src/indicator/ema.ts +7 -6
  360. package/src/indicator/envelope.ts +11 -6
  361. package/src/indicator/index.ts +1 -1
  362. package/src/indicator/macd.ts +5 -4
  363. package/src/indicator/min-max.ts +10 -7
  364. package/src/indicator/rma.ts +7 -6
  365. package/src/indicator/sma.spec.ts +5 -4
  366. package/src/indicator/sma.ts +9 -8
  367. package/src/indicator/swma.ts +8 -4
  368. package/src/indicator/tma.spec.ts +5 -4
  369. package/src/indicator/tma.ts +4 -3
  370. package/src/indicator/trailing.spec.ts +29 -16
  371. package/src/indicator/trailing.ts +22 -16
  372. package/src/indicator/true-range.spec.ts +32 -0
  373. package/src/indicator/true-range.ts +32 -0
  374. package/src/indicator/window.ts +3 -3
  375. package/src/indicator/wma.spec.ts +5 -4
  376. package/src/indicator/wma.ts +8 -7
  377. package/src/shared/collections.spec.ts +30 -0
  378. package/src/shared/collections.ts +141 -0
  379. package/src/shared/datetime.ts +0 -12
  380. package/src/shared/decimals.spec.ts +19 -24
  381. package/src/shared/decimals.ts +22 -55
  382. package/src/shared/index.ts +2 -1
  383. package/src/shared/io.ts +0 -2
  384. package/src/shared/pipe.ts +12 -0
  385. package/src/shared/policy.ts +0 -13
  386. package/src/storage/cache.spec.ts +18 -0
  387. package/src/storage/cache.ts +1 -1
  388. package/src/storage/feed.ts +88 -23
  389. package/src/storage/storage.ts +9 -13
  390. package/src/store/index.ts +8 -2
  391. package/src/store/{event/store-balance.event.spec.ts → store-balance.event.spec.ts} +10 -10
  392. package/src/store/store-balance.event.ts +124 -0
  393. package/src/store/store-instrument.event.spec.ts +25 -0
  394. package/src/store/store-instrument.event.ts +72 -0
  395. package/src/store/store-order.event.spec.ts +28 -0
  396. package/src/store/store-order.event.ts +214 -0
  397. package/src/store/store-orderbook.event.spec.ts +37 -0
  398. package/src/store/store-orderbook.event.ts +54 -0
  399. package/src/store/store-position.event.ts +114 -0
  400. package/src/store/store-state.ts +48 -0
  401. package/src/store/store-trade.event.spec.ts +60 -0
  402. package/src/store/store-trade.event.ts +36 -0
  403. package/src/store/store.event.ts +8 -0
  404. package/src/store/store.spec.ts +180 -0
  405. package/src/store/store.ts +10 -208
  406. package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +0 -10
  407. package/dist/adapter/paper/simulator/paper-margin-simulator.js +0 -69
  408. package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +0 -1
  409. package/dist/adapter/paper/simulator/paper-simulator.d.ts +0 -16
  410. package/dist/adapter/paper/simulator/paper-simulator.js +0 -93
  411. package/dist/adapter/paper/simulator/paper-simulator.js.map +0 -1
  412. package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +0 -13
  413. package/dist/adapter/paper/simulator/paper-spot-simulator.js +0 -81
  414. package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +0 -1
  415. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +0 -49
  416. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +0 -1
  417. package/dist/domain/statement.d.ts +0 -4
  418. package/dist/domain/statement.js +0 -87
  419. package/dist/domain/statement.js.map +0 -1
  420. package/dist/indicator/truerange.d.ts +0 -3
  421. package/dist/indicator/truerange.js +0 -19
  422. package/dist/indicator/truerange.js.map +0 -1
  423. package/dist/indicator/truerange.spec.js +0 -28
  424. package/dist/indicator/truerange.spec.js.map +0 -1
  425. package/dist/shared/policy.spec.js +0 -22
  426. package/dist/shared/policy.spec.js.map +0 -1
  427. package/dist/shared/topic.d.ts +0 -14
  428. package/dist/shared/topic.js +0 -40
  429. package/dist/shared/topic.js.map +0 -1
  430. package/dist/shared/topic.spec.js +0 -43
  431. package/dist/shared/topic.spec.js.map +0 -1
  432. package/dist/store/event/index.d.ts +0 -8
  433. package/dist/store/event/index.js +0 -25
  434. package/dist/store/event/index.js.map +0 -1
  435. package/dist/store/event/store-balance.event.d.ts +0 -37
  436. package/dist/store/event/store-balance.event.js +0 -119
  437. package/dist/store/event/store-balance.event.js.map +0 -1
  438. package/dist/store/event/store-balance.event.spec.js.map +0 -1
  439. package/dist/store/event/store-candle.event.d.ts +0 -18
  440. package/dist/store/event/store-candle.event.js +0 -63
  441. package/dist/store/event/store-candle.event.js.map +0 -1
  442. package/dist/store/event/store-candle.event.spec.js +0 -23
  443. package/dist/store/event/store-candle.event.spec.js.map +0 -1
  444. package/dist/store/event/store-instrument.event.js +0 -78
  445. package/dist/store/event/store-instrument.event.js.map +0 -1
  446. package/dist/store/event/store-instrument.event.spec.js +0 -21
  447. package/dist/store/event/store-instrument.event.spec.js.map +0 -1
  448. package/dist/store/event/store-order.event.d.ts +0 -61
  449. package/dist/store/event/store-order.event.js +0 -205
  450. package/dist/store/event/store-order.event.js.map +0 -1
  451. package/dist/store/event/store-order.event.spec.js.map +0 -1
  452. package/dist/store/event/store-orderbook.event.d.ts +0 -15
  453. package/dist/store/event/store-orderbook.event.js +0 -65
  454. package/dist/store/event/store-orderbook.event.js.map +0 -1
  455. package/dist/store/event/store-position.event.d.ts +0 -23
  456. package/dist/store/event/store-position.event.js +0 -97
  457. package/dist/store/event/store-position.event.js.map +0 -1
  458. package/dist/store/event/store-trade.event.d.ts +0 -13
  459. package/dist/store/event/store-trade.event.js +0 -47
  460. package/dist/store/event/store-trade.event.js.map +0 -1
  461. package/dist/store/event/store-trade.event.spec.js +0 -44
  462. package/dist/store/event/store-trade.event.spec.js.map +0 -1
  463. package/dist/store/event/store.event.d.ts +0 -5
  464. package/dist/store/event/store.event.js.map +0 -1
  465. package/dist/store/store.state.d.ts +0 -21
  466. package/dist/store/store.state.js +0 -21
  467. package/dist/store/store.state.js.map +0 -1
  468. package/dist/tests/backtester-adapter.spec.js +0 -61
  469. package/dist/tests/backtester-adapter.spec.js.map +0 -1
  470. package/dist/tests/session.spec.d.ts +0 -0
  471. package/dist/tests/session.spec.js +0 -1
  472. package/dist/tests/session.spec.js.map +0 -1
  473. package/jestconfig.integration.json +0 -12
  474. package/src/adapter/paper/simulator/paper-margin-simulator.ts +0 -108
  475. package/src/adapter/paper/simulator/paper-simulator.ts +0 -121
  476. package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +0 -87
  477. package/src/adapter/paper/simulator/paper-spot-simulator.ts +0 -134
  478. package/src/domain/statement.ts +0 -119
  479. package/src/indicator/truerange.spec.ts +0 -32
  480. package/src/indicator/truerange.ts +0 -31
  481. package/src/shared/policy.spec.ts +0 -25
  482. package/src/shared/topic.spec.ts +0 -34
  483. package/src/shared/topic.ts +0 -43
  484. package/src/store/event/index.ts +0 -8
  485. package/src/store/event/store-balance.event.ts +0 -161
  486. package/src/store/event/store-candle.event.spec.ts +0 -30
  487. package/src/store/event/store-candle.event.ts +0 -71
  488. package/src/store/event/store-instrument.event.spec.ts +0 -25
  489. package/src/store/event/store-instrument.event.ts +0 -84
  490. package/src/store/event/store-order.event.spec.ts +0 -28
  491. package/src/store/event/store-order.event.ts +0 -218
  492. package/src/store/event/store-orderbook.event.ts +0 -70
  493. package/src/store/event/store-position.event.ts +0 -109
  494. package/src/store/event/store-trade.event.spec.ts +0 -60
  495. package/src/store/event/store-trade.event.ts +0 -52
  496. package/src/store/event/store.event.ts +0 -6
  497. package/src/store/store.state.ts +0 -43
  498. package/src/tests/backtester-adapter.spec.ts +0 -88
  499. package/src/tests/session.spec.ts +0 -121
@@ -1,161 +0,0 @@
1
- import { AssetSelector } from '../../domain/asset';
2
- import { Balance } from '../../domain/balance';
3
- import { timestamp } from '../../shared';
4
- import { event } from '../../shared/topic';
5
- import { State, StateChangeTracker } from '../store.state';
6
- import { StoreEvent } from './store.event';
7
-
8
- /**
9
- * Updates the free and freezed balance of the given asset.
10
- */
11
- @event
12
- export class BalancePatchEvent implements StoreEvent {
13
- type = 'balance-patch';
14
-
15
- constructor(
16
- readonly asset: AssetSelector,
17
- readonly free: number,
18
- readonly freezed: number,
19
- readonly timestamp: timestamp
20
- ) {}
21
- }
22
-
23
- /**
24
- * @see BalancePatchEvent
25
- */
26
- export function BalancePatchEventHandler(
27
- event: BalancePatchEvent,
28
- state: State,
29
- changes: StateChangeTracker
30
- ) {
31
- let balance = state.balance[event.asset.toString()];
32
-
33
- if (!balance) {
34
- const asset = state.universe.asset[event.asset.toString()];
35
-
36
- if (!asset) {
37
- return;
38
- }
39
-
40
- balance = state.balance[asset.toString()] = new Balance(asset);
41
- }
42
-
43
- balance.timestamp = event.timestamp;
44
- balance.set(event.free, event.freezed);
45
-
46
- state.timestamp = event.timestamp;
47
-
48
- changes.commit(balance);
49
- }
50
-
51
- /**
52
- *
53
- */
54
- @event
55
- export class BalanceTransactEvent implements StoreEvent {
56
- type = 'balance-transact';
57
-
58
- constructor(
59
- readonly asset: AssetSelector,
60
- readonly amount: number,
61
- readonly timestamp: timestamp
62
- ) {}
63
- }
64
-
65
- /**
66
- * @see BalanceTransactEvent
67
- */
68
- export function BalanceTransactEventHandler(
69
- event: BalanceTransactEvent,
70
- state: State,
71
- changes: StateChangeTracker
72
- ) {
73
- let balance = state.balance[event.asset.toString()];
74
-
75
- if (!balance) {
76
- const asset = state.universe.asset[event.asset.toString()];
77
-
78
- balance = new Balance(asset);
79
-
80
- state.balance[asset.toString()] = balance;
81
- }
82
-
83
- balance.timestamp = event.timestamp;
84
- balance.transact(event.amount);
85
-
86
- state.timestamp = event.timestamp;
87
-
88
- changes.commit(balance);
89
- }
90
-
91
- /**
92
- *
93
- */
94
- @event
95
- export class BalanceFreezEvent implements StoreEvent {
96
- type = 'balance-freez';
97
-
98
- constructor(
99
- readonly asset: AssetSelector,
100
- readonly amount: number,
101
- readonly timestamp: timestamp
102
- ) {}
103
- }
104
-
105
- /**
106
- * @see BalanceFreezEvent
107
- */
108
- export function BalanceFreezEventHandler(
109
- event: BalanceFreezEvent,
110
- state: State,
111
- changes: StateChangeTracker
112
- ) {
113
- const balance = state.balance[event.asset.toString()];
114
-
115
- if (!balance) {
116
- throw new Error('invalid balance');
117
- }
118
-
119
- balance.timestamp = event.timestamp;
120
- balance.freez(event.amount);
121
-
122
- state.timestamp = event.timestamp;
123
-
124
- changes.commit(balance);
125
- }
126
-
127
- /**
128
- *
129
- */
130
- @event
131
- export class BalanceUnfreezEvent implements StoreEvent {
132
- type = 'balance-unfreez';
133
-
134
- constructor(
135
- readonly asset: AssetSelector,
136
- readonly amount: number,
137
- readonly timestamp: timestamp
138
- ) {}
139
- }
140
-
141
- /**
142
- * @see BalanceUnfreezEvent
143
- */
144
- export function BalanceUnfreezEventHandler(
145
- event: BalanceUnfreezEvent,
146
- state: State,
147
- changes: StateChangeTracker
148
- ) {
149
- const balance = state.balance[event.asset.toString()];
150
-
151
- if (!balance) {
152
- throw new Error('invalid balance');
153
- }
154
-
155
- balance.timestamp = event.timestamp;
156
- balance.unfreez(event.amount);
157
-
158
- state.timestamp = event.timestamp;
159
-
160
- changes.commit(balance);
161
- }
@@ -1,30 +0,0 @@
1
- import { Asset, Instrument } from '../../domain';
2
- import { now } from '../../shared';
3
- import { Store } from '../store';
4
- import { CandleEvent } from '.';
5
-
6
- const instrument = new Instrument(
7
- new Asset('btc', 'binance', 8),
8
- new Asset('usdt', 'binance', 2),
9
- 'binance:btc-usdt'
10
- );
11
-
12
- describe('candle patch event tests', () => {
13
- test('should patch trade object', () => {
14
- const timestamp = now();
15
- const store = new Store();
16
-
17
- store.snapshot.universe.instrument[instrument.toString()] = instrument;
18
- store.snapshot.subscription.instrument[instrument.toString()] = instrument;
19
-
20
- store.dispatch(new CandleEvent(instrument, 1, 1, 1, 1, 1, 1, timestamp));
21
-
22
- const trade = store.snapshot.trade[instrument.toString()];
23
-
24
- expect(trade.timestamp).toEqual(timestamp);
25
- expect(trade.instrument.toString()).toEqual(instrument.toString());
26
- expect(trade.rate).toEqual(1);
27
- expect(trade.quantity).toEqual(1);
28
- expect(store.snapshot.timestamp).toEqual(timestamp);
29
- });
30
- });
@@ -1,71 +0,0 @@
1
- import { InstrumentSelector } from '../../domain';
2
- import { timestamp } from '../../shared/datetime';
3
- import { event } from '../../shared/topic';
4
- import { StateChangeTracker } from '..';
5
- import { State } from '../store.state';
6
- import { StoreEvent } from './store.event';
7
- import { OrderbookPatchEventHandler } from './store-orderbook.event';
8
- import { TradePatchEventHandler } from './store-trade.event';
9
-
10
- @event
11
- export class CandleEvent implements StoreEvent {
12
- type = 'candle';
13
-
14
- constructor(
15
- readonly instrument: InstrumentSelector,
16
- readonly timeframe: number,
17
- readonly open: number,
18
- readonly high: number,
19
- readonly low: number,
20
- readonly close: number,
21
- readonly volume: number,
22
- readonly timestamp: timestamp
23
- ) {}
24
- }
25
-
26
- export function CandleEventHandler(
27
- event: CandleEvent,
28
- state: State,
29
- changes: StateChangeTracker
30
- ) {
31
- const instrument = state.universe.instrument[event.instrument.toString()];
32
-
33
- const patch = (timestamp: number, rate: number) => {
34
- // patch trade object
35
- TradePatchEventHandler(
36
- {
37
- type: 'trade-patch',
38
- instrument: event.instrument,
39
- quantity: event.volume,
40
- rate,
41
- timestamp
42
- },
43
- state,
44
- changes
45
- );
46
-
47
- // patch orderbook by assuming candle close price is mid orderbook price
48
- OrderbookPatchEventHandler(
49
- {
50
- type: 'orderbook-patch',
51
- instrument: event.instrument,
52
- bestAskQuantity: instrument.base.fixed(event.volume * 0.5),
53
- bestAskRate: rate,
54
- bestBidQuantity: instrument.base.fixed(event.volume * 0.5),
55
- bestBidRate: rate,
56
- timestamp
57
- },
58
- state,
59
- changes
60
- );
61
-
62
- state.timestamp = event.timestamp;
63
-
64
- changes.commitPendingChanges();
65
- };
66
-
67
- patch(event.timestamp, instrument.quote.fixed(event.open));
68
- patch(event.timestamp, instrument.quote.fixed(event.high));
69
- patch(event.timestamp, instrument.quote.fixed(event.low));
70
- patch(event.timestamp, instrument.quote.fixed(event.close));
71
- }
@@ -1,25 +0,0 @@
1
- import { Asset, Commission } from '../../domain';
2
- import { now } from '../../shared';
3
- import { Store } from '..';
4
- import { InstrumentPatchEvent } from './store-instrument.event';
5
-
6
- describe('instrument patch event tests', () => {
7
- test('should patch a store', () => {
8
- const timestamp = now();
9
- const store = new Store();
10
- const base = new Asset('de30', 'cex', 2);
11
- const quote = new Asset('usd', 'cex', 2);
12
-
13
- store.dispatch(
14
- new InstrumentPatchEvent(timestamp, base, quote, new Commission(0, 0), '')
15
- );
16
-
17
- expect(store.snapshot.universe.instrument['cex:de30-usd'].base).toEqual(base);
18
- expect(store.snapshot.universe.instrument['cex:de30-usd'].quote).toEqual(quote);
19
- expect(store.snapshot.universe.instrument['cex:de30-usd'].timestamp).toEqual(
20
- timestamp
21
- );
22
- expect(Object.keys(store.snapshot.universe.instrument).length).toEqual(1);
23
- expect(Object.keys(store.snapshot.universe.asset).length).toEqual(2);
24
- });
25
- });
@@ -1,84 +0,0 @@
1
- import { Asset, Commission } from '../../domain';
2
- import { Instrument, InstrumentSelector } from '../../domain/instrument';
3
- import { timestamp } from '../../shared';
4
- import { event } from '../../shared/topic';
5
- import { State, StateChangeTracker } from '../../store';
6
- import { StoreEvent } from './store.event';
7
-
8
- @event
9
- export class InstrumentPatchEvent implements StoreEvent {
10
- type = 'instrument-patch';
11
-
12
- constructor(
13
- readonly timestamp: timestamp,
14
- readonly base: Asset,
15
- readonly quote: Asset,
16
- readonly commission: Commission,
17
- readonly raw: string,
18
- readonly leverage?: number
19
- ) {}
20
- }
21
-
22
- export function InstrumentPatchEventHandler(
23
- event: InstrumentPatchEvent,
24
- state: State,
25
- changes: StateChangeTracker
26
- ) {
27
- const selector = new InstrumentSelector(
28
- event.base.name,
29
- event.quote.name,
30
- event.base.adapter
31
- );
32
-
33
- let instrument = state.universe.instrument[selector.toString()];
34
- if (!instrument) {
35
- instrument = new Instrument(event.base, event.quote, event.raw);
36
-
37
- //TODO: add asset before
38
- state.universe.asset[event.base.toString()] = event.base;
39
- state.universe.asset[event.quote.toString()] = event.quote;
40
- state.universe.instrument[selector.toString()] = instrument;
41
- }
42
-
43
- instrument.timestamp = event.timestamp;
44
- instrument.commission = event.commission;
45
-
46
- if (event.leverage) {
47
- instrument.leverage = event.leverage;
48
- }
49
-
50
- changes.commit(instrument);
51
- }
52
-
53
- @event
54
- export class InstrumentSubscriptionEvent implements StoreEvent {
55
- type = 'instrument-subscription';
56
-
57
- constructor(
58
- readonly timestamp: timestamp,
59
- readonly instrument: InstrumentSelector,
60
- readonly subscribed: boolean
61
- ) {}
62
- }
63
-
64
- export function InstrumentSubscriptionEventHandler(
65
- event: InstrumentSubscriptionEvent,
66
- state: State,
67
- changes: StateChangeTracker
68
- ) {
69
- const instrumentKey = event.instrument.toString();
70
-
71
- if (!(instrumentKey in state.universe.instrument)) {
72
- throw new Error(`Trying to patch not existing instrument: ${instrumentKey}`);
73
- }
74
-
75
- const instrument = state.universe.instrument[instrumentKey];
76
-
77
- if (event.subscribed) {
78
- state.subscription.instrument[instrument.toString()] = instrument;
79
- state.subscription.asset[instrument.base.toString()] = instrument.base;
80
- state.subscription.asset[instrument.quote.toString()] = instrument.quote;
81
- }
82
-
83
- changes.commit(instrument);
84
- }
@@ -1,28 +0,0 @@
1
- import { Asset, Instrument, Order } from '../../domain';
2
- import { now } from '../../shared';
3
- import { Store } from '../store';
4
- import { OrderLoadEvent } from './store-order.event';
5
-
6
- const instrument = new Instrument(
7
- new Asset('btc', 'binance', 8),
8
- new Asset('usdt', 'binance', 2),
9
- 'binance:btc-usdt'
10
- );
11
-
12
- describe('order load event tests', () => {
13
- test('should load order to store', () => {
14
- const timestamp = now();
15
- const store = new Store();
16
- const order = Order.buyMarket(instrument, 1.0);
17
-
18
- order.state = 'PENDING';
19
-
20
- store.snapshot.universe.instrument[instrument.toString()] = instrument;
21
- store.snapshot.subscription.instrument[instrument.toString()] = instrument;
22
-
23
- store.dispatch(new OrderLoadEvent(order, timestamp));
24
-
25
- expect(Object.keys(store.snapshot.order).length).toEqual(1);
26
- expect(store.snapshot.order[order.id]).toEqual(order);
27
- });
28
- });
@@ -1,218 +0,0 @@
1
- import { Order } from '../../domain';
2
- import { timestamp } from '../../shared';
3
- import { event } from '../../shared/topic';
4
- import { State, StateChangeTracker } from '../store.state';
5
- import { StoreEvent } from './store.event';
6
-
7
- @event
8
- export class OrderLoadEvent implements StoreEvent {
9
- type = 'order-load';
10
-
11
- constructor(readonly order: Order, readonly timestamp: timestamp) {}
12
- }
13
-
14
- export function OrderLoadEventHandler(
15
- event: OrderLoadEvent,
16
- state: State,
17
- changes: StateChangeTracker
18
- ) {
19
- event.order.timestamp = event.timestamp;
20
-
21
- state.order[event.order.id] = event.order;
22
-
23
- changes.commit(event.order);
24
- }
25
-
26
- @event
27
- export class OrderNewEvent implements StoreEvent {
28
- type = 'order-new';
29
-
30
- constructor(readonly order: Order, readonly timestamp: timestamp) {}
31
- }
32
-
33
- export function OrderNewEventHandler(
34
- event: OrderNewEvent,
35
- state: State,
36
- changes: StateChangeTracker
37
- ) {
38
- if (event.order.state != 'NEW') {
39
- throw new Error(`Order is not new`);
40
- }
41
-
42
- event.order.createdAt = event.timestamp;
43
- event.order.timestamp = event.timestamp;
44
-
45
- state.order[event.order.id] = event.order;
46
-
47
- changes.commit(event.order);
48
- }
49
-
50
- @event
51
- export class OrderPendingEvent implements StoreEvent {
52
- type = 'order-pending';
53
-
54
- constructor(readonly id: string, readonly timestamp: timestamp) {}
55
- }
56
-
57
- export function OrderPendingEventHandler(
58
- event: OrderPendingEvent,
59
- state: State,
60
- changes: StateChangeTracker
61
- ) {
62
- if (!(event.id in state.order)) {
63
- throw new Error(`Trying to patch unknown order: ${event.id}`);
64
- }
65
-
66
- const order = state.order[event.id];
67
-
68
- if (order.state != 'NEW') {
69
- throw new Error(`Order is not NEW: ${order.state}`);
70
- }
71
-
72
- order.state = 'PENDING';
73
- order.timestamp = event.timestamp;
74
-
75
- changes.commit(order);
76
- }
77
-
78
- @event
79
- export class OrderFilledEvent implements StoreEvent {
80
- type = 'order-filled';
81
-
82
- constructor(
83
- readonly id: string,
84
- readonly averageExecutionRate: number,
85
- readonly timestamp: timestamp
86
- ) {}
87
- }
88
-
89
- export function OrderFilledEventHandler(
90
- event: OrderFilledEvent,
91
- state: State,
92
- changes: StateChangeTracker
93
- ) {
94
- if (!(event.id in state.order)) {
95
- throw new Error(`Trying to patch unknown order: ${event.id}`);
96
- }
97
-
98
- const order = state.order[event.id];
99
-
100
- if (order.state != 'PENDING' && order.state != 'CANCELING') {
101
- throw new Error(`Order is not PENDING or CANCELING: ${order.state}`);
102
- }
103
-
104
- order.state = 'FILLED';
105
- order.timestamp = event.timestamp;
106
- order.quantityExecuted = order.quantity;
107
- order.averageExecutionRate = event.averageExecutionRate;
108
-
109
- changes.commit(order);
110
- }
111
-
112
- @event
113
- export class OrderCancelingEvent implements StoreEvent {
114
- type = 'order-canceling';
115
-
116
- constructor(readonly id: string, readonly timestamp: timestamp) {}
117
- }
118
-
119
- export function OrderCancelingEventHandler(
120
- event: OrderCancelingEvent,
121
- state: State,
122
- changes: StateChangeTracker
123
- ) {
124
- if (!(event.id in state.order)) {
125
- throw new Error(`Trying to patch unknown order: ${event.id}`);
126
- }
127
-
128
- const order = state.order[event.id];
129
-
130
- if (order.state == 'CANCELING' || order.state == 'CANCELED') {
131
- return;
132
- }
133
-
134
- if (order.state != 'PENDING') {
135
- throw new Error(`Order is not PENDING: ${order.state}`);
136
- }
137
-
138
- order.state = 'CANCELING';
139
- order.timestamp = event.timestamp;
140
-
141
- changes.commit(order);
142
- }
143
-
144
- @event
145
- export class OrderCanceledEvent implements StoreEvent {
146
- type = 'order-canceled';
147
-
148
- constructor(readonly id: string, readonly timestamp: timestamp) {}
149
- }
150
-
151
- export function OrderCanceledEventHandler(
152
- event: OrderCanceledEvent,
153
- state: State,
154
- changes: StateChangeTracker
155
- ) {
156
- const order = state.order[event.id];
157
-
158
- if (order.state == 'CANCELED') {
159
- return;
160
- }
161
-
162
- if (order.state != 'CANCELING') {
163
- throw new Error(`Order is not CANCELING: ${order.state}`);
164
- }
165
-
166
- order.state = 'CANCELED';
167
- order.timestamp = event.timestamp;
168
-
169
- changes.commit(order);
170
- }
171
-
172
- @event
173
- export class OrderCancelFailedEvent implements StoreEvent {
174
- type = 'order-cancel-failed';
175
-
176
- constructor(readonly id: string, readonly timestamp: timestamp) {}
177
- }
178
-
179
- export function OrderCancelFailedEventHandler(
180
- event: OrderCancelFailedEvent,
181
- state: State,
182
- changes: StateChangeTracker
183
- ) {
184
- const order = state.order[event.id];
185
-
186
- if (order.state != 'CANCELING') {
187
- return;
188
- }
189
-
190
- order.state = 'PENDING';
191
- order.timestamp = event.timestamp;
192
-
193
- changes.commit(order);
194
- }
195
-
196
- @event
197
- export class OrderRejectedEvent implements StoreEvent {
198
- type = 'order-canceled';
199
-
200
- constructor(readonly id: string, readonly timestamp: timestamp) {}
201
- }
202
-
203
- export function OrderRejectedEventHandler(
204
- event: OrderRejectedEvent,
205
- state: State,
206
- changes: StateChangeTracker
207
- ) {
208
- const order = state.order[event.id];
209
-
210
- if (order.state != 'NEW') {
211
- throw new Error(`Order is not NEW: ${order.state}`);
212
- }
213
-
214
- order.state = 'REJECTED';
215
- order.timestamp = event.timestamp;
216
-
217
- changes.commit(order);
218
- }
@@ -1,70 +0,0 @@
1
- import { InstrumentSelector } from '../../domain/instrument';
2
- import { Orderbook } from '../../domain/orderbook';
3
- import { timestamp } from '../../shared';
4
- import { event } from '../../shared/topic';
5
- import { State, StateChangeTracker } from '../store.state';
6
- import { StoreEvent } from './store.event';
7
-
8
- @event
9
- export class OrderbookPatchEvent implements StoreEvent {
10
- type = 'orderbook-patch';
11
-
12
- constructor(
13
- readonly instrument: InstrumentSelector,
14
- readonly bestAskRate: number,
15
- readonly bestAskQuantity: number,
16
- readonly bestBidRate: number,
17
- readonly bestBidQuantity: number,
18
- readonly timestamp: timestamp
19
- ) {}
20
- }
21
-
22
- export function OrderbookPatchEventHandler(
23
- event: OrderbookPatchEvent,
24
- state: State,
25
- changes: StateChangeTracker
26
- ) {
27
- const instrumentKey = event.instrument.toString();
28
-
29
- if (!(instrumentKey in state.subscription.instrument)) {
30
- throw new Error(`Trying to patch unsubscribed instrument: ${instrumentKey}`);
31
- }
32
-
33
- let orderbook = state.orderbook[instrumentKey];
34
-
35
- if (!orderbook) {
36
- const instrument = state.universe.instrument[instrumentKey];
37
-
38
- orderbook = new Orderbook(instrument);
39
-
40
- state.orderbook[instrumentKey] = orderbook;
41
- }
42
-
43
- state.timestamp = event.timestamp;
44
-
45
- orderbook.timestamp = event.timestamp;
46
- orderbook.bestAskRate = orderbook.instrument.quote.fixed(event.bestAskRate);
47
- orderbook.bestAskQuantity = orderbook.instrument.base.fixed(event.bestAskQuantity);
48
- orderbook.bestBidRate = orderbook.instrument.quote.fixed(event.bestBidRate);
49
- orderbook.bestBidQuantity = orderbook.instrument.base.fixed(event.bestBidQuantity);
50
-
51
- const quote = state.balance[orderbook.instrument.quote.toString()];
52
-
53
- if (quote) {
54
- for (const position of Object.values(quote.position)) {
55
- if (position.instrument.toString() != orderbook.toString()) {
56
- continue;
57
- }
58
-
59
- const rate = position.size >= 0 ? orderbook.bestBidRate : orderbook.bestAskRate;
60
-
61
- position.calculatePnL(rate);
62
- }
63
-
64
- if (quote.total < 0) {
65
- throw new Error('liquidated');
66
- }
67
- }
68
-
69
- changes.commit(orderbook);
70
- }