@quantform/core 0.5.14 → 0.5.15

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 (408) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +4 -2
  2. package/dist/adapter/adapter-aggregate.js +16 -18
  3. package/dist/adapter/adapter-aggregate.js.map +1 -1
  4. package/dist/adapter/adapter.d.ts +20 -21
  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 +9 -7
  8. package/dist/adapter/backtester/backtester-adapter.js +13 -12
  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 +82 -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 +17 -18
  17. package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
  18. package/dist/adapter/backtester/backtester-streamer.d.ts +4 -1
  19. package/dist/adapter/backtester/backtester-streamer.js +39 -18
  20. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  21. package/dist/adapter/backtester/backtester-streamer.spec.js +13 -13
  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 +103 -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 +7 -7
  36. package/dist/adapter/paper/paper-adapter.js +20 -18
  37. package/dist/adapter/paper/paper-adapter.js.map +1 -1
  38. package/dist/adapter/paper/paper-adapter.spec.js +35 -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 +3 -1
  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 +6 -5
  47. package/dist/domain/asset.js +22 -16
  48. package/dist/domain/asset.js.map +1 -1
  49. package/dist/domain/asset.spec.js +32 -32
  50. package/dist/domain/asset.spec.js.map +1 -1
  51. package/dist/domain/balance.d.ts +7 -7
  52. package/dist/domain/balance.js +26 -21
  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/{shared/policy.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 +67 -7
  61. package/dist/domain/balance.spec.js.map +1 -1
  62. package/dist/domain/candle.d.ts +2 -17
  63. package/dist/domain/candle.js +3 -70
  64. package/dist/domain/candle.js.map +1 -1
  65. package/dist/domain/candle.operator.d.ts +9 -0
  66. package/dist/domain/candle.operator.js +64 -0
  67. package/dist/domain/candle.operator.js.map +1 -0
  68. package/dist/{shared/topic.spec.d.ts → domain/candle.operator.spec.d.ts} +0 -0
  69. package/dist/domain/candle.operator.spec.js +111 -0
  70. package/dist/domain/candle.operator.spec.js.map +1 -0
  71. package/dist/domain/candle.spec.js +11 -53
  72. package/dist/domain/candle.spec.js.map +1 -1
  73. package/dist/domain/commission.d.ts +4 -1
  74. package/dist/domain/commission.js +2 -2
  75. package/dist/domain/commission.js.map +1 -1
  76. package/dist/{store/event/store-balance.event.spec.d.ts → domain/commission.spec.d.ts} +0 -0
  77. package/dist/domain/commission.spec.js +30 -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 +5 -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-candle.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 +12 -14
  98. package/dist/domain/order.js +37 -26
  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-instrument.event.spec.d.ts → domain/order.operator.spec.d.ts} +0 -0
  104. package/dist/domain/order.operator.spec.js +64 -0
  105. package/dist/domain/order.operator.spec.js.map +1 -0
  106. package/dist/{store/event/store-order.event.spec.d.ts → domain/order.spec.d.ts} +0 -0
  107. package/dist/domain/order.spec.js +33 -0
  108. package/dist/domain/order.spec.js.map +1 -0
  109. package/dist/domain/orderbook.d.ts +1 -0
  110. package/dist/domain/orderbook.js +1 -0
  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-trade.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/domain/orderbook.spec.d.ts +1 -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 +6 -11
  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 +10 -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 +48 -0
  129. package/dist/domain/position.operator.spec.js.map +1 -0
  130. package/dist/domain/position.spec.js +21 -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 +1 -1
  136. package/dist/domain/session.spec.js.map +1 -1
  137. package/dist/domain/trade.d.ts +1 -0
  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/cross.spec.js +2 -2
  150. package/dist/indicator/cross.spec.js.map +1 -1
  151. package/dist/indicator/ema.spec.js +1 -1
  152. package/dist/indicator/ema.spec.js.map +1 -1
  153. package/dist/indicator/sma.spec.js +1 -1
  154. package/dist/indicator/sma.spec.js.map +1 -1
  155. package/dist/indicator/tma.spec.js +1 -1
  156. package/dist/indicator/tma.spec.js.map +1 -1
  157. package/dist/indicator/trailing.spec.js +2 -2
  158. package/dist/indicator/trailing.spec.js.map +1 -1
  159. package/dist/indicator/truerange.spec.js +1 -1
  160. package/dist/indicator/truerange.spec.js.map +1 -1
  161. package/dist/indicator/wma.spec.js +1 -1
  162. package/dist/indicator/wma.spec.js.map +1 -1
  163. package/dist/shared/collections.d.ts +10 -0
  164. package/dist/shared/collections.js +33 -0
  165. package/dist/shared/collections.js.map +1 -0
  166. package/dist/shared/datetime.d.ts +0 -1
  167. package/dist/shared/datetime.js +1 -12
  168. package/dist/shared/datetime.js.map +1 -1
  169. package/dist/shared/decimals.d.ts +1 -1
  170. package/dist/shared/decimals.js +4 -5
  171. package/dist/shared/decimals.js.map +1 -1
  172. package/dist/shared/decimals.spec.js +2 -1
  173. package/dist/shared/decimals.spec.js.map +1 -1
  174. package/dist/shared/index.d.ts +1 -1
  175. package/dist/shared/index.js +1 -1
  176. package/dist/shared/index.js.map +1 -1
  177. package/dist/shared/io.js.map +1 -1
  178. package/dist/shared/policy.d.ts +0 -1
  179. package/dist/shared/policy.js +1 -11
  180. package/dist/shared/policy.js.map +1 -1
  181. package/dist/storage/cache.js +1 -1
  182. package/dist/storage/cache.js.map +1 -1
  183. package/dist/storage/cache.spec.d.ts +1 -0
  184. package/dist/storage/cache.spec.js +18 -0
  185. package/dist/storage/cache.spec.js.map +1 -0
  186. package/dist/storage/feed.d.ts +3 -4
  187. package/dist/storage/feed.js +16 -6
  188. package/dist/storage/feed.js.map +1 -1
  189. package/dist/storage/storage.d.ts +2 -7
  190. package/dist/storage/storage.js +6 -11
  191. package/dist/storage/storage.js.map +1 -1
  192. package/dist/store/index.d.ts +8 -2
  193. package/dist/store/index.js +8 -2
  194. package/dist/store/index.js.map +1 -1
  195. package/dist/store/store-balance.event.d.ts +33 -0
  196. package/dist/store/store-balance.event.js +90 -0
  197. package/dist/store/store-balance.event.js.map +1 -0
  198. package/dist/store/store-balance.event.spec.d.ts +1 -0
  199. package/dist/store/{event/store-balance.event.spec.js → store-balance.event.spec.js} +7 -7
  200. package/dist/store/store-balance.event.spec.js.map +1 -0
  201. package/dist/store/{event/store-instrument.event.d.ts → store-instrument.event.d.ts} +5 -8
  202. package/dist/store/store-instrument.event.js +52 -0
  203. package/dist/store/store-instrument.event.js.map +1 -0
  204. package/dist/store/store-instrument.event.spec.d.ts +1 -0
  205. package/dist/store/store-instrument.event.spec.js +22 -0
  206. package/dist/store/store-instrument.event.spec.js.map +1 -0
  207. package/dist/store/store-order.event.d.ts +59 -0
  208. package/dist/store/store-order.event.js +181 -0
  209. package/dist/store/store-order.event.js.map +1 -0
  210. package/dist/store/store-order.event.spec.d.ts +1 -0
  211. package/dist/store/{event/store-order.event.spec.js → store-order.event.spec.js} +8 -8
  212. package/dist/store/store-order.event.spec.js.map +1 -0
  213. package/dist/store/{event/store-orderbook.event.d.ts → store-orderbook.event.d.ts} +4 -5
  214. package/dist/store/store-orderbook.event.js +42 -0
  215. package/dist/store/store-orderbook.event.js.map +1 -0
  216. package/dist/store/{event/store-position.event.d.ts → store-position.event.d.ts} +5 -7
  217. package/dist/store/store-position.event.js +77 -0
  218. package/dist/store/store-position.event.js.map +1 -0
  219. package/dist/store/store-state.d.ts +27 -0
  220. package/dist/store/store-state.js +29 -0
  221. package/dist/store/store-state.js.map +1 -0
  222. package/dist/store/{event/store-trade.event.d.ts → store-trade.event.d.ts} +4 -5
  223. package/dist/store/store-trade.event.js +25 -0
  224. package/dist/store/store-trade.event.js.map +1 -0
  225. package/dist/store/store-trade.event.spec.d.ts +1 -0
  226. package/dist/store/{event/store-trade.event.spec.js → store-trade.event.spec.js} +13 -13
  227. package/dist/store/store-trade.event.spec.js.map +1 -0
  228. package/dist/store/store.d.ts +4 -25
  229. package/dist/store/store.event.d.ts +6 -0
  230. package/dist/store/{event/store.event.js → store.event.js} +0 -0
  231. package/dist/store/store.event.js.map +1 -0
  232. package/dist/store/store.js +7 -195
  233. package/dist/store/store.js.map +1 -1
  234. package/dist/store/store.spec.d.ts +1 -0
  235. package/dist/store/store.spec.js +119 -0
  236. package/dist/store/store.spec.js.map +1 -0
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/{jestconfig.unit.json → jestconfig.json} +1 -2
  239. package/package.json +2 -6
  240. package/src/adapter/adapter-aggregate.ts +27 -35
  241. package/src/adapter/adapter.ts +25 -54
  242. package/src/adapter/backtester/backtester-adapter.spec.ts +124 -0
  243. package/src/adapter/backtester/backtester-adapter.ts +28 -17
  244. package/src/adapter/backtester/backtester-cursor.spec.ts +18 -19
  245. package/src/adapter/backtester/backtester-cursor.ts +7 -7
  246. package/src/adapter/backtester/backtester-streamer.spec.ts +19 -19
  247. package/src/adapter/backtester/backtester-streamer.ts +50 -20
  248. package/src/adapter/error.ts +9 -0
  249. package/src/adapter/paper/engine/paper-engine.spec.ts +92 -0
  250. package/src/adapter/paper/engine/paper-engine.ts +135 -0
  251. package/src/adapter/paper/index.ts +1 -2
  252. package/src/adapter/paper/paper-adapter.spec.ts +55 -19
  253. package/src/adapter/paper/paper-adapter.ts +27 -24
  254. package/src/bootstrap.ts +26 -19
  255. package/src/cli/pull.ts +5 -1
  256. package/src/cli/test.ts +5 -2
  257. package/src/domain/asset.spec.ts +33 -29
  258. package/src/domain/asset.ts +27 -21
  259. package/src/domain/balance.operator.spec.ts +25 -0
  260. package/src/domain/balance.operator.ts +15 -0
  261. package/src/domain/balance.spec.ts +95 -7
  262. package/src/domain/balance.ts +35 -29
  263. package/src/domain/candle.operator.spec.ts +125 -0
  264. package/src/domain/candle.operator.ts +106 -0
  265. package/src/domain/candle.spec.ts +12 -68
  266. package/src/domain/candle.ts +2 -114
  267. package/src/domain/commission.spec.ts +33 -0
  268. package/src/domain/commission.ts +2 -2
  269. package/src/domain/component.ts +1 -0
  270. package/src/domain/error.ts +25 -0
  271. package/src/domain/index.ts +8 -1
  272. package/src/domain/instrument.operator.spec.ts +28 -0
  273. package/src/domain/instrument.operator.ts +25 -0
  274. package/src/domain/instrument.spec.ts +22 -30
  275. package/src/domain/instrument.ts +20 -11
  276. package/src/domain/order.operator.spec.ts +81 -0
  277. package/src/domain/order.operator.ts +23 -0
  278. package/src/domain/order.spec.ts +43 -0
  279. package/src/domain/order.ts +43 -46
  280. package/src/domain/orderbook.operator.spec.ts +28 -0
  281. package/src/domain/orderbook.operator.ts +15 -0
  282. package/src/domain/orderbook.spec.ts +17 -0
  283. package/src/domain/orderbook.ts +4 -1
  284. package/src/domain/position.operator.spec.ts +58 -0
  285. package/src/domain/position.operator.ts +61 -0
  286. package/src/domain/position.spec.ts +28 -24
  287. package/src/domain/position.ts +16 -48
  288. package/src/domain/session.spec.ts +1 -1
  289. package/src/domain/session.ts +41 -131
  290. package/src/domain/trade.operator.spec.ts +31 -0
  291. package/src/domain/trade.operator.ts +15 -0
  292. package/src/domain/trade.spec.ts +17 -0
  293. package/src/domain/trade.ts +4 -1
  294. package/src/indicator/cross.spec.ts +2 -2
  295. package/src/indicator/ema.spec.ts +1 -1
  296. package/src/indicator/sma.spec.ts +1 -1
  297. package/src/indicator/tma.spec.ts +1 -1
  298. package/src/indicator/trailing.spec.ts +2 -2
  299. package/src/indicator/truerange.spec.ts +1 -1
  300. package/src/indicator/wma.spec.ts +1 -1
  301. package/src/shared/collections.ts +35 -0
  302. package/src/shared/datetime.ts +0 -12
  303. package/src/shared/decimals.spec.ts +2 -1
  304. package/src/shared/decimals.ts +6 -6
  305. package/src/shared/index.ts +1 -1
  306. package/src/shared/io.ts +0 -2
  307. package/src/shared/policy.ts +0 -13
  308. package/src/storage/cache.spec.ts +18 -0
  309. package/src/storage/cache.ts +1 -1
  310. package/src/storage/feed.ts +26 -16
  311. package/src/storage/storage.ts +9 -13
  312. package/src/store/index.ts +8 -2
  313. package/src/store/{event/store-balance.event.spec.ts → store-balance.event.spec.ts} +6 -6
  314. package/src/store/store-balance.event.ts +124 -0
  315. package/src/store/store-instrument.event.spec.ts +25 -0
  316. package/src/store/store-instrument.event.ts +72 -0
  317. package/src/store/store-order.event.spec.ts +28 -0
  318. package/src/store/store-order.event.ts +214 -0
  319. package/src/store/store-orderbook.event.ts +54 -0
  320. package/src/store/store-position.event.ts +102 -0
  321. package/src/store/store-state.ts +48 -0
  322. package/src/store/{event/store-trade.event.spec.ts → store-trade.event.spec.ts} +14 -14
  323. package/src/store/store-trade.event.ts +36 -0
  324. package/src/store/store.event.ts +8 -0
  325. package/src/store/store.spec.ts +180 -0
  326. package/src/store/store.ts +10 -208
  327. package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +0 -10
  328. package/dist/adapter/paper/simulator/paper-margin-simulator.js +0 -69
  329. package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +0 -1
  330. package/dist/adapter/paper/simulator/paper-simulator.d.ts +0 -16
  331. package/dist/adapter/paper/simulator/paper-simulator.js +0 -93
  332. package/dist/adapter/paper/simulator/paper-simulator.js.map +0 -1
  333. package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +0 -13
  334. package/dist/adapter/paper/simulator/paper-spot-simulator.js +0 -81
  335. package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +0 -1
  336. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +0 -49
  337. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +0 -1
  338. package/dist/domain/statement.d.ts +0 -4
  339. package/dist/domain/statement.js +0 -87
  340. package/dist/domain/statement.js.map +0 -1
  341. package/dist/shared/policy.spec.js +0 -22
  342. package/dist/shared/policy.spec.js.map +0 -1
  343. package/dist/shared/topic.d.ts +0 -14
  344. package/dist/shared/topic.js +0 -40
  345. package/dist/shared/topic.js.map +0 -1
  346. package/dist/shared/topic.spec.js +0 -43
  347. package/dist/shared/topic.spec.js.map +0 -1
  348. package/dist/store/event/index.d.ts +0 -8
  349. package/dist/store/event/index.js +0 -25
  350. package/dist/store/event/index.js.map +0 -1
  351. package/dist/store/event/store-balance.event.d.ts +0 -37
  352. package/dist/store/event/store-balance.event.js +0 -119
  353. package/dist/store/event/store-balance.event.js.map +0 -1
  354. package/dist/store/event/store-balance.event.spec.js.map +0 -1
  355. package/dist/store/event/store-candle.event.d.ts +0 -18
  356. package/dist/store/event/store-candle.event.js +0 -63
  357. package/dist/store/event/store-candle.event.js.map +0 -1
  358. package/dist/store/event/store-candle.event.spec.js +0 -23
  359. package/dist/store/event/store-candle.event.spec.js.map +0 -1
  360. package/dist/store/event/store-instrument.event.js +0 -78
  361. package/dist/store/event/store-instrument.event.js.map +0 -1
  362. package/dist/store/event/store-instrument.event.spec.js +0 -21
  363. package/dist/store/event/store-instrument.event.spec.js.map +0 -1
  364. package/dist/store/event/store-order.event.d.ts +0 -61
  365. package/dist/store/event/store-order.event.js +0 -205
  366. package/dist/store/event/store-order.event.js.map +0 -1
  367. package/dist/store/event/store-order.event.spec.js.map +0 -1
  368. package/dist/store/event/store-orderbook.event.js +0 -65
  369. package/dist/store/event/store-orderbook.event.js.map +0 -1
  370. package/dist/store/event/store-position.event.js +0 -97
  371. package/dist/store/event/store-position.event.js.map +0 -1
  372. package/dist/store/event/store-trade.event.js +0 -47
  373. package/dist/store/event/store-trade.event.js.map +0 -1
  374. package/dist/store/event/store-trade.event.spec.js.map +0 -1
  375. package/dist/store/event/store.event.d.ts +0 -5
  376. package/dist/store/event/store.event.js.map +0 -1
  377. package/dist/store/store.state.d.ts +0 -21
  378. package/dist/store/store.state.js +0 -21
  379. package/dist/store/store.state.js.map +0 -1
  380. package/dist/tests/backtester-adapter.spec.js +0 -61
  381. package/dist/tests/backtester-adapter.spec.js.map +0 -1
  382. package/dist/tests/session.spec.d.ts +0 -0
  383. package/dist/tests/session.spec.js +0 -1
  384. package/dist/tests/session.spec.js.map +0 -1
  385. package/jestconfig.integration.json +0 -12
  386. package/src/adapter/paper/simulator/paper-margin-simulator.ts +0 -108
  387. package/src/adapter/paper/simulator/paper-simulator.ts +0 -121
  388. package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +0 -87
  389. package/src/adapter/paper/simulator/paper-spot-simulator.ts +0 -134
  390. package/src/domain/statement.ts +0 -119
  391. package/src/shared/policy.spec.ts +0 -25
  392. package/src/shared/topic.spec.ts +0 -34
  393. package/src/shared/topic.ts +0 -43
  394. package/src/store/event/index.ts +0 -8
  395. package/src/store/event/store-balance.event.ts +0 -161
  396. package/src/store/event/store-candle.event.spec.ts +0 -30
  397. package/src/store/event/store-candle.event.ts +0 -71
  398. package/src/store/event/store-instrument.event.spec.ts +0 -25
  399. package/src/store/event/store-instrument.event.ts +0 -84
  400. package/src/store/event/store-order.event.spec.ts +0 -28
  401. package/src/store/event/store-order.event.ts +0 -218
  402. package/src/store/event/store-orderbook.event.ts +0 -70
  403. package/src/store/event/store-position.event.ts +0 -109
  404. package/src/store/event/store-trade.event.ts +0 -52
  405. package/src/store/event/store.event.ts +0 -6
  406. package/src/store/store.state.ts +0 -43
  407. package/src/tests/backtester-adapter.spec.ts +0 -88
  408. package/src/tests/session.spec.ts +0 -121
@@ -0,0 +1,106 @@
1
+ import {
2
+ concat,
3
+ filter,
4
+ last,
5
+ map,
6
+ mergeMap,
7
+ Observable,
8
+ share,
9
+ skipLast,
10
+ switchMap
11
+ } from 'rxjs';
12
+
13
+ import { Candle } from './candle';
14
+ import { tf } from './timeframe';
15
+
16
+ function aggregate(candle: Candle, timeframe: number, value: number, timestamp: number) {
17
+ const frame = tf(timestamp, timeframe);
18
+
19
+ if (!candle) {
20
+ return new Candle(frame, value, value, value, value);
21
+ }
22
+
23
+ if (candle.timestamp === frame) {
24
+ candle.apply(value);
25
+ } else {
26
+ return new Candle(frame, candle.close, value, value, value);
27
+ }
28
+ }
29
+
30
+ export function candle<T extends { timestamp: number }>(
31
+ timeframe: number,
32
+ fn: (x: T) => number,
33
+ candleToStartWith: Candle = undefined
34
+ ) {
35
+ return function (source: Observable<T>): Observable<Candle> {
36
+ let candle = candleToStartWith;
37
+
38
+ return source.pipe(
39
+ map(it => {
40
+ const newCandle = aggregate(candle, timeframe, fn(it), it.timestamp);
41
+ if (newCandle) {
42
+ const prevCandle = candle;
43
+ candle = newCandle;
44
+
45
+ if (candleToStartWith && candleToStartWith.timestamp < newCandle.timestamp) {
46
+ candleToStartWith = undefined;
47
+ return [prevCandle, candle];
48
+ }
49
+ }
50
+
51
+ if (candleToStartWith) {
52
+ candleToStartWith = undefined;
53
+ }
54
+
55
+ return [candle];
56
+ }),
57
+ mergeMap(it => it),
58
+ share()
59
+ );
60
+ };
61
+ }
62
+
63
+ export function mergeCandle<T extends { timestamp: number }>(
64
+ timeframe: number,
65
+ fn: (x: T) => number,
66
+ history$: Observable<Candle>
67
+ ) {
68
+ return function (source$: Observable<T>): Observable<Candle> {
69
+ return concat(
70
+ history$.pipe(skipLast(1)),
71
+ history$.pipe(
72
+ last(),
73
+ switchMap(lastHistoricalCandle =>
74
+ source$.pipe(candle(timeframe, fn, lastHistoricalCandle))
75
+ ),
76
+ share()
77
+ )
78
+ );
79
+ };
80
+ }
81
+
82
+ export function candleCompleted(): (source: Observable<Candle>) => Observable<Candle> {
83
+ let currCandle: Candle;
84
+
85
+ return (source: Observable<Candle>) =>
86
+ source.pipe(
87
+ map(it => {
88
+ if (!currCandle) {
89
+ currCandle = it;
90
+
91
+ return undefined;
92
+ } else {
93
+ if (currCandle.timestamp !== it.timestamp) {
94
+ const prevCandle = currCandle;
95
+ currCandle = it;
96
+
97
+ return prevCandle;
98
+ }
99
+
100
+ return undefined;
101
+ }
102
+ }),
103
+ filter(it => !!it),
104
+ share()
105
+ );
106
+ }
@@ -1,13 +1,8 @@
1
- import { from, map } from 'rxjs';
2
-
3
1
  import { now } from '../shared';
4
- import { TradePatchEvent } from '../store';
5
- import { Candle, mergeCandle } from './candle';
6
- import { instrumentOf } from './instrument';
7
- import { Timeframe } from './timeframe';
2
+ import { Candle } from './candle';
8
3
 
9
- describe('candle tests', () => {
10
- test('should instantiate valid candle', () => {
4
+ describe('Candle', () => {
5
+ test('should construct a candle', () => {
11
6
  const timestamp = now();
12
7
 
13
8
  const sut = new Candle(timestamp, 2, 4, 1, 3);
@@ -19,67 +14,16 @@ describe('candle tests', () => {
19
14
  expect(sut.close).toEqual(3);
20
15
  });
21
16
 
22
- test('should pipe and merge candle from history', done => {
23
- const timestamp = 0;
24
- const instrument = instrumentOf('binance:btc-usdt');
25
-
26
- const history$ = from([
27
- new Candle(timestamp + Timeframe.D1 * 1, 1, 1.5, 0.5, 2),
28
- new Candle(timestamp + Timeframe.D1 * 2, 2, 2.5, 1.5, 3),
29
- new Candle(timestamp + Timeframe.D1 * 3, 3, 3.5, 2.5, 4)
30
- ]);
31
-
32
- const input$ = from([
33
- new TradePatchEvent(instrument, 5, 1, timestamp + Timeframe.D1 * 3),
34
- new TradePatchEvent(instrument, 3, 1, timestamp + Timeframe.D1 * 4),
35
- new TradePatchEvent(instrument, 4, 1, timestamp + Timeframe.D1 * 5)
36
- ]);
37
-
38
- const high = [1.5, 2.5, 5, 3];
39
-
40
- input$
41
- .pipe(mergeCandle(Timeframe.D1, it => it.rate, history$))
42
- .pipe(
43
- map(it => {
44
- expect(it.high).toBe(high.shift());
45
-
46
- if (!high.length) {
47
- done();
48
- }
49
- })
50
- )
51
- .subscribe();
52
- });
53
-
54
- test('should pipe and not merge candle from history', done => {
55
- const timestamp = 0;
56
- const instrument = instrumentOf('binance:btc-usdt');
57
-
58
- const history$ = from([
59
- new Candle(timestamp + Timeframe.D1 * 1, 1, 1.5, 0.5, 2),
60
- new Candle(timestamp + Timeframe.D1 * 2, 2, 2.5, 1.5, 3),
61
- new Candle(timestamp + Timeframe.D1 * 3, 3, 3.5, 2.5, 4)
62
- ]);
63
-
64
- const input$ = from([
65
- new TradePatchEvent(instrument, 5, 1, timestamp + Timeframe.D1 * 4),
66
- new TradePatchEvent(instrument, 3, 1, timestamp + Timeframe.D1 * 5),
67
- new TradePatchEvent(instrument, 4, 1, timestamp + Timeframe.D1 * 6)
68
- ]);
69
-
70
- const high = [1.5, 2.5, 3.5, 5, 3];
17
+ test('should modify a candle', () => {
18
+ const timestamp = now();
71
19
 
72
- input$
73
- .pipe(mergeCandle(Timeframe.D1, it => it.rate, history$))
74
- .pipe(
75
- map(it => {
76
- expect(it.high).toBe(high.shift());
20
+ const sut = new Candle(timestamp, 2, 4, 1, 3);
21
+ sut.apply(10);
77
22
 
78
- if (!high.length) {
79
- done();
80
- }
81
- })
82
- )
83
- .subscribe();
23
+ expect(sut.timestamp).toEqual(timestamp);
24
+ expect(sut.open).toEqual(2);
25
+ expect(sut.high).toEqual(10);
26
+ expect(sut.low).toEqual(1);
27
+ expect(sut.close).toEqual(10);
84
28
  });
85
29
  });
@@ -1,17 +1,4 @@
1
- import {
2
- concat,
3
- filter,
4
- last,
5
- map,
6
- mergeMap,
7
- Observable,
8
- share,
9
- skipLast,
10
- withLatestFrom
11
- } from 'rxjs';
12
-
13
1
  import { timestamp } from '../shared';
14
- import { tf } from './timeframe';
15
2
 
16
3
  export class Candle {
17
4
  constructor(
@@ -19,7 +6,8 @@ export class Candle {
19
6
  public open: number,
20
7
  public high: number,
21
8
  public low: number,
22
- public close: number
9
+ public close: number,
10
+ public volume?: number
23
11
  ) {}
24
12
 
25
13
  apply(value: number) {
@@ -28,103 +16,3 @@ export class Candle {
28
16
  this.close = value;
29
17
  }
30
18
  }
31
-
32
- export class CandleBuilder {
33
- private current: Candle;
34
-
35
- get candle(): Candle {
36
- return this.current;
37
- }
38
-
39
- constructor(readonly timeframe: number) {}
40
-
41
- append(value: number, timestamp: timestamp): Candle {
42
- const frame = tf(timestamp, this.timeframe);
43
-
44
- if (!this.current) {
45
- this.current = new Candle(frame, value, value, value, value);
46
-
47
- return null;
48
- }
49
-
50
- if (this.candle.timestamp == frame) {
51
- this.candle.apply(value);
52
-
53
- return null;
54
- }
55
-
56
- const previous = this.current;
57
-
58
- this.current = new Candle(frame, value, value, value, value);
59
- return previous;
60
- }
61
- }
62
-
63
- export function candle<T extends { timestamp: number }>(
64
- timeframe: number,
65
- fn: (x: T) => number,
66
- options: { passThru: boolean } = { passThru: false }
67
- ) {
68
- return function (source: Observable<T>): Observable<Candle> {
69
- const builder = new CandleBuilder(timeframe);
70
- let candle: Candle;
71
-
72
- if (options.passThru) {
73
- return source.pipe(
74
- map(it => {
75
- builder.append(fn(it), it.timestamp);
76
- return builder.candle;
77
- }),
78
- share()
79
- );
80
- }
81
-
82
- return source.pipe(
83
- filter(it => (candle = builder.append(fn(it), it.timestamp)) != null),
84
- map(_ => candle),
85
- share()
86
- );
87
- };
88
- }
89
-
90
- export function mergeCandle<T extends { timestamp: number }>(
91
- timeframe: number,
92
- fn: (x: T) => number,
93
- history$: Observable<Candle>
94
- ) {
95
- return function (source$: Observable<T>): Observable<Candle> {
96
- const builder = new CandleBuilder(timeframe);
97
- let hasMergedHistory = false;
98
-
99
- return concat(
100
- history$.pipe(skipLast(1)),
101
- source$.pipe(
102
- withLatestFrom(history$.pipe(last())),
103
- mergeMap(([it, history]) => {
104
- const completed = builder.append(fn(it), it.timestamp);
105
-
106
- if (completed) {
107
- if (completed.timestamp == history.timestamp) {
108
- completed.open = history.open;
109
- completed.high = Math.max(completed.high, history.high);
110
- completed.low = Math.min(completed.low, history.low);
111
-
112
- hasMergedHistory = true;
113
- } else if (completed.timestamp > history.timestamp) {
114
- if (!hasMergedHistory) {
115
- hasMergedHistory = true;
116
- return [history, completed];
117
- }
118
- } else if (completed.timestamp < history.timestamp) {
119
- throw new Error('invalid candle sequence, input data is to old.');
120
- }
121
-
122
- return [completed];
123
- }
124
-
125
- return [];
126
- })
127
- )
128
- );
129
- };
130
- }
@@ -0,0 +1,33 @@
1
+ import { commissionPercentOf } from './commission';
2
+
3
+ describe('Commission', () => {
4
+ test('should construct a Commission', () => {
5
+ const sut = commissionPercentOf({
6
+ maker: 0.1,
7
+ taker: 0.2
8
+ });
9
+
10
+ expect(sut.makerRate).toEqual(0.001);
11
+ expect(sut.takerRate).toEqual(0.002);
12
+ });
13
+
14
+ test('should calculate a maker fee', () => {
15
+ const sut = commissionPercentOf({
16
+ maker: 0.1,
17
+ taker: 0.2
18
+ });
19
+
20
+ expect(sut.calculateMakerFee(2000)).toEqual(2);
21
+ expect(sut.applyMakerFee(2000)).toEqual(1998);
22
+ });
23
+
24
+ test('should calculate a taker fee', () => {
25
+ const sut = commissionPercentOf({
26
+ maker: 0.1,
27
+ taker: 0.2
28
+ });
29
+
30
+ expect(sut.calculateTakerFee(2000)).toEqual(4);
31
+ expect(sut.applyTakerFee(2000)).toEqual(1996);
32
+ });
33
+ });
@@ -18,6 +18,6 @@ export class Commission {
18
18
  }
19
19
  }
20
20
 
21
- export function commissionPercentOf(maker: number, taker: number) {
22
- return new Commission(maker / 100.0, taker / 100.0);
21
+ export function commissionPercentOf(fees: { maker: number; taker: number }) {
22
+ return new Commission(fees.maker / 100.0, fees.taker / 100.0);
23
23
  }
@@ -1,6 +1,7 @@
1
1
  import { timestamp } from '../shared';
2
2
 
3
3
  export interface Component {
4
+ id: string;
4
5
  kind: string;
5
6
  timestamp: timestamp;
6
7
  }
@@ -0,0 +1,25 @@
1
+ export function insufficientFundsError(
2
+ assetName: string,
3
+ requiredAmount: number,
4
+ availableAmount: number
5
+ ) {
6
+ return new Error(
7
+ `insufficient funds of ${assetName} has: ${availableAmount} requires: ${requiredAmount}`
8
+ );
9
+ }
10
+
11
+ export function invalidArgumentError(value: any) {
12
+ throw new Error(`invalid argument: ${value}`);
13
+ }
14
+
15
+ export function invalidAssetSelectorError(selector: string) {
16
+ throw new Error(`invalid asset selector: ${selector}`);
17
+ }
18
+
19
+ export function invalidInstrumentSelectorError(selector: string) {
20
+ throw new Error(`invalid instrument selector: ${selector}`);
21
+ }
22
+
23
+ export function adapterMismatchError() {
24
+ return new Error('adapters must be the same');
25
+ }
@@ -1,13 +1,20 @@
1
1
  export * from './asset';
2
2
  export * from './balance';
3
+ export * from './balance.operator';
4
+ export * from './error';
3
5
  export * from './candle';
6
+ export * from './candle.operator';
4
7
  export * from './commission';
5
8
  export * from './component';
6
9
  export * from './instrument';
10
+ export * from './instrument.operator';
7
11
  export * from './order';
12
+ export * from './order.operator';
8
13
  export * from './orderbook';
14
+ export * from './orderbook.operator';
9
15
  export * from './position';
16
+ export * from './position.operator';
10
17
  export * from './session';
11
- export * from './statement';
12
18
  export * from './timeframe';
13
19
  export * from './trade';
20
+ export * from './trade.operator';
@@ -0,0 +1,28 @@
1
+ import { Subject } from 'rxjs';
2
+
3
+ import { State } from '../store';
4
+ import { Asset } from './asset';
5
+ import { Component } from './component';
6
+ import { Instrument, instrumentOf } from './instrument';
7
+ import { instrument } from './instrument.operator';
8
+
9
+ describe('instrument', () => {
10
+ const state = new State();
11
+
12
+ beforeEach(() => {
13
+ state.universe.instrument.upsert(
14
+ new Instrument(new Asset('abc', 'xyz', 4), new Asset('def', 'xyz', 4), 'abc-def')
15
+ );
16
+ });
17
+
18
+ test('should pipe an instrument on subscription', done => {
19
+ new Subject<Component>()
20
+ .pipe(instrument(instrumentOf('xyz:abc-def'), state))
21
+ .subscribe({
22
+ next: it => {
23
+ expect(it.id).toEqual('xyz:abc-def');
24
+ done();
25
+ }
26
+ });
27
+ });
28
+ });
@@ -0,0 +1,25 @@
1
+ import { distinctUntilChanged, filter, map, Observable, startWith } from 'rxjs';
2
+
3
+ import { State } from '../store';
4
+ import { Component } from './component';
5
+ import { Instrument, InstrumentSelector } from './instrument';
6
+
7
+ export function instrument(selector: InstrumentSelector, state: State) {
8
+ return (source$: Observable<Component>) =>
9
+ source$.pipe(
10
+ startWith(state.universe.instrument.get(selector.id)),
11
+ filter(it => it instanceof Instrument && it.id == selector.id),
12
+ map(it => it as Instrument)
13
+ );
14
+ }
15
+
16
+ export function instruments(state: State) {
17
+ return (source$: Observable<Component>) =>
18
+ source$.pipe(
19
+ filter(it => it instanceof Instrument),
20
+ map(() => state.universe.instrument.asReadonlyArray()),
21
+ startWith(state.universe.instrument.asReadonlyArray()),
22
+ filter(it => it.length > 0),
23
+ distinctUntilChanged((lhs, rhs) => lhs.length == rhs.length)
24
+ );
25
+ }
@@ -1,8 +1,8 @@
1
1
  import { Asset, assetOf } from './asset';
2
2
  import { Instrument, instrumentOf } from './instrument';
3
3
 
4
- describe('instrument tests', () => {
5
- test('should instantiate proper instrument', () => {
4
+ describe('Instrument', () => {
5
+ test('should construct a instrument', () => {
6
6
  const sut = new Instrument(
7
7
  new Asset('abc', 'xyz', 4),
8
8
  new Asset('def', 'xyz', 4),
@@ -10,63 +10,55 @@ describe('instrument tests', () => {
10
10
  );
11
11
 
12
12
  expect(sut.base.name).toEqual('abc');
13
- expect(sut.base.adapter).toEqual('xyz');
13
+ expect(sut.base.adapterName).toEqual('xyz');
14
14
  expect(sut.quote.name).toEqual('def');
15
- expect(sut.quote.adapter).toEqual('xyz');
16
- expect(sut.toString()).toEqual('xyz:abc-def');
15
+ expect(sut.quote.adapterName).toEqual('xyz');
16
+ expect(sut.id).toEqual('xyz:abc-def');
17
17
  });
18
18
  });
19
19
 
20
- describe('instrument selector tests', () => {
21
- test('should instantiate proper instrument selector', () => {
20
+ describe('InstrumentSelector', () => {
21
+ test('should construct a instrument selector', () => {
22
22
  const sut = instrumentOf('xyz:abc-def');
23
23
 
24
24
  expect(sut.base.name).toEqual('abc');
25
- expect(sut.base.adapter).toEqual('xyz');
25
+ expect(sut.base.adapterName).toEqual('xyz');
26
26
  expect(sut.quote.name).toEqual('def');
27
- expect(sut.quote.adapter).toEqual('xyz');
28
- expect(sut.toString()).toEqual('xyz:abc-def');
27
+ expect(sut.quote.adapterName).toEqual('xyz');
28
+ expect(sut.id).toEqual('xyz:abc-def');
29
29
  });
30
30
 
31
- test('should instantiate proper instrument selector capital case', () => {
31
+ test('should construct a instrument selector capital case', () => {
32
32
  const sut = instrumentOf('XYZ:ABC-DEF');
33
33
 
34
34
  expect(sut.base.name).toEqual('abc');
35
- expect(sut.base.adapter).toEqual('xyz');
35
+ expect(sut.base.adapterName).toEqual('xyz');
36
36
  expect(sut.quote.name).toEqual('def');
37
- expect(sut.quote.adapter).toEqual('xyz');
38
- expect(sut.toString()).toEqual('xyz:abc-def');
37
+ expect(sut.quote.adapterName).toEqual('xyz');
38
+ expect(sut.id).toEqual('xyz:abc-def');
39
39
  });
40
40
 
41
41
  test('should throw invalid format message for missing separator', () => {
42
- const fn = () => {
43
- instrumentOf('xyzabc-def');
44
- };
42
+ const fn = () => instrumentOf('xyzabc-def');
45
43
 
46
- expect(fn).toThrow(Error);
44
+ expect(fn).toThrowError();
47
45
  });
48
46
 
49
47
  test('should throw invalid format message for multiple separators', () => {
50
- const fn = () => {
51
- instrumentOf('xyz:abc:-def');
52
- };
48
+ const fn = () => instrumentOf('xyz:abc:-def');
53
49
 
54
- expect(fn).toThrow(Error);
50
+ expect(fn).toThrowError();
55
51
  });
56
52
 
57
53
  test('should throw invalid format message for missing pair name', () => {
58
- const fn = () => {
59
- instrumentOf('xyz:');
60
- };
54
+ const fn = () => instrumentOf('xyz:');
61
55
 
62
- expect(fn).toThrow(Error);
56
+ expect(fn).toThrowError();
63
57
  });
64
58
 
65
59
  test('should throw invalid format message for missing adapter name', () => {
66
- const fn = () => {
67
- assetOf(':abc-def');
68
- };
60
+ const fn = () => assetOf(':abc-def');
69
61
 
70
- expect(fn).toThrow(Error);
62
+ expect(fn).toThrowError();
71
63
  });
72
64
  });
@@ -1,11 +1,13 @@
1
1
  import { timestamp } from '../shared';
2
- import { Asset, AssetSelector } from './asset';
2
+ import { Asset, AssetSelector, AssetSelectorSeparator } from './asset';
3
3
  import { Commission } from './commission';
4
4
  import { Component } from './component';
5
+ import { adapterMismatchError, invalidInstrumentSelectorError } from './error';
5
6
 
6
- export class InstrumentSelector {
7
- private readonly id: string;
7
+ export const InstrumentSelectorSeparator = '-';
8
8
 
9
+ export class InstrumentSelector {
10
+ readonly id: string;
9
11
  readonly base: AssetSelector;
10
12
  readonly quote: AssetSelector;
11
13
 
@@ -13,7 +15,7 @@ export class InstrumentSelector {
13
15
  this.base = new AssetSelector(base.toLowerCase(), adapter.toLowerCase());
14
16
  this.quote = new AssetSelector(quote.toLowerCase(), adapter.toLowerCase());
15
17
 
16
- this.id = `${this.base.toString()}-${this.quote.name}`;
18
+ this.id = `${this.base.id}${InstrumentSelectorSeparator}${this.quote.name}`;
17
19
  }
18
20
 
19
21
  toString(): string {
@@ -32,17 +34,24 @@ export class Instrument extends InstrumentSelector implements Component {
32
34
  leverage?: number = null;
33
35
 
34
36
  constructor(readonly base: Asset, readonly quote: Asset, readonly raw: string) {
35
- super(base.name, quote.name, base.adapter);
37
+ super(base.name, quote.name, base.adapterName);
36
38
 
37
- if (base.adapter != quote.adapter) {
38
- throw new Error('Adapter mismatch!');
39
+ if (base.adapterName != quote.adapterName) {
40
+ throw adapterMismatchError();
39
41
  }
40
42
  }
41
43
  }
42
44
 
43
- export function instrumentOf(instrument: string): InstrumentSelector {
44
- const section = instrument.split(':');
45
- const asset = section[1].split('-');
45
+ export function instrumentOf(selector: string): InstrumentSelector {
46
+ const [adapterName, asset, ...rest] = selector.split(AssetSelectorSeparator);
47
+ if (!adapterName || !asset || rest.length) {
48
+ throw invalidInstrumentSelectorError(selector);
49
+ }
50
+
51
+ const [baseAssetName, quoteAssetName] = asset.split(InstrumentSelectorSeparator);
52
+ if (!baseAssetName || !quoteAssetName) {
53
+ throw invalidInstrumentSelectorError(selector);
54
+ }
46
55
 
47
- return new InstrumentSelector(asset[0], asset[1], section[0]);
56
+ return new InstrumentSelector(baseAssetName, quoteAssetName, adapterName);
48
57
  }