@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
package/src/bootstrap.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  AdapterAggregate,
3
- BacktesterAdapter,
4
3
  BacktesterListener,
5
4
  BacktesterStreamer,
6
- PaperAdapter
5
+ createBacktesterAdapterFactory,
6
+ createPaperAdapterFactory,
7
+ DefaultTimeProvider
7
8
  } from './adapter';
8
9
  import { Session, SessionDescriptor } from './domain';
9
- import { Cache, Feed, InMemoryStorage, InMemoryStorageFactory } from './storage';
10
+ import { Cache, Feed, inMemoryStorageFactory } from './storage';
10
11
  import { Store } from './store';
11
12
 
12
13
  export class Bootstrap {
@@ -56,9 +57,9 @@ export class Bootstrap {
56
57
  */
57
58
  backtest(listener?: BacktesterListener): [Session, BacktesterStreamer] {
58
59
  const store = new Store();
59
- const { storage } = this.descriptor;
60
- const feed = new Feed(storage.create('feed'));
61
- const cache = new Cache(storage.create('cache'));
60
+ const storage = this.descriptor.storage ?? inMemoryStorageFactory();
61
+ const feed = new Feed(storage('feed'));
62
+ const cache = new Cache(storage('cache'));
62
63
 
63
64
  const streamer = new BacktesterStreamer(
64
65
  store,
@@ -68,13 +69,13 @@ export class Bootstrap {
68
69
  );
69
70
 
70
71
  const aggregate = new AdapterAggregate(
71
- this.descriptor.adapter.map(
72
- it =>
73
- new BacktesterAdapter(
74
- new PaperAdapter(it, store, this.descriptor.simulation),
75
- streamer
76
- )
72
+ this.descriptor.adapter.map(it =>
73
+ createBacktesterAdapterFactory(
74
+ createPaperAdapterFactory(it, this.descriptor.simulation),
75
+ streamer
76
+ )
77
77
  ),
78
+ streamer.getTimeProvider(),
78
79
  store,
79
80
  cache
80
81
  );
@@ -102,13 +103,14 @@ export class Bootstrap {
102
103
  }
103
104
 
104
105
  const store = new Store();
105
- const storage = this.descriptor.storage ?? new InMemoryStorageFactory();
106
- const cache = new Cache(storage.create('cache'));
106
+ const storage = this.descriptor.storage ?? inMemoryStorageFactory();
107
+ const cache = new Cache(storage('cache'));
107
108
 
108
109
  const aggregate = new AdapterAggregate(
109
- this.descriptor.adapter.map(
110
- it => new PaperAdapter(it, store, this.descriptor.simulation)
110
+ this.descriptor.adapter.map(it =>
111
+ createPaperAdapterFactory(it, this.descriptor.simulation)
111
112
  ),
113
+ DefaultTimeProvider,
112
114
  store,
113
115
  cache
114
116
  );
@@ -122,10 +124,15 @@ export class Bootstrap {
122
124
  */
123
125
  live(): Session {
124
126
  const store = new Store();
125
- const storage = this.descriptor.storage ?? new InMemoryStorageFactory();
126
- const cache = new Cache(storage.create('cache'));
127
+ const storage = this.descriptor.storage ?? inMemoryStorageFactory();
128
+ const cache = new Cache(storage('cache'));
127
129
 
128
- const aggregate = new AdapterAggregate(this.descriptor.adapter, store, cache);
130
+ const aggregate = new AdapterAggregate(
131
+ this.descriptor.adapter,
132
+ DefaultTimeProvider,
133
+ store,
134
+ cache
135
+ );
129
136
 
130
137
  return new Session(store, aggregate, this.descriptor);
131
138
  }
package/src/cli/pull.ts CHANGED
@@ -40,28 +40,33 @@ export default async function (name: string, instrument: string, options: any) {
40
40
  );
41
41
  }
42
42
 
43
+ console.time('Pulling completed in');
44
+
43
45
  await session.awake(undefined);
44
46
 
45
47
  const bar = new SingleBar({}, Presets.shades_classic);
46
- const feed = new Feed(module.descriptor.storage.create('feed'));
48
+ const feed = new Feed(module.descriptor.storage('feed'));
47
49
 
48
50
  bar.start(100, 0);
49
51
 
50
- await session.aggregate.feed({
51
- instrument: instrumentOf(instrument),
52
+ await session.aggregate.feed(
53
+ instrumentOf(instrument),
52
54
  from,
53
55
  to,
54
- destination: feed,
55
- callback: timestamp => {
56
+ async (timestamp, events) => {
56
57
  const duration = to - from;
57
58
  const completed = timestamp - from;
58
59
 
60
+ await feed.save(events);
61
+
59
62
  bar.update(Math.floor((completed / duration) * 100));
60
63
  }
61
- });
64
+ );
62
65
 
63
66
  bar.update(100);
64
67
  bar.stop();
65
68
 
66
69
  await session.dispose();
70
+
71
+ console.timeLog('Pulling completed in');
67
72
  }
package/src/cli/test.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { BacktesterStreamer } from '../adapter';
2
1
  import { Bootstrap } from '../bootstrap';
3
2
  import build from './build';
4
3
  import { getModule } from './internal/workspace';
@@ -36,10 +35,14 @@ export default async function (name, options: any) {
36
35
 
37
36
  await new Promise<void>(async resolve => {
38
37
  const [session] = bootstrap.useBacktestPeriod(from, to).backtest({
38
+ onBacktestStarted: () => {
39
+ console.log('backtest started');
40
+ console.time('backtest completed');
41
+ },
39
42
  onBacktestCompleted: async () => {
40
43
  await session.dispose();
41
44
 
42
- console.log('backtest completed.');
45
+ console.timeEnd('backtest completed');
43
46
 
44
47
  resolve();
45
48
  }
@@ -1,66 +1,70 @@
1
+ import { d } from '../shared';
1
2
  import { Asset, assetOf } from './asset';
2
3
 
3
- describe('asset tests', () => {
4
- test('should instantiate proper asset', () => {
4
+ describe('Asset', () => {
5
+ test('should construct a new asset', () => {
5
6
  const sut = new Asset('abc', 'xyz', 4);
6
7
 
7
8
  expect(sut.name).toEqual('abc');
8
- expect(sut.adapter).toEqual('xyz');
9
+ expect(sut.adapterName).toEqual('xyz');
9
10
  expect(sut.scale).toEqual(4);
10
- expect(sut.tickSize).toEqual(0.0001);
11
- expect(sut.fixed(1.1234567)).toEqual(1.1234);
12
- expect(sut.floor(1.1234567)).toEqual(1.1234);
13
- expect(sut.ceil(1.1234567)).toEqual(1.1235);
14
- expect(sut.toString()).toEqual('xyz:abc');
11
+ expect(sut.tickSize).toEqual(d(0.0001));
12
+ expect(sut.floor(d(1.1234567))).toEqual(d(1.1234));
13
+ expect(sut.ceil(d(1.1234567))).toEqual(d(1.1235));
14
+ expect(sut.id).toEqual('xyz:abc');
15
+ });
16
+
17
+ test('should throw for missing asset name', () => {
18
+ const fn = () => new Asset('xyz', '', 5);
19
+
20
+ expect(fn).toThrowError();
21
+ });
22
+
23
+ test('should throw for missing adapter name', () => {
24
+ const fn = () => new Asset('', 'xyz', 5);
25
+
26
+ expect(fn).toThrowError();
15
27
  });
16
28
  });
17
29
 
18
- describe('asset selector tests', () => {
19
- test('should instantiate proper asset selector', () => {
30
+ describe('AssetSelector', () => {
31
+ test('should construct a new asset selector from unified string', () => {
20
32
  const sut = assetOf('xyz:abc');
21
33
 
22
34
  expect(sut.name).toEqual('abc');
23
- expect(sut.adapter).toEqual('xyz');
24
- expect(sut.toString()).toEqual('xyz:abc');
35
+ expect(sut.adapterName).toEqual('xyz');
36
+ expect(sut.id).toEqual('xyz:abc');
25
37
  });
26
38
 
27
39
  test('should instantiate proper asset selector capital case', () => {
28
40
  const sut = assetOf('XYZ:ABC');
29
41
 
30
42
  expect(sut.name).toEqual('abc');
31
- expect(sut.adapter).toEqual('xyz');
32
- expect(sut.toString()).toEqual('xyz:abc');
43
+ expect(sut.adapterName).toEqual('xyz');
44
+ expect(sut.id).toEqual('xyz:abc');
33
45
  });
34
46
 
35
47
  test('should throw invalid format message for missing separator', () => {
36
- const fn = () => {
37
- assetOf('xyzabc');
38
- };
48
+ const fn = () => assetOf('xyzabc');
39
49
 
40
- expect(fn).toThrow(Error);
50
+ expect(fn).toThrowError();
41
51
  });
42
52
 
43
- test('should throw invalid format message for multiple separators', () => {
44
- const fn = () => {
45
- assetOf('xyz:abc:');
46
- };
53
+ test('should throw for multiple separators', () => {
54
+ const fn = () => assetOf('xyz:abc:');
47
55
 
48
- expect(fn).toThrow(Error);
56
+ expect(fn).toThrowError();
49
57
  });
50
58
 
51
- test('should throw invalid format message for missing asset name', () => {
52
- const fn = () => {
53
- assetOf('xyz:');
54
- };
59
+ test('should throw for missing asset name', () => {
60
+ const fn = () => assetOf('xyz:');
55
61
 
56
- expect(fn).toThrow(Error);
62
+ expect(fn).toThrowError();
57
63
  });
58
64
 
59
- test('should throw invalid format message for missing adapter name', () => {
60
- const fn = () => {
61
- assetOf(':abc');
62
- };
65
+ test('should throw for missing adapter name', () => {
66
+ const fn = () => assetOf(':abc');
63
67
 
64
- expect(fn).toThrow(Error);
68
+ expect(fn).toThrowError();
65
69
  });
66
70
  });
@@ -1,19 +1,28 @@
1
- import { ceil, fixed, floor } from '../shared/decimals';
1
+ import { d, decimal } from './../shared/decimals';
2
+ import { invalidArgumentError, invalidAssetSelectorError } from './error';
3
+
4
+ export const AssetSelectorSeparator = ':';
2
5
 
3
6
  /**
4
7
  * Supposed to query specific @see Asset from based on string notation.
5
8
  */
6
9
  export class AssetSelector {
7
- private readonly id: string;
8
-
10
+ readonly id: string;
9
11
  readonly name: string;
10
- readonly adapter: string;
12
+ readonly adapterName: string;
11
13
 
12
- constructor(name: string, adapter: string) {
13
- this.name = name.toLowerCase();
14
- this.adapter = adapter.toLowerCase();
14
+ constructor(name: string, adapterName: string) {
15
+ if (!name?.length) {
16
+ throw invalidArgumentError(name);
17
+ }
15
18
 
16
- this.id = `${this.adapter}:${this.name}`;
19
+ if (!adapterName?.length) {
20
+ throw invalidArgumentError(adapterName);
21
+ }
22
+
23
+ this.name = name.toLowerCase();
24
+ this.adapterName = adapterName.toLowerCase();
25
+ this.id = `${this.adapterName}${AssetSelectorSeparator}${this.name}`;
17
26
  }
18
27
 
19
28
  /**
@@ -27,21 +36,14 @@ export class AssetSelector {
27
36
  /**
28
37
  * Creates @see AssetSelector based on unified string notation.
29
38
  */
30
- export function assetOf(asset: string): AssetSelector {
31
- const section = asset.split(':');
39
+ export function assetOf(selector: string): AssetSelector {
40
+ const [adapterName, name, ...rest] = selector.split(AssetSelectorSeparator);
32
41
 
33
- if (section.length != 2) {
34
- throw Error('invalid asset format');
42
+ if (!adapterName || !name || rest.length) {
43
+ throw invalidAssetSelectorError(selector);
35
44
  }
36
45
 
37
- const assetName = section[1];
38
- const adapterName = section[0];
39
-
40
- if (assetName.length == 0 || adapterName.length == 0) {
41
- throw Error('invalid asset format');
42
- }
43
-
44
- return new AssetSelector(assetName, adapterName);
46
+ return new AssetSelector(name, adapterName);
45
47
  }
46
48
 
47
49
  /**
@@ -49,32 +51,29 @@ export function assetOf(asset: string): AssetSelector {
49
51
  * For example, you can combine two trading assets to create a trading instrument.
50
52
  */
51
53
  export class Asset extends AssetSelector {
52
- readonly tickSize: number;
54
+ readonly tickSize: decimal;
53
55
 
54
- constructor(name: string, adapter: string, public readonly scale: number) {
55
- super(name, adapter);
56
+ constructor(name: string, adapterName: string, public readonly scale: number) {
57
+ super(name, adapterName);
56
58
 
57
- this.tickSize = 1.0 / Math.pow(10, this.scale);
58
- }
59
+ if (scale && (scale < 0 || Number.isNaN(scale))) {
60
+ throw invalidArgumentError(scale);
61
+ }
59
62
 
60
- /**
61
- * Trims a number to the asset precision.
62
- */
63
- fixed(number: number): number {
64
- return fixed(number, this.scale);
63
+ this.tickSize = d(1.0).div(Math.pow(10, this.scale));
65
64
  }
66
65
 
67
66
  /**
68
67
  * Rounds down a number to the asset precision.
69
68
  */
70
- floor(number: number): number {
71
- return floor(number, this.scale);
69
+ floor(number: decimal): decimal {
70
+ return number.toFloor(this.scale);
72
71
  }
73
72
 
74
73
  /**
75
74
  * Rounds up a number to the asset precision.
76
75
  */
77
- ceil(number: number): number {
78
- return ceil(number, this.scale);
76
+ ceil(number: decimal): decimal {
77
+ return number.toCeil(this.scale);
79
78
  }
80
79
  }
@@ -0,0 +1,25 @@
1
+ import { Subject } from 'rxjs';
2
+
3
+ import { State } from '../store';
4
+ import { Asset } from './asset';
5
+ import { Balance } from './balance';
6
+ import { balance } from './balance.operator';
7
+ import { Component } from './component';
8
+
9
+ describe('balance', () => {
10
+ const asset = new Asset('abc', 'xyz', 4);
11
+ const state = new State();
12
+
13
+ beforeEach(() => {
14
+ state.balance.upsert(new Balance(asset));
15
+ });
16
+
17
+ test('should pipe a balance on subscription', done => {
18
+ new Subject<Component>().pipe(balance(asset, state)).subscribe({
19
+ next: it => {
20
+ expect(it.asset).toEqual(asset);
21
+ done();
22
+ }
23
+ });
24
+ });
25
+ });
@@ -0,0 +1,15 @@
1
+ import { filter, map, Observable, startWith } from 'rxjs';
2
+
3
+ import { State } from '../store';
4
+ import { AssetSelector } from './asset';
5
+ import { Balance } from './balance';
6
+ import { Component } from './component';
7
+
8
+ export function balance(selector: AssetSelector, state: State) {
9
+ return (source$: Observable<Component>) =>
10
+ source$.pipe(
11
+ startWith(state.balance.get(selector.id)),
12
+ filter(it => it instanceof Balance && (!selector || it.asset.id == selector.id)),
13
+ map(it => it as Balance)
14
+ );
15
+ }
@@ -1,24 +1,113 @@
1
+ import { d } from '../shared';
1
2
  import { Asset } from './asset';
2
3
  import { Balance } from './balance';
4
+ import { Instrument } from './instrument';
5
+ import { Position } from './position';
3
6
 
4
- describe('balance tests', () => {
5
- test('should instantiate empty balance', () => {
6
- const sut = new Balance(new Asset('abc', 'xyz', 4));
7
+ describe('Balance', () => {
8
+ const asset = new Asset('abc', 'xyz', 4);
9
+ const instrument = new Instrument(
10
+ new Asset('abc', 'xyz', 4),
11
+ new Asset('def', 'xyz', 4),
12
+ 'abc-def'
13
+ );
7
14
 
8
- expect(sut.asset.toString()).toEqual('xyz:abc');
9
- expect(sut.free).toEqual(0);
10
- expect(sut.locked).toEqual(0);
15
+ test('should construct empty balance', () => {
16
+ const sut = new Balance(asset);
17
+
18
+ expect(sut.asset.id).toEqual('xyz:abc');
19
+ expect(sut.free).toEqual(d.Zero);
20
+ expect(sut.locked).toEqual(d.Zero);
11
21
  expect(Object.keys(sut.position).length).toEqual(0);
12
22
  });
13
23
 
14
- test('should instantiate balance', () => {
15
- const sut = new Balance(new Asset('abc', 'xyz', 4));
24
+ test('should construct balance', () => {
25
+ const sut = new Balance(asset);
16
26
 
17
- sut.set(100, 50);
27
+ sut.set(d(100), d(50));
18
28
 
19
- expect(sut.asset.toString()).toEqual('xyz:abc');
20
- expect(sut.free).toEqual(100);
21
- expect(sut.locked).toEqual(50);
29
+ expect(sut.asset.id).toEqual('xyz:abc');
30
+ expect(sut.free).toEqual(d(100));
31
+ expect(sut.locked).toEqual(d(50));
32
+ expect(sut.total).toEqual(d(150));
22
33
  expect(Object.keys(sut.position).length).toEqual(0);
23
34
  });
35
+
36
+ test('should account positive amount', () => {
37
+ const sut = new Balance(asset);
38
+
39
+ sut.set(d(100), d.Zero);
40
+ sut.account(d(10));
41
+
42
+ expect(sut.free).toEqual(d(110));
43
+ expect(sut.locked).toEqual(d.Zero);
44
+ expect(sut.total).toEqual(d(110));
45
+ });
46
+
47
+ test('should account negative amount', () => {
48
+ const sut = new Balance(asset);
49
+
50
+ sut.set(d(100), d.Zero);
51
+ sut.account(d(-10));
52
+
53
+ expect(sut.free).toEqual(d(90));
54
+ expect(sut.locked).toEqual(d.Zero);
55
+ expect(sut.total).toEqual(d(90));
56
+ });
57
+
58
+ test('should throw for insufficient balance account amount', () => {
59
+ const sut = new Balance(asset);
60
+
61
+ sut.set(d(100), d.Zero);
62
+ const fn = () => sut.account(d(-120));
63
+
64
+ expect(fn).toThrowError();
65
+ });
66
+
67
+ test('should lock specific amount of available balance', () => {
68
+ const sut = new Balance(asset);
69
+
70
+ sut.set(d(100), d.Zero);
71
+ sut.lock('key', d(10));
72
+
73
+ expect(sut.free).toEqual(d(90));
74
+ expect(sut.locked).toEqual(d(10));
75
+ expect(sut.total).toEqual(d(100));
76
+ });
77
+
78
+ test('should throw for lock insufficient amount of available balance', () => {
79
+ const sut = new Balance(asset);
80
+
81
+ sut.set(d(30), d(50));
82
+ const fn = () => sut.lock('key', d(100));
83
+
84
+ expect(fn).toThrowError();
85
+ });
86
+
87
+ test('should lock an unlock specific amount of available balance', () => {
88
+ const sut = new Balance(asset);
89
+
90
+ sut.set(d(100), d.Zero);
91
+ sut.lock('key', d(40));
92
+ sut.tryUnlock('key');
93
+
94
+ expect(sut.free).toEqual(d(100));
95
+ expect(sut.locked).toEqual(d.Zero);
96
+ expect(sut.total).toEqual(d(100));
97
+ });
98
+
99
+ test('should return correct estimated unrealized pnl', () => {
100
+ const position = new Position('1', instrument, 'CROSS', d(2511.81), d(10.31), 20);
101
+
102
+ position.calculateEstimatedUnrealizedPnL(d(2576.44));
103
+
104
+ const sut = new Balance(asset);
105
+
106
+ sut.set(d(100), d.Zero);
107
+ sut.position['1'] = position;
108
+
109
+ expect(sut.getEstimatedUnrealizedPnL()).toEqual(d(0.2652));
110
+ expect(sut.free).toEqual(d(100).add(d(0.2652)));
111
+ expect(sut.total).toEqual(d(100).add(d(0.2652)));
112
+ });
24
113
  });