@quantform/core 0.5.13 → 0.5.23

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