@quantform/core 0.6.6 → 0.6.7

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 (336) hide show
  1. package/dist/adapter/adapter-aggregate.d.ts +2 -2
  2. package/dist/adapter/adapter-aggregate.d.ts.map +1 -1
  3. package/dist/adapter/adapter-aggregate.js +12 -11
  4. package/dist/adapter/adapter.d.ts +2 -3
  5. package/dist/adapter/adapter.d.ts.map +1 -1
  6. package/dist/adapter/backtester/backtester-adapter.d.ts +1 -5
  7. package/dist/adapter/backtester/backtester-adapter.d.ts.map +1 -1
  8. package/dist/adapter/backtester/backtester-adapter.js +2 -2
  9. package/dist/adapter/backtester/backtester-cursor.d.ts.map +1 -1
  10. package/dist/adapter/backtester/backtester-cursor.js +2 -2
  11. package/dist/adapter/backtester/backtester-cursor.spec.d.ts +2 -0
  12. package/dist/adapter/backtester/backtester-cursor.spec.d.ts.map +1 -0
  13. package/dist/adapter/backtester/backtester-cursor.spec.js +47 -0
  14. package/dist/adapter/backtester/backtester-streamer.d.ts +1 -1
  15. package/dist/adapter/backtester/backtester-streamer.d.ts.map +1 -1
  16. package/dist/adapter/backtester/backtester-streamer.js +4 -5
  17. package/dist/adapter/backtester/backtester-streamer.spec.d.ts +2 -0
  18. package/dist/adapter/backtester/backtester-streamer.spec.d.ts.map +1 -0
  19. package/dist/adapter/backtester/backtester-streamer.spec.js +45 -0
  20. package/dist/adapter/backtester/error.d.ts +6 -2
  21. package/dist/adapter/backtester/error.d.ts.map +1 -1
  22. package/dist/adapter/backtester/error.js +11 -7
  23. package/dist/adapter/backtester/index.d.ts +4 -2
  24. package/dist/adapter/backtester/index.d.ts.map +1 -1
  25. package/dist/adapter/backtester/index.js +4 -2
  26. package/dist/adapter/error.d.ts +9 -3
  27. package/dist/adapter/error.d.ts.map +1 -1
  28. package/dist/adapter/error.js +16 -10
  29. package/dist/adapter/index.d.ts +5 -4
  30. package/dist/adapter/index.d.ts.map +1 -1
  31. package/dist/adapter/index.js +5 -4
  32. package/dist/adapter/paper/engine/paper-engine.d.ts.map +1 -1
  33. package/dist/adapter/paper/engine/paper-engine.js +7 -8
  34. package/dist/adapter/paper/engine/paper-engine.spec.d.ts +2 -0
  35. package/dist/adapter/paper/engine/paper-engine.spec.d.ts.map +1 -0
  36. package/dist/adapter/paper/engine/paper-engine.spec.js +63 -0
  37. package/dist/adapter/paper/index.d.ts +2 -2
  38. package/dist/adapter/paper/index.d.ts.map +1 -1
  39. package/dist/adapter/paper/index.js +2 -2
  40. package/dist/adapter/paper/paper-adapter.d.ts +1 -3
  41. package/dist/adapter/paper/paper-adapter.d.ts.map +1 -1
  42. package/dist/adapter/paper/paper-adapter.js +8 -7
  43. package/dist/cli/build.js +1 -1
  44. package/dist/cli/dev.js +6 -6
  45. package/dist/cli/index.js +5 -5
  46. package/dist/cli/internal/workspace.js +1 -1
  47. package/dist/cli/pull.js +6 -6
  48. package/dist/cli/run.js +6 -6
  49. package/dist/cli/test.d.ts.map +1 -1
  50. package/dist/cli/test.js +9 -8
  51. package/dist/domain/asset.d.ts +5 -1
  52. package/dist/domain/asset.d.ts.map +1 -1
  53. package/dist/domain/asset.js +13 -7
  54. package/dist/domain/asset.spec.d.ts +2 -0
  55. package/dist/domain/asset.spec.d.ts.map +1 -0
  56. package/dist/domain/asset.spec.js +54 -0
  57. package/dist/domain/balance-operator.d.ts +1 -3
  58. package/dist/domain/balance-operator.d.ts.map +1 -1
  59. package/dist/domain/balance-operator.js +2 -2
  60. package/dist/domain/balance-operator.spec.d.ts +2 -0
  61. package/dist/domain/balance-operator.spec.d.ts.map +1 -0
  62. package/dist/domain/balance-operator.spec.js +21 -0
  63. package/dist/domain/balance.d.ts +14 -15
  64. package/dist/domain/balance.d.ts.map +1 -1
  65. package/dist/domain/balance.js +30 -48
  66. package/dist/domain/balance.spec.d.ts +2 -0
  67. package/dist/domain/balance.spec.d.ts.map +1 -0
  68. package/dist/domain/balance.spec.js +32 -0
  69. package/dist/domain/commission.d.ts.map +1 -1
  70. package/dist/domain/commission.spec.d.ts +2 -0
  71. package/dist/domain/commission.spec.d.ts.map +1 -0
  72. package/dist/domain/commission.spec.js +30 -0
  73. package/dist/domain/component.d.ts +2 -2
  74. package/dist/domain/component.d.ts.map +1 -1
  75. package/dist/domain/error.d.ts +15 -5
  76. package/dist/domain/error.d.ts.map +1 -1
  77. package/dist/domain/error.js +26 -16
  78. package/dist/domain/index.d.ts +21 -21
  79. package/dist/domain/index.d.ts.map +1 -1
  80. package/dist/domain/index.js +21 -21
  81. package/dist/domain/instrument-operator.d.ts +1 -2
  82. package/dist/domain/instrument-operator.d.ts.map +1 -1
  83. package/dist/domain/instrument-operator.js +3 -3
  84. package/dist/domain/instrument-operator.spec.d.ts +2 -0
  85. package/dist/domain/instrument-operator.spec.d.ts.map +1 -0
  86. package/dist/domain/instrument-operator.spec.js +21 -0
  87. package/dist/domain/instrument.d.ts +3 -3
  88. package/dist/domain/instrument.d.ts.map +1 -1
  89. package/dist/domain/instrument.js +10 -8
  90. package/dist/domain/instrument.spec.d.ts +2 -0
  91. package/dist/domain/instrument.spec.d.ts.map +1 -0
  92. package/dist/domain/instrument.spec.js +51 -0
  93. package/dist/domain/ohlc-operator.d.ts +1 -1
  94. package/dist/domain/ohlc-operator.d.ts.map +1 -1
  95. package/dist/domain/ohlc-operator.js +4 -5
  96. package/dist/domain/ohlc-operator.spec.d.ts +2 -0
  97. package/dist/domain/ohlc-operator.spec.d.ts.map +1 -0
  98. package/dist/domain/ohlc-operator.spec.js +110 -0
  99. package/dist/domain/ohlc.d.ts.map +1 -1
  100. package/dist/domain/ohlc.spec.d.ts +2 -0
  101. package/dist/domain/ohlc.spec.d.ts.map +1 -0
  102. package/dist/domain/ohlc.spec.js +25 -0
  103. package/dist/domain/order-operator.d.ts +1 -3
  104. package/dist/domain/order-operator.d.ts.map +1 -1
  105. package/dist/domain/order-operator.js +3 -3
  106. package/dist/domain/order-operator.spec.d.ts +2 -0
  107. package/dist/domain/order-operator.spec.d.ts.map +1 -0
  108. package/dist/domain/order-operator.spec.js +61 -0
  109. package/dist/domain/order.d.ts +5 -8
  110. package/dist/domain/order.d.ts.map +1 -1
  111. package/dist/domain/order.js +14 -22
  112. package/dist/domain/order.spec.d.ts +2 -0
  113. package/dist/domain/order.spec.d.ts.map +1 -0
  114. package/dist/domain/order.spec.js +27 -0
  115. package/dist/domain/orderbook-operator.d.ts +1 -3
  116. package/dist/domain/orderbook-operator.d.ts.map +1 -1
  117. package/dist/domain/orderbook-operator.js +2 -2
  118. package/dist/domain/orderbook-operator.spec.d.ts +2 -0
  119. package/dist/domain/orderbook-operator.spec.d.ts.map +1 -0
  120. package/dist/domain/orderbook-operator.spec.js +19 -0
  121. package/dist/domain/orderbook.d.ts +3 -2
  122. package/dist/domain/orderbook.d.ts.map +1 -1
  123. package/dist/domain/orderbook.js +3 -0
  124. package/dist/domain/orderbook.spec.d.ts +2 -0
  125. package/dist/domain/orderbook.spec.d.ts.map +1 -0
  126. package/dist/domain/orderbook.spec.js +11 -0
  127. package/dist/domain/position-operator.d.ts +1 -3
  128. package/dist/domain/position-operator.d.ts.map +1 -1
  129. package/dist/domain/position-operator.js +3 -4
  130. package/dist/domain/position-operator.spec.d.ts +2 -0
  131. package/dist/domain/position-operator.spec.d.ts.map +1 -0
  132. package/dist/domain/position-operator.spec.js +44 -0
  133. package/dist/domain/position.d.ts +3 -2
  134. package/dist/domain/position.d.ts.map +1 -1
  135. package/dist/domain/position.js +2 -0
  136. package/dist/domain/position.spec.d.ts +2 -0
  137. package/dist/domain/position.spec.d.ts.map +1 -0
  138. package/dist/domain/position.spec.js +28 -0
  139. package/dist/domain/session-builder.d.ts +8 -4
  140. package/dist/domain/session-builder.d.ts.map +1 -1
  141. package/dist/domain/session-builder.js +10 -15
  142. package/dist/domain/session.d.ts +1 -1
  143. package/dist/domain/session.d.ts.map +1 -1
  144. package/dist/domain/session.js +11 -17
  145. package/dist/domain/session.spec.d.ts +2 -0
  146. package/dist/domain/session.spec.d.ts.map +1 -0
  147. package/dist/domain/session.spec.js +17 -0
  148. package/dist/domain/trade-operator.d.ts +1 -3
  149. package/dist/domain/trade-operator.d.ts.map +1 -1
  150. package/dist/domain/trade-operator.js +2 -2
  151. package/dist/domain/trade-operator.spec.d.ts +2 -0
  152. package/dist/domain/trade-operator.spec.d.ts.map +1 -0
  153. package/dist/domain/trade-operator.spec.js +21 -0
  154. package/dist/domain/trade.d.ts +3 -2
  155. package/dist/domain/trade.d.ts.map +1 -1
  156. package/dist/domain/trade.js +3 -0
  157. package/dist/domain/trade.spec.d.ts +2 -0
  158. package/dist/domain/trade.spec.d.ts.map +1 -0
  159. package/dist/domain/trade.spec.js +11 -0
  160. package/dist/index.d.ts +2 -2
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +9 -8
  163. package/dist/shared/collections.spec.d.ts +2 -0
  164. package/dist/shared/collections.spec.d.ts.map +1 -0
  165. package/dist/shared/collections.spec.js +29 -0
  166. package/dist/shared/decimals.spec.d.ts +2 -0
  167. package/dist/shared/decimals.spec.d.ts.map +1 -0
  168. package/dist/shared/decimals.spec.js +28 -0
  169. package/dist/shared/hash.d.ts +2 -0
  170. package/dist/shared/hash.d.ts.map +1 -0
  171. package/dist/shared/hash.js +12 -0
  172. package/dist/shared/index.d.ts +7 -7
  173. package/dist/shared/index.d.ts.map +1 -1
  174. package/dist/shared/index.js +7 -7
  175. package/dist/shared/logger.d.ts +8 -5
  176. package/dist/shared/logger.d.ts.map +1 -1
  177. package/dist/shared/logger.js +23 -16
  178. package/dist/storage/cache.d.ts +1 -1
  179. package/dist/storage/cache.d.ts.map +1 -1
  180. package/dist/storage/cache.spec.d.ts +2 -0
  181. package/dist/storage/cache.spec.d.ts.map +1 -0
  182. package/dist/storage/cache.spec.js +25 -0
  183. package/dist/storage/feed.d.ts +1 -1
  184. package/dist/storage/feed.d.ts.map +1 -1
  185. package/dist/storage/index.d.ts +4 -4
  186. package/dist/storage/index.d.ts.map +1 -1
  187. package/dist/storage/index.js +4 -4
  188. package/dist/storage/measurement.d.ts +1 -1
  189. package/dist/storage/measurement.d.ts.map +1 -1
  190. package/dist/store/error.d.ts +21 -7
  191. package/dist/store/error.d.ts.map +1 -1
  192. package/dist/store/error.js +36 -22
  193. package/dist/store/index.d.ts +10 -9
  194. package/dist/store/index.d.ts.map +1 -1
  195. package/dist/store/index.js +10 -9
  196. package/dist/store/store-balance-event.d.ts +10 -30
  197. package/dist/store/store-balance-event.d.ts.map +1 -1
  198. package/dist/store/store-balance-event.js +19 -94
  199. package/dist/store/store-balance-event.spec.d.ts +2 -0
  200. package/dist/store/store-balance-event.spec.d.ts.map +1 -0
  201. package/dist/store/store-balance-event.spec.js +24 -0
  202. package/dist/store/store-event.d.ts +1 -1
  203. package/dist/store/store-event.d.ts.map +1 -1
  204. package/dist/store/store-instrument-event.d.ts +1 -2
  205. package/dist/store/store-instrument-event.d.ts.map +1 -1
  206. package/dist/store/store-instrument-event.js +5 -6
  207. package/dist/store/store-instrument-event.spec.d.ts +2 -0
  208. package/dist/store/store-instrument-event.spec.d.ts.map +1 -0
  209. package/dist/store/store-instrument-event.spec.js +22 -0
  210. package/dist/store/store-order-event.d.ts +1 -2
  211. package/dist/store/store-order-event.d.ts.map +1 -1
  212. package/dist/store/store-order-event.js +60 -22
  213. package/dist/store/store-order-event.spec.d.ts +2 -0
  214. package/dist/store/store-order-event.spec.d.ts.map +1 -0
  215. package/dist/store/store-order-event.spec.js +23 -0
  216. package/dist/store/store-orderbook-event.d.ts +1 -2
  217. package/dist/store/store-orderbook-event.d.ts.map +1 -1
  218. package/dist/store/store-orderbook-event.js +3 -3
  219. package/dist/store/store-orderbook-event.spec.d.ts +2 -0
  220. package/dist/store/store-orderbook-event.spec.d.ts.map +1 -0
  221. package/dist/store/store-orderbook-event.spec.js +27 -0
  222. package/dist/store/store-position-event.d.ts +1 -2
  223. package/dist/store/store-position-event.d.ts.map +1 -1
  224. package/dist/store/store-position-event.js +5 -5
  225. package/dist/store/store-state.d.ts.map +1 -1
  226. package/dist/store/store-trade-event.d.ts +1 -2
  227. package/dist/store/store-trade-event.d.ts.map +1 -1
  228. package/dist/store/store-trade-event.js +3 -3
  229. package/dist/store/store-trade-event.spec.d.ts +2 -0
  230. package/dist/store/store-trade-event.spec.d.ts.map +1 -0
  231. package/dist/store/store-trade-event.spec.js +44 -0
  232. package/dist/store/store.d.ts +1 -2
  233. package/dist/store/store.d.ts.map +1 -1
  234. package/dist/store/store.js +5 -2
  235. package/dist/store/store.spec.d.ts +2 -0
  236. package/dist/store/store.spec.d.ts.map +1 -0
  237. package/dist/store/store.spec.js +122 -0
  238. package/jest.config.ts +23 -2
  239. package/package.json +2 -2
  240. package/src/adapter/adapter-aggregate.ts +35 -21
  241. package/src/adapter/adapter.ts +6 -7
  242. package/src/adapter/backtester/backtester-adapter.ts +12 -8
  243. package/src/adapter/backtester/backtester-cursor.spec.ts +6 -6
  244. package/src/adapter/backtester/backtester-cursor.ts +5 -5
  245. package/src/adapter/backtester/backtester-streamer.spec.ts +6 -6
  246. package/src/adapter/backtester/backtester-streamer.ts +12 -9
  247. package/src/adapter/backtester/error.ts +8 -4
  248. package/src/adapter/backtester/index.ts +4 -2
  249. package/src/adapter/error.ts +14 -8
  250. package/src/adapter/index.ts +5 -4
  251. package/src/adapter/paper/engine/paper-engine.spec.ts +6 -12
  252. package/src/adapter/paper/engine/paper-engine.ts +13 -28
  253. package/src/adapter/paper/index.ts +2 -2
  254. package/src/adapter/paper/paper-adapter.ts +18 -11
  255. package/src/cli/build.ts +1 -1
  256. package/src/cli/dev.ts +5 -5
  257. package/src/cli/index.ts +5 -5
  258. package/src/cli/internal/workspace.ts +1 -1
  259. package/src/cli/pull.ts +7 -7
  260. package/src/cli/run.ts +5 -5
  261. package/src/cli/test.ts +8 -7
  262. package/src/domain/asset.spec.ts +4 -4
  263. package/src/domain/asset.ts +13 -6
  264. package/src/domain/balance-operator.spec.ts +3 -6
  265. package/src/domain/balance-operator.ts +5 -6
  266. package/src/domain/balance.spec.ts +7 -77
  267. package/src/domain/balance.ts +51 -64
  268. package/src/domain/commission.spec.ts +3 -3
  269. package/src/domain/commission.ts +1 -1
  270. package/src/domain/component.ts +3 -3
  271. package/src/domain/error.ts +23 -18
  272. package/src/domain/index.ts +21 -21
  273. package/src/domain/instrument-operator.spec.ts +10 -7
  274. package/src/domain/instrument-operator.ts +6 -6
  275. package/src/domain/instrument.spec.ts +11 -6
  276. package/src/domain/instrument.ts +16 -7
  277. package/src/domain/ohlc-operator.spec.ts +5 -6
  278. package/src/domain/ohlc-operator.ts +2 -3
  279. package/src/domain/ohlc.spec.ts +2 -2
  280. package/src/domain/ohlc.ts +2 -2
  281. package/src/domain/order-operator.spec.ts +14 -10
  282. package/src/domain/order-operator.ts +8 -7
  283. package/src/domain/order.spec.ts +3 -6
  284. package/src/domain/order.ts +26 -29
  285. package/src/domain/orderbook-operator.spec.ts +11 -9
  286. package/src/domain/orderbook-operator.ts +5 -6
  287. package/src/domain/orderbook.spec.ts +3 -6
  288. package/src/domain/orderbook.ts +5 -3
  289. package/src/domain/position-operator.spec.ts +14 -11
  290. package/src/domain/position-operator.ts +12 -9
  291. package/src/domain/position.spec.ts +3 -6
  292. package/src/domain/position.ts +5 -3
  293. package/src/domain/session-builder.ts +14 -14
  294. package/src/domain/session.spec.ts +4 -4
  295. package/src/domain/session.ts +20 -15
  296. package/src/domain/trade-operator.spec.ts +4 -9
  297. package/src/domain/trade-operator.ts +5 -6
  298. package/src/domain/trade.spec.ts +3 -6
  299. package/src/domain/trade.ts +5 -3
  300. package/src/index.ts +15 -14
  301. package/src/shared/collections.spec.ts +2 -2
  302. package/src/shared/decimals.spec.ts +1 -1
  303. package/src/shared/hash.ts +10 -0
  304. package/src/shared/index.ts +7 -7
  305. package/src/shared/logger.ts +22 -15
  306. package/src/storage/cache.spec.ts +2 -3
  307. package/src/storage/cache.ts +2 -2
  308. package/src/storage/feed.ts +4 -4
  309. package/src/storage/index.ts +4 -4
  310. package/src/storage/measurement.ts +2 -2
  311. package/src/store/error.ts +33 -22
  312. package/src/store/index.ts +10 -9
  313. package/src/store/store-balance-event.spec.ts +5 -7
  314. package/src/store/store-balance-event.ts +20 -115
  315. package/src/store/store-event.ts +2 -2
  316. package/src/store/store-instrument-event.spec.ts +4 -5
  317. package/src/store/store-instrument-event.ts +13 -9
  318. package/src/store/store-order-event.spec.ts +6 -5
  319. package/src/store/store-order-event.ts +92 -23
  320. package/src/store/store-orderbook-event.spec.ts +4 -5
  321. package/src/store/store-orderbook-event.ts +11 -7
  322. package/src/store/store-position-event.ts +13 -9
  323. package/src/store/store-state.ts +2 -2
  324. package/src/store/store-trade-event.spec.ts +4 -5
  325. package/src/store/store-trade-event.ts +11 -7
  326. package/src/store/store.spec.ts +45 -31
  327. package/src/store/store.ts +6 -3
  328. package/tsconfig.json +7 -4
  329. package/dist/cli/error.d.ts +0 -2
  330. package/dist/cli/error.d.ts.map +0 -1
  331. package/dist/cli/error.js +0 -7
  332. package/dist/shared/pipe.d.ts +0 -5
  333. package/dist/shared/pipe.d.ts.map +0 -1
  334. package/dist/shared/pipe.js +0 -8
  335. package/src/cli/error.ts +0 -5
  336. package/src/shared/pipe.ts +0 -12
@@ -1,7 +1,11 @@
1
- export function missingPeriodParametersError() {
2
- return new Error('invalid backtest options, please provide from and to period.');
1
+ export class MissingPeriodParametersError extends Error {
2
+ constructor() {
3
+ super('invalid backtest options, please provide from and to period.');
4
+ }
3
5
  }
4
6
 
5
- export function invalidEventSequenceError() {
6
- return new Error('invalid event to consume');
7
+ export class InvalidEventSequenceError extends Error {
8
+ constructor() {
9
+ super('invalid event to consume');
10
+ }
7
11
  }
@@ -1,2 +1,4 @@
1
- export * from './backtester-adapter';
2
- export * from './backtester-streamer';
1
+ export * from '@lib/adapter/backtester/backtester-adapter';
2
+ export * from '@lib/adapter/backtester/backtester-streamer';
3
+ export * from '@lib/adapter/backtester/backtester-cursor';
4
+ export * from '@lib/adapter/backtester/error';
@@ -1,13 +1,19 @@
1
- export function adapterNotFoundError(adapterName: string) {
2
- return new Error(
3
- `Unknown adapter: ${adapterName}. You should provide adapter in session descriptor.`
4
- );
1
+ export class AdapterNotFoundError extends Error {
2
+ constructor(adapterName: string) {
3
+ super(
4
+ `Unknown adapter: ${adapterName}. You should provide adapter in session descriptor.`
5
+ );
6
+ }
5
7
  }
6
8
 
7
- export function noPaperEngineProvidedError() {
8
- return new Error('No paper engine provided.');
9
+ export class NoPaperEngineProvidedError extends Error {
10
+ constructor() {
11
+ super('No paper engine provided.');
12
+ }
9
13
  }
10
14
 
11
- export function backtestPageNotEmpty() {
12
- return new Error('Backtest page is not empty');
15
+ export class BacktestPageNotEmpty extends Error {
16
+ constructor() {
17
+ super('Backtest page is not empty');
18
+ }
13
19
  }
@@ -1,4 +1,5 @@
1
- export * from './adapter';
2
- export * from './adapter-aggregate';
3
- export * from './backtester';
4
- export * from './paper';
1
+ export * from '@lib/adapter/adapter';
2
+ export * from '@lib/adapter/adapter-aggregate';
3
+ export * from '@lib/adapter/backtester';
4
+ export * from '@lib/adapter/paper';
5
+ export * from '@lib/adapter/error';
@@ -1,19 +1,13 @@
1
- import {
2
- Asset,
3
- Commission,
4
- commissionPercentOf,
5
- Instrument,
6
- Order
7
- } from '../../../domain';
8
- import { d, now } from '../../../shared';
1
+ import { PaperEngine } from '@lib/adapter';
2
+ import { Asset, Commission, commissionPercentOf, Instrument, Order } from '@lib/domain';
3
+ import { d, now } from '@lib/shared';
9
4
  import {
10
5
  BalancePatchEvent,
11
6
  InstrumentPatchEvent,
12
7
  InstrumentSubscriptionEvent,
13
8
  OrderbookPatchEvent,
14
9
  Store
15
- } from '../../../store';
16
- import { PaperEngine } from './paper-engine';
10
+ } from '@lib/store';
17
11
 
18
12
  describe('PaperEngine', () => {
19
13
  const instrument = new Instrument(
@@ -109,8 +103,8 @@ describe('PaperEngine', () => {
109
103
  expect(store.snapshot.order.asReadonlyArray().length).toEqual(1);
110
104
  expect(pendingOrder.state).toEqual('FILLED');
111
105
  expect(baseBalance.free).toEqual(d(0.4));
112
- expect(baseBalance.locked).toEqual(d.Zero);
113
- expect(quoteBalance.free).toEqual(d(1060.53));
106
+ expect(baseBalance.locked).toEqual(d(0.6));
107
+ expect(quoteBalance.free).toEqual(d(1000));
114
108
  expect(quoteBalance.locked).toEqual(d.Zero);
115
109
  });
116
110
  });
@@ -1,11 +1,9 @@
1
1
  import { tap } from 'rxjs';
2
2
 
3
- import { Order, Orderbook, Trade } from '../../../domain';
4
- import { d, decimal } from '../../../shared';
3
+ import { Order, Orderbook, Trade } from '@lib/domain';
4
+ import { d, decimal } from '@lib/shared';
5
5
  import {
6
- BalanceLockOrderEvent,
7
- BalanceTransactEvent,
8
- BalanceUnlockOrderEvent,
6
+ InstrumentNotSupportedError,
9
7
  OrderCanceledEvent,
10
8
  OrderCancelingEvent,
11
9
  OrderFilledEvent,
@@ -13,18 +11,17 @@ import {
13
11
  OrderPendingEvent,
14
12
  OrderRejectedEvent,
15
13
  Store
16
- } from '../../../store';
17
- import { instrumentNotSupportedError } from '../../../store/error';
14
+ } from '@lib/store';
18
15
 
19
16
  export class PaperEngine {
20
17
  constructor(private readonly store: Store) {
21
18
  store.changes$
22
19
  .pipe(
23
20
  tap(it => {
24
- if (it instanceof Orderbook) {
25
- this.onOrderbook(it);
26
- } else if (it instanceof Trade) {
27
- this.onTrade(it);
21
+ if (it.type === Orderbook.type) {
22
+ this.onOrderbook(it as Orderbook);
23
+ } else if (it.type === Trade.type) {
24
+ this.onTrade(it as Trade);
28
25
  }
29
26
  })
30
27
  )
@@ -35,17 +32,11 @@ export class PaperEngine {
35
32
  const { timestamp } = this.store.snapshot;
36
33
 
37
34
  try {
38
- this.store.dispatch(
39
- new OrderNewEvent(order, timestamp),
40
- new BalanceLockOrderEvent(order.id, order.instrument, timestamp)
41
- );
35
+ this.store.dispatch(new OrderNewEvent(order, timestamp));
42
36
 
43
37
  this.store.dispatch(new OrderPendingEvent(order.id, order.instrument, timestamp));
44
38
  } catch (error) {
45
- this.store.dispatch(
46
- new BalanceUnlockOrderEvent(order.id, order.instrument, timestamp),
47
- new OrderRejectedEvent(order.id, order.instrument, timestamp)
48
- );
39
+ this.store.dispatch(new OrderRejectedEvent(order.id, order.instrument, timestamp));
49
40
  }
50
41
  }
51
42
 
@@ -54,10 +45,7 @@ export class PaperEngine {
54
45
 
55
46
  this.store.dispatch(new OrderCancelingEvent(order.id, order.instrument, timestamp));
56
47
 
57
- this.store.dispatch(
58
- new BalanceUnlockOrderEvent(order.id, order.instrument, timestamp),
59
- new OrderCanceledEvent(order.id, order.instrument, timestamp)
60
- );
48
+ this.store.dispatch(new OrderCanceledEvent(order.id, order.instrument, timestamp));
61
49
  }
62
50
 
63
51
  private onOrderbook(orderbook: Orderbook) {
@@ -115,7 +103,7 @@ export class PaperEngine {
115
103
 
116
104
  const instrument = this.store.snapshot.universe.instrument.get(order.instrument.id);
117
105
  if (!instrument) {
118
- throw instrumentNotSupportedError(order.instrument);
106
+ throw new InstrumentNotSupportedError(order.instrument);
119
107
  }
120
108
 
121
109
  const transacted = {
@@ -142,10 +130,7 @@ export class PaperEngine {
142
130
  }
143
131
 
144
132
  this.store.dispatch(
145
- new BalanceUnlockOrderEvent(order.id, order.instrument, timestamp),
146
- new OrderFilledEvent(order.id, order.instrument, averageExecutionRate, timestamp),
147
- new BalanceTransactEvent(instrument.base, transacted.base, timestamp),
148
- new BalanceTransactEvent(instrument.quote, transacted.quote, timestamp)
133
+ new OrderFilledEvent(order.id, order.instrument, averageExecutionRate, timestamp)
149
134
  );
150
135
  }
151
136
  }
@@ -1,2 +1,2 @@
1
- export * from './paper-adapter';
2
- export * from './engine/paper-engine';
1
+ export * from '@lib/adapter/paper/paper-adapter';
2
+ export * from '@lib/adapter/paper/engine/paper-engine';
@@ -1,10 +1,13 @@
1
- import { assetOf, InstrumentSelector, Ohlc, Order } from '../../domain';
2
- import { d, decimal, timestamp } from '../../shared';
3
- import { BalancePatchEvent, Store } from '../../store';
4
- import { Adapter } from '..';
5
- import { AdapterFactory, FeedAsyncCallback } from '../adapter';
6
- import { noPaperEngineProvidedError } from '../error';
7
- import { PaperEngine } from './engine/paper-engine';
1
+ import {
2
+ Adapter,
3
+ AdapterFactory,
4
+ FeedAsyncCallback,
5
+ NoPaperEngineProvidedError,
6
+ PaperEngine
7
+ } from '@lib/adapter';
8
+ import { assetOf, InstrumentSelector, Ohlc, Order } from '@lib/domain';
9
+ import { d, decimal, timestamp } from '@lib/shared';
10
+ import { BalanceLoadEvent, OrderNewEvent, Store } from '@lib/store';
8
11
 
9
12
  export interface PaperOptions {
10
13
  balance: { [key: string]: decimal };
@@ -62,27 +65,31 @@ export class PaperAdapter extends Adapter {
62
65
 
63
66
  subscribed = subscribed.filter(it => it.id != asset.id);
64
67
 
65
- this.store.dispatch(new BalancePatchEvent(asset, free, d.Zero, this.timestamp()));
68
+ this.store.dispatch(new BalanceLoadEvent(asset, free, d.Zero, this.timestamp()));
66
69
  }
67
70
 
68
71
  for (const missingAsset of subscribed) {
69
72
  this.store.dispatch(
70
- new BalancePatchEvent(missingAsset, d.Zero, d.Zero, this.timestamp())
73
+ new BalanceLoadEvent(missingAsset, d.Zero, d.Zero, this.timestamp())
71
74
  );
72
75
  }
73
76
  }
74
77
 
75
78
  async open(order: Order): Promise<void> {
76
79
  if (!this.engine) {
77
- throw noPaperEngineProvidedError();
80
+ throw new NoPaperEngineProvidedError();
78
81
  }
79
82
 
83
+ const { timestamp } = this.store.snapshot;
84
+
85
+ this.store.dispatch(new OrderNewEvent(order, timestamp));
86
+
80
87
  this.engine.open(order);
81
88
  }
82
89
 
83
90
  async cancel(order: Order): Promise<void> {
84
91
  if (!this.engine) {
85
- throw noPaperEngineProvidedError();
92
+ throw new NoPaperEngineProvidedError();
86
93
  }
87
94
 
88
95
  this.engine.cancel(order);
package/src/cli/build.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { spawn } from 'child_process';
2
2
 
3
- import { buildDirectory } from './internal/workspace';
3
+ import { buildDirectory } from '@lib/cli/internal/workspace';
4
4
 
5
5
  export default async function (): Promise<number> {
6
6
  return new Promise<number>((resolve, reject) => {
package/src/cli/dev.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { join } from 'path';
2
2
 
3
- import { spawn } from '..';
4
- import { SessionBuilder } from '../domain/session-builder';
5
- import { now } from '../shared';
6
- import build from './build';
7
- import { buildDirectory } from './internal/workspace';
3
+ import build from '@lib/cli/build';
4
+ import { buildDirectory } from '@lib/cli/internal/workspace';
5
+ import { SessionBuilder } from '@lib/domain';
6
+ import { spawn } from '@lib/index';
7
+ import { now } from '@lib/shared';
8
8
 
9
9
  export default async function (name: string, options: any) {
10
10
  if (await build()) {
package/src/cli/index.ts CHANGED
@@ -4,11 +4,11 @@ import { ChildProcess, spawn } from 'child_process';
4
4
  import { program } from 'commander';
5
5
  import watch from 'node-watch';
6
6
 
7
- import build from './build';
8
- import dev from './dev';
9
- import pull from './pull';
10
- import run from './run';
11
- import test from './test';
7
+ import build from '@lib/cli/build';
8
+ import dev from '@lib/cli/dev';
9
+ import pull from '@lib/cli/pull';
10
+ import run from '@lib/cli/run';
11
+ import test from '@lib/cli/test';
12
12
 
13
13
  program
14
14
  .command('build')
@@ -1,6 +1,6 @@
1
1
  import { join } from 'path';
2
2
 
3
- import { workingDirectory } from './../../shared';
3
+ import { workingDirectory } from '@lib/shared';
4
4
 
5
5
  export function buildDirectory() {
6
6
  return join(process.cwd(), workingDirectory(), 'build');
package/src/cli/pull.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { Presets, SingleBar } from 'cli-progress';
2
2
  import { join } from 'path';
3
3
 
4
- import { spawn } from '..';
5
- import { instrumentOf } from '../domain';
6
- import { SessionBuilder } from '../domain/session-builder';
7
- import { now } from '../shared';
8
- import { Feed } from '../storage';
9
- import build from './build';
10
- import { buildDirectory } from './internal/workspace';
4
+ import build from '@lib/cli/build';
5
+ import { buildDirectory } from '@lib/cli/internal/workspace';
6
+ import { instrumentOf } from '@lib/domain';
7
+ import { SessionBuilder } from '@lib/domain';
8
+ import { spawn } from '@lib/index';
9
+ import { now } from '@lib/shared';
10
+ import { Feed } from '@lib/storage';
11
11
 
12
12
  export default async function (name: string, instrument: string, options: any) {
13
13
  if (await build()) {
package/src/cli/run.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { join } from 'path';
2
2
 
3
- import { spawn } from '..';
4
- import { SessionBuilder } from '../domain/session-builder';
5
- import { now } from '../shared';
6
- import build from './build';
7
- import { buildDirectory } from './internal/workspace';
3
+ import build from '@lib/cli/build';
4
+ import { buildDirectory } from '@lib/cli/internal/workspace';
5
+ import { SessionBuilder } from '@lib/domain';
6
+ import { spawn } from '@lib/index';
7
+ import { now } from '@lib/shared';
8
8
 
9
9
  export default async function (name: string, options: any) {
10
10
  if (await build()) {
package/src/cli/test.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { join } from 'path';
2
2
 
3
- import { SessionBuilder } from '../domain/session-builder';
4
- import { Logger, now } from '../shared';
5
- import { spawn } from '..';
6
- import build from './build';
7
- import { buildDirectory } from './internal/workspace';
3
+ import build from '@lib/cli/build';
4
+ import { buildDirectory } from '@lib/cli/internal/workspace';
5
+ import { SessionBuilder } from '@lib/domain';
6
+ import { spawn } from '@lib/index';
7
+ import { log, now } from '@lib/shared';
8
8
 
9
9
  export default async function (name: string, options: any) {
10
10
  if (await build()) {
@@ -18,17 +18,18 @@ export default async function (name: string, options: any) {
18
18
  );
19
19
 
20
20
  const rules = await spawn(name, builder);
21
+ const logger = log('backtester');
21
22
 
22
23
  const startTime = performance.now();
23
24
 
24
25
  const [session, backtester] = builder.backtest({
25
- onBacktestStarted: () => Logger.info('backtest', `new session ${session.id} started`),
26
+ onBacktestStarted: () => logger.info(`new session ${session.id} started`),
26
27
  onBacktestCompleted: async () => {
27
28
  await session.dispose();
28
29
 
29
30
  const seconds = ((performance.now() - startTime) / 1000).toFixed(3);
30
31
 
31
- Logger.info('backtest', `session ${session.id} completed in ${seconds}s`);
32
+ logger.info(`session ${session.id} completed in ${seconds}s`);
32
33
  }
33
34
  });
34
35
 
@@ -1,7 +1,7 @@
1
- import { d } from '../shared';
2
- import { Asset, assetOf } from './asset';
1
+ import { Asset, assetOf, AssetSelector } from '@lib/domain';
2
+ import { d } from '@lib/shared';
3
3
 
4
- describe('Asset', () => {
4
+ describe(Asset.name, () => {
5
5
  test('should construct a new asset', () => {
6
6
  const sut = new Asset('abc', 'xyz', 4);
7
7
 
@@ -27,7 +27,7 @@ describe('Asset', () => {
27
27
  });
28
28
  });
29
29
 
30
- describe('AssetSelector', () => {
30
+ describe(AssetSelector.name, () => {
31
31
  test('should construct a new asset selector from unified string', () => {
32
32
  const sut = assetOf('xyz:abc');
33
33
 
@@ -1,5 +1,5 @@
1
- import { d, decimal } from './../shared/decimals';
2
- import { invalidArgumentError, invalidAssetSelectorError } from './error';
1
+ import { InvalidArgumentsError, InvalidAssetSelectorError } from '@lib/domain';
2
+ import { d, decimal } from '@lib/shared';
3
3
 
4
4
  export const AssetSelectorSeparator = ':';
5
5
 
@@ -13,11 +13,11 @@ export class AssetSelector {
13
13
 
14
14
  constructor(name: string, adapterName: string) {
15
15
  if (!name?.length) {
16
- throw invalidArgumentError(name);
16
+ throw new InvalidArgumentsError({ name });
17
17
  }
18
18
 
19
19
  if (!adapterName?.length) {
20
- throw invalidArgumentError(adapterName);
20
+ throw new InvalidArgumentsError({ adapterName });
21
21
  }
22
22
 
23
23
  this.name = name.toLowerCase();
@@ -33,7 +33,7 @@ export function assetOf(selector: string): AssetSelector {
33
33
  const [adapterName, name, ...rest] = selector.split(AssetSelectorSeparator);
34
34
 
35
35
  if (!adapterName || !name || rest.length) {
36
- throw invalidAssetSelectorError(selector);
36
+ throw new InvalidAssetSelectorError(selector);
37
37
  }
38
38
 
39
39
  return new AssetSelector(name, adapterName);
@@ -50,12 +50,19 @@ export class Asset extends AssetSelector {
50
50
  super(name, adapterName);
51
51
 
52
52
  if (scale && (scale < 0 || Number.isNaN(scale))) {
53
- throw invalidArgumentError(scale);
53
+ throw new InvalidArgumentsError({ scale });
54
54
  }
55
55
 
56
56
  this.tickSize = d(1.0).div(Math.pow(10, this.scale));
57
57
  }
58
58
 
59
+ /**
60
+ * Formats a number to string with fixed number of decimal places.
61
+ */
62
+ fixed(number: decimal): string {
63
+ return number.toFixed(this.scale);
64
+ }
65
+
59
66
  /**
60
67
  * Rounds down a number to the asset precision.
61
68
  */
@@ -1,12 +1,9 @@
1
1
  import { Subject } from 'rxjs';
2
2
 
3
- import { State } from '../store';
4
- import { Asset } from './asset';
5
- import { Balance } from './balance';
6
- import { balance } from './balance-operator';
7
- import { Component } from './component';
3
+ import { Asset, Balance, balance, Component } from '@lib/domain';
4
+ import { State } from '@lib/store';
8
5
 
9
- describe('balance', () => {
6
+ describe(balance.name, () => {
10
7
  const timestamp = 0;
11
8
  const asset = new Asset('abc', 'xyz', 4);
12
9
  const state = new State();
@@ -1,15 +1,14 @@
1
1
  import { filter, map, Observable, startWith } from 'rxjs';
2
2
 
3
- import { State } from '../store';
4
- import { AssetSelector } from './asset';
5
- import { Balance } from './balance';
6
- import { Component } from './component';
3
+ import { AssetSelector, Balance, Component } from '@lib/domain';
4
+ import { State } from '@lib/store';
7
5
 
8
6
  export function balance(selector: AssetSelector, state: State) {
9
7
  return (source$: Observable<Component>) =>
10
8
  source$.pipe(
11
9
  startWith(state.balance.get(selector.id)),
12
- filter(it => it instanceof Balance && (!selector || it.asset.id == selector.id)),
13
- map(it => it as Balance)
10
+ filter(it => it !== undefined && it.type === Balance.type),
11
+ map(it => it as Balance),
12
+ filter(it => it.asset.id === selector.id)
14
13
  );
15
14
  }
@@ -1,11 +1,7 @@
1
- import { d } from '../shared';
2
- import { Asset } from './asset';
3
- import { Balance } from './balance';
4
- import { Commission } from './commission';
5
- import { Instrument } from './instrument';
6
- import { Position } from './position';
1
+ import { Asset, Balance, Commission, Instrument, Position } from '@lib/domain';
2
+ import { d } from '@lib/shared';
7
3
 
8
- describe('Balance', () => {
4
+ describe(Balance.name, () => {
9
5
  const asset = new Asset('abc', 'xyz', 4);
10
6
  const instrument = new Instrument(
11
7
  0,
@@ -25,78 +21,13 @@ describe('Balance', () => {
25
21
  });
26
22
 
27
23
  test('should construct balance', () => {
28
- const sut = new Balance(1, asset);
29
-
30
- sut.set(d(100), d(50));
24
+ const sut = new Balance(1, asset, d(100));
31
25
 
32
26
  expect(sut.asset.id).toEqual('xyz:abc');
33
27
  expect(sut.free).toEqual(d(100));
34
- expect(sut.locked).toEqual(d(50));
35
- expect(sut.total).toEqual(d(150));
36
- expect(Object.keys(sut.position).length).toEqual(0);
37
- });
38
-
39
- test('should account positive amount', () => {
40
- const sut = new Balance(0, asset);
41
-
42
- sut.set(d(100), d.Zero);
43
- sut.account(d(10));
44
-
45
- expect(sut.free).toEqual(d(110));
46
- expect(sut.locked).toEqual(d.Zero);
47
- expect(sut.total).toEqual(d(110));
48
- });
49
-
50
- test('should account negative amount', () => {
51
- const sut = new Balance(0, asset);
52
-
53
- sut.set(d(100), d.Zero);
54
- sut.account(d(-10));
55
-
56
- expect(sut.free).toEqual(d(90));
57
- expect(sut.locked).toEqual(d.Zero);
58
- expect(sut.total).toEqual(d(90));
59
- });
60
-
61
- test('should throw for insufficient balance account amount', () => {
62
- const sut = new Balance(0, asset);
63
-
64
- sut.set(d(100), d.Zero);
65
- const fn = () => sut.account(d(-120));
66
-
67
- expect(fn).toThrowError();
68
- });
69
-
70
- test('should lock specific amount of available balance', () => {
71
- const sut = new Balance(0, asset);
72
-
73
- sut.set(d(100), d.Zero);
74
- sut.lock('key', d(10));
75
-
76
- expect(sut.free).toEqual(d(90));
77
- expect(sut.locked).toEqual(d(10));
78
- expect(sut.total).toEqual(d(100));
79
- });
80
-
81
- test('should throw for lock insufficient amount of available balance', () => {
82
- const sut = new Balance(0, asset);
83
-
84
- sut.set(d(30), d(50));
85
- const fn = () => sut.lock('key', d(100));
86
-
87
- expect(fn).toThrowError();
88
- });
89
-
90
- test('should lock and unlock specific amount of available balance', () => {
91
- const sut = new Balance(0, asset);
92
-
93
- sut.set(d(100), d.Zero);
94
- sut.lock('key', d(40));
95
- sut.tryUnlock('key');
96
-
97
- expect(sut.free).toEqual(d(100));
98
- expect(sut.locked).toEqual(d.Zero);
28
+ expect(sut.locked).toEqual(d(0));
99
29
  expect(sut.total).toEqual(d(100));
30
+ expect(Object.keys(sut.position).length).toEqual(0);
100
31
  });
101
32
 
102
33
  test('should return correct estimated unrealized pnl', () => {
@@ -104,9 +35,8 @@ describe('Balance', () => {
104
35
 
105
36
  position.calculateEstimatedUnrealizedPnL(d(2576.44));
106
37
 
107
- const sut = new Balance(0, asset);
38
+ const sut = new Balance(0, asset, d(100));
108
39
 
109
- sut.set(d(100), d.Zero);
110
40
  sut.position['1'] = position;
111
41
 
112
42
  expect(sut.getEstimatedUnrealizedPnL()).toEqual(d(0.2652));