@quantform/core 0.5.23 → 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 (555) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/adapter/adapter-aggregate.d.ts +36 -1
  3. package/dist/adapter/adapter-aggregate.d.ts.map +1 -0
  4. package/dist/adapter/adapter-aggregate.js +110 -50
  5. package/dist/adapter/adapter.d.ts +25 -0
  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 +1 -0
  9. package/dist/adapter/backtester/backtester-adapter.d.ts.map +1 -0
  10. package/dist/adapter/backtester/backtester-adapter.js +26 -13
  11. package/dist/adapter/backtester/backtester-cursor.d.ts +2 -1
  12. package/dist/adapter/backtester/backtester-cursor.d.ts.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.js +24 -14
  14. package/dist/adapter/backtester/backtester-streamer.d.ts +20 -1
  15. package/dist/adapter/backtester/backtester-streamer.d.ts.map +1 -0
  16. package/dist/adapter/backtester/backtester-streamer.js +54 -30
  17. package/dist/adapter/backtester/error.d.ts +3 -0
  18. package/dist/adapter/backtester/error.d.ts.map +1 -0
  19. package/dist/adapter/backtester/error.js +11 -0
  20. package/dist/adapter/backtester/index.d.ts +1 -0
  21. package/dist/adapter/backtester/index.d.ts.map +1 -0
  22. package/dist/adapter/backtester/index.js +0 -1
  23. package/dist/adapter/error.d.ts +2 -0
  24. package/dist/adapter/error.d.ts.map +1 -0
  25. package/dist/adapter/error.js +5 -2
  26. package/dist/adapter/index.d.ts +1 -0
  27. package/dist/adapter/index.d.ts.map +1 -0
  28. package/dist/adapter/index.js +0 -1
  29. package/dist/adapter/paper/engine/paper-engine.d.ts +1 -0
  30. package/dist/adapter/paper/engine/paper-engine.d.ts.map +1 -0
  31. package/dist/adapter/paper/engine/paper-engine.js +18 -13
  32. package/dist/adapter/paper/index.d.ts +1 -0
  33. package/dist/adapter/paper/index.d.ts.map +1 -0
  34. package/dist/adapter/paper/index.js +0 -1
  35. package/dist/adapter/paper/paper-adapter.d.ts +4 -3
  36. package/dist/adapter/paper/paper-adapter.d.ts.map +1 -0
  37. package/dist/adapter/paper/paper-adapter.js +44 -21
  38. package/dist/cli/build.d.ts +1 -0
  39. package/dist/cli/build.d.ts.map +1 -0
  40. package/dist/cli/build.js +18 -8
  41. package/dist/cli/dev.d.ts +1 -0
  42. package/dist/cli/dev.d.ts.map +1 -0
  43. package/dist/cli/dev.js +52 -12
  44. package/dist/cli/error.d.ts +2 -0
  45. package/dist/cli/error.d.ts.map +1 -0
  46. package/dist/cli/error.js +7 -0
  47. package/dist/cli/index.d.ts +1 -0
  48. package/dist/cli/index.d.ts.map +1 -0
  49. package/dist/cli/index.js +21 -10
  50. package/dist/cli/internal/workspace.d.ts +1 -7
  51. package/dist/cli/internal/workspace.d.ts.map +1 -0
  52. package/dist/cli/internal/workspace.js +1 -6
  53. package/dist/cli/pull.d.ts +1 -0
  54. package/dist/cli/pull.d.ts.map +1 -0
  55. package/dist/cli/pull.js +68 -38
  56. package/dist/cli/run.d.ts +2 -1
  57. package/dist/cli/run.d.ts.map +1 -0
  58. package/dist/cli/run.js +52 -14
  59. package/dist/cli/test.d.ts +2 -1
  60. package/dist/cli/test.d.ts.map +1 -0
  61. package/dist/cli/test.js +59 -34
  62. package/dist/domain/asset.d.ts +20 -0
  63. package/dist/domain/asset.d.ts.map +1 -0
  64. package/dist/domain/asset.js +19 -1
  65. package/dist/domain/{balance.operator.d.ts → balance-operator.d.ts} +1 -0
  66. package/dist/domain/balance-operator.d.ts.map +1 -0
  67. package/dist/domain/{balance.operator.js → balance-operator.js} +0 -1
  68. package/dist/domain/balance.d.ts +27 -3
  69. package/dist/domain/balance.d.ts.map +1 -0
  70. package/dist/domain/balance.js +31 -3
  71. package/dist/domain/{candle.operator.d.ts → candle-operator.d.ts} +1 -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 +3 -2
  75. package/dist/domain/candle.d.ts.map +1 -0
  76. package/dist/domain/candle.js +0 -1
  77. package/dist/domain/commission.d.ts +2 -0
  78. package/dist/domain/commission.d.ts.map +1 -0
  79. package/dist/domain/commission.js +2 -1
  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 +4 -3
  84. package/dist/domain/error.d.ts.map +1 -0
  85. package/dist/domain/error.js +3 -4
  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 +15 -20
  99. package/dist/domain/order.d.ts.map +1 -0
  100. package/dist/domain/order.js +16 -28
  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 +10 -6
  105. package/dist/domain/orderbook.d.ts.map +1 -0
  106. package/dist/domain/orderbook.js +7 -2
  107. package/dist/domain/{position.operator.d.ts → position-operator.d.ts} +4 -2
  108. package/dist/domain/position-operator.d.ts.map +1 -0
  109. package/dist/domain/{position.operator.js → position-operator.js} +10 -3
  110. package/dist/domain/position.d.ts +5 -4
  111. package/dist/domain/position.d.ts.map +1 -0
  112. package/dist/domain/position.js +2 -2
  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 +103 -39
  119. package/dist/domain/timeframe.d.ts +1 -0
  120. package/dist/domain/timeframe.d.ts.map +1 -0
  121. package/dist/domain/timeframe.js +0 -1
  122. package/dist/domain/{trade.operator.d.ts → trade-operator.d.ts} +1 -0
  123. package/dist/domain/trade-operator.d.ts.map +1 -0
  124. package/dist/domain/{trade.operator.js → trade-operator.js} +0 -1
  125. package/dist/domain/trade.d.ts +10 -5
  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 +9 -6
  132. package/dist/shared/collections.d.ts.map +1 -0
  133. package/dist/shared/collections.js +21 -13
  134. package/dist/shared/datetime.d.ts +1 -0
  135. package/dist/shared/datetime.d.ts.map +1 -0
  136. package/dist/shared/datetime.js +0 -1
  137. package/dist/shared/decimals.d.ts +13 -0
  138. package/dist/shared/decimals.d.ts.map +1 -0
  139. package/dist/shared/decimals.js +12 -1
  140. package/dist/shared/environment.d.ts +3 -0
  141. package/dist/shared/environment.d.ts.map +1 -0
  142. package/dist/shared/environment.js +15 -0
  143. package/dist/shared/index.d.ts +2 -1
  144. package/dist/shared/index.d.ts.map +1 -0
  145. package/dist/shared/index.js +1 -2
  146. package/dist/shared/logger.d.ts +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 +1 -0
  150. package/dist/shared/pipe.d.ts.map +1 -0
  151. package/dist/shared/pipe.js +0 -1
  152. package/dist/shared/policy.d.ts +1 -0
  153. package/dist/shared/policy.d.ts.map +1 -0
  154. package/dist/shared/policy.js +0 -1
  155. package/dist/storage/cache.d.ts +1 -0
  156. package/dist/storage/cache.d.ts.map +1 -0
  157. package/dist/storage/cache.js +30 -19
  158. package/dist/storage/feed.d.ts +25 -0
  159. package/dist/storage/feed.d.ts.map +1 -0
  160. package/dist/storage/feed.js +56 -19
  161. package/dist/storage/index.d.ts +1 -0
  162. package/dist/storage/index.d.ts.map +1 -0
  163. package/dist/storage/index.js +0 -1
  164. package/dist/storage/measurement.d.ts +20 -0
  165. package/dist/storage/measurement.d.ts.map +1 -0
  166. package/dist/storage/measurement.js +41 -10
  167. package/dist/storage/storage.d.ts +41 -0
  168. package/dist/storage/storage.d.ts.map +1 -0
  169. package/dist/storage/storage.js +69 -33
  170. package/dist/store/error.d.ts +9 -0
  171. package/dist/store/error.d.ts.map +1 -0
  172. package/dist/store/error.js +31 -0
  173. package/dist/store/index.d.ts +8 -7
  174. package/dist/store/index.d.ts.map +1 -0
  175. package/dist/store/index.js +7 -8
  176. package/dist/store/{store-balance.event.d.ts → store-balance-event.d.ts} +14 -1
  177. package/dist/store/store-balance-event.d.ts.map +1 -0
  178. package/dist/store/{store-balance.event.js → store-balance-event.js} +54 -10
  179. package/dist/store/{store.event.d.ts → store-event.d.ts} +1 -0
  180. package/dist/store/store-event.d.ts.map +1 -0
  181. package/dist/store/{store.event.js → store-event.js} +0 -1
  182. package/dist/store/{store-instrument.event.d.ts → store-instrument-event.d.ts} +5 -4
  183. package/dist/store/store-instrument-event.d.ts.map +1 -0
  184. package/dist/store/{store-instrument.event.js → store-instrument-event.js} +13 -5
  185. package/dist/store/{store-order.event.d.ts → store-order-event.d.ts} +7 -2
  186. package/dist/store/store-order-event.d.ts.map +1 -0
  187. package/dist/store/{store-order.event.js → store-order-event.js} +24 -20
  188. package/dist/store/{store-orderbook.event.d.ts → store-orderbook-event.d.ts} +2 -1
  189. package/dist/store/store-orderbook-event.d.ts.map +1 -0
  190. package/dist/store/{store-orderbook.event.js → store-orderbook-event.js} +6 -5
  191. package/dist/store/{store-position.event.d.ts → store-position-event.d.ts} +3 -2
  192. package/dist/store/store-position-event.d.ts.map +1 -0
  193. package/dist/store/{store-position.event.js → store-position-event.js} +13 -6
  194. package/dist/store/store-state.d.ts +3 -2
  195. package/dist/store/store-state.d.ts.map +1 -0
  196. package/dist/store/store-state.js +1 -1
  197. package/dist/store/{store-trade.event.d.ts → store-trade-event.d.ts} +6 -1
  198. package/dist/store/store-trade-event.d.ts.map +1 -0
  199. package/dist/store/{store-trade.event.js → store-trade-event.js} +12 -3
  200. package/dist/store/store.d.ts +2 -1
  201. package/dist/store/store.d.ts.map +1 -0
  202. package/dist/store/store.js +0 -1
  203. package/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 -32
  208. package/src/adapter/adapter-aggregate.ts +41 -18
  209. package/src/adapter/backtester/backtester-adapter.ts +0 -2
  210. package/src/adapter/backtester/backtester-cursor.ts +2 -2
  211. package/src/adapter/backtester/backtester-streamer.spec.ts +5 -3
  212. package/src/adapter/backtester/backtester-streamer.ts +16 -8
  213. package/src/adapter/backtester/error.ts +7 -0
  214. package/src/adapter/error.ts +4 -0
  215. package/src/adapter/paper/engine/paper-engine.spec.ts +38 -21
  216. package/src/adapter/paper/engine/paper-engine.ts +44 -35
  217. package/src/adapter/paper/paper-adapter.ts +13 -4
  218. package/src/cli/build.ts +1 -1
  219. package/src/cli/dev.ts +15 -7
  220. package/src/cli/error.ts +5 -0
  221. package/src/cli/internal/workspace.ts +0 -11
  222. package/src/cli/pull.ts +22 -31
  223. package/src/cli/run.ts +14 -11
  224. package/src/cli/test.ts +24 -37
  225. package/src/domain/asset.ts +1 -1
  226. package/src/domain/{balance.operator.spec.ts → balance-operator.spec.ts} +4 -3
  227. package/src/domain/{balance.operator.ts → balance-operator.ts} +0 -0
  228. package/src/domain/balance.spec.ts +15 -12
  229. package/src/domain/balance.ts +7 -6
  230. package/src/domain/{candle.operator.spec.ts → candle-operator.spec.ts} +1 -1
  231. package/src/domain/{candle.operator.ts → candle-operator.ts} +21 -5
  232. package/src/domain/commission.ts +3 -1
  233. package/src/domain/error.ts +3 -3
  234. package/src/domain/index.ts +8 -7
  235. package/src/domain/{instrument.operator.spec.ts → instrument-operator.spec.ts} +9 -2
  236. package/src/domain/{instrument.operator.ts → instrument-operator.ts} +0 -0
  237. package/src/domain/instrument.spec.ts +8 -1
  238. package/src/domain/instrument.ts +11 -8
  239. package/src/domain/{order.operator.spec.ts → order-operator.spec.ts} +9 -6
  240. package/src/domain/{order.operator.ts → order-operator.ts} +2 -2
  241. package/src/domain/order.spec.ts +8 -9
  242. package/src/domain/order.ts +22 -52
  243. package/src/domain/{orderbook.operator.spec.ts → orderbook-operator.spec.ts} +15 -3
  244. package/src/domain/{orderbook.operator.ts → orderbook-operator.ts} +0 -0
  245. package/src/domain/orderbook.spec.ts +11 -2
  246. package/src/domain/orderbook.ts +10 -9
  247. package/src/domain/{position.operator.spec.ts → position-operator.spec.ts} +11 -6
  248. package/src/domain/{position.operator.ts → position-operator.ts} +13 -6
  249. package/src/domain/position.spec.ts +7 -4
  250. package/src/domain/position.ts +3 -3
  251. package/src/domain/session-builder.ts +158 -0
  252. package/src/domain/session.spec.ts +2 -9
  253. package/src/domain/session.ts +84 -69
  254. package/src/domain/{trade.operator.spec.ts → trade-operator.spec.ts} +7 -3
  255. package/src/domain/{trade.operator.ts → trade-operator.ts} +0 -0
  256. package/src/domain/trade.spec.ts +6 -2
  257. package/src/domain/trade.ts +9 -7
  258. package/src/index.ts +1 -2
  259. package/src/shared/collections.spec.ts +10 -6
  260. package/src/shared/collections.ts +29 -16
  261. package/src/shared/environment.ts +13 -0
  262. package/src/shared/index.ts +1 -1
  263. package/src/shared/logger.ts +35 -7
  264. package/src/shared/pipe.ts +1 -1
  265. package/src/storage/cache.ts +3 -1
  266. package/src/storage/feed.ts +2 -0
  267. package/src/storage/storage.ts +10 -8
  268. package/src/store/error.ts +36 -0
  269. package/src/store/index.ts +7 -7
  270. package/src/store/{store-balance.event.spec.ts → store-balance-event.spec.ts} +3 -3
  271. package/src/store/{store-balance.event.ts → store-balance-event.ts} +54 -11
  272. package/src/store/{store.event.ts → store-event.ts} +0 -0
  273. package/src/store/{store-instrument.event.spec.ts → store-instrument-event.spec.ts} +6 -5
  274. package/src/store/{store-instrument.event.ts → store-instrument-event.ts} +17 -6
  275. package/src/store/store-order-event.spec.ts +32 -0
  276. package/src/store/{store-order.event.ts → store-order-event.ts} +25 -20
  277. package/src/store/{store-orderbook.event.spec.ts → store-orderbook-event.spec.ts} +11 -9
  278. package/src/store/{store-orderbook.event.ts → store-orderbook-event.ts} +7 -5
  279. package/src/store/{store-position.event.ts → store-position-event.ts} +14 -7
  280. package/src/store/store-state.ts +3 -3
  281. package/src/store/{store-trade.event.spec.ts → store-trade-event.spec.ts} +7 -5
  282. package/src/store/{store-trade.event.ts → store-trade-event.ts} +10 -4
  283. package/src/store/store.spec.ts +13 -11
  284. package/src/store/store.ts +1 -1
  285. package/src/strategy.ts +47 -0
  286. package/tsconfig.json +12 -5
  287. package/dist/adapter/adapter-aggregate.js.map +0 -1
  288. package/dist/adapter/adapter.js.map +0 -1
  289. package/dist/adapter/backtester/backtester-adapter.js.map +0 -1
  290. package/dist/adapter/backtester/backtester-adapter.spec.d.ts +0 -1
  291. package/dist/adapter/backtester/backtester-adapter.spec.js +0 -83
  292. package/dist/adapter/backtester/backtester-adapter.spec.js.map +0 -1
  293. package/dist/adapter/backtester/backtester-cursor.js.map +0 -1
  294. package/dist/adapter/backtester/backtester-cursor.spec.d.ts +0 -1
  295. package/dist/adapter/backtester/backtester-cursor.spec.js +0 -39
  296. package/dist/adapter/backtester/backtester-cursor.spec.js.map +0 -1
  297. package/dist/adapter/backtester/backtester-streamer.js.map +0 -1
  298. package/dist/adapter/backtester/backtester-streamer.spec.d.ts +0 -1
  299. package/dist/adapter/backtester/backtester-streamer.spec.js +0 -45
  300. package/dist/adapter/backtester/backtester-streamer.spec.js.map +0 -1
  301. package/dist/adapter/backtester/index.js.map +0 -1
  302. package/dist/adapter/error.js.map +0 -1
  303. package/dist/adapter/index.js.map +0 -1
  304. package/dist/adapter/paper/engine/paper-engine.js.map +0 -1
  305. package/dist/adapter/paper/engine/paper-engine.spec.d.ts +0 -1
  306. package/dist/adapter/paper/engine/paper-engine.spec.js +0 -54
  307. package/dist/adapter/paper/engine/paper-engine.spec.js.map +0 -1
  308. package/dist/adapter/paper/index.js.map +0 -1
  309. package/dist/adapter/paper/paper-adapter.js.map +0 -1
  310. package/dist/adapter/paper/paper-adapter.spec.d.ts +0 -1
  311. package/dist/adapter/paper/paper-adapter.spec.js +0 -70
  312. package/dist/adapter/paper/paper-adapter.spec.js.map +0 -1
  313. package/dist/bootstrap.d.ts +0 -11
  314. package/dist/bootstrap.js +0 -73
  315. package/dist/bootstrap.js.map +0 -1
  316. package/dist/cli/build.js.map +0 -1
  317. package/dist/cli/dev.js.map +0 -1
  318. package/dist/cli/index.js.map +0 -1
  319. package/dist/cli/internal/workspace.js.map +0 -1
  320. package/dist/cli/pull.js.map +0 -1
  321. package/dist/cli/run.js.map +0 -1
  322. package/dist/cli/test.js.map +0 -1
  323. package/dist/domain/asset.js.map +0 -1
  324. package/dist/domain/asset.spec.d.ts +0 -1
  325. package/dist/domain/asset.spec.js +0 -55
  326. package/dist/domain/asset.spec.js.map +0 -1
  327. package/dist/domain/balance.js.map +0 -1
  328. package/dist/domain/balance.operator.js.map +0 -1
  329. package/dist/domain/balance.operator.spec.d.ts +0 -1
  330. package/dist/domain/balance.operator.spec.js +0 -23
  331. package/dist/domain/balance.operator.spec.js.map +0 -1
  332. package/dist/domain/balance.spec.d.ts +0 -1
  333. package/dist/domain/balance.spec.js +0 -83
  334. package/dist/domain/balance.spec.js.map +0 -1
  335. package/dist/domain/candle.js.map +0 -1
  336. package/dist/domain/candle.operator.js.map +0 -1
  337. package/dist/domain/candle.operator.spec.d.ts +0 -1
  338. package/dist/domain/candle.operator.spec.js +0 -112
  339. package/dist/domain/candle.operator.spec.js.map +0 -1
  340. package/dist/domain/candle.spec.d.ts +0 -1
  341. package/dist/domain/candle.spec.js +0 -26
  342. package/dist/domain/candle.spec.js.map +0 -1
  343. package/dist/domain/commission.js.map +0 -1
  344. package/dist/domain/commission.spec.d.ts +0 -1
  345. package/dist/domain/commission.spec.js +0 -31
  346. package/dist/domain/commission.spec.js.map +0 -1
  347. package/dist/domain/component.js.map +0 -1
  348. package/dist/domain/error.js.map +0 -1
  349. package/dist/domain/index.js.map +0 -1
  350. package/dist/domain/instrument.js.map +0 -1
  351. package/dist/domain/instrument.operator.js.map +0 -1
  352. package/dist/domain/instrument.operator.spec.d.ts +0 -1
  353. package/dist/domain/instrument.operator.spec.js +0 -24
  354. package/dist/domain/instrument.operator.spec.js.map +0 -1
  355. package/dist/domain/instrument.spec.d.ts +0 -1
  356. package/dist/domain/instrument.spec.js +0 -49
  357. package/dist/domain/instrument.spec.js.map +0 -1
  358. package/dist/domain/order.js.map +0 -1
  359. package/dist/domain/order.operator.js +0 -14
  360. package/dist/domain/order.operator.js.map +0 -1
  361. package/dist/domain/order.operator.spec.d.ts +0 -1
  362. package/dist/domain/order.operator.spec.js +0 -65
  363. package/dist/domain/order.operator.spec.js.map +0 -1
  364. package/dist/domain/order.spec.d.ts +0 -1
  365. package/dist/domain/order.spec.js +0 -34
  366. package/dist/domain/order.spec.js.map +0 -1
  367. package/dist/domain/orderbook.js.map +0 -1
  368. package/dist/domain/orderbook.operator.js.map +0 -1
  369. package/dist/domain/orderbook.operator.spec.d.ts +0 -1
  370. package/dist/domain/orderbook.operator.spec.js +0 -22
  371. package/dist/domain/orderbook.operator.spec.js.map +0 -1
  372. package/dist/domain/orderbook.spec.d.ts +0 -1
  373. package/dist/domain/orderbook.spec.js +0 -13
  374. package/dist/domain/orderbook.spec.js.map +0 -1
  375. package/dist/domain/position.js.map +0 -1
  376. package/dist/domain/position.operator.js.map +0 -1
  377. package/dist/domain/position.operator.spec.d.ts +0 -1
  378. package/dist/domain/position.operator.spec.js +0 -49
  379. package/dist/domain/position.operator.spec.js.map +0 -1
  380. package/dist/domain/position.spec.d.ts +0 -1
  381. package/dist/domain/position.spec.js +0 -31
  382. package/dist/domain/position.spec.js.map +0 -1
  383. package/dist/domain/session.js.map +0 -1
  384. package/dist/domain/session.spec.d.ts +0 -1
  385. package/dist/domain/session.spec.js +0 -23
  386. package/dist/domain/session.spec.js.map +0 -1
  387. package/dist/domain/timeframe.js.map +0 -1
  388. package/dist/domain/trade.js.map +0 -1
  389. package/dist/domain/trade.operator.js.map +0 -1
  390. package/dist/domain/trade.operator.spec.d.ts +0 -1
  391. package/dist/domain/trade.operator.spec.js +0 -24
  392. package/dist/domain/trade.operator.spec.js.map +0 -1
  393. package/dist/domain/trade.spec.d.ts +0 -1
  394. package/dist/domain/trade.spec.js +0 -13
  395. package/dist/domain/trade.spec.js.map +0 -1
  396. package/dist/index.js.map +0 -1
  397. package/dist/indicator/atr.d.ts +0 -4
  398. package/dist/indicator/atr.js +0 -16
  399. package/dist/indicator/atr.js.map +0 -1
  400. package/dist/indicator/cross.d.ts +0 -4
  401. package/dist/indicator/cross.js +0 -41
  402. package/dist/indicator/cross.js.map +0 -1
  403. package/dist/indicator/cross.spec.d.ts +0 -1
  404. package/dist/indicator/cross.spec.js +0 -102
  405. package/dist/indicator/cross.spec.js.map +0 -1
  406. package/dist/indicator/donchian.d.ts +0 -10
  407. package/dist/indicator/donchian.js +0 -16
  408. package/dist/indicator/donchian.js.map +0 -1
  409. package/dist/indicator/drawdown.d.ts +0 -3
  410. package/dist/indicator/drawdown.js +0 -28
  411. package/dist/indicator/drawdown.js.map +0 -1
  412. package/dist/indicator/ema.d.ts +0 -3
  413. package/dist/indicator/ema.js +0 -24
  414. package/dist/indicator/ema.js.map +0 -1
  415. package/dist/indicator/ema.spec.d.ts +0 -1
  416. package/dist/indicator/ema.spec.js +0 -24
  417. package/dist/indicator/ema.spec.js.map +0 -1
  418. package/dist/indicator/envelope.d.ts +0 -6
  419. package/dist/indicator/envelope.js +0 -18
  420. package/dist/indicator/envelope.js.map +0 -1
  421. package/dist/indicator/index.d.ts +0 -17
  422. package/dist/indicator/index.js +0 -34
  423. package/dist/indicator/index.js.map +0 -1
  424. package/dist/indicator/macd.d.ts +0 -3
  425. package/dist/indicator/macd.js +0 -13
  426. package/dist/indicator/macd.js.map +0 -1
  427. package/dist/indicator/min-max.d.ts +0 -6
  428. package/dist/indicator/min-max.js +0 -22
  429. package/dist/indicator/min-max.js.map +0 -1
  430. package/dist/indicator/ring-buffer.d.ts +0 -16
  431. package/dist/indicator/ring-buffer.js +0 -56
  432. package/dist/indicator/ring-buffer.js.map +0 -1
  433. package/dist/indicator/rma.d.ts +0 -3
  434. package/dist/indicator/rma.js +0 -24
  435. package/dist/indicator/rma.js.map +0 -1
  436. package/dist/indicator/sma.d.ts +0 -3
  437. package/dist/indicator/sma.js +0 -17
  438. package/dist/indicator/sma.js.map +0 -1
  439. package/dist/indicator/sma.spec.d.ts +0 -1
  440. package/dist/indicator/sma.spec.js +0 -20
  441. package/dist/indicator/sma.spec.js.map +0 -1
  442. package/dist/indicator/swma.d.ts +0 -3
  443. package/dist/indicator/swma.js +0 -24
  444. package/dist/indicator/swma.js.map +0 -1
  445. package/dist/indicator/tma.d.ts +0 -3
  446. package/dist/indicator/tma.js +0 -16
  447. package/dist/indicator/tma.js.map +0 -1
  448. package/dist/indicator/tma.spec.d.ts +0 -1
  449. package/dist/indicator/tma.spec.js +0 -20
  450. package/dist/indicator/tma.spec.js.map +0 -1
  451. package/dist/indicator/trailing.d.ts +0 -14
  452. package/dist/indicator/trailing.js +0 -68
  453. package/dist/indicator/trailing.js.map +0 -1
  454. package/dist/indicator/trailing.spec.d.ts +0 -1
  455. package/dist/indicator/trailing.spec.js +0 -70
  456. package/dist/indicator/trailing.spec.js.map +0 -1
  457. package/dist/indicator/true-range.d.ts +0 -4
  458. package/dist/indicator/true-range.js +0 -20
  459. package/dist/indicator/true-range.js.map +0 -1
  460. package/dist/indicator/true-range.spec.d.ts +0 -1
  461. package/dist/indicator/true-range.spec.js +0 -28
  462. package/dist/indicator/true-range.spec.js.map +0 -1
  463. package/dist/indicator/window.d.ts +0 -3
  464. package/dist/indicator/window.js +0 -22
  465. package/dist/indicator/window.js.map +0 -1
  466. package/dist/indicator/wma.d.ts +0 -3
  467. package/dist/indicator/wma.js +0 -23
  468. package/dist/indicator/wma.js.map +0 -1
  469. package/dist/indicator/wma.spec.d.ts +0 -1
  470. package/dist/indicator/wma.spec.js +0 -20
  471. package/dist/indicator/wma.spec.js.map +0 -1
  472. package/dist/shared/collections.js.map +0 -1
  473. package/dist/shared/collections.spec.d.ts +0 -1
  474. package/dist/shared/collections.spec.js +0 -28
  475. package/dist/shared/collections.spec.js.map +0 -1
  476. package/dist/shared/datetime.js.map +0 -1
  477. package/dist/shared/decimals.js.map +0 -1
  478. package/dist/shared/decimals.spec.d.ts +0 -1
  479. package/dist/shared/decimals.spec.js +0 -29
  480. package/dist/shared/decimals.spec.js.map +0 -1
  481. package/dist/shared/index.js.map +0 -1
  482. package/dist/shared/io.d.ts +0 -1
  483. package/dist/shared/io.js +0 -8
  484. package/dist/shared/io.js.map +0 -1
  485. package/dist/shared/logger.js.map +0 -1
  486. package/dist/shared/pipe.js.map +0 -1
  487. package/dist/shared/policy.js.map +0 -1
  488. package/dist/storage/cache.js.map +0 -1
  489. package/dist/storage/cache.spec.d.ts +0 -1
  490. package/dist/storage/cache.spec.js +0 -18
  491. package/dist/storage/cache.spec.js.map +0 -1
  492. package/dist/storage/feed.js.map +0 -1
  493. package/dist/storage/index.js.map +0 -1
  494. package/dist/storage/measurement.js.map +0 -1
  495. package/dist/storage/storage.js.map +0 -1
  496. package/dist/store/index.js.map +0 -1
  497. package/dist/store/store-balance.event.js.map +0 -1
  498. package/dist/store/store-balance.event.spec.d.ts +0 -1
  499. package/dist/store/store-balance.event.spec.js +0 -26
  500. package/dist/store/store-balance.event.spec.js.map +0 -1
  501. package/dist/store/store-instrument.event.js.map +0 -1
  502. package/dist/store/store-instrument.event.spec.d.ts +0 -1
  503. package/dist/store/store-instrument.event.spec.js +0 -22
  504. package/dist/store/store-instrument.event.spec.js.map +0 -1
  505. package/dist/store/store-order.event.js.map +0 -1
  506. package/dist/store/store-order.event.spec.d.ts +0 -1
  507. package/dist/store/store-order.event.spec.js +0 -21
  508. package/dist/store/store-order.event.spec.js.map +0 -1
  509. package/dist/store/store-orderbook.event.js.map +0 -1
  510. package/dist/store/store-orderbook.event.spec.d.ts +0 -1
  511. package/dist/store/store-orderbook.event.spec.js +0 -28
  512. package/dist/store/store-orderbook.event.spec.js.map +0 -1
  513. package/dist/store/store-position.event.js.map +0 -1
  514. package/dist/store/store-state.js.map +0 -1
  515. package/dist/store/store-trade.event.js.map +0 -1
  516. package/dist/store/store-trade.event.spec.d.ts +0 -1
  517. package/dist/store/store-trade.event.spec.js +0 -44
  518. package/dist/store/store-trade.event.spec.js.map +0 -1
  519. package/dist/store/store.event.js.map +0 -1
  520. package/dist/store/store.js.map +0 -1
  521. package/dist/store/store.spec.d.ts +0 -1
  522. package/dist/store/store.spec.js +0 -119
  523. package/dist/store/store.spec.js.map +0 -1
  524. package/dist/tsconfig.tsbuildinfo +0 -1
  525. package/jestconfig.json +0 -13
  526. package/src/adapter/backtester/backtester-adapter.spec.ts +0 -133
  527. package/src/adapter/paper/paper-adapter.spec.ts +0 -114
  528. package/src/bootstrap.ts +0 -139
  529. package/src/indicator/atr.ts +0 -21
  530. package/src/indicator/cross.spec.ts +0 -136
  531. package/src/indicator/cross.ts +0 -59
  532. package/src/indicator/donchian.ts +0 -38
  533. package/src/indicator/drawdown.ts +0 -29
  534. package/src/indicator/ema.spec.ts +0 -39
  535. package/src/indicator/ema.ts +0 -27
  536. package/src/indicator/envelope.ts +0 -25
  537. package/src/indicator/index.ts +0 -17
  538. package/src/indicator/macd.ts +0 -22
  539. package/src/indicator/min-max.ts +0 -28
  540. package/src/indicator/ring-buffer.ts +0 -63
  541. package/src/indicator/rma.ts +0 -26
  542. package/src/indicator/sma.spec.ts +0 -21
  543. package/src/indicator/sma.ts +0 -25
  544. package/src/indicator/swma.ts +0 -28
  545. package/src/indicator/tma.spec.ts +0 -21
  546. package/src/indicator/tma.ts +0 -20
  547. package/src/indicator/trailing.spec.ts +0 -88
  548. package/src/indicator/trailing.ts +0 -81
  549. package/src/indicator/true-range.spec.ts +0 -32
  550. package/src/indicator/true-range.ts +0 -32
  551. package/src/indicator/window.ts +0 -28
  552. package/src/indicator/wma.spec.ts +0 -20
  553. package/src/indicator/wma.ts +0 -29
  554. package/src/shared/io.ts +0 -3
  555. package/src/store/store-order.event.spec.ts +0 -28
@@ -53,8 +53,6 @@ export class BacktesterAdapter extends Adapter {
53
53
  it => new InstrumentSubscriptionEvent(this.timestamp(), it, true)
54
54
  )
55
55
  );
56
-
57
- this.streamer.tryContinue();
58
56
  }
59
57
 
60
58
  account(): Promise<void> {
@@ -12,9 +12,9 @@ export class BacktesterCursor {
12
12
  return this.page.length - this.pageIndex;
13
13
  }
14
14
 
15
- constructor(readonly instrument: InstrumentSelector, private readonly feed: Feed) {}
15
+ constructor(readonly instrument: InstrumentSelector, private readonly feed: Feed) { }
16
16
 
17
- peek(): StorageEvent {
17
+ peek(): StorageEvent | undefined {
18
18
  if (!this.page) {
19
19
  return undefined;
20
20
  }
@@ -1,4 +1,4 @@
1
- import { Asset, Instrument } from '../../domain';
1
+ import { Asset, Commission, Instrument } from '../../domain';
2
2
  import { d } from '../../shared';
3
3
  import { Feed, InMemoryStorage } from '../../storage';
4
4
  import { Store, TradePatchEvent } from '../../store';
@@ -6,9 +6,11 @@ import { BacktesterStreamer } from './backtester-streamer';
6
6
 
7
7
  describe('BacktesterStreamer', () => {
8
8
  const instrument = new Instrument(
9
+ 0,
9
10
  new Asset('btc', 'binance', 8),
10
11
  new Asset('usdt', 'binance', 2),
11
- 'binance:btc-usdt'
12
+ 'binance:btc-usdt',
13
+ Commission.Zero
12
14
  );
13
15
 
14
16
  test('should repeat specific events', done => {
@@ -27,7 +29,7 @@ describe('BacktesterStreamer', () => {
27
29
  },
28
30
  {
29
31
  onBacktestCompleted: () => {
30
- const trade = store.snapshot.trade.get(instrument.id);
32
+ const trade = store.snapshot.trade.get(instrument.id) ?? fail();
31
33
 
32
34
  expect(trade.timestamp).toEqual(8);
33
35
  expect(trade.rate).toEqual(d(8));
@@ -4,6 +4,7 @@ import { Feed } from '../../storage';
4
4
  import { Store } from '../../store';
5
5
  import { AdapterTimeProvider } from '../adapter';
6
6
  import { BacktesterCursor } from './backtester-cursor';
7
+ import { invalidEventSequenceError, missingPeriodParametersError } from './error';
7
8
 
8
9
  /**
9
10
  * Listen to backtest session events.
@@ -40,7 +41,7 @@ export class BacktesterStreamer {
40
41
  private readonly listener?: BacktesterListener
41
42
  ) {
42
43
  if (period.from == undefined || period.to == undefined) {
43
- throw new Error('invalid backtest options, please provide from and to period.');
44
+ throw missingPeriodParametersError();
44
45
  }
45
46
 
46
47
  this.timestamp = period.from;
@@ -86,7 +87,7 @@ export class BacktesterStreamer {
86
87
  }
87
88
 
88
89
  if (this.sequence == 0) {
89
- if (this.listener.onBacktestStarted) {
90
+ if (this.listener?.onBacktestStarted) {
90
91
  this.listener.onBacktestStarted(this);
91
92
  }
92
93
  }
@@ -94,7 +95,7 @@ export class BacktesterStreamer {
94
95
  const next = async () => {
95
96
  if (await this.processNext()) {
96
97
  if (this.sequence % this.sequenceUpdateBatch == 0) {
97
- if (this.listener.onBacktestUpdated) {
98
+ if (this.listener?.onBacktestUpdated) {
98
99
  this.listener.onBacktestUpdated(this);
99
100
  }
100
101
  }
@@ -103,7 +104,7 @@ export class BacktesterStreamer {
103
104
  setImmediate(next);
104
105
  }
105
106
  } else {
106
- if (this.listener.onBacktestCompleted) {
107
+ if (this.listener?.onBacktestCompleted) {
107
108
  this.listener.onBacktestCompleted(this);
108
109
  }
109
110
  }
@@ -120,19 +121,26 @@ export class BacktesterStreamer {
120
121
 
121
122
  const event = cursor.peek();
122
123
 
124
+ if (!event) {
125
+ return false;
126
+ }
127
+
123
128
  this.timestamp = event.timestamp;
124
129
  this.sequence++;
125
130
 
126
131
  this.store.dispatch(event);
127
132
 
128
133
  if (cursor.dequeue().timestamp != event.timestamp) {
129
- throw new Error('invalid event to consume');
134
+ throw invalidEventSequenceError();
130
135
  }
131
136
 
132
137
  return true;
133
138
  }
134
139
 
135
- private async current(from: timestamp, to: timestamp): Promise<BacktesterCursor> {
140
+ private async current(
141
+ from: timestamp,
142
+ to: timestamp
143
+ ): Promise<BacktesterCursor | undefined> {
136
144
  for (const cursor of Object.values(this.cursor)) {
137
145
  if (cursor.size == 0 && !cursor.completed) {
138
146
  await cursor.fetchNextPage(from, to);
@@ -140,8 +148,8 @@ export class BacktesterStreamer {
140
148
  }
141
149
 
142
150
  return Object.values(this.cursor)
143
- .filter(it => it.peek() != undefined)
144
- .sort((lhs, rhs) => lhs.peek().timestamp - rhs.peek().timestamp)
151
+ .filter(it => it !== undefined)
152
+ .sort((lhs, rhs) => (lhs?.peek()?.timestamp ?? 0) - (rhs?.peek()?.timestamp ?? 0))
145
153
  .find(() => true);
146
154
  }
147
155
  }
@@ -0,0 +1,7 @@
1
+ export function missingPeriodParametersError() {
2
+ return new Error('invalid backtest options, please provide from and to period.');
3
+ }
4
+
5
+ export function invalidEventSequenceError() {
6
+ return new Error('invalid event to consume');
7
+ }
@@ -4,6 +4,10 @@ export function adapterNotFoundError(adapterName: string) {
4
4
  );
5
5
  }
6
6
 
7
+ export function noPaperEngineProvidedError() {
8
+ return new Error('No paper engine provided.');
9
+ }
10
+
7
11
  export function backtestPageNotEmpty() {
8
12
  return new Error('Backtest page is not empty');
9
13
  }
@@ -1,4 +1,10 @@
1
- import { Asset, commissionPercentOf, Instrument, Order } from '../../../domain';
1
+ import {
2
+ Asset,
3
+ Commission,
4
+ commissionPercentOf,
5
+ Instrument,
6
+ Order
7
+ } from '../../../domain';
2
8
  import { d, now } from '../../../shared';
3
9
  import {
4
10
  BalancePatchEvent,
@@ -11,9 +17,11 @@ 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({
@@ -24,7 +32,7 @@ describe('PaperEngine', () => {
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, d(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, ''),
@@ -34,16 +42,19 @@ describe('PaperEngine', () => {
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(d.Zero);
40
- expect(store.snapshot.balance.get(instrument.quote.id).locked).toEqual(d(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, d(-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, ''),
@@ -53,16 +64,19 @@ describe('PaperEngine', () => {
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(d(0.4));
59
- expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(d(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, d(-0.6), d(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, ''),
@@ -73,12 +87,13 @@ describe('PaperEngine', () => {
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'
79
- );
80
- expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(d(0.4));
81
- expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(d(0.6));
94
+ expect(pendingOrder.state).toEqual('PENDING');
95
+ expect(baseBalance.free).toEqual(d(0.4));
96
+ expect(baseBalance.locked).toEqual(d(0.6));
82
97
 
83
98
  store.dispatch(
84
99
  new OrderbookPatchEvent(
@@ -89,11 +104,13 @@ describe('PaperEngine', () => {
89
104
  )
90
105
  );
91
106
 
107
+ const quoteBalance = store.snapshot.balance.get(instrument.quote.id) ?? fail();
108
+
92
109
  expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
93
- expect(store.snapshot.order.get(instrument.id).get(order.id).state).toEqual('FILLED');
94
- expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(d(0.4));
95
- expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(d.Zero);
96
- expect(store.snapshot.balance.get(instrument.quote.id).free).toEqual(d(1060.53));
97
- expect(store.snapshot.balance.get(instrument.quote.id).locked).toEqual(d.Zero);
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);
98
115
  });
99
116
  });
@@ -14,6 +14,7 @@ import {
14
14
  OrderRejectedEvent,
15
15
  Store
16
16
  } from '../../../store';
17
+ import { instrumentNotSupportedError } from '../../../store/error';
17
18
 
18
19
  export class PaperEngine {
19
20
  constructor(private readonly store: Store) {
@@ -60,55 +61,63 @@ export class PaperEngine {
60
61
  }
61
62
 
62
63
  private onOrderbook(orderbook: Orderbook) {
63
- this.store.snapshot.order
64
- .get(orderbook.instrument.id)
65
- .asReadonlyArray()
66
- .forEach(it => {
67
- if (it.state != 'PENDING') {
68
- return;
69
- }
64
+ const orders = this.store.snapshot.order.get(orderbook.instrument.id);
65
+ if (!orders) {
66
+ return;
67
+ }
70
68
 
71
- if (it.type == 'LIMIT') {
72
- if (it.quantity.greaterThan(0) && it.rate.greaterThan(orderbook.asks.rate)) {
73
- this.completeOrder(it, orderbook.asks.rate);
74
- } else if (it.quantity.lessThan(0) && it.rate.lessThan(orderbook.bids.rate)) {
75
- this.completeOrder(it, orderbook.bids.rate);
76
- }
77
- } else if (it.type == 'MARKET') {
78
- if (it.quantity.greaterThan(0)) {
79
- this.completeOrder(it, orderbook.asks.rate);
80
- } else if (it.quantity.lessThan(0)) {
81
- this.completeOrder(it, orderbook.bids.rate);
82
- }
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);
83
85
  }
84
- });
86
+ }
87
+ });
85
88
  }
86
89
 
87
90
  private onTrade(trade: Trade) {
88
- this.store.snapshot.order
89
- .get(trade.instrument.id)
90
- .asReadonlyArray()
91
- .forEach(it => {
92
- if (it.state != 'PENDING') {
93
- return;
94
- }
91
+ const orders = this.store.snapshot.order.get(trade.instrument.id);
92
+ if (!orders) {
93
+ return;
94
+ }
95
95
 
96
- if (it.type == 'LIMIT') {
97
- if (it.quantity.greaterThan(0) && it.rate.greaterThan(trade.rate)) {
98
- this.completeOrder(it, trade.rate);
99
- } else if (it.quantity.lessThan(0) && it.rate.lessThan(trade.rate)) {
100
- this.completeOrder(it, trade.rate);
101
- }
102
- } 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)) {
103
105
  this.completeOrder(it, trade.rate);
104
106
  }
105
- });
107
+ } else {
108
+ this.completeOrder(it, trade.rate);
109
+ }
110
+ });
106
111
  }
107
112
 
108
113
  private completeOrder(order: Order, averageExecutionRate: decimal) {
109
114
  const { timestamp } = this.store.snapshot;
110
115
 
111
116
  const instrument = this.store.snapshot.universe.instrument.get(order.instrument.id);
117
+ if (!instrument) {
118
+ throw instrumentNotSupportedError(order.instrument);
119
+ }
120
+
112
121
  const transacted = {
113
122
  base: d.Zero,
114
123
  quote: d.Zero
@@ -1,12 +1,13 @@
1
1
  import { assetOf, Candle, InstrumentSelector, Order } from '../../domain';
2
- import { d, timestamp } from '../../shared';
2
+ import { d, decimal, timestamp } from '../../shared';
3
3
  import { BalancePatchEvent, Store } from '../../store';
4
4
  import { Adapter } from '..';
5
5
  import { AdapterFactory, FeedAsyncCallback } from '../adapter';
6
+ import { noPaperEngineProvidedError } from '../error';
6
7
  import { PaperEngine } from './engine/paper-engine';
7
8
 
8
9
  export interface PaperOptions {
9
- balance: { [key: string]: number };
10
+ balance: { [key: string]: decimal };
10
11
  }
11
12
 
12
13
  export function createPaperAdapterFactory(
@@ -19,7 +20,7 @@ export function createPaperAdapterFactory(
19
20
 
20
21
  export class PaperAdapter extends Adapter {
21
22
  readonly name = this.decoratedAdapter.name;
22
- private engine: PaperEngine;
23
+ private engine?: PaperEngine;
23
24
 
24
25
  constructor(
25
26
  readonly decoratedAdapter: Adapter,
@@ -57,7 +58,7 @@ export class PaperAdapter extends Adapter {
57
58
  continue;
58
59
  }
59
60
 
60
- const free = d(this.options.balance[balance]);
61
+ const free = this.options.balance[balance];
61
62
 
62
63
  subscribed = subscribed.filter(it => it.id != asset.id);
63
64
 
@@ -72,10 +73,18 @@ export class PaperAdapter extends Adapter {
72
73
  }
73
74
 
74
75
  async open(order: Order): Promise<void> {
76
+ if (!this.engine) {
77
+ throw noPaperEngineProvidedError();
78
+ }
79
+
75
80
  this.engine.open(order);
76
81
  }
77
82
 
78
83
  async cancel(order: Order): Promise<void> {
84
+ if (!this.engine) {
85
+ throw noPaperEngineProvidedError();
86
+ }
87
+
79
88
  this.engine.cancel(order);
80
89
  }
81
90
 
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,51 +1,42 @@
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;
15
-
16
- const module = await getModule(name);
17
-
18
- const bootstrap = new Bootstrap(module.descriptor);
19
- const session = bootstrap.useSessionId(id).paper();
20
-
21
- if (!module.descriptor.storage) {
22
- throw new Error('Please provide a "storage" property in session descriptor.');
23
- }
24
-
25
- const from = options.from
26
- ? Date.parse(options.from)
27
- : module.descriptor.simulation.from;
28
-
29
- if (!from) {
30
- throw new Error(
31
- 'Please set a "from" date in session descriptor or provide the date as parameter.'
32
- );
33
- }
18
+ const builder = new SessionBuilder().useSessionId(
19
+ options.id ? Number(options.id) : now()
20
+ );
34
21
 
35
- const to = options.to ? Date.parse(options.to) : module.descriptor.simulation.to;
22
+ await prepare(name, builder);
36
23
 
37
- if (!to) {
38
- throw new Error(
39
- 'Please set a "to" date in session descriptor or provide the date as parameter.'
40
- );
41
- }
24
+ const session = builder.paper();
42
25
 
43
26
  console.time('Pulling completed in');
44
27
 
45
- await session.awake(undefined);
28
+ await session.awake();
29
+
30
+ const bar = new SingleBar(
31
+ {
32
+ format: `Pulling ${instrument} [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}`
33
+ },
34
+ Presets.rect
35
+ );
46
36
 
47
- const bar = new SingleBar({}, Presets.shades_classic);
48
- const feed = new Feed(module.descriptor.storage('feed'));
37
+ const feed = new Feed(builder.storage('feed'));
38
+ const from = options.from ? Date.parse(options.from) : builder.period.from;
39
+ const to = options.to ? Date.parse(options.to) : builder.period.to;
49
40
 
50
41
  bar.start(100, 0);
51
42
 
package/src/cli/run.ts CHANGED
@@ -1,22 +1,25 @@
1
- import * as dotenv from 'dotenv';
1
+ import { join } from 'path';
2
2
 
3
- import { Bootstrap } from '../bootstrap';
3
+ import { 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
  }