@quantform/core 0.5.14 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +4 -2
  2. package/dist/adapter/adapter-aggregate.js +16 -18
  3. package/dist/adapter/adapter-aggregate.js.map +1 -1
  4. package/dist/adapter/adapter.d.ts +20 -21
  5. package/dist/adapter/adapter.js +8 -43
  6. package/dist/adapter/adapter.js.map +1 -1
  7. package/dist/adapter/backtester/backtester-adapter.d.ts +9 -7
  8. package/dist/adapter/backtester/backtester-adapter.js +13 -12
  9. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  10. package/dist/{tests → adapter/backtester}/backtester-adapter.spec.d.ts +0 -0
  11. package/dist/adapter/backtester/backtester-adapter.spec.js +82 -0
  12. package/dist/adapter/backtester/backtester-adapter.spec.js.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.d.ts +3 -4
  14. package/dist/adapter/backtester/backtester-cursor.js +2 -1
  15. package/dist/adapter/backtester/backtester-cursor.js.map +1 -1
  16. package/dist/adapter/backtester/backtester-cursor.spec.js +17 -18
  17. package/dist/adapter/backtester/backtester-cursor.spec.js.map +1 -1
  18. package/dist/adapter/backtester/backtester-streamer.d.ts +4 -1
  19. package/dist/adapter/backtester/backtester-streamer.js +39 -18
  20. package/dist/adapter/backtester/backtester-streamer.js.map +1 -1
  21. package/dist/adapter/backtester/backtester-streamer.spec.js +13 -13
  22. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  23. package/dist/adapter/error.d.ts +2 -0
  24. package/dist/adapter/error.js +12 -0
  25. package/dist/adapter/error.js.map +1 -0
  26. package/dist/adapter/paper/engine/paper-engine.d.ts +11 -0
  27. package/dist/adapter/paper/engine/paper-engine.js +103 -0
  28. package/dist/adapter/paper/engine/paper-engine.js.map +1 -0
  29. package/dist/adapter/paper/{simulator/paper-spot-simulator.spec.d.ts → engine/paper-engine.spec.d.ts} +0 -0
  30. package/dist/adapter/paper/engine/paper-engine.spec.js +54 -0
  31. package/dist/adapter/paper/engine/paper-engine.spec.js.map +1 -0
  32. package/dist/adapter/paper/index.d.ts +1 -2
  33. package/dist/adapter/paper/index.js +1 -2
  34. package/dist/adapter/paper/index.js.map +1 -1
  35. package/dist/adapter/paper/paper-adapter.d.ts +7 -7
  36. package/dist/adapter/paper/paper-adapter.js +20 -18
  37. package/dist/adapter/paper/paper-adapter.js.map +1 -1
  38. package/dist/adapter/paper/paper-adapter.spec.js +35 -17
  39. package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
  40. package/dist/bootstrap.js +11 -10
  41. package/dist/bootstrap.js.map +1 -1
  42. package/dist/cli/pull.js +3 -1
  43. package/dist/cli/pull.js.map +1 -1
  44. package/dist/cli/test.js +5 -1
  45. package/dist/cli/test.js.map +1 -1
  46. package/dist/domain/asset.d.ts +6 -5
  47. package/dist/domain/asset.js +22 -16
  48. package/dist/domain/asset.js.map +1 -1
  49. package/dist/domain/asset.spec.js +32 -32
  50. package/dist/domain/asset.spec.js.map +1 -1
  51. package/dist/domain/balance.d.ts +7 -7
  52. package/dist/domain/balance.js +26 -21
  53. package/dist/domain/balance.js.map +1 -1
  54. package/dist/domain/balance.operator.d.ts +6 -0
  55. package/dist/domain/balance.operator.js +10 -0
  56. package/dist/domain/balance.operator.js.map +1 -0
  57. package/dist/{shared/policy.spec.d.ts → domain/balance.operator.spec.d.ts} +0 -0
  58. package/dist/domain/balance.operator.spec.js +23 -0
  59. package/dist/domain/balance.operator.spec.js.map +1 -0
  60. package/dist/domain/balance.spec.js +67 -7
  61. package/dist/domain/balance.spec.js.map +1 -1
  62. package/dist/domain/candle.d.ts +2 -17
  63. package/dist/domain/candle.js +3 -70
  64. package/dist/domain/candle.js.map +1 -1
  65. package/dist/domain/candle.operator.d.ts +9 -0
  66. package/dist/domain/candle.operator.js +64 -0
  67. package/dist/domain/candle.operator.js.map +1 -0
  68. package/dist/{shared/topic.spec.d.ts → domain/candle.operator.spec.d.ts} +0 -0
  69. package/dist/domain/candle.operator.spec.js +111 -0
  70. package/dist/domain/candle.operator.spec.js.map +1 -0
  71. package/dist/domain/candle.spec.js +11 -53
  72. package/dist/domain/candle.spec.js.map +1 -1
  73. package/dist/domain/commission.d.ts +4 -1
  74. package/dist/domain/commission.js +2 -2
  75. package/dist/domain/commission.js.map +1 -1
  76. package/dist/{store/event/store-balance.event.spec.d.ts → domain/commission.spec.d.ts} +0 -0
  77. package/dist/domain/commission.spec.js +30 -0
  78. package/dist/domain/commission.spec.js.map +1 -0
  79. package/dist/domain/component.d.ts +1 -0
  80. package/dist/domain/error.d.ts +5 -0
  81. package/dist/domain/error.js +24 -0
  82. package/dist/domain/error.js.map +1 -0
  83. package/dist/domain/index.d.ts +8 -1
  84. package/dist/domain/index.js +8 -1
  85. package/dist/domain/index.js.map +1 -1
  86. package/dist/domain/instrument.d.ts +3 -2
  87. package/dist/domain/instrument.js +17 -9
  88. package/dist/domain/instrument.js.map +1 -1
  89. package/dist/domain/instrument.operator.d.ts +6 -0
  90. package/dist/domain/instrument.operator.js +14 -0
  91. package/dist/domain/instrument.operator.js.map +1 -0
  92. package/dist/{store/event/store-candle.event.spec.d.ts → domain/instrument.operator.spec.d.ts} +0 -0
  93. package/dist/domain/instrument.operator.spec.js +24 -0
  94. package/dist/domain/instrument.operator.spec.js.map +1 -0
  95. package/dist/domain/instrument.spec.js +22 -30
  96. package/dist/domain/instrument.spec.js.map +1 -1
  97. package/dist/domain/order.d.ts +12 -14
  98. package/dist/domain/order.js +37 -26
  99. package/dist/domain/order.js.map +1 -1
  100. package/dist/domain/order.operator.d.ts +7 -0
  101. package/dist/domain/order.operator.js +14 -0
  102. package/dist/domain/order.operator.js.map +1 -0
  103. package/dist/{store/event/store-instrument.event.spec.d.ts → domain/order.operator.spec.d.ts} +0 -0
  104. package/dist/domain/order.operator.spec.js +64 -0
  105. package/dist/domain/order.operator.spec.js.map +1 -0
  106. package/dist/{store/event/store-order.event.spec.d.ts → domain/order.spec.d.ts} +0 -0
  107. package/dist/domain/order.spec.js +33 -0
  108. package/dist/domain/order.spec.js.map +1 -0
  109. package/dist/domain/orderbook.d.ts +1 -0
  110. package/dist/domain/orderbook.js +1 -0
  111. package/dist/domain/orderbook.js.map +1 -1
  112. package/dist/domain/orderbook.operator.d.ts +6 -0
  113. package/dist/domain/orderbook.operator.js +10 -0
  114. package/dist/domain/orderbook.operator.js.map +1 -0
  115. package/dist/{store/event/store-trade.event.spec.d.ts → domain/orderbook.operator.spec.d.ts} +0 -0
  116. package/dist/domain/orderbook.operator.spec.js +22 -0
  117. package/dist/domain/orderbook.operator.spec.js.map +1 -0
  118. package/dist/domain/orderbook.spec.d.ts +1 -0
  119. package/dist/domain/orderbook.spec.js +13 -0
  120. package/dist/domain/orderbook.spec.js.map +1 -0
  121. package/dist/domain/position.d.ts +6 -11
  122. package/dist/domain/position.js +9 -31
  123. package/dist/domain/position.js.map +1 -1
  124. package/dist/domain/position.operator.d.ts +10 -0
  125. package/dist/domain/position.operator.js +38 -0
  126. package/dist/domain/position.operator.js.map +1 -0
  127. package/dist/domain/position.operator.spec.d.ts +1 -0
  128. package/dist/domain/position.operator.spec.js +48 -0
  129. package/dist/domain/position.operator.spec.js.map +1 -0
  130. package/dist/domain/position.spec.js +21 -17
  131. package/dist/domain/position.spec.js.map +1 -1
  132. package/dist/domain/session.d.ts +15 -18
  133. package/dist/domain/session.js +21 -31
  134. package/dist/domain/session.js.map +1 -1
  135. package/dist/domain/session.spec.js +1 -1
  136. package/dist/domain/session.spec.js.map +1 -1
  137. package/dist/domain/trade.d.ts +1 -0
  138. package/dist/domain/trade.js +1 -0
  139. package/dist/domain/trade.js.map +1 -1
  140. package/dist/domain/trade.operator.d.ts +6 -0
  141. package/dist/domain/trade.operator.js +10 -0
  142. package/dist/domain/trade.operator.js.map +1 -0
  143. package/dist/domain/trade.operator.spec.d.ts +1 -0
  144. package/dist/domain/trade.operator.spec.js +24 -0
  145. package/dist/domain/trade.operator.spec.js.map +1 -0
  146. package/dist/domain/trade.spec.d.ts +1 -0
  147. package/dist/domain/trade.spec.js +13 -0
  148. package/dist/domain/trade.spec.js.map +1 -0
  149. package/dist/indicator/cross.spec.js +2 -2
  150. package/dist/indicator/cross.spec.js.map +1 -1
  151. package/dist/indicator/ema.spec.js +1 -1
  152. package/dist/indicator/ema.spec.js.map +1 -1
  153. package/dist/indicator/sma.spec.js +1 -1
  154. package/dist/indicator/sma.spec.js.map +1 -1
  155. package/dist/indicator/tma.spec.js +1 -1
  156. package/dist/indicator/tma.spec.js.map +1 -1
  157. package/dist/indicator/trailing.spec.js +2 -2
  158. package/dist/indicator/trailing.spec.js.map +1 -1
  159. package/dist/indicator/truerange.spec.js +1 -1
  160. package/dist/indicator/truerange.spec.js.map +1 -1
  161. package/dist/indicator/wma.spec.js +1 -1
  162. package/dist/indicator/wma.spec.js.map +1 -1
  163. package/dist/shared/collections.d.ts +10 -0
  164. package/dist/shared/collections.js +33 -0
  165. package/dist/shared/collections.js.map +1 -0
  166. package/dist/shared/datetime.d.ts +0 -1
  167. package/dist/shared/datetime.js +1 -12
  168. package/dist/shared/datetime.js.map +1 -1
  169. package/dist/shared/decimals.d.ts +1 -1
  170. package/dist/shared/decimals.js +4 -5
  171. package/dist/shared/decimals.js.map +1 -1
  172. package/dist/shared/decimals.spec.js +2 -1
  173. package/dist/shared/decimals.spec.js.map +1 -1
  174. package/dist/shared/index.d.ts +1 -1
  175. package/dist/shared/index.js +1 -1
  176. package/dist/shared/index.js.map +1 -1
  177. package/dist/shared/io.js.map +1 -1
  178. package/dist/shared/policy.d.ts +0 -1
  179. package/dist/shared/policy.js +1 -11
  180. package/dist/shared/policy.js.map +1 -1
  181. package/dist/storage/cache.js +1 -1
  182. package/dist/storage/cache.js.map +1 -1
  183. package/dist/storage/cache.spec.d.ts +1 -0
  184. package/dist/storage/cache.spec.js +18 -0
  185. package/dist/storage/cache.spec.js.map +1 -0
  186. package/dist/storage/feed.d.ts +3 -4
  187. package/dist/storage/feed.js +16 -6
  188. package/dist/storage/feed.js.map +1 -1
  189. package/dist/storage/storage.d.ts +2 -7
  190. package/dist/storage/storage.js +6 -11
  191. package/dist/storage/storage.js.map +1 -1
  192. package/dist/store/index.d.ts +8 -2
  193. package/dist/store/index.js +8 -2
  194. package/dist/store/index.js.map +1 -1
  195. package/dist/store/store-balance.event.d.ts +33 -0
  196. package/dist/store/store-balance.event.js +90 -0
  197. package/dist/store/store-balance.event.js.map +1 -0
  198. package/dist/store/store-balance.event.spec.d.ts +1 -0
  199. package/dist/store/{event/store-balance.event.spec.js → store-balance.event.spec.js} +7 -7
  200. package/dist/store/store-balance.event.spec.js.map +1 -0
  201. package/dist/store/{event/store-instrument.event.d.ts → store-instrument.event.d.ts} +5 -8
  202. package/dist/store/store-instrument.event.js +52 -0
  203. package/dist/store/store-instrument.event.js.map +1 -0
  204. package/dist/store/store-instrument.event.spec.d.ts +1 -0
  205. package/dist/store/store-instrument.event.spec.js +22 -0
  206. package/dist/store/store-instrument.event.spec.js.map +1 -0
  207. package/dist/store/store-order.event.d.ts +59 -0
  208. package/dist/store/store-order.event.js +181 -0
  209. package/dist/store/store-order.event.js.map +1 -0
  210. package/dist/store/store-order.event.spec.d.ts +1 -0
  211. package/dist/store/{event/store-order.event.spec.js → store-order.event.spec.js} +8 -8
  212. package/dist/store/store-order.event.spec.js.map +1 -0
  213. package/dist/store/{event/store-orderbook.event.d.ts → store-orderbook.event.d.ts} +4 -5
  214. package/dist/store/store-orderbook.event.js +42 -0
  215. package/dist/store/store-orderbook.event.js.map +1 -0
  216. package/dist/store/{event/store-position.event.d.ts → store-position.event.d.ts} +5 -7
  217. package/dist/store/store-position.event.js +77 -0
  218. package/dist/store/store-position.event.js.map +1 -0
  219. package/dist/store/store-state.d.ts +27 -0
  220. package/dist/store/store-state.js +29 -0
  221. package/dist/store/store-state.js.map +1 -0
  222. package/dist/store/{event/store-trade.event.d.ts → store-trade.event.d.ts} +4 -5
  223. package/dist/store/store-trade.event.js +25 -0
  224. package/dist/store/store-trade.event.js.map +1 -0
  225. package/dist/store/store-trade.event.spec.d.ts +1 -0
  226. package/dist/store/{event/store-trade.event.spec.js → store-trade.event.spec.js} +13 -13
  227. package/dist/store/store-trade.event.spec.js.map +1 -0
  228. package/dist/store/store.d.ts +4 -25
  229. package/dist/store/store.event.d.ts +6 -0
  230. package/dist/store/{event/store.event.js → store.event.js} +0 -0
  231. package/dist/store/store.event.js.map +1 -0
  232. package/dist/store/store.js +7 -195
  233. package/dist/store/store.js.map +1 -1
  234. package/dist/store/store.spec.d.ts +1 -0
  235. package/dist/store/store.spec.js +119 -0
  236. package/dist/store/store.spec.js.map +1 -0
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/{jestconfig.unit.json → jestconfig.json} +1 -2
  239. package/package.json +2 -6
  240. package/src/adapter/adapter-aggregate.ts +27 -35
  241. package/src/adapter/adapter.ts +25 -54
  242. package/src/adapter/backtester/backtester-adapter.spec.ts +124 -0
  243. package/src/adapter/backtester/backtester-adapter.ts +28 -17
  244. package/src/adapter/backtester/backtester-cursor.spec.ts +18 -19
  245. package/src/adapter/backtester/backtester-cursor.ts +7 -7
  246. package/src/adapter/backtester/backtester-streamer.spec.ts +19 -19
  247. package/src/adapter/backtester/backtester-streamer.ts +50 -20
  248. package/src/adapter/error.ts +9 -0
  249. package/src/adapter/paper/engine/paper-engine.spec.ts +92 -0
  250. package/src/adapter/paper/engine/paper-engine.ts +135 -0
  251. package/src/adapter/paper/index.ts +1 -2
  252. package/src/adapter/paper/paper-adapter.spec.ts +55 -19
  253. package/src/adapter/paper/paper-adapter.ts +27 -24
  254. package/src/bootstrap.ts +26 -19
  255. package/src/cli/pull.ts +5 -1
  256. package/src/cli/test.ts +5 -2
  257. package/src/domain/asset.spec.ts +33 -29
  258. package/src/domain/asset.ts +27 -21
  259. package/src/domain/balance.operator.spec.ts +25 -0
  260. package/src/domain/balance.operator.ts +15 -0
  261. package/src/domain/balance.spec.ts +95 -7
  262. package/src/domain/balance.ts +35 -29
  263. package/src/domain/candle.operator.spec.ts +125 -0
  264. package/src/domain/candle.operator.ts +106 -0
  265. package/src/domain/candle.spec.ts +12 -68
  266. package/src/domain/candle.ts +2 -114
  267. package/src/domain/commission.spec.ts +33 -0
  268. package/src/domain/commission.ts +2 -2
  269. package/src/domain/component.ts +1 -0
  270. package/src/domain/error.ts +25 -0
  271. package/src/domain/index.ts +8 -1
  272. package/src/domain/instrument.operator.spec.ts +28 -0
  273. package/src/domain/instrument.operator.ts +25 -0
  274. package/src/domain/instrument.spec.ts +22 -30
  275. package/src/domain/instrument.ts +20 -11
  276. package/src/domain/order.operator.spec.ts +81 -0
  277. package/src/domain/order.operator.ts +23 -0
  278. package/src/domain/order.spec.ts +43 -0
  279. package/src/domain/order.ts +43 -46
  280. package/src/domain/orderbook.operator.spec.ts +28 -0
  281. package/src/domain/orderbook.operator.ts +15 -0
  282. package/src/domain/orderbook.spec.ts +17 -0
  283. package/src/domain/orderbook.ts +4 -1
  284. package/src/domain/position.operator.spec.ts +58 -0
  285. package/src/domain/position.operator.ts +61 -0
  286. package/src/domain/position.spec.ts +28 -24
  287. package/src/domain/position.ts +16 -48
  288. package/src/domain/session.spec.ts +1 -1
  289. package/src/domain/session.ts +41 -131
  290. package/src/domain/trade.operator.spec.ts +31 -0
  291. package/src/domain/trade.operator.ts +15 -0
  292. package/src/domain/trade.spec.ts +17 -0
  293. package/src/domain/trade.ts +4 -1
  294. package/src/indicator/cross.spec.ts +2 -2
  295. package/src/indicator/ema.spec.ts +1 -1
  296. package/src/indicator/sma.spec.ts +1 -1
  297. package/src/indicator/tma.spec.ts +1 -1
  298. package/src/indicator/trailing.spec.ts +2 -2
  299. package/src/indicator/truerange.spec.ts +1 -1
  300. package/src/indicator/wma.spec.ts +1 -1
  301. package/src/shared/collections.ts +35 -0
  302. package/src/shared/datetime.ts +0 -12
  303. package/src/shared/decimals.spec.ts +2 -1
  304. package/src/shared/decimals.ts +6 -6
  305. package/src/shared/index.ts +1 -1
  306. package/src/shared/io.ts +0 -2
  307. package/src/shared/policy.ts +0 -13
  308. package/src/storage/cache.spec.ts +18 -0
  309. package/src/storage/cache.ts +1 -1
  310. package/src/storage/feed.ts +26 -16
  311. package/src/storage/storage.ts +9 -13
  312. package/src/store/index.ts +8 -2
  313. package/src/store/{event/store-balance.event.spec.ts → store-balance.event.spec.ts} +6 -6
  314. package/src/store/store-balance.event.ts +124 -0
  315. package/src/store/store-instrument.event.spec.ts +25 -0
  316. package/src/store/store-instrument.event.ts +72 -0
  317. package/src/store/store-order.event.spec.ts +28 -0
  318. package/src/store/store-order.event.ts +214 -0
  319. package/src/store/store-orderbook.event.ts +54 -0
  320. package/src/store/store-position.event.ts +102 -0
  321. package/src/store/store-state.ts +48 -0
  322. package/src/store/{event/store-trade.event.spec.ts → store-trade.event.spec.ts} +14 -14
  323. package/src/store/store-trade.event.ts +36 -0
  324. package/src/store/store.event.ts +8 -0
  325. package/src/store/store.spec.ts +180 -0
  326. package/src/store/store.ts +10 -208
  327. package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +0 -10
  328. package/dist/adapter/paper/simulator/paper-margin-simulator.js +0 -69
  329. package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +0 -1
  330. package/dist/adapter/paper/simulator/paper-simulator.d.ts +0 -16
  331. package/dist/adapter/paper/simulator/paper-simulator.js +0 -93
  332. package/dist/adapter/paper/simulator/paper-simulator.js.map +0 -1
  333. package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +0 -13
  334. package/dist/adapter/paper/simulator/paper-spot-simulator.js +0 -81
  335. package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +0 -1
  336. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js +0 -49
  337. package/dist/adapter/paper/simulator/paper-spot-simulator.spec.js.map +0 -1
  338. package/dist/domain/statement.d.ts +0 -4
  339. package/dist/domain/statement.js +0 -87
  340. package/dist/domain/statement.js.map +0 -1
  341. package/dist/shared/policy.spec.js +0 -22
  342. package/dist/shared/policy.spec.js.map +0 -1
  343. package/dist/shared/topic.d.ts +0 -14
  344. package/dist/shared/topic.js +0 -40
  345. package/dist/shared/topic.js.map +0 -1
  346. package/dist/shared/topic.spec.js +0 -43
  347. package/dist/shared/topic.spec.js.map +0 -1
  348. package/dist/store/event/index.d.ts +0 -8
  349. package/dist/store/event/index.js +0 -25
  350. package/dist/store/event/index.js.map +0 -1
  351. package/dist/store/event/store-balance.event.d.ts +0 -37
  352. package/dist/store/event/store-balance.event.js +0 -119
  353. package/dist/store/event/store-balance.event.js.map +0 -1
  354. package/dist/store/event/store-balance.event.spec.js.map +0 -1
  355. package/dist/store/event/store-candle.event.d.ts +0 -18
  356. package/dist/store/event/store-candle.event.js +0 -63
  357. package/dist/store/event/store-candle.event.js.map +0 -1
  358. package/dist/store/event/store-candle.event.spec.js +0 -23
  359. package/dist/store/event/store-candle.event.spec.js.map +0 -1
  360. package/dist/store/event/store-instrument.event.js +0 -78
  361. package/dist/store/event/store-instrument.event.js.map +0 -1
  362. package/dist/store/event/store-instrument.event.spec.js +0 -21
  363. package/dist/store/event/store-instrument.event.spec.js.map +0 -1
  364. package/dist/store/event/store-order.event.d.ts +0 -61
  365. package/dist/store/event/store-order.event.js +0 -205
  366. package/dist/store/event/store-order.event.js.map +0 -1
  367. package/dist/store/event/store-order.event.spec.js.map +0 -1
  368. package/dist/store/event/store-orderbook.event.js +0 -65
  369. package/dist/store/event/store-orderbook.event.js.map +0 -1
  370. package/dist/store/event/store-position.event.js +0 -97
  371. package/dist/store/event/store-position.event.js.map +0 -1
  372. package/dist/store/event/store-trade.event.js +0 -47
  373. package/dist/store/event/store-trade.event.js.map +0 -1
  374. package/dist/store/event/store-trade.event.spec.js.map +0 -1
  375. package/dist/store/event/store.event.d.ts +0 -5
  376. package/dist/store/event/store.event.js.map +0 -1
  377. package/dist/store/store.state.d.ts +0 -21
  378. package/dist/store/store.state.js +0 -21
  379. package/dist/store/store.state.js.map +0 -1
  380. package/dist/tests/backtester-adapter.spec.js +0 -61
  381. package/dist/tests/backtester-adapter.spec.js.map +0 -1
  382. package/dist/tests/session.spec.d.ts +0 -0
  383. package/dist/tests/session.spec.js +0 -1
  384. package/dist/tests/session.spec.js.map +0 -1
  385. package/jestconfig.integration.json +0 -12
  386. package/src/adapter/paper/simulator/paper-margin-simulator.ts +0 -108
  387. package/src/adapter/paper/simulator/paper-simulator.ts +0 -121
  388. package/src/adapter/paper/simulator/paper-spot-simulator.spec.ts +0 -87
  389. package/src/adapter/paper/simulator/paper-spot-simulator.ts +0 -134
  390. package/src/domain/statement.ts +0 -119
  391. package/src/shared/policy.spec.ts +0 -25
  392. package/src/shared/topic.spec.ts +0 -34
  393. package/src/shared/topic.ts +0 -43
  394. package/src/store/event/index.ts +0 -8
  395. package/src/store/event/store-balance.event.ts +0 -161
  396. package/src/store/event/store-candle.event.spec.ts +0 -30
  397. package/src/store/event/store-candle.event.ts +0 -71
  398. package/src/store/event/store-instrument.event.spec.ts +0 -25
  399. package/src/store/event/store-instrument.event.ts +0 -84
  400. package/src/store/event/store-order.event.spec.ts +0 -28
  401. package/src/store/event/store-order.event.ts +0 -218
  402. package/src/store/event/store-orderbook.event.ts +0 -70
  403. package/src/store/event/store-position.event.ts +0 -109
  404. package/src/store/event/store-trade.event.ts +0 -52
  405. package/src/store/event/store.event.ts +0 -6
  406. package/src/store/store.state.ts +0 -43
  407. package/src/tests/backtester-adapter.spec.ts +0 -88
  408. package/src/tests/session.spec.ts +0 -121
@@ -1,7 +1,8 @@
1
1
  import { InstrumentSelector } from '../../domain';
2
2
  import { timestamp } from '../../shared';
3
3
  import { Feed } from '../../storage';
4
- import { Store } from '../../store';
4
+ import { OrderbookPatchEvent, Store, TradePatchEvent } from '../../store';
5
+ import { AdapterTimeProvider } from '../adapter';
5
6
  import { BacktesterCursor } from './backtester-cursor';
6
7
 
7
8
  /**
@@ -45,14 +46,22 @@ export class BacktesterStreamer {
45
46
  this.timestamp = period.from;
46
47
  }
47
48
 
49
+ getTimeProvider(): AdapterTimeProvider {
50
+ const provider = {
51
+ timestamp: () => this.timestamp
52
+ };
53
+
54
+ return provider;
55
+ }
56
+
48
57
  subscribe(instrument: InstrumentSelector) {
49
- if (instrument.toString() in this.cursor) {
58
+ if (instrument.id in this.cursor) {
50
59
  return;
51
60
  }
52
61
 
53
62
  const cursor = new BacktesterCursor(instrument, this.feed);
54
63
 
55
- this.cursor[instrument.toString()] = cursor;
64
+ this.cursor[instrument.id] = cursor;
56
65
  }
57
66
 
58
67
  /**
@@ -65,7 +74,7 @@ export class BacktesterStreamer {
65
74
  /**
66
75
  * Decreases stop counter and continues execution if no more stops requested.
67
76
  */
68
- async tryContinue(): Promise<void> {
77
+ tryContinue() {
69
78
  if (this.stopAcquire == 0) {
70
79
  return;
71
80
  }
@@ -82,21 +91,25 @@ export class BacktesterStreamer {
82
91
  }
83
92
  }
84
93
 
85
- while (await this.processNext()) {
86
- if (this.sequence % this.sequenceUpdateBatch == 0) {
87
- if (this.listener.onBacktestUpdated) {
88
- this.listener.onBacktestUpdated(this);
94
+ const next = async () => {
95
+ if (await this.processNext()) {
96
+ if (this.sequence % this.sequenceUpdateBatch == 0) {
97
+ if (this.listener.onBacktestUpdated) {
98
+ this.listener.onBacktestUpdated(this);
99
+ }
89
100
  }
90
- }
91
101
 
92
- if (this.stopAcquire > 0) {
93
- return;
102
+ if (this.stopAcquire === 0) {
103
+ setImmediate(next);
104
+ }
105
+ } else {
106
+ if (this.listener.onBacktestCompleted) {
107
+ this.listener.onBacktestCompleted(this);
108
+ }
94
109
  }
95
- }
110
+ };
96
111
 
97
- if (this.listener.onBacktestCompleted) {
98
- this.listener.onBacktestCompleted(this);
99
- }
112
+ next();
100
113
  }
101
114
 
102
115
  private async processNext(): Promise<boolean> {
@@ -105,20 +118,37 @@ export class BacktesterStreamer {
105
118
  return false;
106
119
  }
107
120
 
108
- const event = cursor.peek();
121
+ const candle = cursor.peek();
122
+ const instrument = cursor.instrument;
123
+ const volume = candle.volume ?? 0;
109
124
 
110
- this.timestamp = event.timestamp;
125
+ this.timestamp = candle.timestamp;
111
126
  this.sequence++;
112
127
 
113
- this.store.dispatch(event);
128
+ this.dispatch(candle.timestamp, instrument, candle.open, volume);
129
+ this.dispatch(candle.timestamp, instrument, candle.high, volume);
130
+ this.dispatch(candle.timestamp, instrument, candle.low, volume);
131
+ this.dispatch(candle.timestamp, instrument, candle.close, volume);
114
132
 
115
- if (cursor.dequeue().timestamp != event.timestamp) {
133
+ if (cursor.dequeue().timestamp != candle.timestamp) {
116
134
  throw new Error('invalid event to consume');
117
135
  }
118
136
 
119
137
  return true;
120
138
  }
121
139
 
140
+ private dispatch(
141
+ timestamp: number,
142
+ instrument: InstrumentSelector,
143
+ rate: number,
144
+ volume: number
145
+ ) {
146
+ this.store.dispatch(
147
+ new TradePatchEvent(instrument, rate, volume, timestamp),
148
+ new OrderbookPatchEvent(instrument, rate, volume, rate, volume, timestamp)
149
+ );
150
+ }
151
+
122
152
  private async current(from: timestamp, to: timestamp): Promise<BacktesterCursor> {
123
153
  for (const cursor of Object.values(this.cursor)) {
124
154
  if (cursor.size == 0 && !cursor.completed) {
@@ -127,7 +157,7 @@ export class BacktesterStreamer {
127
157
  }
128
158
 
129
159
  return Object.values(this.cursor)
130
- .filter(it => it.peek() != null)
160
+ .filter(it => it.peek() != undefined)
131
161
  .sort((lhs, rhs) => lhs.peek().timestamp - rhs.peek().timestamp)
132
162
  .find(() => true);
133
163
  }
@@ -0,0 +1,9 @@
1
+ export function adapterNotFoundError(adapterName: string) {
2
+ return new Error(
3
+ `Unknown adapter: ${adapterName}. You should provide adapter in session descriptor.`
4
+ );
5
+ }
6
+
7
+ export function backtestPageNotEmpty() {
8
+ return new Error('Backtest page is not empty');
9
+ }
@@ -0,0 +1,92 @@
1
+ import { Asset, commissionPercentOf, Instrument, Order } from '../../../domain';
2
+ import { now } from '../../../shared';
3
+ import {
4
+ BalancePatchEvent,
5
+ InstrumentPatchEvent,
6
+ InstrumentSubscriptionEvent,
7
+ OrderbookPatchEvent,
8
+ Store
9
+ } from '../../../store';
10
+ import { PaperEngine } from './paper-engine';
11
+
12
+ describe('PaperEngine', () => {
13
+ const instrument = new Instrument(
14
+ new Asset('btc', 'binance', 8),
15
+ new Asset('usdt', 'binance', 2),
16
+ 'binance:btc-usdt'
17
+ );
18
+
19
+ const commission = commissionPercentOf({
20
+ maker: 0.1,
21
+ taker: 0.1
22
+ });
23
+
24
+ test('should open a new buy market order', () => {
25
+ const store = new Store();
26
+ const engine = new PaperEngine(store);
27
+ const order = Order.market(instrument, 1.0);
28
+
29
+ store.dispatch(
30
+ new InstrumentPatchEvent(now(), instrument.base, instrument.quote, commission, ''),
31
+ new BalancePatchEvent(instrument.base, 1, 0, now()),
32
+ new BalancePatchEvent(instrument.quote, 1000, 0, now())
33
+ );
34
+
35
+ engine.open(order);
36
+
37
+ expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
38
+ expect(store.snapshot.order.get(instrument.id).get(order.id)).toEqual(order);
39
+ expect(store.snapshot.balance.get(instrument.quote.id).free).toEqual(0);
40
+ expect(store.snapshot.balance.get(instrument.quote.id).locked).toEqual(1000);
41
+ });
42
+
43
+ test('should open a new sell market order', () => {
44
+ const store = new Store();
45
+ const engine = new PaperEngine(store);
46
+ const order = Order.market(instrument, -0.6);
47
+
48
+ store.dispatch(
49
+ new InstrumentPatchEvent(now(), instrument.base, instrument.quote, commission, ''),
50
+ new BalancePatchEvent(instrument.base, 1, 0, now()),
51
+ new BalancePatchEvent(instrument.quote, 1000, 0, now())
52
+ );
53
+
54
+ engine.open(order);
55
+
56
+ expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
57
+ expect(store.snapshot.order.get(instrument.id).get(order.id)).toEqual(order);
58
+ expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(0.4);
59
+ expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(0.6);
60
+ });
61
+
62
+ test('should open and fill a new sell limit order', () => {
63
+ const store = new Store();
64
+ const engine = new PaperEngine(store);
65
+ const order = Order.limit(instrument, -0.6, 100);
66
+
67
+ store.dispatch(
68
+ new InstrumentPatchEvent(now(), instrument.base, instrument.quote, commission, ''),
69
+ new BalancePatchEvent(instrument.base, 1, 0, now()),
70
+ new BalancePatchEvent(instrument.quote, 1000, 0, now()),
71
+ new InstrumentSubscriptionEvent(now(), instrument, true)
72
+ );
73
+
74
+ engine.open(order);
75
+
76
+ 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(0.4);
81
+ expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(0.6);
82
+
83
+ store.dispatch(new OrderbookPatchEvent(instrument, 102, 1, 101, 1, now()));
84
+
85
+ expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
86
+ expect(store.snapshot.order.get(instrument.id).get(order.id).state).toEqual('FILLED');
87
+ expect(store.snapshot.balance.get(instrument.base.id).free).toEqual(0.4);
88
+ expect(store.snapshot.balance.get(instrument.base.id).locked).toEqual(0);
89
+ expect(store.snapshot.balance.get(instrument.quote.id).free).toEqual(1060.53);
90
+ expect(store.snapshot.balance.get(instrument.quote.id).locked).toEqual(0);
91
+ });
92
+ });
@@ -0,0 +1,135 @@
1
+ import { tap } from 'rxjs';
2
+
3
+ import { Order, Orderbook, Trade } from '../../../domain';
4
+ import {
5
+ BalanceLockOrderEvent,
6
+ BalanceTransactEvent,
7
+ BalanceUnlockOrderEvent,
8
+ OrderCanceledEvent,
9
+ OrderCancelingEvent,
10
+ OrderFilledEvent,
11
+ OrderNewEvent,
12
+ OrderPendingEvent,
13
+ OrderRejectedEvent,
14
+ Store
15
+ } from '../../../store';
16
+
17
+ export class PaperEngine {
18
+ constructor(private readonly store: Store) {
19
+ store.changes$
20
+ .pipe(
21
+ tap(it => {
22
+ if (it instanceof Orderbook) {
23
+ this.onOrderbook(it);
24
+ } else if (it instanceof Trade) {
25
+ this.onTrade(it);
26
+ }
27
+ })
28
+ )
29
+ .subscribe();
30
+ }
31
+
32
+ public open(order: Order) {
33
+ const { timestamp } = this.store.snapshot;
34
+
35
+ try {
36
+ this.store.dispatch(
37
+ new OrderNewEvent(order, timestamp),
38
+ new BalanceLockOrderEvent(order.id, order.instrument, timestamp)
39
+ );
40
+
41
+ this.store.dispatch(new OrderPendingEvent(order.id, order.instrument, timestamp));
42
+ } catch (error) {
43
+ this.store.dispatch(
44
+ new BalanceUnlockOrderEvent(order.id, order.instrument, timestamp),
45
+ new OrderRejectedEvent(order.id, order.instrument, timestamp)
46
+ );
47
+ }
48
+ }
49
+
50
+ public cancel(order: Order) {
51
+ const { timestamp } = this.store.snapshot;
52
+
53
+ this.store.dispatch(new OrderCancelingEvent(order.id, order.instrument, timestamp));
54
+
55
+ this.store.dispatch(
56
+ new BalanceUnlockOrderEvent(order.id, order.instrument, timestamp),
57
+ new OrderCanceledEvent(order.id, order.instrument, timestamp)
58
+ );
59
+ }
60
+
61
+ private onOrderbook(orderbook: Orderbook) {
62
+ this.store.snapshot.order
63
+ .get(orderbook.instrument.id)
64
+ .asReadonlyArray()
65
+ .forEach(it => {
66
+ if (it.state != 'PENDING') {
67
+ return;
68
+ }
69
+
70
+ if (it.type == 'LIMIT') {
71
+ if (it.quantity > 0 && it.rate > orderbook.bestAskRate) {
72
+ this.completeOrder(it, orderbook.bestAskRate);
73
+ } else if (it.quantity < 0 && it.rate < orderbook.bestBidRate) {
74
+ this.completeOrder(it, orderbook.bestBidRate);
75
+ }
76
+ } else if (it.type == 'MARKET') {
77
+ if (it.quantity > 0) {
78
+ this.completeOrder(it, orderbook.bestAskRate);
79
+ } else if (it.quantity < 0) {
80
+ this.completeOrder(it, orderbook.bestBidRate);
81
+ }
82
+ }
83
+ });
84
+ }
85
+
86
+ private onTrade(trade: Trade) {
87
+ this.store.snapshot.order
88
+ .get(trade.instrument.id)
89
+ .asReadonlyArray()
90
+ .forEach(it => {
91
+ if (it.state != 'PENDING') {
92
+ return;
93
+ }
94
+
95
+ if (it.type == 'LIMIT') {
96
+ if (it.quantity > 0 && it.rate > trade.rate) {
97
+ this.completeOrder(it, trade.rate);
98
+ } else if (it.quantity < 0 && it.rate < trade.rate) {
99
+ this.completeOrder(it, trade.rate);
100
+ }
101
+ } else if (it.type == 'MARKET') {
102
+ this.completeOrder(it, trade.rate);
103
+ }
104
+ });
105
+ }
106
+
107
+ private completeOrder(order: Order, averageExecutionRate: number) {
108
+ const { timestamp } = this.store.snapshot;
109
+
110
+ const instrument = this.store.snapshot.universe.instrument.get(order.instrument.id);
111
+ const transacted = {
112
+ base: 0,
113
+ quote: 0
114
+ };
115
+
116
+ const qty = Math.abs(order.quantity);
117
+
118
+ if (order.quantity > 0) {
119
+ transacted.base += instrument.base.floor(instrument.commission.applyMakerFee(qty));
120
+ transacted.quote -= instrument.quote.floor(averageExecutionRate * qty);
121
+ } else if (order.quantity < 0) {
122
+ transacted.base -= instrument.base.floor(qty);
123
+ transacted.quote += instrument.quote.floor(
124
+ instrument.commission.applyMakerFee(averageExecutionRate * qty)
125
+ );
126
+ }
127
+
128
+ this.store.dispatch(
129
+ new BalanceUnlockOrderEvent(order.id, order.instrument, timestamp),
130
+ new OrderFilledEvent(order.id, order.instrument, averageExecutionRate, timestamp),
131
+ new BalanceTransactEvent(instrument.base, transacted.base, timestamp),
132
+ new BalanceTransactEvent(instrument.quote, transacted.quote, timestamp)
133
+ );
134
+ }
135
+ }
@@ -1,3 +1,2 @@
1
1
  export * from './paper-adapter';
2
- export * from './simulator/paper-margin-simulator';
3
- export * from './simulator/paper-spot-simulator';
2
+ export * from './engine/paper-engine';
@@ -1,25 +1,58 @@
1
- import { Cache, InMemoryStorage } from '../../storage';
2
1
  import { InstrumentPatchEvent, Store } from '../../store';
3
- import { AdapterContext } from '..';
4
- import { Adapter } from '../adapter';
5
- import { Asset, Commission, instrumentOf, Order } from './../../domain';
6
- import { PaperSpotSimulator } from '.';
2
+ import {
3
+ Adapter,
4
+ AdapterTimeProvider,
5
+ DefaultTimeProvider,
6
+ FeedQuery,
7
+ HistoryQuery
8
+ } from '../adapter';
9
+ import {
10
+ Asset,
11
+ Candle,
12
+ Commission,
13
+ instrumentOf,
14
+ InstrumentSelector,
15
+ Order
16
+ } from './../../domain';
17
+ import { PaperEngine } from './engine/paper-engine';
7
18
  import { PaperAdapter } from './paper-adapter';
8
- import { PaperSimulator } from './simulator/paper-simulator';
9
19
 
10
20
  class DefaultAdapter extends Adapter {
21
+ dispose(): Promise<void> {
22
+ throw new Error('Method not implemented.');
23
+ }
24
+ subscribe(instruments: InstrumentSelector[]): Promise<void> {
25
+ throw new Error('Method not implemented.');
26
+ }
27
+ account(): Promise<void> {
28
+ throw new Error('Method not implemented.');
29
+ }
30
+ open(order: Order): Promise<void> {
31
+ throw new Error('Method not implemented.');
32
+ }
33
+ cancel(order: Order): Promise<void> {
34
+ throw new Error('Method not implemented.');
35
+ }
36
+ history(query: HistoryQuery): Promise<Candle[]> {
37
+ throw new Error('Method not implemented.');
38
+ }
39
+ feed(query: FeedQuery): Promise<void> {
40
+ throw new Error('Method not implemented.');
41
+ }
11
42
  name = 'default';
12
43
 
13
44
  timestamp() {
14
45
  return 123;
15
46
  }
16
47
 
17
- async awake(context: AdapterContext): Promise<void> {
18
- super.awake(context);
48
+ constructor(timeProvider: AdapterTimeProvider, private readonly store: Store) {
49
+ super(timeProvider);
50
+ }
19
51
 
20
- context.dispatch(
52
+ async awake(): Promise<void> {
53
+ this.store.dispatch(
21
54
  new InstrumentPatchEvent(
22
- context.timestamp,
55
+ this.timestamp(),
23
56
  new Asset('a', this.name, 8),
24
57
  new Asset('b', this.name, 4),
25
58
  new Commission(0.1, 0.1),
@@ -28,12 +61,12 @@ class DefaultAdapter extends Adapter {
28
61
  );
29
62
  }
30
63
 
31
- createPaperSimulator(adapter: PaperAdapter): PaperSimulator {
32
- return new PaperSpotSimulator(adapter);
64
+ createPaperEngine(adapter: PaperAdapter): PaperEngine {
65
+ return new PaperEngine(adapter.store);
33
66
  }
34
67
  }
35
68
 
36
- describe('paper adapter tests', () => {
69
+ describe('PaperAdapter', () => {
37
70
  const options = {
38
71
  balance: {
39
72
  ['default:a']: 1000,
@@ -44,7 +77,11 @@ describe('paper adapter tests', () => {
44
77
  test('should return wrapped adapter name and timestamp', () => {
45
78
  const store = new Store();
46
79
 
47
- const sut = new PaperAdapter(new DefaultAdapter(), store, options);
80
+ const sut = new PaperAdapter(
81
+ new DefaultAdapter(DefaultTimeProvider, store),
82
+ store,
83
+ options
84
+ );
48
85
 
49
86
  expect(sut.name).toEqual('default');
50
87
  expect(sut.timestamp()).toEqual(123);
@@ -52,18 +89,17 @@ describe('paper adapter tests', () => {
52
89
 
53
90
  test('', async () => {
54
91
  const store = new Store();
55
- const adapter = new DefaultAdapter();
56
- const cache = new Cache(new InMemoryStorage());
92
+ const adapter = new DefaultAdapter(DefaultTimeProvider, store);
57
93
 
58
94
  const sut = new PaperAdapter(adapter, store, options);
59
95
 
60
- await sut.awake(new AdapterContext(sut, store, cache));
96
+ await sut.awake();
61
97
  await sut.account();
62
98
 
63
- const order = Order.buyMarket(instrumentOf('default:a-b'), 1.0);
99
+ const order = Order.market(instrumentOf('default:a-b'), 1.0);
64
100
 
65
101
  await sut.open(order);
66
102
 
67
- expect(store.snapshot.order[order.id]).toEqual(order);
103
+ expect(store.snapshot.order.get(order.instrument.id).get(order.id)).toEqual(order);
68
104
  });
69
105
  });
@@ -1,34 +1,39 @@
1
1
  import { assetOf, Candle, InstrumentSelector, Order } from '../../domain';
2
2
  import { BalancePatchEvent, Store } from '../../store';
3
- import { Adapter, AdapterContext } from '..';
4
- import { FeedQuery, HistoryQuery } from '../adapter';
5
- import { PaperSimulator } from './simulator/paper-simulator';
3
+ import { Adapter } from '..';
4
+ import { AdapterFactory, FeedQuery, HistoryQuery } from '../adapter';
5
+ import { PaperEngine } from './engine/paper-engine';
6
6
 
7
7
  export interface PaperOptions {
8
8
  balance: { [key: string]: number };
9
9
  }
10
10
 
11
+ export function createPaperAdapterFactory(
12
+ decoratedAdapterFactory: AdapterFactory,
13
+ options: PaperOptions
14
+ ): AdapterFactory {
15
+ return (timeProvider, store, cache) =>
16
+ new PaperAdapter(decoratedAdapterFactory(timeProvider, store, cache), store, options);
17
+ }
18
+
11
19
  export class PaperAdapter extends Adapter {
12
20
  readonly name = this.decoratedAdapter.name;
13
- readonly simulator: PaperSimulator;
21
+ private engine: PaperEngine;
14
22
 
15
23
  constructor(
16
24
  readonly decoratedAdapter: Adapter,
17
25
  readonly store: Store,
18
26
  readonly options: PaperOptions
19
27
  ) {
20
- super();
21
-
22
- this.simulator = this.createPaperSimulator(this);
28
+ super({
29
+ timestamp: () => this.decoratedAdapter.timestamp()
30
+ });
23
31
  }
24
32
 
25
- timestamp() {
26
- return this.decoratedAdapter.timestamp();
27
- }
33
+ async awake(): Promise<void> {
34
+ this.engine = this.createPaperEngine(this);
28
35
 
29
- async awake(context: AdapterContext): Promise<void> {
30
- await super.awake(context);
31
- await this.decoratedAdapter.awake(context);
36
+ await this.decoratedAdapter.awake();
32
37
  }
33
38
 
34
39
  dispose(): Promise<void> {
@@ -41,36 +46,34 @@ export class PaperAdapter extends Adapter {
41
46
 
42
47
  async account(): Promise<void> {
43
48
  let subscribed = Object.values(this.store.snapshot.subscription.asset).filter(
44
- it => it.adapter == this.name
49
+ it => it.adapterName == this.name
45
50
  );
46
51
 
47
52
  for (const balance in this.options.balance) {
48
53
  const asset = assetOf(balance);
49
54
 
50
- if (asset.adapter != this.name) {
55
+ if (asset.adapterName != this.name) {
51
56
  continue;
52
57
  }
53
58
 
54
59
  const free = this.options.balance[balance];
55
60
 
56
- subscribed = subscribed.filter(it => it.toString() != asset.toString());
61
+ subscribed = subscribed.filter(it => it.id != asset.id);
57
62
 
58
- this.store.dispatch(new BalancePatchEvent(asset, free, 0, this.context.timestamp));
63
+ this.store.dispatch(new BalancePatchEvent(asset, free, 0, this.timestamp()));
59
64
  }
60
65
 
61
66
  for (const missingAsset of subscribed) {
62
- this.store.dispatch(
63
- new BalancePatchEvent(missingAsset, 0, 0, this.context.timestamp)
64
- );
67
+ this.store.dispatch(new BalancePatchEvent(missingAsset, 0, 0, this.timestamp()));
65
68
  }
66
69
  }
67
70
 
68
71
  async open(order: Order): Promise<void> {
69
- this.simulator.open(order);
72
+ this.engine.open(order);
70
73
  }
71
74
 
72
75
  async cancel(order: Order): Promise<void> {
73
- this.simulator.cancel(order);
76
+ this.engine.cancel(order);
74
77
  }
75
78
 
76
79
  history(query: HistoryQuery): Promise<Candle[]> {
@@ -81,7 +84,7 @@ export class PaperAdapter extends Adapter {
81
84
  return this.decoratedAdapter.feed(query);
82
85
  }
83
86
 
84
- createPaperSimulator(adapter: PaperAdapter): PaperSimulator {
85
- return this.decoratedAdapter.createPaperSimulator(adapter);
87
+ createPaperEngine(adapter: PaperAdapter): PaperEngine {
88
+ return this.decoratedAdapter.createPaperEngine(adapter);
86
89
  }
87
90
  }
package/src/bootstrap.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  AdapterAggregate,
3
- BacktesterAdapter,
4
3
  BacktesterListener,
5
4
  BacktesterStreamer,
6
- PaperAdapter
5
+ createBacktesterAdapterFactory,
6
+ createPaperAdapterFactory,
7
+ DefaultTimeProvider
7
8
  } from './adapter';
8
9
  import { Session, SessionDescriptor } from './domain';
9
- import { Cache, Feed, InMemoryStorage, InMemoryStorageFactory } from './storage';
10
+ import { Cache, Feed, inMemoryStorageFactory } from './storage';
10
11
  import { Store } from './store';
11
12
 
12
13
  export class Bootstrap {
@@ -56,9 +57,9 @@ export class Bootstrap {
56
57
  */
57
58
  backtest(listener?: BacktesterListener): [Session, BacktesterStreamer] {
58
59
  const store = new Store();
59
- const { storage } = this.descriptor;
60
- const feed = new Feed(storage.create('feed'));
61
- const cache = new Cache(storage.create('cache'));
60
+ const storage = this.descriptor.storage ?? inMemoryStorageFactory();
61
+ const feed = new Feed(storage('feed'));
62
+ const cache = new Cache(storage('cache'));
62
63
 
63
64
  const streamer = new BacktesterStreamer(
64
65
  store,
@@ -68,13 +69,13 @@ export class Bootstrap {
68
69
  );
69
70
 
70
71
  const aggregate = new AdapterAggregate(
71
- this.descriptor.adapter.map(
72
- it =>
73
- new BacktesterAdapter(
74
- new PaperAdapter(it, store, this.descriptor.simulation),
75
- streamer
76
- )
72
+ this.descriptor.adapter.map(it =>
73
+ createBacktesterAdapterFactory(
74
+ createPaperAdapterFactory(it, this.descriptor.simulation),
75
+ streamer
76
+ )
77
77
  ),
78
+ streamer.getTimeProvider(),
78
79
  store,
79
80
  cache
80
81
  );
@@ -102,13 +103,14 @@ export class Bootstrap {
102
103
  }
103
104
 
104
105
  const store = new Store();
105
- const storage = this.descriptor.storage ?? new InMemoryStorageFactory();
106
- const cache = new Cache(storage.create('cache'));
106
+ const storage = this.descriptor.storage ?? inMemoryStorageFactory();
107
+ const cache = new Cache(storage('cache'));
107
108
 
108
109
  const aggregate = new AdapterAggregate(
109
- this.descriptor.adapter.map(
110
- it => new PaperAdapter(it, store, this.descriptor.simulation)
110
+ this.descriptor.adapter.map(it =>
111
+ createPaperAdapterFactory(it, this.descriptor.simulation)
111
112
  ),
113
+ DefaultTimeProvider,
112
114
  store,
113
115
  cache
114
116
  );
@@ -122,10 +124,15 @@ export class Bootstrap {
122
124
  */
123
125
  live(): Session {
124
126
  const store = new Store();
125
- const storage = this.descriptor.storage ?? new InMemoryStorageFactory();
126
- const cache = new Cache(storage.create('cache'));
127
+ const storage = this.descriptor.storage ?? inMemoryStorageFactory();
128
+ const cache = new Cache(storage('cache'));
127
129
 
128
- const aggregate = new AdapterAggregate(this.descriptor.adapter, store, cache);
130
+ const aggregate = new AdapterAggregate(
131
+ this.descriptor.adapter,
132
+ DefaultTimeProvider,
133
+ store,
134
+ cache
135
+ );
129
136
 
130
137
  return new Session(store, aggregate, this.descriptor);
131
138
  }