@quantform/core 0.5.15 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/adapter/adapter-aggregate.d.ts +41 -5
  3. package/dist/adapter/adapter-aggregate.d.ts.map +1 -0
  4. package/dist/adapter/adapter-aggregate.js +114 -54
  5. package/dist/adapter/adapter.d.ts +29 -15
  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 +4 -3
  9. package/dist/adapter/backtester/backtester-adapter.d.ts.map +1 -0
  10. package/dist/adapter/backtester/backtester-adapter.js +28 -15
  11. package/dist/adapter/backtester/backtester-cursor.d.ts +5 -4
  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 -2
  15. package/dist/adapter/backtester/backtester-streamer.d.ts.map +1 -0
  16. package/dist/adapter/backtester/backtester-streamer.js +54 -40
  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 +38 -32
  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 +7 -5
  36. package/dist/adapter/paper/paper-adapter.d.ts.map +1 -0
  37. package/dist/adapter/paper/paper-adapter.js +49 -25
  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 +65 -40
  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 +24 -4
  63. package/dist/domain/asset.d.ts.map +1 -0
  64. package/dist/domain/asset.js +23 -8
  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 +35 -11
  69. package/dist/domain/balance.d.ts.map +1 -0
  70. package/dist/domain/balance.js +46 -17
  71. package/dist/domain/candle-operator.d.ts +11 -0
  72. package/dist/domain/candle-operator.d.ts.map +1 -0
  73. package/dist/domain/{candle.operator.js → candle-operator.js} +11 -5
  74. package/dist/domain/candle.d.ts +9 -8
  75. package/dist/domain/candle.d.ts.map +1 -0
  76. package/dist/domain/candle.js +3 -3
  77. package/dist/domain/commission.d.ts +12 -9
  78. package/dist/domain/commission.d.ts.map +1 -0
  79. package/dist/domain/commission.js +7 -6
  80. package/dist/domain/component.d.ts +1 -0
  81. package/dist/domain/component.d.ts.map +1 -0
  82. package/dist/domain/component.js +0 -1
  83. package/dist/domain/error.d.ts +6 -4
  84. package/dist/domain/error.d.ts.map +1 -0
  85. package/dist/domain/error.js +4 -5
  86. package/dist/domain/index.d.ts +9 -7
  87. package/dist/domain/index.d.ts.map +1 -0
  88. package/dist/domain/index.js +8 -8
  89. package/dist/domain/{instrument.operator.d.ts → instrument-operator.d.ts} +1 -0
  90. package/dist/domain/instrument-operator.d.ts.map +1 -0
  91. package/dist/domain/{instrument.operator.js → instrument-operator.js} +0 -1
  92. package/dist/domain/instrument.d.ts +9 -6
  93. package/dist/domain/instrument.d.ts.map +1 -0
  94. package/dist/domain/instrument.js +7 -3
  95. package/dist/domain/{order.operator.d.ts → order-operator.d.ts} +1 -0
  96. package/dist/domain/order-operator.d.ts.map +1 -0
  97. package/dist/domain/order-operator.js +16 -0
  98. package/dist/domain/order.d.ts +17 -22
  99. package/dist/domain/order.d.ts.map +1 -0
  100. package/dist/domain/order.js +23 -34
  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 +26 -10
  105. package/dist/domain/orderbook.d.ts.map +1 -0
  106. package/dist/domain/orderbook.js +12 -6
  107. package/dist/domain/{position.operator.d.ts → position-operator.d.ts} +7 -4
  108. package/dist/domain/position-operator.d.ts.map +1 -0
  109. package/dist/domain/{position.operator.js → position-operator.js} +13 -6
  110. package/dist/domain/position.d.ts +10 -9
  111. package/dist/domain/position.d.ts.map +1 -0
  112. package/dist/domain/position.js +4 -4
  113. package/dist/domain/session-builder.d.ts +54 -0
  114. package/dist/domain/session-builder.d.ts.map +1 -0
  115. package/dist/domain/session-builder.js +105 -0
  116. package/dist/domain/session.d.ts +54 -13
  117. package/dist/domain/session.d.ts.map +1 -0
  118. package/dist/domain/session.js +104 -40
  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 +12 -7
  126. package/dist/domain/trade.d.ts.map +1 -0
  127. package/dist/domain/trade.js +8 -2
  128. package/dist/index.d.ts +2 -2
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +1 -3
  131. package/dist/shared/collections.d.ts +20 -1
  132. package/dist/shared/collections.d.ts.map +1 -0
  133. package/dist/shared/collections.js +98 -8
  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 +28 -6
  138. package/dist/shared/decimals.d.ts.map +1 -0
  139. package/dist/shared/decimals.js +33 -35
  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 +3 -1
  144. package/dist/shared/index.d.ts.map +1 -0
  145. package/dist/shared/index.js +2 -2
  146. package/dist/shared/logger.d.ts +5 -7
  147. package/dist/shared/logger.d.ts.map +1 -0
  148. package/dist/shared/logger.js +24 -8
  149. package/dist/shared/pipe.d.ts +5 -0
  150. package/dist/shared/pipe.d.ts.map +1 -0
  151. package/dist/shared/pipe.js +8 -0
  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 +33 -4
  159. package/dist/storage/feed.d.ts.map +1 -0
  160. package/dist/storage/feed.js +93 -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} +20 -7
  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} +10 -5
  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 +13 -0
  189. package/dist/store/store-orderbook-event.d.ts.map +1 -0
  190. package/dist/store/store-orderbook-event.js +43 -0
  191. package/dist/store/{store-position.event.d.ts → store-position-event.d.ts} +7 -6
  192. package/dist/store/store-position-event.d.ts.map +1 -0
  193. package/dist/store/{store-position.event.js → store-position-event.js} +36 -17
  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 +17 -0
  198. package/dist/store/store-trade-event.d.ts.map +1 -0
  199. package/dist/store/{store-trade.event.js → store-trade-event.js} +14 -5
  200. package/dist/store/store.d.ts +2 -1
  201. package/dist/store/store.d.ts.map +1 -0
  202. package/dist/store/store.js +0 -1
  203. package/dist/strategy.d.ts +8 -0
  204. package/dist/strategy.d.ts.map +1 -0
  205. package/dist/strategy.js +44 -0
  206. package/jest.config.ts +13 -0
  207. package/package.json +19 -30
  208. package/src/adapter/adapter-aggregate.ts +57 -25
  209. package/src/adapter/adapter.ts +15 -18
  210. package/src/adapter/backtester/backtester-adapter.ts +14 -7
  211. package/src/adapter/backtester/backtester-cursor.spec.ts +20 -18
  212. package/src/adapter/backtester/backtester-cursor.ts +6 -6
  213. package/src/adapter/backtester/backtester-streamer.spec.ts +18 -15
  214. package/src/adapter/backtester/backtester-streamer.ts +21 -30
  215. package/src/adapter/backtester/error.ts +7 -0
  216. package/src/adapter/error.ts +4 -0
  217. package/src/adapter/paper/engine/paper-engine.spec.ts +54 -30
  218. package/src/adapter/paper/engine/paper-engine.ts +62 -46
  219. package/src/adapter/paper/paper-adapter.ts +30 -9
  220. package/src/cli/build.ts +1 -1
  221. package/src/cli/dev.ts +15 -7
  222. package/src/cli/error.ts +5 -0
  223. package/src/cli/internal/workspace.ts +0 -11
  224. package/src/cli/pull.ts +28 -36
  225. package/src/cli/run.ts +14 -11
  226. package/src/cli/test.ts +24 -37
  227. package/src/domain/asset.spec.ts +4 -4
  228. package/src/domain/asset.ts +8 -15
  229. package/src/domain/{balance.operator.spec.ts → balance-operator.spec.ts} +4 -3
  230. package/src/domain/{balance.operator.ts → balance-operator.ts} +0 -0
  231. package/src/domain/balance.spec.ts +51 -47
  232. package/src/domain/balance.ts +32 -31
  233. package/src/domain/candle-operator.spec.ts +126 -0
  234. package/src/domain/{candle.operator.ts → candle-operator.ts} +24 -7
  235. package/src/domain/candle.spec.ts +13 -12
  236. package/src/domain/candle.ts +9 -9
  237. package/src/domain/commission.spec.ts +13 -12
  238. package/src/domain/commission.ts +15 -11
  239. package/src/domain/error.ts +8 -6
  240. package/src/domain/index.ts +8 -7
  241. package/src/domain/{instrument.operator.spec.ts → instrument-operator.spec.ts} +9 -2
  242. package/src/domain/{instrument.operator.ts → instrument-operator.ts} +0 -0
  243. package/src/domain/instrument.spec.ts +8 -1
  244. package/src/domain/instrument.ts +11 -8
  245. package/src/domain/{order.operator.spec.ts → order-operator.spec.ts} +11 -7
  246. package/src/domain/{order.operator.ts → order-operator.ts} +2 -2
  247. package/src/domain/order.spec.ts +15 -15
  248. package/src/domain/order.ts +34 -61
  249. package/src/domain/{orderbook.operator.spec.ts → orderbook-operator.spec.ts} +15 -3
  250. package/src/domain/{orderbook.operator.ts → orderbook-operator.ts} +0 -0
  251. package/src/domain/orderbook.spec.ts +11 -2
  252. package/src/domain/orderbook.ts +20 -13
  253. package/src/domain/{position.operator.spec.ts → position-operator.spec.ts} +13 -7
  254. package/src/domain/{position.operator.ts → position-operator.ts} +21 -11
  255. package/src/domain/position.spec.ts +14 -10
  256. package/src/domain/position.ts +10 -10
  257. package/src/domain/session-builder.ts +158 -0
  258. package/src/domain/session.spec.ts +5 -12
  259. package/src/domain/session.ts +85 -72
  260. package/src/domain/{trade.operator.spec.ts → trade-operator.spec.ts} +7 -3
  261. package/src/domain/{trade.operator.ts → trade-operator.ts} +0 -0
  262. package/src/domain/trade.spec.ts +6 -2
  263. package/src/domain/trade.ts +9 -7
  264. package/src/index.ts +1 -2
  265. package/src/shared/collections.spec.ts +34 -0
  266. package/src/shared/collections.ts +125 -6
  267. package/src/shared/decimals.spec.ts +18 -24
  268. package/src/shared/decimals.ts +22 -55
  269. package/src/shared/environment.ts +13 -0
  270. package/src/shared/index.ts +2 -1
  271. package/src/shared/logger.ts +35 -7
  272. package/src/shared/pipe.ts +12 -0
  273. package/src/storage/cache.ts +3 -1
  274. package/src/storage/feed.ts +91 -34
  275. package/src/storage/storage.ts +10 -8
  276. package/src/store/error.ts +36 -0
  277. package/src/store/index.ts +7 -7
  278. package/src/store/{store-balance.event.spec.ts → store-balance-event.spec.ts} +8 -8
  279. package/src/store/{store-balance.event.ts → store-balance-event.ts} +58 -15
  280. package/src/store/{store.event.ts → store-event.ts} +0 -0
  281. package/src/store/{store-instrument.event.spec.ts → store-instrument-event.spec.ts} +8 -7
  282. package/src/store/{store-instrument.event.ts → store-instrument-event.ts} +18 -7
  283. package/src/store/store-order-event.spec.ts +32 -0
  284. package/src/store/{store-order.event.ts → store-order-event.ts} +27 -22
  285. package/src/store/store-orderbook-event.spec.ts +39 -0
  286. package/src/store/store-orderbook-event.ts +56 -0
  287. package/src/store/{store-position.event.ts → store-position-event.ts} +41 -22
  288. package/src/store/store-state.ts +3 -3
  289. package/src/store/{store-trade.event.spec.ts → store-trade-event.spec.ts} +16 -14
  290. package/src/store/{store-trade.event.ts → store-trade-event.ts} +14 -8
  291. package/src/store/store.spec.ts +22 -20
  292. package/src/store/store.ts +1 -1
  293. package/src/strategy.ts +47 -0
  294. package/tsconfig.json +12 -5
  295. package/dist/adapter/adapter-aggregate.js.map +0 -1
  296. package/dist/adapter/adapter.js.map +0 -1
  297. package/dist/adapter/backtester/backtester-adapter.js.map +0 -1
  298. package/dist/adapter/backtester/backtester-adapter.spec.d.ts +0 -1
  299. package/dist/adapter/backtester/backtester-adapter.spec.js +0 -82
  300. package/dist/adapter/backtester/backtester-adapter.spec.js.map +0 -1
  301. package/dist/adapter/backtester/backtester-cursor.js.map +0 -1
  302. package/dist/adapter/backtester/backtester-cursor.spec.d.ts +0 -1
  303. package/dist/adapter/backtester/backtester-cursor.spec.js +0 -37
  304. package/dist/adapter/backtester/backtester-cursor.spec.js.map +0 -1
  305. package/dist/adapter/backtester/backtester-streamer.js.map +0 -1
  306. package/dist/adapter/backtester/backtester-streamer.spec.d.ts +0 -1
  307. package/dist/adapter/backtester/backtester-streamer.spec.js +0 -44
  308. package/dist/adapter/backtester/backtester-streamer.spec.js.map +0 -1
  309. package/dist/adapter/backtester/index.js.map +0 -1
  310. package/dist/adapter/error.js.map +0 -1
  311. package/dist/adapter/index.js.map +0 -1
  312. package/dist/adapter/paper/engine/paper-engine.js.map +0 -1
  313. package/dist/adapter/paper/engine/paper-engine.spec.d.ts +0 -1
  314. package/dist/adapter/paper/engine/paper-engine.spec.js +0 -54
  315. package/dist/adapter/paper/engine/paper-engine.spec.js.map +0 -1
  316. package/dist/adapter/paper/index.js.map +0 -1
  317. package/dist/adapter/paper/paper-adapter.js.map +0 -1
  318. package/dist/adapter/paper/paper-adapter.spec.d.ts +0 -1
  319. package/dist/adapter/paper/paper-adapter.spec.js +0 -69
  320. package/dist/adapter/paper/paper-adapter.spec.js.map +0 -1
  321. package/dist/bootstrap.d.ts +0 -11
  322. package/dist/bootstrap.js +0 -73
  323. package/dist/bootstrap.js.map +0 -1
  324. package/dist/cli/build.js.map +0 -1
  325. package/dist/cli/dev.js.map +0 -1
  326. package/dist/cli/index.js.map +0 -1
  327. package/dist/cli/internal/workspace.js.map +0 -1
  328. package/dist/cli/pull.js.map +0 -1
  329. package/dist/cli/run.js.map +0 -1
  330. package/dist/cli/test.js.map +0 -1
  331. package/dist/domain/asset.js.map +0 -1
  332. package/dist/domain/asset.spec.d.ts +0 -1
  333. package/dist/domain/asset.spec.js +0 -55
  334. package/dist/domain/asset.spec.js.map +0 -1
  335. package/dist/domain/balance.js.map +0 -1
  336. package/dist/domain/balance.operator.js.map +0 -1
  337. package/dist/domain/balance.operator.spec.d.ts +0 -1
  338. package/dist/domain/balance.operator.spec.js +0 -23
  339. package/dist/domain/balance.operator.spec.js.map +0 -1
  340. package/dist/domain/balance.spec.d.ts +0 -1
  341. package/dist/domain/balance.spec.js +0 -82
  342. package/dist/domain/balance.spec.js.map +0 -1
  343. package/dist/domain/candle.js.map +0 -1
  344. package/dist/domain/candle.operator.d.ts +0 -9
  345. package/dist/domain/candle.operator.js.map +0 -1
  346. package/dist/domain/candle.operator.spec.d.ts +0 -1
  347. package/dist/domain/candle.operator.spec.js +0 -111
  348. package/dist/domain/candle.operator.spec.js.map +0 -1
  349. package/dist/domain/candle.spec.d.ts +0 -1
  350. package/dist/domain/candle.spec.js +0 -26
  351. package/dist/domain/candle.spec.js.map +0 -1
  352. package/dist/domain/commission.js.map +0 -1
  353. package/dist/domain/commission.spec.d.ts +0 -1
  354. package/dist/domain/commission.spec.js +0 -30
  355. package/dist/domain/commission.spec.js.map +0 -1
  356. package/dist/domain/component.js.map +0 -1
  357. package/dist/domain/error.js.map +0 -1
  358. package/dist/domain/index.js.map +0 -1
  359. package/dist/domain/instrument.js.map +0 -1
  360. package/dist/domain/instrument.operator.js.map +0 -1
  361. package/dist/domain/instrument.operator.spec.d.ts +0 -1
  362. package/dist/domain/instrument.operator.spec.js +0 -24
  363. package/dist/domain/instrument.operator.spec.js.map +0 -1
  364. package/dist/domain/instrument.spec.d.ts +0 -1
  365. package/dist/domain/instrument.spec.js +0 -49
  366. package/dist/domain/instrument.spec.js.map +0 -1
  367. package/dist/domain/order.js.map +0 -1
  368. package/dist/domain/order.operator.js +0 -14
  369. package/dist/domain/order.operator.js.map +0 -1
  370. package/dist/domain/order.operator.spec.d.ts +0 -1
  371. package/dist/domain/order.operator.spec.js +0 -64
  372. package/dist/domain/order.operator.spec.js.map +0 -1
  373. package/dist/domain/order.spec.d.ts +0 -1
  374. package/dist/domain/order.spec.js +0 -33
  375. package/dist/domain/order.spec.js.map +0 -1
  376. package/dist/domain/orderbook.js.map +0 -1
  377. package/dist/domain/orderbook.operator.js.map +0 -1
  378. package/dist/domain/orderbook.operator.spec.d.ts +0 -1
  379. package/dist/domain/orderbook.operator.spec.js +0 -22
  380. package/dist/domain/orderbook.operator.spec.js.map +0 -1
  381. package/dist/domain/orderbook.spec.d.ts +0 -1
  382. package/dist/domain/orderbook.spec.js +0 -13
  383. package/dist/domain/orderbook.spec.js.map +0 -1
  384. package/dist/domain/position.js.map +0 -1
  385. package/dist/domain/position.operator.js.map +0 -1
  386. package/dist/domain/position.operator.spec.d.ts +0 -1
  387. package/dist/domain/position.operator.spec.js +0 -48
  388. package/dist/domain/position.operator.spec.js.map +0 -1
  389. package/dist/domain/position.spec.d.ts +0 -1
  390. package/dist/domain/position.spec.js +0 -30
  391. package/dist/domain/position.spec.js.map +0 -1
  392. package/dist/domain/session.js.map +0 -1
  393. package/dist/domain/session.spec.d.ts +0 -1
  394. package/dist/domain/session.spec.js +0 -23
  395. package/dist/domain/session.spec.js.map +0 -1
  396. package/dist/domain/timeframe.js.map +0 -1
  397. package/dist/domain/trade.js.map +0 -1
  398. package/dist/domain/trade.operator.js.map +0 -1
  399. package/dist/domain/trade.operator.spec.d.ts +0 -1
  400. package/dist/domain/trade.operator.spec.js +0 -24
  401. package/dist/domain/trade.operator.spec.js.map +0 -1
  402. package/dist/domain/trade.spec.d.ts +0 -1
  403. package/dist/domain/trade.spec.js +0 -13
  404. package/dist/domain/trade.spec.js.map +0 -1
  405. package/dist/index.js.map +0 -1
  406. package/dist/indicator/atr.d.ts +0 -3
  407. package/dist/indicator/atr.js +0 -16
  408. package/dist/indicator/atr.js.map +0 -1
  409. package/dist/indicator/cross.d.ts +0 -3
  410. package/dist/indicator/cross.js +0 -41
  411. package/dist/indicator/cross.js.map +0 -1
  412. package/dist/indicator/cross.spec.d.ts +0 -1
  413. package/dist/indicator/cross.spec.js +0 -101
  414. package/dist/indicator/cross.spec.js.map +0 -1
  415. package/dist/indicator/donchian.d.ts +0 -9
  416. package/dist/indicator/donchian.js +0 -16
  417. package/dist/indicator/donchian.js.map +0 -1
  418. package/dist/indicator/drawdown.d.ts +0 -2
  419. package/dist/indicator/drawdown.js +0 -27
  420. package/dist/indicator/drawdown.js.map +0 -1
  421. package/dist/indicator/ema.d.ts +0 -2
  422. package/dist/indicator/ema.js +0 -23
  423. package/dist/indicator/ema.js.map +0 -1
  424. package/dist/indicator/ema.spec.d.ts +0 -1
  425. package/dist/indicator/ema.spec.js +0 -23
  426. package/dist/indicator/ema.spec.js.map +0 -1
  427. package/dist/indicator/envelope.d.ts +0 -5
  428. package/dist/indicator/envelope.js +0 -18
  429. package/dist/indicator/envelope.js.map +0 -1
  430. package/dist/indicator/index.d.ts +0 -17
  431. package/dist/indicator/index.js +0 -34
  432. package/dist/indicator/index.js.map +0 -1
  433. package/dist/indicator/macd.d.ts +0 -2
  434. package/dist/indicator/macd.js +0 -13
  435. package/dist/indicator/macd.js.map +0 -1
  436. package/dist/indicator/min-max.d.ts +0 -5
  437. package/dist/indicator/min-max.js +0 -21
  438. package/dist/indicator/min-max.js.map +0 -1
  439. package/dist/indicator/ring-buffer.d.ts +0 -16
  440. package/dist/indicator/ring-buffer.js +0 -56
  441. package/dist/indicator/ring-buffer.js.map +0 -1
  442. package/dist/indicator/rma.d.ts +0 -2
  443. package/dist/indicator/rma.js +0 -23
  444. package/dist/indicator/rma.js.map +0 -1
  445. package/dist/indicator/sma.d.ts +0 -2
  446. package/dist/indicator/sma.js +0 -19
  447. package/dist/indicator/sma.js.map +0 -1
  448. package/dist/indicator/sma.spec.d.ts +0 -1
  449. package/dist/indicator/sma.spec.js +0 -19
  450. package/dist/indicator/sma.spec.js.map +0 -1
  451. package/dist/indicator/swma.d.ts +0 -2
  452. package/dist/indicator/swma.js +0 -20
  453. package/dist/indicator/swma.js.map +0 -1
  454. package/dist/indicator/tma.d.ts +0 -2
  455. package/dist/indicator/tma.js +0 -16
  456. package/dist/indicator/tma.js.map +0 -1
  457. package/dist/indicator/tma.spec.d.ts +0 -1
  458. package/dist/indicator/tma.spec.js +0 -19
  459. package/dist/indicator/tma.spec.js.map +0 -1
  460. package/dist/indicator/trailing.d.ts +0 -13
  461. package/dist/indicator/trailing.js +0 -67
  462. package/dist/indicator/trailing.js.map +0 -1
  463. package/dist/indicator/trailing.spec.d.ts +0 -1
  464. package/dist/indicator/trailing.spec.js +0 -69
  465. package/dist/indicator/trailing.spec.js.map +0 -1
  466. package/dist/indicator/truerange.d.ts +0 -3
  467. package/dist/indicator/truerange.js +0 -19
  468. package/dist/indicator/truerange.js.map +0 -1
  469. package/dist/indicator/truerange.spec.d.ts +0 -1
  470. package/dist/indicator/truerange.spec.js +0 -28
  471. package/dist/indicator/truerange.spec.js.map +0 -1
  472. package/dist/indicator/window.d.ts +0 -3
  473. package/dist/indicator/window.js +0 -22
  474. package/dist/indicator/window.js.map +0 -1
  475. package/dist/indicator/wma.d.ts +0 -2
  476. package/dist/indicator/wma.js +0 -22
  477. package/dist/indicator/wma.js.map +0 -1
  478. package/dist/indicator/wma.spec.d.ts +0 -1
  479. package/dist/indicator/wma.spec.js +0 -19
  480. package/dist/indicator/wma.spec.js.map +0 -1
  481. package/dist/shared/collections.js.map +0 -1
  482. package/dist/shared/datetime.js.map +0 -1
  483. package/dist/shared/decimals.js.map +0 -1
  484. package/dist/shared/decimals.spec.d.ts +0 -1
  485. package/dist/shared/decimals.spec.js +0 -34
  486. package/dist/shared/decimals.spec.js.map +0 -1
  487. package/dist/shared/index.js.map +0 -1
  488. package/dist/shared/io.d.ts +0 -1
  489. package/dist/shared/io.js +0 -8
  490. package/dist/shared/io.js.map +0 -1
  491. package/dist/shared/logger.js.map +0 -1
  492. package/dist/shared/policy.js.map +0 -1
  493. package/dist/storage/cache.js.map +0 -1
  494. package/dist/storage/cache.spec.d.ts +0 -1
  495. package/dist/storage/cache.spec.js +0 -18
  496. package/dist/storage/cache.spec.js.map +0 -1
  497. package/dist/storage/feed.js.map +0 -1
  498. package/dist/storage/index.js.map +0 -1
  499. package/dist/storage/measurement.js.map +0 -1
  500. package/dist/storage/storage.js.map +0 -1
  501. package/dist/store/index.js.map +0 -1
  502. package/dist/store/store-balance.event.js.map +0 -1
  503. package/dist/store/store-balance.event.spec.d.ts +0 -1
  504. package/dist/store/store-balance.event.spec.js +0 -26
  505. package/dist/store/store-balance.event.spec.js.map +0 -1
  506. package/dist/store/store-instrument.event.js.map +0 -1
  507. package/dist/store/store-instrument.event.spec.d.ts +0 -1
  508. package/dist/store/store-instrument.event.spec.js +0 -22
  509. package/dist/store/store-instrument.event.spec.js.map +0 -1
  510. package/dist/store/store-order.event.js.map +0 -1
  511. package/dist/store/store-order.event.spec.d.ts +0 -1
  512. package/dist/store/store-order.event.spec.js +0 -21
  513. package/dist/store/store-order.event.spec.js.map +0 -1
  514. package/dist/store/store-orderbook.event.d.ts +0 -14
  515. package/dist/store/store-orderbook.event.js +0 -42
  516. package/dist/store/store-orderbook.event.js.map +0 -1
  517. package/dist/store/store-position.event.js.map +0 -1
  518. package/dist/store/store-state.js.map +0 -1
  519. package/dist/store/store-trade.event.d.ts +0 -12
  520. package/dist/store/store-trade.event.js.map +0 -1
  521. package/dist/store/store-trade.event.spec.d.ts +0 -1
  522. package/dist/store/store-trade.event.spec.js +0 -44
  523. package/dist/store/store-trade.event.spec.js.map +0 -1
  524. package/dist/store/store.event.js.map +0 -1
  525. package/dist/store/store.js.map +0 -1
  526. package/dist/store/store.spec.d.ts +0 -1
  527. package/dist/store/store.spec.js +0 -119
  528. package/dist/store/store.spec.js.map +0 -1
  529. package/dist/tsconfig.tsbuildinfo +0 -1
  530. package/jestconfig.json +0 -12
  531. package/src/adapter/backtester/backtester-adapter.spec.ts +0 -124
  532. package/src/adapter/paper/paper-adapter.spec.ts +0 -105
  533. package/src/bootstrap.ts +0 -139
  534. package/src/domain/candle.operator.spec.ts +0 -125
  535. package/src/indicator/atr.ts +0 -20
  536. package/src/indicator/cross.spec.ts +0 -151
  537. package/src/indicator/cross.ts +0 -51
  538. package/src/indicator/donchian.ts +0 -37
  539. package/src/indicator/drawdown.ts +0 -27
  540. package/src/indicator/ema.spec.ts +0 -38
  541. package/src/indicator/ema.ts +0 -26
  542. package/src/indicator/envelope.ts +0 -20
  543. package/src/indicator/index.ts +0 -17
  544. package/src/indicator/macd.ts +0 -21
  545. package/src/indicator/min-max.ts +0 -25
  546. package/src/indicator/ring-buffer.ts +0 -63
  547. package/src/indicator/rma.ts +0 -25
  548. package/src/indicator/sma.spec.ts +0 -20
  549. package/src/indicator/sma.ts +0 -24
  550. package/src/indicator/swma.ts +0 -24
  551. package/src/indicator/tma.spec.ts +0 -20
  552. package/src/indicator/tma.ts +0 -19
  553. package/src/indicator/trailing.spec.ts +0 -75
  554. package/src/indicator/trailing.ts +0 -75
  555. package/src/indicator/truerange.spec.ts +0 -32
  556. package/src/indicator/truerange.ts +0 -31
  557. package/src/indicator/window.ts +0 -28
  558. package/src/indicator/wma.spec.ts +0 -19
  559. package/src/indicator/wma.ts +0 -28
  560. package/src/shared/io.ts +0 -3
  561. package/src/store/store-order.event.spec.ts +0 -28
  562. package/src/store/store-orderbook.event.ts +0 -54
@@ -1,5 +1,11 @@
1
- import { Asset, commissionPercentOf, Instrument, Order } from '../../../domain';
2
- import { now } from '../../../shared';
1
+ import {
2
+ Asset,
3
+ Commission,
4
+ commissionPercentOf,
5
+ Instrument,
6
+ Order
7
+ } from '../../../domain';
8
+ import { d, now } from '../../../shared';
3
9
  import {
4
10
  BalancePatchEvent,
5
11
  InstrumentPatchEvent,
@@ -11,82 +17,100 @@ import { PaperEngine } from './paper-engine';
11
17
 
12
18
  describe('PaperEngine', () => {
13
19
  const instrument = new Instrument(
20
+ 0,
14
21
  new Asset('btc', 'binance', 8),
15
22
  new Asset('usdt', 'binance', 2),
16
- 'binance:btc-usdt'
23
+ 'binance:btc-usdt',
24
+ Commission.Zero
17
25
  );
18
26
 
19
27
  const commission = commissionPercentOf({
20
- maker: 0.1,
21
- taker: 0.1
28
+ maker: d(0.1),
29
+ taker: d(0.1)
22
30
  });
23
31
 
24
32
  test('should open a new buy market order', () => {
25
33
  const store = new Store();
26
34
  const engine = new PaperEngine(store);
27
- const order = Order.market(instrument, 1.0);
35
+ const order = new Order(0, '1', instrument, d(1.0), 0);
28
36
 
29
37
  store.dispatch(
30
38
  new InstrumentPatchEvent(now(), instrument.base, instrument.quote, commission, ''),
31
- new BalancePatchEvent(instrument.base, 1, 0, now()),
32
- new BalancePatchEvent(instrument.quote, 1000, 0, now())
39
+ new BalancePatchEvent(instrument.base, d(1), d.Zero, now()),
40
+ new BalancePatchEvent(instrument.quote, d(1000), d.Zero, now())
33
41
  );
34
42
 
35
43
  engine.open(order);
36
44
 
45
+ const pendingOrder = store.snapshot.order.get(instrument.id)?.get(order.id) ?? fail();
46
+ const balance = store.snapshot.balance.get(instrument.quote.id) ?? fail();
47
+
37
48
  expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
38
- expect(store.snapshot.order.get(instrument.id).get(order.id)).toEqual(order);
39
- expect(store.snapshot.balance.get(instrument.quote.id).free).toEqual(0);
40
- expect(store.snapshot.balance.get(instrument.quote.id).locked).toEqual(1000);
49
+ expect(pendingOrder).toEqual(order);
50
+ expect(balance.free).toEqual(d.Zero);
51
+ expect(balance.locked).toEqual(d(1000));
41
52
  });
42
53
 
43
54
  test('should open a new sell market order', () => {
44
55
  const store = new Store();
45
56
  const engine = new PaperEngine(store);
46
- const order = Order.market(instrument, -0.6);
57
+ const order = new Order(0, '1', instrument, d(-0.6), 0);
47
58
 
48
59
  store.dispatch(
49
60
  new InstrumentPatchEvent(now(), instrument.base, instrument.quote, commission, ''),
50
- new BalancePatchEvent(instrument.base, 1, 0, now()),
51
- new BalancePatchEvent(instrument.quote, 1000, 0, now())
61
+ new BalancePatchEvent(instrument.base, d(1), d.Zero, now()),
62
+ new BalancePatchEvent(instrument.quote, d(1000), d.Zero, now())
52
63
  );
53
64
 
54
65
  engine.open(order);
55
66
 
67
+ const pendingOrder = store.snapshot.order.get(instrument.id)?.get(order.id) ?? fail();
68
+ const balance = store.snapshot.balance.get(instrument.base.id) ?? fail();
69
+
56
70
  expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
57
- expect(store.snapshot.order.get(instrument.id).get(order.id)).toEqual(order);
58
- expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(0.4);
59
- expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(0.6);
71
+ expect(pendingOrder).toEqual(order);
72
+ expect(balance.free).toEqual(d(0.4));
73
+ expect(balance.locked).toEqual(d(0.6));
60
74
  });
61
75
 
62
76
  test('should open and fill a new sell limit order', () => {
63
77
  const store = new Store();
64
78
  const engine = new PaperEngine(store);
65
- const order = Order.limit(instrument, -0.6, 100);
79
+ const order = new Order(0, '1', instrument, d(-0.6), 0, d(100));
66
80
 
67
81
  store.dispatch(
68
82
  new InstrumentPatchEvent(now(), instrument.base, instrument.quote, commission, ''),
69
- new BalancePatchEvent(instrument.base, 1, 0, now()),
70
- new BalancePatchEvent(instrument.quote, 1000, 0, now()),
83
+ new BalancePatchEvent(instrument.base, d(1), d.Zero, now()),
84
+ new BalancePatchEvent(instrument.quote, d(1000), d.Zero, now()),
71
85
  new InstrumentSubscriptionEvent(now(), instrument, true)
72
86
  );
73
87
 
74
88
  engine.open(order);
75
89
 
90
+ const pendingOrder = store.snapshot.order.get(instrument.id)?.get(order.id) ?? fail();
91
+ const baseBalance = store.snapshot.balance.get(instrument.base.id) ?? fail();
92
+
76
93
  expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
77
- expect(store.snapshot.order.get(instrument.id).get(order.id).state).toEqual(
78
- 'PENDING'
94
+ expect(pendingOrder.state).toEqual('PENDING');
95
+ expect(baseBalance.free).toEqual(d(0.4));
96
+ expect(baseBalance.locked).toEqual(d(0.6));
97
+
98
+ store.dispatch(
99
+ new OrderbookPatchEvent(
100
+ instrument,
101
+ { rate: d(102), quantity: d(1), next: undefined },
102
+ { rate: d(101), quantity: d(1), next: undefined },
103
+ now()
104
+ )
79
105
  );
80
- expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(0.4);
81
- expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(0.6);
82
106
 
83
- store.dispatch(new OrderbookPatchEvent(instrument, 102, 1, 101, 1, now()));
107
+ const quoteBalance = store.snapshot.balance.get(instrument.quote.id) ?? fail();
84
108
 
85
109
  expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
86
- expect(store.snapshot.order.get(instrument.id).get(order.id).state).toEqual('FILLED');
87
- expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(0.4);
88
- expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(0);
89
- expect(store.snapshot.balance.get(instrument.quote.id).free).toEqual(1060.53);
90
- expect(store.snapshot.balance.get(instrument.quote.id).locked).toEqual(0);
110
+ expect(pendingOrder.state).toEqual('FILLED');
111
+ expect(baseBalance.free).toEqual(d(0.4));
112
+ expect(baseBalance.locked).toEqual(d.Zero);
113
+ expect(quoteBalance.free).toEqual(d(1060.53));
114
+ expect(quoteBalance.locked).toEqual(d.Zero);
91
115
  });
92
116
  });
@@ -1,6 +1,7 @@
1
1
  import { tap } from 'rxjs';
2
2
 
3
3
  import { Order, Orderbook, Trade } from '../../../domain';
4
+ import { d, decimal } from '../../../shared';
4
5
  import {
5
6
  BalanceLockOrderEvent,
6
7
  BalanceTransactEvent,
@@ -13,6 +14,7 @@ import {
13
14
  OrderRejectedEvent,
14
15
  Store
15
16
  } from '../../../store';
17
+ import { instrumentNotSupportedError } from '../../../store/error';
16
18
 
17
19
  export class PaperEngine {
18
20
  constructor(private readonly store: Store) {
@@ -59,69 +61,83 @@ export class PaperEngine {
59
61
  }
60
62
 
61
63
  private onOrderbook(orderbook: Orderbook) {
62
- this.store.snapshot.order
63
- .get(orderbook.instrument.id)
64
- .asReadonlyArray()
65
- .forEach(it => {
66
- if (it.state != 'PENDING') {
67
- return;
68
- }
64
+ const orders = this.store.snapshot.order.get(orderbook.instrument.id);
65
+ if (!orders) {
66
+ return;
67
+ }
69
68
 
70
- if (it.type == 'LIMIT') {
71
- if (it.quantity > 0 && it.rate > orderbook.bestAskRate) {
72
- this.completeOrder(it, orderbook.bestAskRate);
73
- } else if (it.quantity < 0 && it.rate < orderbook.bestBidRate) {
74
- this.completeOrder(it, orderbook.bestBidRate);
75
- }
76
- } else if (it.type == 'MARKET') {
77
- if (it.quantity > 0) {
78
- this.completeOrder(it, orderbook.bestAskRate);
79
- } else if (it.quantity < 0) {
80
- this.completeOrder(it, orderbook.bestBidRate);
81
- }
69
+ orders.asReadonlyArray().forEach(it => {
70
+ if (it.state != 'PENDING') {
71
+ return;
72
+ }
73
+
74
+ if (it.rate) {
75
+ if (it.quantity.greaterThan(0) && it.rate.greaterThan(orderbook.asks.rate)) {
76
+ this.completeOrder(it, orderbook.asks.rate);
77
+ } else if (it.quantity.lessThan(0) && it.rate.lessThan(orderbook.bids.rate)) {
78
+ this.completeOrder(it, orderbook.bids.rate);
79
+ }
80
+ } else {
81
+ if (it.quantity.greaterThan(0)) {
82
+ this.completeOrder(it, orderbook.asks.rate);
83
+ } else if (it.quantity.lessThan(0)) {
84
+ this.completeOrder(it, orderbook.bids.rate);
82
85
  }
83
- });
86
+ }
87
+ });
84
88
  }
85
89
 
86
90
  private onTrade(trade: Trade) {
87
- this.store.snapshot.order
88
- .get(trade.instrument.id)
89
- .asReadonlyArray()
90
- .forEach(it => {
91
- if (it.state != 'PENDING') {
92
- return;
93
- }
91
+ const orders = this.store.snapshot.order.get(trade.instrument.id);
92
+ if (!orders) {
93
+ return;
94
+ }
94
95
 
95
- if (it.type == 'LIMIT') {
96
- if (it.quantity > 0 && it.rate > trade.rate) {
97
- this.completeOrder(it, trade.rate);
98
- } else if (it.quantity < 0 && it.rate < trade.rate) {
99
- this.completeOrder(it, trade.rate);
100
- }
101
- } else if (it.type == 'MARKET') {
96
+ orders.asReadonlyArray().forEach(it => {
97
+ if (it.state != 'PENDING') {
98
+ return;
99
+ }
100
+
101
+ if (it.rate) {
102
+ if (it.quantity.greaterThan(0) && it.rate.greaterThan(trade.rate)) {
103
+ this.completeOrder(it, trade.rate);
104
+ } else if (it.quantity.lessThan(0) && it.rate.lessThan(trade.rate)) {
102
105
  this.completeOrder(it, trade.rate);
103
106
  }
104
- });
107
+ } else {
108
+ this.completeOrder(it, trade.rate);
109
+ }
110
+ });
105
111
  }
106
112
 
107
- private completeOrder(order: Order, averageExecutionRate: number) {
113
+ private completeOrder(order: Order, averageExecutionRate: decimal) {
108
114
  const { timestamp } = this.store.snapshot;
109
115
 
110
116
  const instrument = this.store.snapshot.universe.instrument.get(order.instrument.id);
117
+ if (!instrument) {
118
+ throw instrumentNotSupportedError(order.instrument);
119
+ }
120
+
111
121
  const transacted = {
112
- base: 0,
113
- quote: 0
122
+ base: d.Zero,
123
+ quote: d.Zero
114
124
  };
115
125
 
116
- const qty = Math.abs(order.quantity);
126
+ const qty = order.quantity.abs();
117
127
 
118
- if (order.quantity > 0) {
119
- transacted.base += instrument.base.floor(instrument.commission.applyMakerFee(qty));
120
- transacted.quote -= instrument.quote.floor(averageExecutionRate * qty);
121
- } else if (order.quantity < 0) {
122
- transacted.base -= instrument.base.floor(qty);
123
- transacted.quote += instrument.quote.floor(
124
- instrument.commission.applyMakerFee(averageExecutionRate * qty)
128
+ if (order.quantity.greaterThan(0)) {
129
+ transacted.base = transacted.base.plus(
130
+ instrument.base.floor(instrument.commission.applyMakerFee(qty))
131
+ );
132
+ transacted.quote = transacted.quote.minus(
133
+ instrument.quote.floor(averageExecutionRate.mul(qty))
134
+ );
135
+ } else if (order.quantity.lessThan(0)) {
136
+ transacted.base = transacted.base.minus(instrument.base.floor(qty));
137
+ transacted.quote = transacted.quote.plus(
138
+ instrument.quote.floor(
139
+ instrument.commission.applyMakerFee(averageExecutionRate.mul(qty))
140
+ )
125
141
  );
126
142
  }
127
143
 
@@ -1,11 +1,13 @@
1
1
  import { assetOf, Candle, InstrumentSelector, Order } from '../../domain';
2
+ import { d, decimal, timestamp } from '../../shared';
2
3
  import { BalancePatchEvent, Store } from '../../store';
3
4
  import { Adapter } from '..';
4
- import { AdapterFactory, FeedQuery, HistoryQuery } from '../adapter';
5
+ import { AdapterFactory, FeedAsyncCallback } from '../adapter';
6
+ import { noPaperEngineProvidedError } from '../error';
5
7
  import { PaperEngine } from './engine/paper-engine';
6
8
 
7
9
  export interface PaperOptions {
8
- balance: { [key: string]: number };
10
+ balance: { [key: string]: decimal };
9
11
  }
10
12
 
11
13
  export function createPaperAdapterFactory(
@@ -18,7 +20,7 @@ export function createPaperAdapterFactory(
18
20
 
19
21
  export class PaperAdapter extends Adapter {
20
22
  readonly name = this.decoratedAdapter.name;
21
- private engine: PaperEngine;
23
+ private engine?: PaperEngine;
22
24
 
23
25
  constructor(
24
26
  readonly decoratedAdapter: Adapter,
@@ -60,28 +62,47 @@ export class PaperAdapter extends Adapter {
60
62
 
61
63
  subscribed = subscribed.filter(it => it.id != asset.id);
62
64
 
63
- this.store.dispatch(new BalancePatchEvent(asset, free, 0, this.timestamp()));
65
+ this.store.dispatch(new BalancePatchEvent(asset, free, d.Zero, this.timestamp()));
64
66
  }
65
67
 
66
68
  for (const missingAsset of subscribed) {
67
- this.store.dispatch(new BalancePatchEvent(missingAsset, 0, 0, this.timestamp()));
69
+ this.store.dispatch(
70
+ new BalancePatchEvent(missingAsset, d.Zero, d.Zero, this.timestamp())
71
+ );
68
72
  }
69
73
  }
70
74
 
71
75
  async open(order: Order): Promise<void> {
76
+ if (!this.engine) {
77
+ throw noPaperEngineProvidedError();
78
+ }
79
+
72
80
  this.engine.open(order);
73
81
  }
74
82
 
75
83
  async cancel(order: Order): Promise<void> {
84
+ if (!this.engine) {
85
+ throw noPaperEngineProvidedError();
86
+ }
87
+
76
88
  this.engine.cancel(order);
77
89
  }
78
90
 
79
- history(query: HistoryQuery): Promise<Candle[]> {
80
- return this.decoratedAdapter.history(query);
91
+ history(
92
+ instrument: InstrumentSelector,
93
+ timeframe: number,
94
+ length: number
95
+ ): Promise<Candle[]> {
96
+ return this.decoratedAdapter.history(instrument, timeframe, length);
81
97
  }
82
98
 
83
- feed(query: FeedQuery): Promise<void> {
84
- return this.decoratedAdapter.feed(query);
99
+ feed(
100
+ instrument: InstrumentSelector,
101
+ from: timestamp,
102
+ to: timestamp,
103
+ callback: FeedAsyncCallback
104
+ ): Promise<void> {
105
+ return this.decoratedAdapter.feed(instrument, from, to, callback);
85
106
  }
86
107
 
87
108
  createPaperEngine(adapter: PaperAdapter): PaperEngine {
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 { SessionBuilder } from '../domain/session-builder';
4
+ import { now } from '../shared';
5
+ import { prepare } from '../strategy';
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 prepare(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,66 +1,58 @@
1
1
  import { Presets, SingleBar } from 'cli-progress';
2
+ import { join } from 'path';
2
3
 
3
- import { Bootstrap } from '../bootstrap';
4
4
  import { instrumentOf } from '../domain';
5
+ import { SessionBuilder } from '../domain/session-builder';
6
+ import { now } from '../shared';
5
7
  import { Feed } from '../storage';
8
+ import { prepare } from '../strategy';
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;
18
+ const builder = new SessionBuilder().useSessionId(
19
+ options.id ? Number(options.id) : now()
20
+ );
15
21
 
16
- const module = await getModule(name);
22
+ await prepare(name, builder);
17
23
 
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
- }
34
-
35
- const to = options.to ? Date.parse(options.to) : module.descriptor.simulation.to;
36
-
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();
46
29
 
47
- const bar = new SingleBar({}, Presets.shades_classic);
48
- const feed = new Feed(module.descriptor.storage('feed'));
30
+ const bar = new SingleBar(
31
+ {
32
+ format: `Pulling ${instrument} [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}`
33
+ },
34
+ Presets.rect
35
+ );
36
+
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
 
52
- await session.aggregate.feed({
53
- instrument: instrumentOf(instrument),
43
+ await session.aggregate.feed(
44
+ instrumentOf(instrument),
54
45
  from,
55
46
  to,
56
- destination: feed,
57
- callback: timestamp => {
47
+ async (timestamp, events) => {
58
48
  const duration = to - from;
59
49
  const completed = timestamp - from;
60
50
 
51
+ await feed.save(events);
52
+
61
53
  bar.update(Math.floor((completed / duration) * 100));
62
54
  }
63
- });
55
+ );
64
56
 
65
57
  bar.update(100);
66
58
  bar.stop();
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 { SessionBuilder } from '../domain/session-builder';
4
+ import { now } from '../shared';
5
+ import { prepare } from '../strategy';
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 prepare(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 { prepare } from '../strategy';
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 prepare(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
  }
@@ -1,3 +1,4 @@
1
+ import { d } from '../shared';
1
2
  import { Asset, assetOf } from './asset';
2
3
 
3
4
  describe('Asset', () => {
@@ -7,10 +8,9 @@ describe('Asset', () => {
7
8
  expect(sut.name).toEqual('abc');
8
9
  expect(sut.adapterName).toEqual('xyz');
9
10
  expect(sut.scale).toEqual(4);
10
- expect(sut.tickSize).toEqual(0.0001);
11
- expect(sut.fixed(1.1234567)).toEqual(1.1234);
12
- expect(sut.floor(1.1234567)).toEqual(1.1234);
13
- expect(sut.ceil(1.1234567)).toEqual(1.1235);
11
+ expect(sut.tickSize).toEqual(d(0.0001));
12
+ expect(sut.floor(d(1.1234567))).toEqual(d(1.1234));
13
+ expect(sut.ceil(d(1.1234567))).toEqual(d(1.1235));
14
14
  expect(sut.id).toEqual('xyz:abc');
15
15
  });
16
16