@quantform/core 0.5.23 → 0.6.5

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 (557) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/adapter/adapter-aggregate.d.ts +38 -3
  3. package/dist/adapter/adapter-aggregate.d.ts.map +1 -0
  4. package/dist/adapter/adapter-aggregate.js +109 -50
  5. package/dist/adapter/adapter.d.ts +27 -2
  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 +3 -2
  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 +6 -5
  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 +17 -1
  63. package/dist/domain/asset.d.ts.map +1 -0
  64. package/dist/domain/asset.js +16 -4
  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 -5
  69. package/dist/domain/balance.d.ts.map +1 -0
  70. package/dist/domain/balance.js +31 -7
  71. package/dist/domain/commission.d.ts +2 -0
  72. package/dist/domain/commission.d.ts.map +1 -0
  73. package/dist/domain/commission.js +2 -1
  74. package/dist/domain/component.d.ts +1 -1
  75. package/dist/domain/component.d.ts.map +1 -0
  76. package/dist/domain/component.js +0 -1
  77. package/dist/domain/error.d.ts +4 -3
  78. package/dist/domain/error.d.ts.map +1 -0
  79. package/dist/domain/error.js +3 -4
  80. package/dist/domain/index.d.ts +10 -8
  81. package/dist/domain/index.d.ts.map +1 -0
  82. package/dist/domain/index.js +9 -9
  83. package/dist/domain/{instrument.operator.d.ts → instrument-operator.d.ts} +1 -0
  84. package/dist/domain/instrument-operator.d.ts.map +1 -0
  85. package/dist/domain/{instrument.operator.js → instrument-operator.js} +0 -1
  86. package/dist/domain/instrument.d.ts +8 -7
  87. package/dist/domain/instrument.d.ts.map +1 -0
  88. package/dist/domain/instrument.js +7 -7
  89. package/dist/domain/ohlc-operator.d.ts +11 -0
  90. package/dist/domain/ohlc-operator.d.ts.map +1 -0
  91. package/dist/domain/{candle.operator.js → ohlc-operator.js} +21 -15
  92. package/dist/domain/{candle.d.ts → ohlc.d.ts} +4 -3
  93. package/dist/domain/ohlc.d.ts.map +1 -0
  94. package/dist/domain/{candle.js → ohlc.js} +3 -4
  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 +14 -21
  99. package/dist/domain/order.d.ts.map +1 -0
  100. package/dist/domain/order.js +16 -32
  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 +9 -7
  105. package/dist/domain/orderbook.d.ts.map +1 -0
  106. package/dist/domain/orderbook.js +7 -6
  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 +4 -5
  111. package/dist/domain/position.d.ts.map +1 -0
  112. package/dist/domain/position.js +2 -6
  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 +106 -0
  116. package/dist/domain/session.d.ts +56 -15
  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 +9 -6
  126. package/dist/domain/trade.d.ts.map +1 -0
  127. package/dist/domain/trade.js +8 -6
  128. package/dist/index.d.ts +25 -2
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +63 -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 +6 -7
  147. package/dist/shared/logger.d.ts.map +1 -0
  148. package/dist/shared/logger.js +27 -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/jest.config.ts +13 -0
  204. package/package.json +19 -32
  205. package/src/adapter/adapter-aggregate.ts +42 -21
  206. package/src/adapter/adapter.ts +3 -3
  207. package/src/adapter/backtester/backtester-adapter.ts +2 -4
  208. package/src/adapter/backtester/backtester-cursor.ts +1 -1
  209. package/src/adapter/backtester/backtester-streamer.spec.ts +5 -3
  210. package/src/adapter/backtester/backtester-streamer.ts +16 -8
  211. package/src/adapter/backtester/error.ts +7 -0
  212. package/src/adapter/error.ts +4 -0
  213. package/src/adapter/paper/engine/paper-engine.spec.ts +38 -21
  214. package/src/adapter/paper/engine/paper-engine.ts +44 -35
  215. package/src/adapter/paper/paper-adapter.ts +15 -6
  216. package/src/cli/build.ts +1 -1
  217. package/src/cli/dev.ts +15 -7
  218. package/src/cli/error.ts +5 -0
  219. package/src/cli/internal/workspace.ts +0 -11
  220. package/src/cli/pull.ts +22 -31
  221. package/src/cli/run.ts +14 -11
  222. package/src/cli/test.ts +24 -37
  223. package/src/domain/asset.ts +1 -8
  224. package/src/domain/{balance.operator.spec.ts → balance-operator.spec.ts} +4 -3
  225. package/src/domain/{balance.operator.ts → balance-operator.ts} +0 -0
  226. package/src/domain/balance.spec.ts +15 -12
  227. package/src/domain/balance.ts +7 -11
  228. package/src/domain/commission.ts +3 -1
  229. package/src/domain/component.ts +0 -1
  230. package/src/domain/error.ts +3 -3
  231. package/src/domain/index.ts +9 -8
  232. package/src/domain/{instrument.operator.spec.ts → instrument-operator.spec.ts} +9 -2
  233. package/src/domain/{instrument.operator.ts → instrument-operator.ts} +0 -0
  234. package/src/domain/instrument.spec.ts +8 -1
  235. package/src/domain/instrument.ts +10 -12
  236. package/src/domain/ohlc-operator.spec.ts +126 -0
  237. package/src/domain/{candle.operator.ts → ohlc-operator.ts} +33 -17
  238. package/src/domain/{candle.spec.ts → ohlc.spec.ts} +6 -6
  239. package/src/domain/{candle.ts → ohlc.ts} +2 -2
  240. package/src/domain/{order.operator.spec.ts → order-operator.spec.ts} +9 -6
  241. package/src/domain/{order.operator.ts → order-operator.ts} +2 -2
  242. package/src/domain/order.spec.ts +8 -9
  243. package/src/domain/order.ts +21 -56
  244. package/src/domain/{orderbook.operator.spec.ts → orderbook-operator.spec.ts} +15 -3
  245. package/src/domain/{orderbook.operator.ts → orderbook-operator.ts} +0 -0
  246. package/src/domain/orderbook.spec.ts +11 -2
  247. package/src/domain/orderbook.ts +9 -13
  248. package/src/domain/{position.operator.spec.ts → position-operator.spec.ts} +11 -6
  249. package/src/domain/{position.operator.ts → position-operator.ts} +13 -6
  250. package/src/domain/position.spec.ts +7 -4
  251. package/src/domain/position.ts +2 -7
  252. package/src/domain/session-builder.ts +158 -0
  253. package/src/domain/session.spec.ts +2 -9
  254. package/src/domain/session.ts +86 -71
  255. package/src/domain/{trade.operator.spec.ts → trade-operator.spec.ts} +7 -3
  256. package/src/domain/{trade.operator.ts → trade-operator.ts} +0 -0
  257. package/src/domain/trade.spec.ts +6 -2
  258. package/src/domain/trade.ts +8 -11
  259. package/src/index.ts +75 -2
  260. package/src/shared/collections.spec.ts +10 -6
  261. package/src/shared/collections.ts +29 -16
  262. package/src/shared/environment.ts +13 -0
  263. package/src/shared/index.ts +1 -1
  264. package/src/shared/logger.ts +37 -7
  265. package/src/shared/pipe.ts +1 -1
  266. package/src/storage/cache.ts +3 -1
  267. package/src/storage/feed.ts +2 -0
  268. package/src/storage/storage.ts +10 -8
  269. package/src/store/error.ts +36 -0
  270. package/src/store/index.ts +7 -7
  271. package/src/store/{store-balance.event.spec.ts → store-balance-event.spec.ts} +3 -3
  272. package/src/store/{store-balance.event.ts → store-balance-event.ts} +54 -11
  273. package/src/store/{store.event.ts → store-event.ts} +0 -0
  274. package/src/store/{store-instrument.event.spec.ts → store-instrument-event.spec.ts} +6 -5
  275. package/src/store/{store-instrument.event.ts → store-instrument-event.ts} +17 -6
  276. package/src/store/store-order-event.spec.ts +32 -0
  277. package/src/store/{store-order.event.ts → store-order-event.ts} +25 -20
  278. package/src/store/{store-orderbook.event.spec.ts → store-orderbook-event.spec.ts} +11 -9
  279. package/src/store/{store-orderbook.event.ts → store-orderbook-event.ts} +7 -5
  280. package/src/store/{store-position.event.ts → store-position-event.ts} +14 -7
  281. package/src/store/store-state.ts +3 -3
  282. package/src/store/{store-trade.event.spec.ts → store-trade-event.spec.ts} +7 -5
  283. package/src/store/{store-trade.event.ts → store-trade-event.ts} +10 -4
  284. package/src/store/store.spec.ts +13 -11
  285. package/src/store/store.ts +1 -1
  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.d.ts +0 -10
  337. package/dist/domain/candle.operator.js.map +0 -1
  338. package/dist/domain/candle.operator.spec.d.ts +0 -1
  339. package/dist/domain/candle.operator.spec.js +0 -112
  340. package/dist/domain/candle.operator.spec.js.map +0 -1
  341. package/dist/domain/candle.spec.d.ts +0 -1
  342. package/dist/domain/candle.spec.js +0 -26
  343. package/dist/domain/candle.spec.js.map +0 -1
  344. package/dist/domain/commission.js.map +0 -1
  345. package/dist/domain/commission.spec.d.ts +0 -1
  346. package/dist/domain/commission.spec.js +0 -31
  347. package/dist/domain/commission.spec.js.map +0 -1
  348. package/dist/domain/component.js.map +0 -1
  349. package/dist/domain/error.js.map +0 -1
  350. package/dist/domain/index.js.map +0 -1
  351. package/dist/domain/instrument.js.map +0 -1
  352. package/dist/domain/instrument.operator.js.map +0 -1
  353. package/dist/domain/instrument.operator.spec.d.ts +0 -1
  354. package/dist/domain/instrument.operator.spec.js +0 -24
  355. package/dist/domain/instrument.operator.spec.js.map +0 -1
  356. package/dist/domain/instrument.spec.d.ts +0 -1
  357. package/dist/domain/instrument.spec.js +0 -49
  358. package/dist/domain/instrument.spec.js.map +0 -1
  359. package/dist/domain/order.js.map +0 -1
  360. package/dist/domain/order.operator.js +0 -14
  361. package/dist/domain/order.operator.js.map +0 -1
  362. package/dist/domain/order.operator.spec.d.ts +0 -1
  363. package/dist/domain/order.operator.spec.js +0 -65
  364. package/dist/domain/order.operator.spec.js.map +0 -1
  365. package/dist/domain/order.spec.d.ts +0 -1
  366. package/dist/domain/order.spec.js +0 -34
  367. package/dist/domain/order.spec.js.map +0 -1
  368. package/dist/domain/orderbook.js.map +0 -1
  369. package/dist/domain/orderbook.operator.js.map +0 -1
  370. package/dist/domain/orderbook.operator.spec.d.ts +0 -1
  371. package/dist/domain/orderbook.operator.spec.js +0 -22
  372. package/dist/domain/orderbook.operator.spec.js.map +0 -1
  373. package/dist/domain/orderbook.spec.d.ts +0 -1
  374. package/dist/domain/orderbook.spec.js +0 -13
  375. package/dist/domain/orderbook.spec.js.map +0 -1
  376. package/dist/domain/position.js.map +0 -1
  377. package/dist/domain/position.operator.js.map +0 -1
  378. package/dist/domain/position.operator.spec.d.ts +0 -1
  379. package/dist/domain/position.operator.spec.js +0 -49
  380. package/dist/domain/position.operator.spec.js.map +0 -1
  381. package/dist/domain/position.spec.d.ts +0 -1
  382. package/dist/domain/position.spec.js +0 -31
  383. package/dist/domain/position.spec.js.map +0 -1
  384. package/dist/domain/session.js.map +0 -1
  385. package/dist/domain/session.spec.d.ts +0 -1
  386. package/dist/domain/session.spec.js +0 -23
  387. package/dist/domain/session.spec.js.map +0 -1
  388. package/dist/domain/timeframe.js.map +0 -1
  389. package/dist/domain/trade.js.map +0 -1
  390. package/dist/domain/trade.operator.js.map +0 -1
  391. package/dist/domain/trade.operator.spec.d.ts +0 -1
  392. package/dist/domain/trade.operator.spec.js +0 -24
  393. package/dist/domain/trade.operator.spec.js.map +0 -1
  394. package/dist/domain/trade.spec.d.ts +0 -1
  395. package/dist/domain/trade.spec.js +0 -13
  396. package/dist/domain/trade.spec.js.map +0 -1
  397. package/dist/index.js.map +0 -1
  398. package/dist/indicator/atr.d.ts +0 -4
  399. package/dist/indicator/atr.js +0 -16
  400. package/dist/indicator/atr.js.map +0 -1
  401. package/dist/indicator/cross.d.ts +0 -4
  402. package/dist/indicator/cross.js +0 -41
  403. package/dist/indicator/cross.js.map +0 -1
  404. package/dist/indicator/cross.spec.d.ts +0 -1
  405. package/dist/indicator/cross.spec.js +0 -102
  406. package/dist/indicator/cross.spec.js.map +0 -1
  407. package/dist/indicator/donchian.d.ts +0 -10
  408. package/dist/indicator/donchian.js +0 -16
  409. package/dist/indicator/donchian.js.map +0 -1
  410. package/dist/indicator/drawdown.d.ts +0 -3
  411. package/dist/indicator/drawdown.js +0 -28
  412. package/dist/indicator/drawdown.js.map +0 -1
  413. package/dist/indicator/ema.d.ts +0 -3
  414. package/dist/indicator/ema.js +0 -24
  415. package/dist/indicator/ema.js.map +0 -1
  416. package/dist/indicator/ema.spec.d.ts +0 -1
  417. package/dist/indicator/ema.spec.js +0 -24
  418. package/dist/indicator/ema.spec.js.map +0 -1
  419. package/dist/indicator/envelope.d.ts +0 -6
  420. package/dist/indicator/envelope.js +0 -18
  421. package/dist/indicator/envelope.js.map +0 -1
  422. package/dist/indicator/index.d.ts +0 -17
  423. package/dist/indicator/index.js +0 -34
  424. package/dist/indicator/index.js.map +0 -1
  425. package/dist/indicator/macd.d.ts +0 -3
  426. package/dist/indicator/macd.js +0 -13
  427. package/dist/indicator/macd.js.map +0 -1
  428. package/dist/indicator/min-max.d.ts +0 -6
  429. package/dist/indicator/min-max.js +0 -22
  430. package/dist/indicator/min-max.js.map +0 -1
  431. package/dist/indicator/ring-buffer.d.ts +0 -16
  432. package/dist/indicator/ring-buffer.js +0 -56
  433. package/dist/indicator/ring-buffer.js.map +0 -1
  434. package/dist/indicator/rma.d.ts +0 -3
  435. package/dist/indicator/rma.js +0 -24
  436. package/dist/indicator/rma.js.map +0 -1
  437. package/dist/indicator/sma.d.ts +0 -3
  438. package/dist/indicator/sma.js +0 -17
  439. package/dist/indicator/sma.js.map +0 -1
  440. package/dist/indicator/sma.spec.d.ts +0 -1
  441. package/dist/indicator/sma.spec.js +0 -20
  442. package/dist/indicator/sma.spec.js.map +0 -1
  443. package/dist/indicator/swma.d.ts +0 -3
  444. package/dist/indicator/swma.js +0 -24
  445. package/dist/indicator/swma.js.map +0 -1
  446. package/dist/indicator/tma.d.ts +0 -3
  447. package/dist/indicator/tma.js +0 -16
  448. package/dist/indicator/tma.js.map +0 -1
  449. package/dist/indicator/tma.spec.d.ts +0 -1
  450. package/dist/indicator/tma.spec.js +0 -20
  451. package/dist/indicator/tma.spec.js.map +0 -1
  452. package/dist/indicator/trailing.d.ts +0 -14
  453. package/dist/indicator/trailing.js +0 -68
  454. package/dist/indicator/trailing.js.map +0 -1
  455. package/dist/indicator/trailing.spec.d.ts +0 -1
  456. package/dist/indicator/trailing.spec.js +0 -70
  457. package/dist/indicator/trailing.spec.js.map +0 -1
  458. package/dist/indicator/true-range.d.ts +0 -4
  459. package/dist/indicator/true-range.js +0 -20
  460. package/dist/indicator/true-range.js.map +0 -1
  461. package/dist/indicator/true-range.spec.d.ts +0 -1
  462. package/dist/indicator/true-range.spec.js +0 -28
  463. package/dist/indicator/true-range.spec.js.map +0 -1
  464. package/dist/indicator/window.d.ts +0 -3
  465. package/dist/indicator/window.js +0 -22
  466. package/dist/indicator/window.js.map +0 -1
  467. package/dist/indicator/wma.d.ts +0 -3
  468. package/dist/indicator/wma.js +0 -23
  469. package/dist/indicator/wma.js.map +0 -1
  470. package/dist/indicator/wma.spec.d.ts +0 -1
  471. package/dist/indicator/wma.spec.js +0 -20
  472. package/dist/indicator/wma.spec.js.map +0 -1
  473. package/dist/shared/collections.js.map +0 -1
  474. package/dist/shared/collections.spec.d.ts +0 -1
  475. package/dist/shared/collections.spec.js +0 -28
  476. package/dist/shared/collections.spec.js.map +0 -1
  477. package/dist/shared/datetime.js.map +0 -1
  478. package/dist/shared/decimals.js.map +0 -1
  479. package/dist/shared/decimals.spec.d.ts +0 -1
  480. package/dist/shared/decimals.spec.js +0 -29
  481. package/dist/shared/decimals.spec.js.map +0 -1
  482. package/dist/shared/index.js.map +0 -1
  483. package/dist/shared/io.d.ts +0 -1
  484. package/dist/shared/io.js +0 -8
  485. package/dist/shared/io.js.map +0 -1
  486. package/dist/shared/logger.js.map +0 -1
  487. package/dist/shared/pipe.js.map +0 -1
  488. package/dist/shared/policy.js.map +0 -1
  489. package/dist/storage/cache.js.map +0 -1
  490. package/dist/storage/cache.spec.d.ts +0 -1
  491. package/dist/storage/cache.spec.js +0 -18
  492. package/dist/storage/cache.spec.js.map +0 -1
  493. package/dist/storage/feed.js.map +0 -1
  494. package/dist/storage/index.js.map +0 -1
  495. package/dist/storage/measurement.js.map +0 -1
  496. package/dist/storage/storage.js.map +0 -1
  497. package/dist/store/index.js.map +0 -1
  498. package/dist/store/store-balance.event.js.map +0 -1
  499. package/dist/store/store-balance.event.spec.d.ts +0 -1
  500. package/dist/store/store-balance.event.spec.js +0 -26
  501. package/dist/store/store-balance.event.spec.js.map +0 -1
  502. package/dist/store/store-instrument.event.js.map +0 -1
  503. package/dist/store/store-instrument.event.spec.d.ts +0 -1
  504. package/dist/store/store-instrument.event.spec.js +0 -22
  505. package/dist/store/store-instrument.event.spec.js.map +0 -1
  506. package/dist/store/store-order.event.js.map +0 -1
  507. package/dist/store/store-order.event.spec.d.ts +0 -1
  508. package/dist/store/store-order.event.spec.js +0 -21
  509. package/dist/store/store-order.event.spec.js.map +0 -1
  510. package/dist/store/store-orderbook.event.js.map +0 -1
  511. package/dist/store/store-orderbook.event.spec.d.ts +0 -1
  512. package/dist/store/store-orderbook.event.spec.js +0 -28
  513. package/dist/store/store-orderbook.event.spec.js.map +0 -1
  514. package/dist/store/store-position.event.js.map +0 -1
  515. package/dist/store/store-state.js.map +0 -1
  516. package/dist/store/store-trade.event.js.map +0 -1
  517. package/dist/store/store-trade.event.spec.d.ts +0 -1
  518. package/dist/store/store-trade.event.spec.js +0 -44
  519. package/dist/store/store-trade.event.spec.js.map +0 -1
  520. package/dist/store/store.event.js.map +0 -1
  521. package/dist/store/store.js.map +0 -1
  522. package/dist/store/store.spec.d.ts +0 -1
  523. package/dist/store/store.spec.js +0 -119
  524. package/dist/store/store.spec.js.map +0 -1
  525. package/dist/tsconfig.tsbuildinfo +0 -1
  526. package/jestconfig.json +0 -13
  527. package/src/adapter/backtester/backtester-adapter.spec.ts +0 -133
  528. package/src/adapter/paper/paper-adapter.spec.ts +0 -114
  529. package/src/bootstrap.ts +0 -139
  530. package/src/domain/candle.operator.spec.ts +0 -126
  531. package/src/indicator/atr.ts +0 -21
  532. package/src/indicator/cross.spec.ts +0 -136
  533. package/src/indicator/cross.ts +0 -59
  534. package/src/indicator/donchian.ts +0 -38
  535. package/src/indicator/drawdown.ts +0 -29
  536. package/src/indicator/ema.spec.ts +0 -39
  537. package/src/indicator/ema.ts +0 -27
  538. package/src/indicator/envelope.ts +0 -25
  539. package/src/indicator/index.ts +0 -17
  540. package/src/indicator/macd.ts +0 -22
  541. package/src/indicator/min-max.ts +0 -28
  542. package/src/indicator/ring-buffer.ts +0 -63
  543. package/src/indicator/rma.ts +0 -26
  544. package/src/indicator/sma.spec.ts +0 -21
  545. package/src/indicator/sma.ts +0 -25
  546. package/src/indicator/swma.ts +0 -28
  547. package/src/indicator/tma.spec.ts +0 -21
  548. package/src/indicator/tma.ts +0 -20
  549. package/src/indicator/trailing.spec.ts +0 -88
  550. package/src/indicator/trailing.ts +0 -81
  551. package/src/indicator/true-range.spec.ts +0 -32
  552. package/src/indicator/true-range.ts +0 -32
  553. package/src/indicator/window.ts +0 -28
  554. package/src/indicator/wma.spec.ts +0 -20
  555. package/src/indicator/wma.ts +0 -29
  556. package/src/shared/io.ts +0 -3
  557. package/src/store/store-order.event.spec.ts +0 -28
@@ -1,12 +1,13 @@
1
- import { assetOf, Candle, InstrumentSelector, Order } from '../../domain';
2
- import { d, timestamp } from '../../shared';
1
+ import { assetOf, InstrumentSelector, Ohlc, Order } from '../../domain';
2
+ import { d, decimal, timestamp } from '../../shared';
3
3
  import { BalancePatchEvent, Store } from '../../store';
4
4
  import { Adapter } from '..';
5
5
  import { AdapterFactory, FeedAsyncCallback } from '../adapter';
6
+ import { noPaperEngineProvidedError } from '../error';
6
7
  import { PaperEngine } from './engine/paper-engine';
7
8
 
8
9
  export interface PaperOptions {
9
- balance: { [key: string]: number };
10
+ balance: { [key: string]: decimal };
10
11
  }
11
12
 
12
13
  export function createPaperAdapterFactory(
@@ -19,7 +20,7 @@ export function createPaperAdapterFactory(
19
20
 
20
21
  export class PaperAdapter extends Adapter {
21
22
  readonly name = this.decoratedAdapter.name;
22
- private engine: PaperEngine;
23
+ private engine?: PaperEngine;
23
24
 
24
25
  constructor(
25
26
  readonly decoratedAdapter: Adapter,
@@ -57,7 +58,7 @@ export class PaperAdapter extends Adapter {
57
58
  continue;
58
59
  }
59
60
 
60
- const free = d(this.options.balance[balance]);
61
+ const free = this.options.balance[balance];
61
62
 
62
63
  subscribed = subscribed.filter(it => it.id != asset.id);
63
64
 
@@ -72,10 +73,18 @@ export class PaperAdapter extends Adapter {
72
73
  }
73
74
 
74
75
  async open(order: Order): Promise<void> {
76
+ if (!this.engine) {
77
+ throw noPaperEngineProvidedError();
78
+ }
79
+
75
80
  this.engine.open(order);
76
81
  }
77
82
 
78
83
  async cancel(order: Order): Promise<void> {
84
+ if (!this.engine) {
85
+ throw noPaperEngineProvidedError();
86
+ }
87
+
79
88
  this.engine.cancel(order);
80
89
  }
81
90
 
@@ -83,7 +92,7 @@ export class PaperAdapter extends Adapter {
83
92
  instrument: InstrumentSelector,
84
93
  timeframe: number,
85
94
  length: number
86
- ): Promise<Candle[]> {
95
+ ): Promise<Ohlc[]> {
87
96
  return this.decoratedAdapter.history(instrument, timeframe, length);
88
97
  }
89
98
 
package/src/cli/build.ts CHANGED
@@ -6,7 +6,7 @@ export default async function (): Promise<number> {
6
6
  return new Promise<number>((resolve, reject) => {
7
7
  const process = spawn('swc', ['./src', '--out-dir', buildDirectory()], {
8
8
  stdio: 'inherit',
9
- shell: false
9
+ shell: true
10
10
  });
11
11
 
12
12
  process.once('exit', resolve);
package/src/cli/dev.ts CHANGED
@@ -1,18 +1,26 @@
1
- import { Bootstrap } from '../bootstrap';
1
+ import { join } from 'path';
2
+
3
+ import { spawn } from '..';
4
+ import { SessionBuilder } from '../domain/session-builder';
5
+ import { now } from '../shared';
2
6
  import build from './build';
3
- import { getModule } from './internal/workspace';
7
+ import { buildDirectory } from './internal/workspace';
4
8
 
5
9
  export default async function (name: string, options: any) {
6
10
  if (await build()) {
7
11
  return;
8
12
  }
9
13
 
10
- const id = options.id ? Number(options.id) : undefined;
14
+ await import(join(buildDirectory(), 'index'));
15
+
16
+ const builder = new SessionBuilder().useSessionId(
17
+ options.id ? Number(options.id) : now()
18
+ );
11
19
 
12
- const module = await getModule(name);
20
+ const rules = await spawn(name, builder);
13
21
 
14
- const bootstrap = new Bootstrap(module.descriptor);
15
- const session = bootstrap.useSessionId(id).paper();
22
+ const session = builder.paper();
23
+ await session.awake();
16
24
 
17
- await session.awake(module.default);
25
+ rules(session).subscribe();
18
26
  }
@@ -0,0 +1,5 @@
1
+ export function missingDescriptorParameterError(parameterName: string) {
2
+ return new Error(
3
+ `please set a "${parameterName}" date in session descriptor or provide the date as parameter.`
4
+ );
5
+ }
@@ -1,18 +1,7 @@
1
1
  import { join } from 'path';
2
- import { Observable } from 'rxjs';
3
2
 
4
- import { Session, SessionDescriptor } from './../../domain';
5
3
  import { workingDirectory } from './../../shared';
6
4
 
7
- export type StrategyModule = {
8
- descriptor: SessionDescriptor;
9
- default: (session: Session) => Observable<any>;
10
- };
11
-
12
5
  export function buildDirectory() {
13
6
  return join(process.cwd(), workingDirectory(), 'build');
14
7
  }
15
-
16
- export async function getModule(name: string): Promise<StrategyModule> {
17
- return await import(join(buildDirectory(), name));
18
- }
package/src/cli/pull.ts CHANGED
@@ -1,51 +1,42 @@
1
1
  import { Presets, SingleBar } from 'cli-progress';
2
+ import { join } from 'path';
2
3
 
3
- import { Bootstrap } from '../bootstrap';
4
+ import { spawn } from '..';
4
5
  import { instrumentOf } from '../domain';
6
+ import { SessionBuilder } from '../domain/session-builder';
7
+ import { now } from '../shared';
5
8
  import { Feed } from '../storage';
6
9
  import build from './build';
7
- import { getModule } from './internal/workspace';
10
+ import { buildDirectory } from './internal/workspace';
8
11
 
9
12
  export default async function (name: string, instrument: string, options: any) {
10
13
  if (await build()) {
11
14
  return;
12
15
  }
16
+ await import(join(buildDirectory(), 'index'));
13
17
 
14
- const id = options.id ? Number(options.id) : undefined;
15
-
16
- const module = await getModule(name);
17
-
18
- const bootstrap = new Bootstrap(module.descriptor);
19
- const session = bootstrap.useSessionId(id).paper();
20
-
21
- if (!module.descriptor.storage) {
22
- throw new Error('Please provide a "storage" property in session descriptor.');
23
- }
24
-
25
- const from = options.from
26
- ? Date.parse(options.from)
27
- : module.descriptor.simulation.from;
28
-
29
- if (!from) {
30
- throw new Error(
31
- 'Please set a "from" date in session descriptor or provide the date as parameter.'
32
- );
33
- }
18
+ const builder = new SessionBuilder().useSessionId(
19
+ options.id ? Number(options.id) : now()
20
+ );
34
21
 
35
- const to = options.to ? Date.parse(options.to) : module.descriptor.simulation.to;
22
+ await spawn(name, builder);
36
23
 
37
- if (!to) {
38
- throw new Error(
39
- 'Please set a "to" date in session descriptor or provide the date as parameter.'
40
- );
41
- }
24
+ const session = builder.paper();
42
25
 
43
26
  console.time('Pulling completed in');
44
27
 
45
- await session.awake(undefined);
28
+ await session.awake();
29
+
30
+ const bar = new SingleBar(
31
+ {
32
+ format: `Pulling ${instrument} [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}`
33
+ },
34
+ Presets.rect
35
+ );
46
36
 
47
- const bar = new SingleBar({}, Presets.shades_classic);
48
- const feed = new Feed(module.descriptor.storage('feed'));
37
+ const feed = new Feed(builder.storage('feed'));
38
+ const from = options.from ? Date.parse(options.from) : builder.period.from;
39
+ const to = options.to ? Date.parse(options.to) : builder.period.to;
49
40
 
50
41
  bar.start(100, 0);
51
42
 
package/src/cli/run.ts CHANGED
@@ -1,22 +1,25 @@
1
- import * as dotenv from 'dotenv';
1
+ import { join } from 'path';
2
2
 
3
- import { Bootstrap } from '../bootstrap';
3
+ import { spawn } from '..';
4
+ import { SessionBuilder } from '../domain/session-builder';
5
+ import { now } from '../shared';
4
6
  import build from './build';
5
- import { getModule } from './internal/workspace';
7
+ import { buildDirectory } from './internal/workspace';
6
8
 
7
- export default async function (name, options: any) {
9
+ export default async function (name: string, options: any) {
8
10
  if (await build()) {
9
11
  return;
10
12
  }
13
+ await import(join(buildDirectory(), 'index'));
11
14
 
12
- dotenv.config();
15
+ const builder = new SessionBuilder().useSessionId(
16
+ options.id ? Number(options.id) : now()
17
+ );
13
18
 
14
- const id = options.id ? Number(options.id) : undefined;
19
+ const rules = await spawn(name, builder);
15
20
 
16
- const module = await getModule(name);
21
+ const session = builder.live();
22
+ await session.awake();
17
23
 
18
- const bootstrap = new Bootstrap(module.descriptor);
19
- const session = bootstrap.useSessionId(id).live();
20
-
21
- await session.awake(module.default);
24
+ rules(session).subscribe();
22
25
  }
package/src/cli/test.ts CHANGED
@@ -1,53 +1,40 @@
1
- import { Bootstrap } from '../bootstrap';
1
+ import { join } from 'path';
2
+
3
+ import { SessionBuilder } from '../domain/session-builder';
4
+ import { Logger, now } from '../shared';
5
+ import { spawn } from '..';
2
6
  import build from './build';
3
- import { getModule } from './internal/workspace';
7
+ import { buildDirectory } from './internal/workspace';
4
8
 
5
- export default async function (name, options: any) {
9
+ export default async function (name: string, options: any) {
6
10
  if (await build()) {
7
11
  return;
8
12
  }
9
13
 
10
- const module = await getModule(name);
14
+ await import(join(buildDirectory(), 'index'));
11
15
 
12
- const bootstrap = new Bootstrap(module.descriptor);
16
+ const builder = new SessionBuilder().useSessionId(
17
+ options.id ? Number(options.id) : now()
18
+ );
13
19
 
14
- if (!module.descriptor.storage) {
15
- throw new Error('Please provide a "storage" property in session descriptor.');
16
- }
20
+ const rules = await spawn(name, builder);
17
21
 
18
- const from = options.from
19
- ? Date.parse(options.from)
20
- : module.descriptor.simulation.from;
22
+ const startTime = performance.now();
21
23
 
22
- if (!from) {
23
- throw new Error(
24
- 'Please set a "from" date in session descriptor or provide the date as parameter.'
25
- );
26
- }
24
+ const [session, backtester] = builder.backtest({
25
+ onBacktestStarted: () => Logger.info('backtest', `new session ${session.id} started`),
26
+ onBacktestCompleted: async () => {
27
+ await session.dispose();
27
28
 
28
- const to = options.to ? Date.parse(options.to) : module.descriptor.simulation.to;
29
+ const seconds = ((performance.now() - startTime) / 1000).toFixed(3);
29
30
 
30
- if (!to) {
31
- throw new Error(
32
- 'Please set a "to" date in session descriptor or provide the date as parameter.'
33
- );
34
- }
35
-
36
- await new Promise<void>(async resolve => {
37
- const [session] = bootstrap.useBacktestPeriod(from, to).backtest({
38
- onBacktestStarted: () => {
39
- console.log('backtest started');
40
- console.time('backtest completed');
41
- },
42
- onBacktestCompleted: async () => {
43
- await session.dispose();
31
+ Logger.info('backtest', `session ${session.id} completed in ${seconds}s`);
32
+ }
33
+ });
44
34
 
45
- console.timeEnd('backtest completed');
35
+ await session.awake();
46
36
 
47
- resolve();
48
- }
49
- });
37
+ rules(session).subscribe();
50
38
 
51
- await session.awake(module.default);
52
- });
39
+ backtester.tryContinue();
53
40
  }
@@ -4,7 +4,7 @@ import { invalidArgumentError, invalidAssetSelectorError } from './error';
4
4
  export const AssetSelectorSeparator = ':';
5
5
 
6
6
  /**
7
- * Supposed to query specific @see Asset from based on string notation.
7
+ * Supposed to query specific @see Asset based on string notation.
8
8
  */
9
9
  export class AssetSelector {
10
10
  readonly id: string;
@@ -24,13 +24,6 @@ export class AssetSelector {
24
24
  this.adapterName = adapterName.toLowerCase();
25
25
  this.id = `${this.adapterName}${AssetSelectorSeparator}${this.name}`;
26
26
  }
27
-
28
- /**
29
- * Returns unified notation of the asset.
30
- */
31
- toString(): string {
32
- return this.id;
33
- }
34
27
  }
35
28
 
36
29
  /**
@@ -3,18 +3,19 @@ import { Subject } from 'rxjs';
3
3
  import { State } from '../store';
4
4
  import { Asset } from './asset';
5
5
  import { Balance } from './balance';
6
- import { balance } from './balance.operator';
6
+ import { balance } from './balance-operator';
7
7
  import { Component } from './component';
8
8
 
9
9
  describe('balance', () => {
10
+ const timestamp = 0;
10
11
  const asset = new Asset('abc', 'xyz', 4);
11
12
  const state = new State();
12
13
 
13
14
  beforeEach(() => {
14
- state.balance.upsert(new Balance(asset));
15
+ state.balance.upsert(new Balance(timestamp, asset));
15
16
  });
16
17
 
17
- test('should pipe a balance on subscription', done => {
18
+ test('should pipe a balance snapshot when subscribed', done => {
18
19
  new Subject<Component>().pipe(balance(asset, state)).subscribe({
19
20
  next: it => {
20
21
  expect(it.asset).toEqual(asset);
@@ -1,19 +1,22 @@
1
1
  import { d } from '../shared';
2
2
  import { Asset } from './asset';
3
3
  import { Balance } from './balance';
4
+ import { Commission } from './commission';
4
5
  import { Instrument } from './instrument';
5
6
  import { Position } from './position';
6
7
 
7
8
  describe('Balance', () => {
8
9
  const asset = new Asset('abc', 'xyz', 4);
9
10
  const instrument = new Instrument(
11
+ 0,
10
12
  new Asset('abc', 'xyz', 4),
11
13
  new Asset('def', 'xyz', 4),
12
- 'abc-def'
14
+ 'abc-def',
15
+ Commission.Zero
13
16
  );
14
17
 
15
18
  test('should construct empty balance', () => {
16
- const sut = new Balance(asset);
19
+ const sut = new Balance(0, asset);
17
20
 
18
21
  expect(sut.asset.id).toEqual('xyz:abc');
19
22
  expect(sut.free).toEqual(d.Zero);
@@ -22,7 +25,7 @@ describe('Balance', () => {
22
25
  });
23
26
 
24
27
  test('should construct balance', () => {
25
- const sut = new Balance(asset);
28
+ const sut = new Balance(1, asset);
26
29
 
27
30
  sut.set(d(100), d(50));
28
31
 
@@ -34,7 +37,7 @@ describe('Balance', () => {
34
37
  });
35
38
 
36
39
  test('should account positive amount', () => {
37
- const sut = new Balance(asset);
40
+ const sut = new Balance(0, asset);
38
41
 
39
42
  sut.set(d(100), d.Zero);
40
43
  sut.account(d(10));
@@ -45,7 +48,7 @@ describe('Balance', () => {
45
48
  });
46
49
 
47
50
  test('should account negative amount', () => {
48
- const sut = new Balance(asset);
51
+ const sut = new Balance(0, asset);
49
52
 
50
53
  sut.set(d(100), d.Zero);
51
54
  sut.account(d(-10));
@@ -56,7 +59,7 @@ describe('Balance', () => {
56
59
  });
57
60
 
58
61
  test('should throw for insufficient balance account amount', () => {
59
- const sut = new Balance(asset);
62
+ const sut = new Balance(0, asset);
60
63
 
61
64
  sut.set(d(100), d.Zero);
62
65
  const fn = () => sut.account(d(-120));
@@ -65,7 +68,7 @@ describe('Balance', () => {
65
68
  });
66
69
 
67
70
  test('should lock specific amount of available balance', () => {
68
- const sut = new Balance(asset);
71
+ const sut = new Balance(0, asset);
69
72
 
70
73
  sut.set(d(100), d.Zero);
71
74
  sut.lock('key', d(10));
@@ -76,7 +79,7 @@ describe('Balance', () => {
76
79
  });
77
80
 
78
81
  test('should throw for lock insufficient amount of available balance', () => {
79
- const sut = new Balance(asset);
82
+ const sut = new Balance(0, asset);
80
83
 
81
84
  sut.set(d(30), d(50));
82
85
  const fn = () => sut.lock('key', d(100));
@@ -84,8 +87,8 @@ describe('Balance', () => {
84
87
  expect(fn).toThrowError();
85
88
  });
86
89
 
87
- test('should lock an unlock specific amount of available balance', () => {
88
- const sut = new Balance(asset);
90
+ test('should lock and unlock specific amount of available balance', () => {
91
+ const sut = new Balance(0, asset);
89
92
 
90
93
  sut.set(d(100), d.Zero);
91
94
  sut.lock('key', d(40));
@@ -97,11 +100,11 @@ describe('Balance', () => {
97
100
  });
98
101
 
99
102
  test('should return correct estimated unrealized pnl', () => {
100
- const position = new Position('1', instrument, 'CROSS', d(2511.81), d(10.31), 20);
103
+ const position = new Position(0, '1', instrument, 'CROSS', d(2511.81), d(10.31), 20);
101
104
 
102
105
  position.calculateEstimatedUnrealizedPnL(d(2576.44));
103
106
 
104
- const sut = new Balance(asset);
107
+ const sut = new Balance(0, asset);
105
108
 
106
109
  sut.set(d(100), d.Zero);
107
110
  sut.position['1'] = position;
@@ -1,4 +1,4 @@
1
- import { d, decimal, timestamp } from '../shared';
1
+ import { d, decimal } from '../shared';
2
2
  import { Asset } from './';
3
3
  import { Component } from './component';
4
4
  import { insufficientFundsError, invalidArgumentError } from './error';
@@ -9,8 +9,6 @@ import { Position, PositionMode } from './position';
9
9
  */
10
10
  export class Balance implements Component {
11
11
  id: string;
12
- kind = 'balance';
13
- timestamp: timestamp;
14
12
 
15
13
  private locker: Record<string, decimal> = {};
16
14
  private available = d.Zero;
@@ -45,7 +43,7 @@ export class Balance implements Component {
45
43
  */
46
44
  readonly position: Record<string, Position> = {};
47
45
 
48
- constructor(public readonly asset: Asset) {
46
+ constructor(public timestamp: number, public readonly asset: Asset) {
49
47
  this.id = asset.id;
50
48
  }
51
49
 
@@ -106,9 +104,11 @@ export class Balance implements Component {
106
104
  getEstimatedUnrealizedPnL(mode?: PositionMode): decimal {
107
105
  return Object.values(this.position).reduce(
108
106
  (aggregate, position) =>
109
- (aggregate = aggregate.add(
110
- mode && mode != position.mode ? 0 : position.estimatedUnrealizedPnL
111
- )),
107
+ aggregate.add(
108
+ mode && mode != position.mode
109
+ ? d.Zero
110
+ : position.estimatedUnrealizedPnL ?? d.Zero
111
+ ),
112
112
  d.Zero
113
113
  );
114
114
  }
@@ -120,8 +120,4 @@ export class Balance implements Component {
120
120
  d.Zero
121
121
  );
122
122
  }
123
-
124
- toString() {
125
- return this.asset.toString();
126
- }
127
123
  }
@@ -1,6 +1,8 @@
1
- import { decimal } from '../shared';
1
+ import { d, decimal } from '../shared';
2
2
 
3
3
  export class Commission {
4
+ static readonly Zero = commissionPercentOf({ maker: d.Zero, taker: d.Zero });
5
+
4
6
  constructor(readonly makerRate: decimal, readonly takerRate: decimal) {}
5
7
 
6
8
  calculateMakerFee(value: decimal) {
@@ -2,6 +2,5 @@ import { timestamp } from '../shared';
2
2
 
3
3
  export interface Component {
4
4
  id: string;
5
- kind: string;
6
5
  timestamp: timestamp;
7
6
  }
@@ -11,15 +11,15 @@ export function insufficientFundsError(
11
11
  }
12
12
 
13
13
  export function invalidArgumentError(value: any) {
14
- throw new Error(`invalid argument: ${value}`);
14
+ return new Error(`invalid argument: ${value}`);
15
15
  }
16
16
 
17
17
  export function invalidAssetSelectorError(selector: string) {
18
- throw new Error(`invalid asset selector: ${selector}`);
18
+ return new Error(`invalid asset selector: ${selector}`);
19
19
  }
20
20
 
21
21
  export function invalidInstrumentSelectorError(selector: string) {
22
- throw new Error(`invalid instrument selector: ${selector}`);
22
+ return new Error(`invalid instrument selector: ${selector}`);
23
23
  }
24
24
 
25
25
  export function adapterMismatchError() {
@@ -1,20 +1,21 @@
1
1
  export * from './asset';
2
2
  export * from './balance';
3
- export * from './balance.operator';
3
+ export * from './balance-operator';
4
4
  export * from './error';
5
- export * from './candle';
6
- export * from './candle.operator';
5
+ export * from './ohlc';
6
+ export * from './ohlc-operator';
7
7
  export * from './commission';
8
8
  export * from './component';
9
9
  export * from './instrument';
10
- export * from './instrument.operator';
10
+ export * from './instrument-operator';
11
11
  export * from './order';
12
- export * from './order.operator';
12
+ export * from './order-operator';
13
13
  export * from './orderbook';
14
- export * from './orderbook.operator';
14
+ export * from './orderbook-operator';
15
15
  export * from './position';
16
- export * from './position.operator';
16
+ export * from './position-operator';
17
17
  export * from './session';
18
+ export * from './session-builder';
18
19
  export * from './timeframe';
19
20
  export * from './trade';
20
- export * from './trade.operator';
21
+ export * from './trade-operator';
@@ -2,16 +2,23 @@ import { Subject } from 'rxjs';
2
2
 
3
3
  import { State } from '../store';
4
4
  import { Asset } from './asset';
5
+ import { Commission } from './commission';
5
6
  import { Component } from './component';
6
7
  import { Instrument, instrumentOf } from './instrument';
7
- import { instrument } from './instrument.operator';
8
+ import { instrument } from './instrument-operator';
8
9
 
9
10
  describe('instrument', () => {
10
11
  const state = new State();
11
12
 
12
13
  beforeEach(() => {
13
14
  state.universe.instrument.upsert(
14
- new Instrument(new Asset('abc', 'xyz', 4), new Asset('def', 'xyz', 4), 'abc-def')
15
+ new Instrument(
16
+ 0,
17
+ new Asset('abc', 'xyz', 4),
18
+ new Asset('def', 'xyz', 4),
19
+ 'abc-def',
20
+ Commission.Zero
21
+ )
15
22
  );
16
23
  });
17
24
 
@@ -1,12 +1,19 @@
1
+ import { d } from '../shared';
1
2
  import { Asset, assetOf } from './asset';
3
+ import { commissionPercentOf } from './commission';
2
4
  import { Instrument, instrumentOf } from './instrument';
3
5
 
4
6
  describe('Instrument', () => {
5
7
  test('should construct a instrument', () => {
6
8
  const sut = new Instrument(
9
+ 0,
7
10
  new Asset('abc', 'xyz', 4),
8
11
  new Asset('def', 'xyz', 4),
9
- 'abc-def'
12
+ 'abc-def',
13
+ commissionPercentOf({
14
+ maker: d.Zero,
15
+ taker: d.Zero
16
+ })
10
17
  );
11
18
 
12
19
  expect(sut.base.name).toEqual('abc');