@quantform/core 0.4.11 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +7 -3
  2. package/dist/adapter/adapter-aggregate.js +17 -18
  3. package/dist/adapter/adapter-aggregate.js.map +1 -1
  4. package/dist/adapter/adapter.d.ts +21 -21
  5. package/dist/adapter/adapter.js +8 -40
  6. package/dist/adapter/adapter.js.map +1 -1
  7. package/dist/adapter/backtester/backtester-adapter.d.ts +9 -7
  8. package/dist/adapter/backtester/backtester-adapter.js +15 -13
  9. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  10. package/dist/{tests → adapter/backtester}/backtester-adapter.spec.d.ts +0 -0
  11. package/dist/adapter/backtester/backtester-adapter.spec.js +82 -0
  12. package/dist/adapter/backtester/backtester-adapter.spec.js.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.d.ts +3 -4
  14. package/dist/adapter/backtester/backtester-cursor.js +2 -1
  15. package/dist/adapter/backtester/backtester-cursor.js.map +1 -1
  16. package/dist/adapter/backtester/backtester-cursor.spec.js +17 -18
  17. package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
  18. package/dist/adapter/backtester/backtester-streamer.d.ts +4 -1
  19. package/dist/adapter/backtester/backtester-streamer.js +39 -18
  20. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  21. package/dist/adapter/backtester/backtester-streamer.spec.js +13 -13
  22. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  23. package/dist/adapter/backtester/index.js +5 -1
  24. package/dist/adapter/backtester/index.js.map +1 -1
  25. package/dist/adapter/error.d.ts +2 -0
  26. package/dist/adapter/error.js +12 -0
  27. package/dist/adapter/error.js.map +1 -0
  28. package/dist/adapter/index.js +5 -1
  29. package/dist/adapter/index.js.map +1 -1
  30. package/dist/adapter/paper/engine/paper-engine.d.ts +11 -0
  31. package/dist/adapter/paper/engine/paper-engine.js +103 -0
  32. package/dist/adapter/paper/engine/paper-engine.js.map +1 -0
  33. package/dist/adapter/paper/{simulator/paper-spot-simulator.spec.d.ts → engine/paper-engine.spec.d.ts} +0 -0
  34. package/dist/adapter/paper/engine/paper-engine.spec.js +54 -0
  35. package/dist/adapter/paper/engine/paper-engine.spec.js.map +1 -0
  36. package/dist/adapter/paper/index.d.ts +1 -2
  37. package/dist/adapter/paper/index.js +6 -3
  38. package/dist/adapter/paper/index.js.map +1 -1
  39. package/dist/adapter/paper/paper-adapter.d.ts +7 -7
  40. package/dist/adapter/paper/paper-adapter.js +21 -19
  41. package/dist/adapter/paper/paper-adapter.js.map +1 -1
  42. package/dist/adapter/paper/paper-adapter.spec.js +35 -15
  43. package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
  44. package/dist/bootstrap.js +32 -15
  45. package/dist/bootstrap.js.map +1 -1
  46. package/dist/cli/build.d.ts +1 -0
  47. package/dist/cli/build.js +16 -0
  48. package/dist/cli/build.js.map +1 -0
  49. package/dist/cli/dev.d.ts +1 -0
  50. package/dist/cli/dev.js +17 -0
  51. package/dist/cli/dev.js.map +1 -0
  52. package/dist/cli/index.d.ts +2 -0
  53. package/dist/cli/index.js +72 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/cli/internal/workspace.d.ts +8 -0
  56. package/dist/cli/internal/workspace.js +14 -0
  57. package/dist/cli/internal/workspace.js.map +1 -0
  58. package/dist/cli/pull.d.ts +1 -0
  59. package/dist/cli/pull.js +52 -0
  60. package/dist/cli/pull.js.map +1 -0
  61. package/dist/cli/run.d.ts +1 -0
  62. package/dist/cli/run.js +19 -0
  63. package/dist/cli/run.js.map +1 -0
  64. package/dist/cli/test.d.ts +1 -0
  65. package/dist/cli/test.js +41 -0
  66. package/dist/cli/test.js.map +1 -0
  67. package/dist/domain/asset.d.ts +6 -5
  68. package/dist/domain/asset.js +22 -16
  69. package/dist/domain/asset.js.map +1 -1
  70. package/dist/domain/asset.spec.js +32 -32
  71. package/dist/domain/asset.spec.js.map +1 -1
  72. package/dist/domain/balance.d.ts +11 -10
  73. package/dist/domain/balance.js +38 -32
  74. package/dist/domain/balance.js.map +1 -1
  75. package/dist/domain/balance.operator.d.ts +6 -0
  76. package/dist/domain/balance.operator.js +10 -0
  77. package/dist/domain/balance.operator.js.map +1 -0
  78. package/dist/{ipc.spec.d.ts → domain/balance.operator.spec.d.ts} +0 -0
  79. package/dist/domain/balance.operator.spec.js +23 -0
  80. package/dist/domain/balance.operator.spec.js.map +1 -0
  81. package/dist/domain/balance.spec.js +69 -9
  82. package/dist/domain/balance.spec.js.map +1 -1
  83. package/dist/domain/candle.d.ts +2 -15
  84. package/dist/domain/candle.js +3 -66
  85. package/dist/domain/candle.js.map +1 -1
  86. package/dist/domain/candle.operator.d.ts +9 -0
  87. package/dist/domain/candle.operator.js +64 -0
  88. package/dist/domain/candle.operator.js.map +1 -0
  89. package/dist/{shared/policy.spec.d.ts → domain/candle.operator.spec.d.ts} +0 -0
  90. package/dist/domain/candle.operator.spec.js +111 -0
  91. package/dist/domain/candle.operator.spec.js.map +1 -0
  92. package/dist/domain/candle.spec.js +11 -53
  93. package/dist/domain/candle.spec.js.map +1 -1
  94. package/dist/domain/commission.d.ts +4 -1
  95. package/dist/domain/commission.js +2 -2
  96. package/dist/domain/commission.js.map +1 -1
  97. package/dist/{shared/topic.spec.d.ts → domain/commission.spec.d.ts} +0 -0
  98. package/dist/domain/commission.spec.js +30 -0
  99. package/dist/domain/commission.spec.js.map +1 -0
  100. package/dist/domain/component.d.ts +2 -0
  101. package/dist/domain/error.d.ts +5 -0
  102. package/dist/domain/error.js +24 -0
  103. package/dist/domain/error.js.map +1 -0
  104. package/dist/domain/index.d.ts +8 -1
  105. package/dist/domain/index.js +13 -2
  106. package/dist/domain/index.js.map +1 -1
  107. package/dist/domain/instrument.d.ts +4 -2
  108. package/dist/domain/instrument.js +18 -9
  109. package/dist/domain/instrument.js.map +1 -1
  110. package/dist/domain/instrument.operator.d.ts +6 -0
  111. package/dist/domain/instrument.operator.js +14 -0
  112. package/dist/domain/instrument.operator.js.map +1 -0
  113. package/dist/{shared/worker.spec.d.ts → domain/instrument.operator.spec.d.ts} +0 -0
  114. package/dist/domain/instrument.operator.spec.js +24 -0
  115. package/dist/domain/instrument.operator.spec.js.map +1 -0
  116. package/dist/domain/instrument.spec.js +22 -30
  117. package/dist/domain/instrument.spec.js.map +1 -1
  118. package/dist/domain/order.d.ts +15 -16
  119. package/dist/domain/order.js +39 -26
  120. package/dist/domain/order.js.map +1 -1
  121. package/dist/domain/order.operator.d.ts +7 -0
  122. package/dist/domain/order.operator.js +14 -0
  123. package/dist/domain/order.operator.js.map +1 -0
  124. package/dist/{store/event/store-balance.event.spec.d.ts → domain/order.operator.spec.d.ts} +0 -0
  125. package/dist/domain/order.operator.spec.js +64 -0
  126. package/dist/domain/order.operator.spec.js.map +1 -0
  127. package/dist/{store/event/store-candle.event.spec.d.ts → domain/order.spec.d.ts} +0 -0
  128. package/dist/domain/order.spec.js +33 -0
  129. package/dist/domain/order.spec.js.map +1 -0
  130. package/dist/domain/orderbook.d.ts +2 -0
  131. package/dist/domain/orderbook.js +2 -0
  132. package/dist/domain/orderbook.js.map +1 -1
  133. package/dist/domain/orderbook.operator.d.ts +6 -0
  134. package/dist/domain/orderbook.operator.js +10 -0
  135. package/dist/domain/orderbook.operator.js.map +1 -0
  136. package/dist/{store/event/store-instrument.event.spec.d.ts → domain/orderbook.operator.spec.d.ts} +0 -0
  137. package/dist/domain/orderbook.operator.spec.js +22 -0
  138. package/dist/domain/orderbook.operator.spec.js.map +1 -0
  139. package/dist/{store/event/store-order.event.spec.d.ts → domain/orderbook.spec.d.ts} +0 -0
  140. package/dist/domain/orderbook.spec.js +13 -0
  141. package/dist/domain/orderbook.spec.js.map +1 -0
  142. package/dist/domain/position.d.ts +6 -10
  143. package/dist/domain/position.js +10 -31
  144. package/dist/domain/position.js.map +1 -1
  145. package/dist/domain/position.operator.d.ts +10 -0
  146. package/dist/domain/position.operator.js +38 -0
  147. package/dist/domain/position.operator.js.map +1 -0
  148. package/dist/{store/event/store-trade.event.spec.d.ts → domain/position.operator.spec.d.ts} +0 -0
  149. package/dist/domain/position.operator.spec.js +48 -0
  150. package/dist/domain/position.operator.spec.js.map +1 -0
  151. package/dist/domain/position.spec.js +21 -17
  152. package/dist/domain/position.spec.js.map +1 -1
  153. package/dist/domain/session.d.ts +18 -35
  154. package/dist/domain/session.js +27 -53
  155. package/dist/domain/session.js.map +1 -1
  156. package/dist/domain/session.spec.js +1 -1
  157. package/dist/domain/session.spec.js.map +1 -1
  158. package/dist/domain/trade.d.ts +3 -1
  159. package/dist/domain/trade.js +2 -0
  160. package/dist/domain/trade.js.map +1 -1
  161. package/dist/domain/trade.operator.d.ts +6 -0
  162. package/dist/domain/trade.operator.js +10 -0
  163. package/dist/domain/trade.operator.js.map +1 -0
  164. package/dist/domain/trade.operator.spec.d.ts +1 -0
  165. package/dist/domain/trade.operator.spec.js +24 -0
  166. package/dist/domain/trade.operator.spec.js.map +1 -0
  167. package/dist/domain/trade.spec.d.ts +1 -0
  168. package/dist/domain/trade.spec.js +13 -0
  169. package/dist/domain/trade.spec.js.map +1 -0
  170. package/dist/index.d.ts +0 -1
  171. package/dist/index.js +5 -2
  172. package/dist/index.js.map +1 -1
  173. package/dist/indicator/atr.js.map +1 -1
  174. package/dist/indicator/cross.spec.js +2 -2
  175. package/dist/indicator/cross.spec.js.map +1 -1
  176. package/dist/indicator/donchian.js.map +1 -1
  177. package/dist/indicator/ema.js.map +1 -1
  178. package/dist/indicator/ema.spec.js +1 -1
  179. package/dist/indicator/ema.spec.js.map +1 -1
  180. package/dist/indicator/envelope.js.map +1 -1
  181. package/dist/indicator/index.js +5 -1
  182. package/dist/indicator/index.js.map +1 -1
  183. package/dist/indicator/macd.js.map +1 -1
  184. package/dist/indicator/min-max.js.map +1 -1
  185. package/dist/indicator/rma.js.map +1 -1
  186. package/dist/indicator/sma.js.map +1 -1
  187. package/dist/indicator/sma.spec.js +1 -1
  188. package/dist/indicator/sma.spec.js.map +1 -1
  189. package/dist/indicator/swma.js.map +1 -1
  190. package/dist/indicator/tma.js.map +1 -1
  191. package/dist/indicator/tma.spec.js +1 -1
  192. package/dist/indicator/tma.spec.js.map +1 -1
  193. package/dist/indicator/trailing.spec.js +2 -2
  194. package/dist/indicator/trailing.spec.js.map +1 -1
  195. package/dist/indicator/truerange.js.map +1 -1
  196. package/dist/indicator/truerange.spec.js +1 -1
  197. package/dist/indicator/truerange.spec.js.map +1 -1
  198. package/dist/indicator/window.js.map +1 -1
  199. package/dist/indicator/wma.js.map +1 -1
  200. package/dist/indicator/wma.spec.js +1 -1
  201. package/dist/indicator/wma.spec.js.map +1 -1
  202. package/dist/shared/collections.d.ts +10 -0
  203. package/dist/shared/collections.js +33 -0
  204. package/dist/shared/collections.js.map +1 -0
  205. package/dist/shared/datetime.d.ts +0 -1
  206. package/dist/shared/datetime.js +1 -12
  207. package/dist/shared/datetime.js.map +1 -1
  208. package/dist/shared/decimals.d.ts +1 -1
  209. package/dist/shared/decimals.js +4 -5
  210. package/dist/shared/decimals.js.map +1 -1
  211. package/dist/shared/decimals.spec.js +2 -1
  212. package/dist/shared/decimals.spec.js.map +1 -1
  213. package/dist/shared/index.d.ts +1 -3
  214. package/dist/shared/index.js +6 -4
  215. package/dist/shared/index.js.map +1 -1
  216. package/dist/shared/io.js.map +1 -1
  217. package/dist/shared/policy.d.ts +0 -1
  218. package/dist/shared/policy.js +1 -11
  219. package/dist/shared/policy.js.map +1 -1
  220. package/dist/storage/cache.d.ts +9 -0
  221. package/dist/storage/cache.js +32 -0
  222. package/dist/storage/cache.js.map +1 -0
  223. package/dist/storage/cache.spec.d.ts +1 -0
  224. package/dist/storage/cache.spec.js +18 -0
  225. package/dist/storage/cache.spec.js.map +1 -0
  226. package/dist/storage/feed.d.ts +3 -4
  227. package/dist/storage/feed.js +16 -6
  228. package/dist/storage/feed.js.map +1 -1
  229. package/dist/storage/index.d.ts +1 -0
  230. package/dist/storage/index.js +6 -1
  231. package/dist/storage/index.js.map +1 -1
  232. package/dist/storage/storage.d.ts +2 -0
  233. package/dist/storage/storage.js +6 -1
  234. package/dist/storage/storage.js.map +1 -1
  235. package/dist/store/index.d.ts +8 -2
  236. package/dist/store/index.js +13 -3
  237. package/dist/store/index.js.map +1 -1
  238. package/dist/store/store-balance.event.d.ts +33 -0
  239. package/dist/store/store-balance.event.js +90 -0
  240. package/dist/store/store-balance.event.js.map +1 -0
  241. package/dist/store/store-balance.event.spec.d.ts +1 -0
  242. package/dist/store/{event/store-balance.event.spec.js → store-balance.event.spec.js} +8 -8
  243. package/dist/store/store-balance.event.spec.js.map +1 -0
  244. package/dist/store/{event/store-instrument.event.d.ts → store-instrument.event.d.ts} +5 -8
  245. package/dist/store/store-instrument.event.js +52 -0
  246. package/dist/store/store-instrument.event.js.map +1 -0
  247. package/dist/store/store-instrument.event.spec.d.ts +1 -0
  248. package/dist/store/store-instrument.event.spec.js +22 -0
  249. package/dist/store/store-instrument.event.spec.js.map +1 -0
  250. package/dist/store/store-order.event.d.ts +59 -0
  251. package/dist/store/store-order.event.js +181 -0
  252. package/dist/store/store-order.event.js.map +1 -0
  253. package/dist/store/store-order.event.spec.d.ts +1 -0
  254. package/dist/store/{event/store-order.event.spec.js → store-order.event.spec.js} +8 -8
  255. package/dist/store/store-order.event.spec.js.map +1 -0
  256. package/dist/store/{event/store-orderbook.event.d.ts → store-orderbook.event.d.ts} +4 -5
  257. package/dist/store/store-orderbook.event.js +42 -0
  258. package/dist/store/store-orderbook.event.js.map +1 -0
  259. package/dist/store/{event/store-position.event.d.ts → store-position.event.d.ts} +5 -7
  260. package/dist/store/store-position.event.js +77 -0
  261. package/dist/store/store-position.event.js.map +1 -0
  262. package/dist/store/store-state.d.ts +27 -0
  263. package/dist/store/store-state.js +29 -0
  264. package/dist/store/store-state.js.map +1 -0
  265. package/dist/store/{event/store-trade.event.d.ts → store-trade.event.d.ts} +4 -5
  266. package/dist/store/store-trade.event.js +25 -0
  267. package/dist/store/store-trade.event.js.map +1 -0
  268. package/dist/store/store-trade.event.spec.d.ts +1 -0
  269. package/dist/store/{event/store-trade.event.spec.js → store-trade.event.spec.js} +14 -14
  270. package/dist/store/store-trade.event.spec.js.map +1 -0
  271. package/dist/store/store.d.ts +4 -25
  272. package/dist/store/store.event.d.ts +6 -0
  273. package/dist/store/{event/store.event.js → store.event.js} +0 -0
  274. package/dist/store/store.event.js.map +1 -0
  275. package/dist/store/store.js +7 -195
  276. package/dist/store/store.js.map +1 -1
  277. package/dist/store/store.spec.d.ts +1 -0
  278. package/dist/store/store.spec.js +119 -0
  279. package/dist/store/store.spec.js.map +1 -0
  280. package/dist/tsconfig.tsbuildinfo +1 -1
  281. package/{jestconfig.unit.json → jestconfig.json} +1 -2
  282. package/package.json +24 -20
  283. package/src/adapter/adapter-aggregate.ts +31 -34
  284. package/src/adapter/adapter.ts +26 -49
  285. package/src/adapter/backtester/backtester-adapter.spec.ts +124 -0
  286. package/src/adapter/backtester/backtester-adapter.ts +30 -17
  287. package/src/adapter/backtester/backtester-cursor.spec.ts +18 -19
  288. package/src/adapter/backtester/backtester-cursor.ts +7 -7
  289. package/src/adapter/backtester/backtester-streamer.spec.ts +19 -19
  290. package/src/adapter/backtester/backtester-streamer.ts +50 -20
  291. package/src/adapter/error.ts +9 -0
  292. package/src/adapter/paper/engine/paper-engine.spec.ts +92 -0
  293. package/src/adapter/paper/engine/paper-engine.ts +135 -0
  294. package/src/adapter/paper/index.ts +1 -2
  295. package/src/adapter/paper/paper-adapter.spec.ts +55 -17
  296. package/src/adapter/paper/paper-adapter.ts +27 -24
  297. package/src/bootstrap.ts +57 -21
  298. package/src/cli/build.ts +15 -0
  299. package/src/cli/dev.ts +18 -0
  300. package/src/cli/index.ts +81 -0
  301. package/src/cli/internal/workspace.ts +18 -0
  302. package/src/cli/pull.ts +71 -0
  303. package/src/cli/run.ts +22 -0
  304. package/src/cli/test.ts +53 -0
  305. package/src/domain/asset.spec.ts +33 -29
  306. package/src/domain/asset.ts +27 -21
  307. package/src/domain/balance.operator.spec.ts +25 -0
  308. package/src/domain/balance.operator.ts +15 -0
  309. package/src/domain/balance.spec.ts +97 -9
  310. package/src/domain/balance.ts +48 -41
  311. package/src/domain/candle.operator.spec.ts +125 -0
  312. package/src/domain/candle.operator.ts +106 -0
  313. package/src/domain/candle.spec.ts +12 -67
  314. package/src/domain/candle.ts +2 -104
  315. package/src/domain/commission.spec.ts +33 -0
  316. package/src/domain/commission.ts +2 -2
  317. package/src/domain/component.ts +2 -0
  318. package/src/domain/error.ts +25 -0
  319. package/src/domain/index.ts +8 -1
  320. package/src/domain/instrument.operator.spec.ts +28 -0
  321. package/src/domain/instrument.operator.ts +25 -0
  322. package/src/domain/instrument.spec.ts +22 -30
  323. package/src/domain/instrument.ts +21 -11
  324. package/src/domain/order.operator.spec.ts +81 -0
  325. package/src/domain/order.operator.ts +23 -0
  326. package/src/domain/order.spec.ts +43 -0
  327. package/src/domain/order.ts +46 -47
  328. package/src/domain/orderbook.operator.spec.ts +28 -0
  329. package/src/domain/orderbook.operator.ts +15 -0
  330. package/src/domain/orderbook.spec.ts +17 -0
  331. package/src/domain/orderbook.ts +5 -1
  332. package/src/domain/position.operator.spec.ts +58 -0
  333. package/src/domain/position.operator.ts +61 -0
  334. package/src/domain/position.spec.ts +28 -24
  335. package/src/domain/position.ts +17 -47
  336. package/src/domain/session.spec.ts +1 -1
  337. package/src/domain/session.ts +57 -197
  338. package/src/domain/trade.operator.spec.ts +31 -0
  339. package/src/domain/trade.operator.ts +15 -0
  340. package/src/domain/trade.spec.ts +17 -0
  341. package/src/domain/trade.ts +6 -2
  342. package/src/index.ts +0 -1
  343. package/src/indicator/atr.ts +1 -0
  344. package/src/indicator/cross.spec.ts +3 -2
  345. package/src/indicator/donchian.ts +1 -0
  346. package/src/indicator/ema.spec.ts +2 -1
  347. package/src/indicator/ema.ts +1 -0
  348. package/src/indicator/envelope.ts +1 -0
  349. package/src/indicator/macd.ts +1 -0
  350. package/src/indicator/min-max.ts +1 -0
  351. package/src/indicator/rma.ts +1 -0
  352. package/src/indicator/sma.spec.ts +2 -1
  353. package/src/indicator/sma.ts +1 -0
  354. package/src/indicator/swma.ts +1 -0
  355. package/src/indicator/tma.spec.ts +2 -1
  356. package/src/indicator/tma.ts +1 -0
  357. package/src/indicator/trailing.spec.ts +3 -2
  358. package/src/indicator/truerange.spec.ts +2 -1
  359. package/src/indicator/truerange.ts +1 -0
  360. package/src/indicator/window.ts +1 -0
  361. package/src/indicator/wma.spec.ts +2 -1
  362. package/src/indicator/wma.ts +1 -0
  363. package/src/shared/collections.ts +35 -0
  364. package/src/shared/datetime.ts +0 -12
  365. package/src/shared/decimals.spec.ts +2 -1
  366. package/src/shared/decimals.ts +6 -6
  367. package/src/shared/index.ts +1 -3
  368. package/src/shared/io.ts +0 -2
  369. package/src/shared/policy.ts +0 -13
  370. package/src/storage/cache.spec.ts +18 -0
  371. package/src/storage/cache.ts +35 -0
  372. package/src/storage/feed.ts +26 -16
  373. package/src/storage/index.ts +1 -0
  374. package/src/storage/storage.ts +11 -0
  375. package/src/store/index.ts +8 -2
  376. package/src/store/{event/store-balance.event.spec.ts → store-balance.event.spec.ts} +7 -7
  377. package/src/store/store-balance.event.ts +124 -0
  378. package/src/store/store-instrument.event.spec.ts +25 -0
  379. package/src/store/store-instrument.event.ts +72 -0
  380. package/src/store/store-order.event.spec.ts +28 -0
  381. package/src/store/store-order.event.ts +214 -0
  382. package/src/store/store-orderbook.event.ts +54 -0
  383. package/src/store/store-position.event.ts +102 -0
  384. package/src/store/store-state.ts +48 -0
  385. package/src/store/{event/store-trade.event.spec.ts → store-trade.event.spec.ts} +15 -15
  386. package/src/store/store-trade.event.ts +36 -0
  387. package/src/store/store.event.ts +8 -0
  388. package/src/store/store.spec.ts +180 -0
  389. package/src/store/store.ts +11 -208
  390. package/tsconfig.json +2 -2
  391. package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +0 -10
  392. package/dist/adapter/paper/simulator/paper-margin-simulator.js +0 -69
  393. package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +0 -1
  394. package/dist/adapter/paper/simulator/paper-simulator.d.ts +0 -16
  395. package/dist/adapter/paper/simulator/paper-simulator.js +0 -93
  396. package/dist/adapter/paper/simulator/paper-simulator.js.map +0 -1
  397. package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +0 -13
  398. package/dist/adapter/paper/simulator/paper-spot-simulator.js +0 -81
  399. package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +0 -1
  400. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +0 -49
  401. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +0 -1
  402. package/dist/domain/statement.d.ts +0 -4
  403. package/dist/domain/statement.js +0 -87
  404. package/dist/domain/statement.js.map +0 -1
  405. package/dist/ipc.d.ts +0 -33
  406. package/dist/ipc.js +0 -244
  407. package/dist/ipc.js.map +0 -1
  408. package/dist/ipc.spec.js +0 -57
  409. package/dist/ipc.spec.js.map +0 -1
  410. package/dist/shared/policy.spec.js +0 -26
  411. package/dist/shared/policy.spec.js.map +0 -1
  412. package/dist/shared/task.d.ts +0 -6
  413. package/dist/shared/task.js +0 -25
  414. package/dist/shared/task.js.map +0 -1
  415. package/dist/shared/topic.d.ts +0 -14
  416. package/dist/shared/topic.js +0 -40
  417. package/dist/shared/topic.js.map +0 -1
  418. package/dist/shared/topic.spec.js +0 -43
  419. package/dist/shared/topic.spec.js.map +0 -1
  420. package/dist/shared/worker.d.ts +0 -10
  421. package/dist/shared/worker.js +0 -46
  422. package/dist/shared/worker.js.map +0 -1
  423. package/dist/shared/worker.spec.js +0 -18
  424. package/dist/shared/worker.spec.js.map +0 -1
  425. package/dist/store/event/index.d.ts +0 -8
  426. package/dist/store/event/index.js +0 -21
  427. package/dist/store/event/index.js.map +0 -1
  428. package/dist/store/event/store-balance.event.d.ts +0 -37
  429. package/dist/store/event/store-balance.event.js +0 -119
  430. package/dist/store/event/store-balance.event.js.map +0 -1
  431. package/dist/store/event/store-balance.event.spec.js.map +0 -1
  432. package/dist/store/event/store-candle.event.d.ts +0 -18
  433. package/dist/store/event/store-candle.event.js +0 -63
  434. package/dist/store/event/store-candle.event.js.map +0 -1
  435. package/dist/store/event/store-candle.event.spec.js +0 -23
  436. package/dist/store/event/store-candle.event.spec.js.map +0 -1
  437. package/dist/store/event/store-instrument.event.js +0 -78
  438. package/dist/store/event/store-instrument.event.js.map +0 -1
  439. package/dist/store/event/store-instrument.event.spec.js +0 -21
  440. package/dist/store/event/store-instrument.event.spec.js.map +0 -1
  441. package/dist/store/event/store-order.event.d.ts +0 -61
  442. package/dist/store/event/store-order.event.js +0 -205
  443. package/dist/store/event/store-order.event.js.map +0 -1
  444. package/dist/store/event/store-order.event.spec.js.map +0 -1
  445. package/dist/store/event/store-orderbook.event.js +0 -65
  446. package/dist/store/event/store-orderbook.event.js.map +0 -1
  447. package/dist/store/event/store-position.event.js +0 -97
  448. package/dist/store/event/store-position.event.js.map +0 -1
  449. package/dist/store/event/store-trade.event.js +0 -47
  450. package/dist/store/event/store-trade.event.js.map +0 -1
  451. package/dist/store/event/store-trade.event.spec.js.map +0 -1
  452. package/dist/store/event/store.event.d.ts +0 -5
  453. package/dist/store/event/store.event.js.map +0 -1
  454. package/dist/store/store.state.d.ts +0 -21
  455. package/dist/store/store.state.js +0 -21
  456. package/dist/store/store.state.js.map +0 -1
  457. package/dist/tests/backtester-adapter.spec.js +0 -60
  458. package/dist/tests/backtester-adapter.spec.js.map +0 -1
  459. package/dist/tests/session.spec.d.ts +0 -0
  460. package/dist/tests/session.spec.js +0 -1
  461. package/dist/tests/session.spec.js.map +0 -1
  462. package/jestconfig.integration.json +0 -12
  463. package/src/adapter/paper/simulator/paper-margin-simulator.ts +0 -108
  464. package/src/adapter/paper/simulator/paper-simulator.ts +0 -120
  465. package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +0 -87
  466. package/src/adapter/paper/simulator/paper-spot-simulator.ts +0 -134
  467. package/src/domain/statement.ts +0 -118
  468. package/src/ipc.spec.ts +0 -73
  469. package/src/ipc.ts +0 -321
  470. package/src/shared/policy.spec.ts +0 -29
  471. package/src/shared/task.ts +0 -30
  472. package/src/shared/topic.spec.ts +0 -34
  473. package/src/shared/topic.ts +0 -43
  474. package/src/shared/worker.spec.ts +0 -25
  475. package/src/shared/worker.ts +0 -55
  476. package/src/store/event/index.ts +0 -8
  477. package/src/store/event/store-balance.event.ts +0 -161
  478. package/src/store/event/store-candle.event.spec.ts +0 -30
  479. package/src/store/event/store-candle.event.ts +0 -71
  480. package/src/store/event/store-instrument.event.spec.ts +0 -25
  481. package/src/store/event/store-instrument.event.ts +0 -84
  482. package/src/store/event/store-order.event.spec.ts +0 -28
  483. package/src/store/event/store-order.event.ts +0 -218
  484. package/src/store/event/store-orderbook.event.ts +0 -70
  485. package/src/store/event/store-position.event.ts +0 -109
  486. package/src/store/event/store-trade.event.ts +0 -52
  487. package/src/store/event/store.event.ts +0 -6
  488. package/src/store/store.state.ts +0 -43
  489. package/src/tests/backtester-adapter.spec.ts +0 -87
  490. package/src/tests/session.spec.ts +0 -121
@@ -1,7 +1,10 @@
1
- import { Adapter, AdapterContext, FeedQuery, HistoryQuery } from '.';
2
1
  import { Candle, InstrumentSelector, Order } from '../domain';
3
2
  import { Logger } from '../shared';
3
+ import { Cache } from '../storage';
4
4
  import { Store } from '../store';
5
+ import { Adapter, FeedQuery, HistoryQuery } from '.';
6
+ import { AdapterFactory, AdapterTimeProvider } from './adapter';
7
+ import { adapterNotFoundError } from './error';
5
8
 
6
9
  /**
7
10
  * Manages instances of all adapters provided in session descriptor.
@@ -10,9 +13,12 @@ import { Store } from '../store';
10
13
  export class AdapterAggregate {
11
14
  private readonly adapter: Record<string, Adapter> = {};
12
15
 
13
- constructor(adapters: Adapter[], private readonly store: Store) {
14
- adapters.forEach(it => (this.adapter[it.name] = it));
15
- }
16
+ constructor(
17
+ private readonly factories: AdapterFactory[],
18
+ private readonly timeProvider: AdapterTimeProvider,
19
+ private readonly store: Store,
20
+ private readonly cache: Cache
21
+ ) {}
16
22
 
17
23
  /**
18
24
  * Returns adapter by name.
@@ -23,9 +29,7 @@ export class AdapterAggregate {
23
29
  const adapter = this.adapter[adapterName];
24
30
 
25
31
  if (!adapter) {
26
- throw new Error(
27
- `Unknown adapter: ${adapterName}. You should provide adapter in session descriptor.`
28
- );
32
+ throw adapterNotFoundError(adapterName);
29
33
  }
30
34
 
31
35
  return adapter;
@@ -35,13 +39,17 @@ export class AdapterAggregate {
35
39
  * Sets up all adapters.
36
40
  */
37
41
  async awake(): Promise<void> {
38
- for (const adapter of Object.values(this.adapter)) {
42
+ for (const factory of this.factories) {
43
+ const adapter = factory(this.timeProvider, this.store, this.cache);
44
+
39
45
  try {
40
- await adapter.awake(this.createContext(adapter));
46
+ await adapter.awake();
41
47
  await adapter.account();
42
48
  } catch (e) {
43
49
  Logger.error(e);
44
50
  }
51
+
52
+ this.adapter[adapter.name] = adapter;
45
53
  }
46
54
  }
47
55
 
@@ -63,19 +71,17 @@ export class AdapterAggregate {
63
71
  * @param selectors
64
72
  */
65
73
  async subscribe(selectors: InstrumentSelector[]): Promise<void> {
66
- const grouped = selectors
67
- .filter(it => it != null)
68
- .reduce((aggregate, it) => {
69
- const adapter = it.base.adapter;
74
+ const grouped = selectors.reduce((aggregate, it) => {
75
+ const adapter = it.base.adapterName;
70
76
 
71
- if (aggregate[adapter]) {
72
- aggregate[adapter].push(it);
73
- } else {
74
- aggregate[adapter] = [it];
75
- }
77
+ if (aggregate[adapter]) {
78
+ aggregate[adapter].push(it);
79
+ } else {
80
+ aggregate[adapter] = [it];
81
+ }
76
82
 
77
- return aggregate;
78
- }, {});
83
+ return aggregate;
84
+ }, {});
79
85
 
80
86
  for (const adapterName in grouped) {
81
87
  try {
@@ -90,9 +96,9 @@ export class AdapterAggregate {
90
96
  * Opens new order.
91
97
  * @param order an order to open.
92
98
  */
93
- open(order: Order): Promise<void> {
99
+ async open(order: Order): Promise<void> {
94
100
  try {
95
- return this.get(order.instrument.base.adapter).open(order);
101
+ await this.get(order.instrument.base.adapterName).open(order);
96
102
  } catch (e) {
97
103
  Logger.error(e);
98
104
  }
@@ -103,7 +109,7 @@ export class AdapterAggregate {
103
109
  */
104
110
  cancel(order: Order): Promise<void> {
105
111
  try {
106
- return this.get(order.instrument.base.adapter).cancel(order);
112
+ return this.get(order.instrument.base.adapterName).cancel(order);
107
113
  } catch (e) {
108
114
  Logger.error(e);
109
115
  }
@@ -115,7 +121,7 @@ export class AdapterAggregate {
115
121
  */
116
122
  history(query: HistoryQuery): Promise<Candle[]> {
117
123
  try {
118
- return this.get(query.instrument.base.adapter).history(query);
124
+ return this.get(query.instrument.base.adapterName).history(query);
119
125
  } catch (e) {
120
126
  Logger.error(e);
121
127
  }
@@ -127,18 +133,9 @@ export class AdapterAggregate {
127
133
  */
128
134
  feed(query: FeedQuery): Promise<void> {
129
135
  try {
130
- return this.get(query.instrument.base.adapter).feed(query);
136
+ return this.get(query.instrument.base.adapterName).feed(query);
131
137
  } catch (e) {
132
138
  Logger.error(e);
133
139
  }
134
140
  }
135
-
136
- /**
137
- *
138
- * @param adapter
139
- * @returns
140
- */
141
- private createContext(adapter: Adapter) {
142
- return new AdapterContext(adapter, this.store);
143
- }
144
141
  }
@@ -1,31 +1,23 @@
1
1
  import { Candle, InstrumentSelector, Order } from '../domain';
2
2
  import { now, timestamp } from '../shared';
3
- import { Feed } from '../storage';
4
- import { State, Store, StoreEvent } from '../store';
3
+ import { Cache, Feed } from '../storage';
4
+ import { Store } from '../store';
5
5
  import { PaperAdapter } from './paper';
6
- import { PaperSimulator } from './paper/simulator/paper-simulator';
6
+ import { PaperEngine } from './paper/engine/paper-engine';
7
7
 
8
- /**
9
- * Shared context for adapter execution. Provides access to the store.
10
- */
11
- export class AdapterContext {
12
- /**
13
- * Returns the current unix timestamp (points to historical date in case of backtest).
14
- */
15
- get timestamp(): timestamp {
16
- return this.adapter.timestamp();
17
- }
18
-
19
- get snapshot(): State {
20
- return this.store.snapshot;
21
- }
8
+ export type AdapterTimeProvider = {
9
+ timestamp: () => number;
10
+ };
22
11
 
23
- constructor(private readonly adapter: Adapter, private readonly store: Store) {}
12
+ export const DefaultTimeProvider = {
13
+ timestamp: () => now()
14
+ };
24
15
 
25
- dispatch(...events: StoreEvent[]) {
26
- return this.store.dispatch(...events);
27
- }
28
- }
16
+ export type AdapterFactory = (
17
+ timeProvider: AdapterTimeProvider,
18
+ store: Store,
19
+ cache: Cache
20
+ ) => Adapter;
29
21
 
30
22
  export type HistoryQuery = {
31
23
  instrument: InstrumentSelector;
@@ -46,64 +38,49 @@ export type FeedQuery = {
46
38
  * @abstract
47
39
  */
48
40
  export abstract class Adapter {
49
- context: AdapterContext;
50
-
51
41
  abstract name: string;
52
42
 
53
43
  timestamp(): timestamp {
54
- return now();
44
+ return this.timeProvider.timestamp();
55
45
  }
56
46
 
47
+ constructor(private readonly timeProvider: AdapterTimeProvider) {}
48
+
57
49
  /**
58
50
  * Setup an adapter.
59
- * @param context
60
51
  */
61
- async awake(context: AdapterContext): Promise<void> {
62
- this.context = context;
63
- }
52
+ abstract awake(): Promise<void>;
64
53
 
65
54
  /**
66
55
  * Dispose an adapter.
67
56
  */
68
- async dispose(): Promise<void> {}
57
+ abstract dispose(): Promise<void>;
69
58
 
70
59
  /**
71
60
  * Subscribe to collection of instruments.
72
61
  * @param instruments
73
62
  */
74
- subscribe(instruments: InstrumentSelector[]): Promise<void> {
75
- throw new Error('method not implemented');
76
- }
63
+ abstract subscribe(instruments: InstrumentSelector[]): Promise<void>;
77
64
 
78
65
  /**
79
66
  *
80
67
  */
81
- account(): Promise<void> {
82
- throw new Error('method not implemented');
83
- }
68
+ abstract account(): Promise<void>;
84
69
 
85
70
  /**
86
71
  * Opens new order.
87
72
  * @param order an order to open.
88
73
  */
89
- open(order: Order): Promise<void> {
90
- throw new Error('method not implemented');
91
- }
74
+ abstract open(order: Order): Promise<void>;
92
75
 
93
76
  /**
94
77
  * Cancels specific order.
95
78
  */
96
- cancel(order: Order): Promise<void> {
97
- throw new Error('method not implemented');
98
- }
79
+ abstract cancel(order: Order): Promise<void>;
99
80
 
100
- history(query: HistoryQuery): Promise<Candle[]> {
101
- throw new Error('method not implemented');
102
- }
81
+ abstract history(query: HistoryQuery): Promise<Candle[]>;
103
82
 
104
- feed(query: FeedQuery): Promise<void> {
105
- throw new Error('method not implemented');
106
- }
83
+ abstract feed(query: FeedQuery): Promise<void>;
107
84
 
108
- abstract createPaperSimulator(adapter: PaperAdapter): PaperSimulator;
85
+ abstract createPaperEngine(adapter: PaperAdapter): PaperEngine;
109
86
  }
@@ -0,0 +1,124 @@
1
+ import {
2
+ Asset,
3
+ Candle,
4
+ Commission,
5
+ instrumentOf,
6
+ InstrumentSelector,
7
+ Order
8
+ } from '../../domain';
9
+ import { Cache, Feed, InMemoryStorage } from '../../storage';
10
+ import { InstrumentPatchEvent, Store } from '../../store';
11
+ import {
12
+ Adapter,
13
+ AdapterTimeProvider,
14
+ DefaultTimeProvider,
15
+ FeedQuery,
16
+ HistoryQuery
17
+ } from '../adapter';
18
+ import { PaperEngine } from '../paper/engine/paper-engine';
19
+ import { PaperAdapter } from '../paper/paper-adapter';
20
+ import { BacktesterAdapter } from './backtester-adapter';
21
+ import { BacktesterStreamer } from './backtester-streamer';
22
+
23
+ const base = new Asset('btc', 'binance', 8);
24
+ const quote = new Asset('usdt', 'binance', 4);
25
+
26
+ class DefaultAdapter extends Adapter {
27
+ dispose(): Promise<void> {
28
+ throw new Error('Method not implemented.');
29
+ }
30
+ subscribe(instruments: InstrumentSelector[]): Promise<void> {
31
+ throw new Error('Method not implemented.');
32
+ }
33
+ account(): Promise<void> {
34
+ throw new Error('Method not implemented.');
35
+ }
36
+ open(order: Order): Promise<void> {
37
+ throw new Error('Method not implemented.');
38
+ }
39
+ cancel(order: Order): Promise<void> {
40
+ throw new Error('Method not implemented.');
41
+ }
42
+ history(query: HistoryQuery): Promise<Candle[]> {
43
+ throw new Error('Method not implemented.');
44
+ }
45
+ feed(query: FeedQuery): Promise<void> {
46
+ throw new Error('Method not implemented.');
47
+ }
48
+ name = 'default';
49
+
50
+ constructor(timeProvider: AdapterTimeProvider, private readonly store: Store) {
51
+ super(timeProvider);
52
+ }
53
+
54
+ timestamp() {
55
+ return 123;
56
+ }
57
+
58
+ createPaperEngine(adapter: PaperAdapter): PaperEngine {
59
+ return new PaperEngine(adapter.store);
60
+ }
61
+
62
+ async awake(): Promise<void> {
63
+ this.store.dispatch(
64
+ new InstrumentPatchEvent(
65
+ this.timestamp(),
66
+ base,
67
+ quote,
68
+ new Commission(0.1, 0.1),
69
+ 'btc-usdt'
70
+ )
71
+ );
72
+ }
73
+ }
74
+
75
+ const instrument = instrumentOf('binance:btc-usdt');
76
+ const store = new Store();
77
+ const adapter = new DefaultAdapter(DefaultTimeProvider, store);
78
+ const feed = new Feed(new InMemoryStorage());
79
+ const cache = new Cache(new InMemoryStorage());
80
+
81
+ describe('BacktesterAdapter', () => {
82
+ test('should return proper adapter name and timestamp', () => {
83
+ const sut = new BacktesterAdapter(
84
+ adapter,
85
+ new BacktesterStreamer(store, feed, {
86
+ from: 1,
87
+ to: 100
88
+ }),
89
+ store
90
+ );
91
+
92
+ expect(sut.name).toEqual('default');
93
+ expect(sut.timestamp()).toEqual(1);
94
+ });
95
+
96
+ test('should stream data from input array', done => {
97
+ const streamer = new BacktesterStreamer(
98
+ store,
99
+ feed,
100
+ {
101
+ from: 0,
102
+ to: 100
103
+ },
104
+ {
105
+ onBacktestCompleted: () => {
106
+ expect(store.snapshot.timestamp).toEqual(1);
107
+ expect(store.snapshot.trade.get(instrument.id).rate).toEqual(100);
108
+ expect(store.snapshot.trade.get(instrument.id).quantity).toEqual(10);
109
+
110
+ done();
111
+ }
112
+ }
113
+ );
114
+
115
+ feed.save(instrument, [new Candle(1, 100, 100, 100, 100, 10)]);
116
+
117
+ const sut = new BacktesterAdapter(adapter, streamer, store);
118
+
119
+ sut.awake();
120
+ sut.subscribe([instrument]);
121
+
122
+ expect(sut.name).toEqual('default');
123
+ });
124
+ });
@@ -1,10 +1,10 @@
1
- import { Adapter, AdapterContext } from '..';
2
1
  import { Candle, InstrumentSelector, Order } from '../../domain';
3
2
  import { timestamp } from '../../shared';
4
- import { InstrumentSubscriptionEvent } from '../../store';
5
- import { FeedQuery, HistoryQuery } from '../adapter';
3
+ import { InstrumentSubscriptionEvent, Store } from '../../store';
4
+ import { Adapter } from '..';
5
+ import { AdapterFactory, FeedQuery, HistoryQuery } from '../adapter';
6
6
  import { PaperAdapter, PaperOptions } from '../paper';
7
- import { PaperSimulator } from '../paper/simulator/paper-simulator';
7
+ import { PaperEngine } from '../paper/engine/paper-engine';
8
8
  import { BacktesterStreamer } from './backtester-streamer';
9
9
 
10
10
  export interface BacktesterOptions extends PaperOptions {
@@ -12,20 +12,31 @@ export interface BacktesterOptions extends PaperOptions {
12
12
  to: timestamp;
13
13
  }
14
14
 
15
+ export function createBacktesterAdapterFactory(
16
+ decoratedAdapterFactory: AdapterFactory,
17
+ streamer: BacktesterStreamer
18
+ ): AdapterFactory {
19
+ return (timeProvider, store, cache) =>
20
+ new BacktesterAdapter(
21
+ decoratedAdapterFactory(timeProvider, store, cache),
22
+ streamer,
23
+ store
24
+ );
25
+ }
26
+
15
27
  export class BacktesterAdapter extends Adapter {
16
28
  readonly name = this.decoratedAdapter.name;
17
29
 
18
- timestamp() {
19
- return this.streamer.timestamp;
30
+ constructor(
31
+ readonly decoratedAdapter: Adapter,
32
+ readonly streamer: BacktesterStreamer,
33
+ readonly store: Store
34
+ ) {
35
+ super(streamer.getTimeProvider());
20
36
  }
21
37
 
22
- constructor(readonly decoratedAdapter: Adapter, readonly streamer: BacktesterStreamer) {
23
- super();
24
- }
25
-
26
- async awake(context: AdapterContext): Promise<void> {
27
- await super.awake(context);
28
- await this.decoratedAdapter.awake(context);
38
+ async awake(): Promise<void> {
39
+ await this.decoratedAdapter.awake();
29
40
  }
30
41
 
31
42
  dispose(): Promise<void> {
@@ -37,11 +48,13 @@ export class BacktesterAdapter extends Adapter {
37
48
  this.streamer.subscribe(it);
38
49
  });
39
50
 
40
- this.context.dispatch(
51
+ this.store.dispatch(
41
52
  ...instruments.map(
42
- it => new InstrumentSubscriptionEvent(this.context.timestamp, it, true)
53
+ it => new InstrumentSubscriptionEvent(this.timestamp(), it, true)
43
54
  )
44
55
  );
56
+
57
+ this.streamer.tryContinue();
45
58
  }
46
59
 
47
60
  account(): Promise<void> {
@@ -70,7 +83,7 @@ export class BacktesterAdapter extends Adapter {
70
83
  return this.decoratedAdapter.feed(query);
71
84
  }
72
85
 
73
- createPaperSimulator(adapter: PaperAdapter): PaperSimulator {
74
- return this.decoratedAdapter.createPaperSimulator(adapter);
86
+ createPaperEngine(adapter: PaperAdapter): PaperEngine {
87
+ return this.decoratedAdapter.createPaperEngine(adapter);
75
88
  }
76
89
  }
@@ -1,43 +1,42 @@
1
- import { instrumentOf } from '../../domain';
1
+ import { Candle, instrumentOf } from '../../domain';
2
2
  import { Feed, InMemoryStorage } from '../../storage';
3
- import { TradePatchEvent } from '../../store';
4
3
  import { BacktesterCursor } from './backtester-cursor';
5
4
 
6
- describe('backtester cursor tests', () => {
5
+ describe('BacktesterCursor', () => {
7
6
  test('should repeat specific events', async () => {
8
7
  const instrument = instrumentOf('binance:btc-usdt');
9
8
  const feed = new Feed(new InMemoryStorage());
10
9
  const cursor = new BacktesterCursor(instrument, feed);
11
10
 
12
11
  feed.save(instrument, [
13
- new TradePatchEvent(instrument, 1, 1, 1),
14
- new TradePatchEvent(instrument, 2, 1, 2),
15
- new TradePatchEvent(instrument, 3, 1, 3),
16
- new TradePatchEvent(instrument, 4, 1, 4),
17
- new TradePatchEvent(instrument, 5, 1, 5),
18
- new TradePatchEvent(instrument, 6, 1, 6),
19
- new TradePatchEvent(instrument, 7, 1, 7),
20
- new TradePatchEvent(instrument, 8, 1, 8)
12
+ new Candle(1, 1, 1, 1, 1),
13
+ new Candle(2, 2, 2, 2, 2),
14
+ new Candle(3, 3, 3, 3, 3),
15
+ new Candle(4, 4, 4, 4, 4),
16
+ new Candle(5, 5, 5, 5, 5),
17
+ new Candle(6, 6, 6, 6, 6),
18
+ new Candle(7, 7, 7, 7, 7),
19
+ new Candle(8, 8, 8, 8, 8)
21
20
  ]);
22
21
 
23
22
  await cursor.fetchNextPage(0, 4);
24
23
 
25
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(1);
26
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(2);
27
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(3);
24
+ expect(cursor.dequeue().open).toEqual(1);
25
+ expect(cursor.dequeue().open).toEqual(2);
26
+ expect(cursor.dequeue().open).toEqual(3);
28
27
  expect(cursor.peek()).toEqual(undefined);
29
28
 
30
29
  await cursor.fetchNextPage(3, 7);
31
30
 
32
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(4);
33
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(5);
34
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(6);
31
+ expect(cursor.dequeue().open).toEqual(4);
32
+ expect(cursor.dequeue().open).toEqual(5);
33
+ expect(cursor.dequeue().open).toEqual(6);
35
34
  expect(cursor.peek()).toEqual(undefined);
36
35
 
37
36
  await cursor.fetchNextPage(6, 10);
38
37
 
39
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(7);
40
- expect(cursor.dequeue<TradePatchEvent>().rate).toEqual(8);
38
+ expect(cursor.dequeue().open).toEqual(7);
39
+ expect(cursor.dequeue().open).toEqual(8);
41
40
  expect(cursor.peek()).toEqual(undefined);
42
41
  });
43
42
  });
@@ -1,10 +1,10 @@
1
- import { InstrumentSelector } from '../../domain';
1
+ import { Candle, InstrumentSelector } from '../../domain';
2
2
  import { timestamp } from '../../shared';
3
3
  import { Feed } from '../../storage';
4
- import { StoreEvent } from '../../store';
4
+ import { backtestPageNotEmpty } from '../error';
5
5
 
6
6
  export class BacktesterCursor {
7
- private page = new Array<StoreEvent>();
7
+ private page = new Array<Candle>();
8
8
  private pageIndex = 0;
9
9
  completed = false;
10
10
 
@@ -14,7 +14,7 @@ export class BacktesterCursor {
14
14
 
15
15
  constructor(readonly instrument: InstrumentSelector, private readonly feed: Feed) {}
16
16
 
17
- peek(): StoreEvent {
17
+ peek(): Candle {
18
18
  if (!this.page) {
19
19
  return undefined;
20
20
  }
@@ -22,8 +22,8 @@ export class BacktesterCursor {
22
22
  return this.page[this.pageIndex];
23
23
  }
24
24
 
25
- dequeue<T extends StoreEvent>(): T {
26
- return this.page[this.pageIndex++] as T;
25
+ dequeue(): Candle {
26
+ return this.page[this.pageIndex++];
27
27
  }
28
28
 
29
29
  async fetchNextPage(from: timestamp, to: number): Promise<void> {
@@ -32,7 +32,7 @@ export class BacktesterCursor {
32
32
  }
33
33
 
34
34
  if (this.size > 0) {
35
- throw new Error('page is not empty');
35
+ throw backtestPageNotEmpty();
36
36
  }
37
37
 
38
38
  this.pageIndex = 0;
@@ -1,21 +1,21 @@
1
- import { Asset, Instrument, Timeframe } from '../../domain';
1
+ import { Asset, Candle, Instrument } from '../../domain';
2
2
  import { Feed, InMemoryStorage } from '../../storage';
3
- import { CandleEvent, Store } from '../../store';
3
+ import { Store } from '../../store';
4
4
  import { BacktesterStreamer } from './backtester-streamer';
5
5
 
6
- const instrument = new Instrument(
7
- new Asset('btc', 'binance', 8),
8
- new Asset('usdt', 'binance', 2),
9
- 'binance:btc-usdt'
10
- );
6
+ describe('BacktesterStreamer', () => {
7
+ const instrument = new Instrument(
8
+ new Asset('btc', 'binance', 8),
9
+ new Asset('usdt', 'binance', 2),
10
+ 'binance:btc-usdt'
11
+ );
11
12
 
12
- describe('backtester streamer tests', () => {
13
13
  test('should repeat specific events', done => {
14
14
  const feed = new Feed(new InMemoryStorage());
15
15
  const store = new Store();
16
16
 
17
- store.snapshot.universe.instrument[instrument.toString()] = instrument;
18
- store.snapshot.subscription.instrument[instrument.toString()] = instrument;
17
+ store.snapshot.universe.instrument.upsert(instrument);
18
+ store.snapshot.subscription.instrument.upsert(instrument);
19
19
 
20
20
  const streamer = new BacktesterStreamer(
21
21
  store,
@@ -26,7 +26,7 @@ describe('backtester streamer tests', () => {
26
26
  },
27
27
  {
28
28
  onBacktestCompleted: () => {
29
- const trade = store.snapshot.trade[instrument.toString()];
29
+ const trade = store.snapshot.trade.get(instrument.id);
30
30
 
31
31
  expect(trade.timestamp).toEqual(8);
32
32
  expect(trade.rate).toEqual(8);
@@ -40,14 +40,14 @@ describe('backtester streamer tests', () => {
40
40
 
41
41
  feed
42
42
  .save(instrument, [
43
- new CandleEvent(instrument, Timeframe.M1, 1, 1, 1, 1, 1, 1),
44
- new CandleEvent(instrument, Timeframe.M1, 2, 2, 2, 2, 2, 2),
45
- new CandleEvent(instrument, Timeframe.M1, 3, 3, 3, 3, 3, 3),
46
- new CandleEvent(instrument, Timeframe.M1, 4, 4, 4, 4, 4, 4),
47
- new CandleEvent(instrument, Timeframe.M1, 5, 5, 5, 5, 5, 5),
48
- new CandleEvent(instrument, Timeframe.M1, 6, 6, 6, 6, 6, 6),
49
- new CandleEvent(instrument, Timeframe.M1, 7, 7, 7, 7, 7, 7),
50
- new CandleEvent(instrument, Timeframe.M1, 8, 8, 8, 8, 8, 8)
43
+ new Candle(1, 1, 1, 1, 1, 1),
44
+ new Candle(2, 2, 2, 2, 2, 2),
45
+ new Candle(3, 3, 3, 3, 3, 3),
46
+ new Candle(4, 4, 4, 4, 4, 4),
47
+ new Candle(5, 5, 5, 5, 5, 5),
48
+ new Candle(6, 6, 6, 6, 6, 6),
49
+ new Candle(7, 7, 7, 7, 7, 7),
50
+ new Candle(8, 8, 8, 8, 8, 8)
51
51
  ])
52
52
  .then(() => {
53
53
  streamer.subscribe(instrument);