@quantform/core 0.3.229 → 0.3.230

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 (235) hide show
  1. package/dist/adapter/adapter-aggregate.js +3 -3
  2. package/dist/adapter/adapter-aggregate.js.map +1 -1
  3. package/dist/adapter/adapter.d.ts +4 -4
  4. package/dist/adapter/adapter.event.d.ts +1 -1
  5. package/dist/adapter/adapter.event.js +1 -1
  6. package/dist/adapter/adapter.js +3 -3
  7. package/dist/adapter/backtester/backtester-adapter.d.ts +2 -2
  8. package/dist/adapter/backtester/backtester-adapter.js +3 -3
  9. package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
  10. package/dist/adapter/backtester/backtester-cursor.d.ts +1 -1
  11. package/dist/adapter/backtester/backtester-streamer.d.ts +1 -1
  12. package/dist/adapter/backtester/backtester-streamer.spec.js +1 -1
  13. package/dist/adapter/backtester/backtester-streamer.spec.js.map +1 -1
  14. package/dist/adapter/paper/{model/paper-model.d.ts → executor/paper-executor.d.ts} +1 -1
  15. package/dist/adapter/paper/{model/paper-model.js → executor/paper-executor.js} +4 -4
  16. package/dist/adapter/paper/executor/paper-executor.js.map +1 -0
  17. package/dist/adapter/paper/{model/paper-margin-model.d.ts → executor/paper-margin-executor.d.ts} +2 -2
  18. package/dist/adapter/paper/{model/paper-margin-model.js → executor/paper-margin-executor.js} +11 -11
  19. package/dist/adapter/paper/executor/paper-margin-executor.js.map +1 -0
  20. package/dist/adapter/paper/{model/paper-spot-model.d.ts → executor/paper-spot-executor.d.ts} +3 -3
  21. package/dist/adapter/paper/{model/paper-spot-model.js → executor/paper-spot-executor.js} +7 -7
  22. package/dist/adapter/paper/executor/paper-spot-executor.js.map +1 -0
  23. package/dist/adapter/paper/index.d.ts +2 -2
  24. package/dist/adapter/paper/index.js +2 -2
  25. package/dist/adapter/paper/index.js.map +1 -1
  26. package/dist/adapter/paper/paper-adapter.d.ts +3 -3
  27. package/dist/adapter/paper/paper-adapter.js +6 -6
  28. package/dist/adapter/paper/paper-adapter.js.map +1 -1
  29. package/dist/adapter/paper/paper-adapter.spec.js +2 -2
  30. package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
  31. package/dist/bin.js +3 -4
  32. package/dist/bin.js.map +1 -1
  33. package/dist/domain/asset.js +1 -1
  34. package/dist/domain/balance.d.ts +1 -1
  35. package/dist/domain/balance.js +1 -3
  36. package/dist/domain/balance.js.map +1 -1
  37. package/dist/domain/candle-builder.d.ts +1 -1
  38. package/dist/domain/candle.d.ts +1 -1
  39. package/dist/domain/candle.spec.js +2 -2
  40. package/dist/domain/{commision.d.ts → commission.d.ts} +2 -2
  41. package/dist/domain/{commision.js → commission.js} +7 -7
  42. package/dist/domain/commission.js.map +1 -0
  43. package/dist/domain/component.d.ts +1 -1
  44. package/dist/domain/index.d.ts +1 -1
  45. package/dist/domain/index.js +1 -1
  46. package/dist/domain/index.js.map +1 -1
  47. package/dist/domain/instrument.d.ts +3 -3
  48. package/dist/domain/order.d.ts +1 -1
  49. package/dist/domain/orderbook.d.ts +1 -1
  50. package/dist/domain/position.d.ts +1 -1
  51. package/dist/domain/position.js +3 -3
  52. package/dist/domain/trade.d.ts +1 -1
  53. package/dist/index.d.ts +1 -2
  54. package/dist/index.js +1 -2
  55. package/dist/index.js.map +1 -1
  56. package/dist/indicator/truerange.spec.js +6 -6
  57. package/dist/session/index.d.ts +1 -0
  58. package/dist/session/index.js +1 -0
  59. package/dist/session/index.js.map +1 -1
  60. package/dist/session/session-descriptor.d.ts +2 -3
  61. package/dist/session/session-statement.d.ts +5 -0
  62. package/dist/session/session-statement.js +87 -0
  63. package/dist/session/session-statement.js.map +1 -0
  64. package/dist/session/session.d.ts +2 -2
  65. package/dist/session/session.js +10 -19
  66. package/dist/session/session.js.map +1 -1
  67. package/dist/session/session.spec.js +3 -3
  68. package/dist/session/session.spec.js.map +1 -1
  69. package/dist/{common → shared}/datetime.d.ts +0 -0
  70. package/dist/{common → shared}/datetime.js +0 -0
  71. package/dist/{common → shared}/datetime.js.map +1 -1
  72. package/dist/{common → shared}/decimals.d.ts +0 -0
  73. package/dist/{common → shared}/decimals.js +0 -0
  74. package/dist/{common → shared}/decimals.js.map +1 -1
  75. package/dist/{common → shared}/decimals.spec.d.ts +0 -0
  76. package/dist/{common → shared}/decimals.spec.js +0 -0
  77. package/dist/{common → shared}/decimals.spec.js.map +1 -1
  78. package/dist/{common → shared}/index.d.ts +0 -0
  79. package/dist/{common → shared}/index.js +0 -0
  80. package/dist/{common → shared}/index.js.map +1 -1
  81. package/dist/{common → shared}/io.d.ts +0 -0
  82. package/dist/{common → shared}/io.js +0 -0
  83. package/dist/shared/io.js.map +1 -0
  84. package/dist/{common → shared}/logger.d.ts +0 -0
  85. package/dist/{common → shared}/logger.js +0 -0
  86. package/dist/{common → shared}/logger.js.map +1 -1
  87. package/dist/{common → shared}/policy.d.ts +0 -0
  88. package/dist/{common → shared}/policy.js +0 -0
  89. package/dist/{common → shared}/policy.js.map +1 -1
  90. package/dist/{common → shared}/policy.spec.d.ts +0 -0
  91. package/dist/{common → shared}/policy.spec.js +0 -0
  92. package/dist/{common → shared}/policy.spec.js.map +1 -1
  93. package/dist/{common → shared}/topic.d.ts +0 -0
  94. package/dist/{common → shared}/topic.js +0 -0
  95. package/dist/{common → shared}/topic.js.map +1 -1
  96. package/dist/{common → shared}/topic.spec.d.ts +0 -0
  97. package/dist/{common → shared}/topic.spec.js +0 -0
  98. package/dist/{common → shared}/topic.spec.js.map +1 -1
  99. package/dist/{common → shared}/worker.d.ts +0 -0
  100. package/dist/{common → shared}/worker.js +0 -0
  101. package/dist/{common → shared}/worker.js.map +1 -1
  102. package/dist/{common → shared}/worker.spec.d.ts +0 -0
  103. package/dist/{common → shared}/worker.spec.js +0 -0
  104. package/dist/{common → shared}/worker.spec.js.map +1 -1
  105. package/dist/storage/measurement.d.ts +1 -1
  106. package/dist/store/event/store-balance.event.d.ts +1 -1
  107. package/dist/store/event/store-balance.event.js +1 -1
  108. package/dist/store/event/store-balance.event.spec.js +3 -3
  109. package/dist/store/event/store-balance.event.spec.js.map +1 -1
  110. package/dist/store/event/store-candle.event.d.ts +1 -1
  111. package/dist/store/event/store-candle.event.js +1 -1
  112. package/dist/store/event/store-candle.event.spec.js +2 -2
  113. package/dist/store/event/store-instrument.event.d.ts +4 -4
  114. package/dist/store/event/store-instrument.event.js +3 -3
  115. package/dist/store/event/store-instrument.event.js.map +1 -1
  116. package/dist/store/event/store-instrument.event.spec.js +3 -3
  117. package/dist/store/event/store-instrument.event.spec.js.map +1 -1
  118. package/dist/store/event/store-order.event.d.ts +1 -1
  119. package/dist/store/event/store-order.event.js +1 -1
  120. package/dist/store/event/store-order.event.spec.js +2 -2
  121. package/dist/store/event/store-orderbook.event.d.ts +1 -1
  122. package/dist/store/event/store-orderbook.event.js +1 -1
  123. package/dist/store/event/store-position.event.d.ts +1 -1
  124. package/dist/store/event/store-position.event.js +1 -1
  125. package/dist/store/event/store-trade.event.d.ts +1 -1
  126. package/dist/store/event/store-trade.event.js +1 -1
  127. package/dist/store/event/store-trade.event.spec.js +5 -5
  128. package/dist/store/event/store.event.d.ts +1 -1
  129. package/dist/store/store.d.ts +1 -1
  130. package/dist/store/store.js +1 -1
  131. package/dist/store/store.state.d.ts +1 -1
  132. package/dist/tests/backtester-adapter.spec.js +5 -5
  133. package/dist/tests/backtester-adapter.spec.js.map +1 -1
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +1 -1
  136. package/src/adapter/adapter-aggregate.ts +4 -2
  137. package/src/adapter/adapter.event.ts +2 -2
  138. package/src/adapter/adapter.ts +4 -4
  139. package/src/adapter/backtester/backtester-adapter.ts +4 -4
  140. package/src/adapter/backtester/backtester-cursor.ts +1 -1
  141. package/src/adapter/backtester/backtester-streamer.spec.ts +1 -1
  142. package/src/adapter/backtester/backtester-streamer.ts +1 -1
  143. package/src/adapter/paper/{model/paper-model.ts → executor/paper-executor.ts} +1 -1
  144. package/src/adapter/paper/{model/paper-margin-model.ts → executor/paper-margin-executor.ts} +4 -4
  145. package/src/adapter/paper/{model/paper-spot-model.ts → executor/paper-spot-executor.ts} +5 -5
  146. package/src/adapter/paper/index.ts +2 -2
  147. package/src/adapter/paper/paper-adapter.spec.ts +4 -4
  148. package/src/adapter/paper/paper-adapter.ts +8 -8
  149. package/src/bin.ts +2 -4
  150. package/src/domain/asset.ts +2 -2
  151. package/src/domain/balance.ts +3 -5
  152. package/src/domain/candle-builder.ts +1 -1
  153. package/src/domain/candle.spec.ts +1 -1
  154. package/src/domain/candle.ts +1 -1
  155. package/src/domain/{commision.ts → commission.ts} +3 -3
  156. package/src/domain/component.ts +1 -1
  157. package/src/domain/index.ts +1 -1
  158. package/src/domain/instrument.ts +3 -3
  159. package/src/domain/order.ts +1 -1
  160. package/src/domain/orderbook.ts +1 -1
  161. package/src/domain/position.ts +2 -2
  162. package/src/domain/trade.ts +1 -1
  163. package/src/index.ts +1 -7
  164. package/src/indicator/truerange.spec.ts +1 -1
  165. package/src/session/index.ts +1 -0
  166. package/src/session/session-descriptor.ts +35 -6
  167. package/src/session/session-statement.ts +119 -0
  168. package/src/session/session.spec.ts +6 -4
  169. package/src/session/session.ts +62 -20
  170. package/src/{common → shared}/datetime.ts +0 -0
  171. package/src/{common → shared}/decimals.spec.ts +0 -0
  172. package/src/{common → shared}/decimals.ts +0 -0
  173. package/src/{common → shared}/index.ts +0 -0
  174. package/src/{common → shared}/io.ts +0 -0
  175. package/src/{common → shared}/logger.ts +0 -0
  176. package/src/{common → shared}/policy.spec.ts +0 -0
  177. package/src/{common → shared}/policy.ts +0 -0
  178. package/src/{common → shared}/topic.spec.ts +0 -0
  179. package/src/{common → shared}/topic.ts +0 -0
  180. package/src/{common → shared}/worker.spec.ts +0 -0
  181. package/src/{common → shared}/worker.ts +0 -0
  182. package/src/storage/measurement.ts +1 -1
  183. package/src/store/event/store-balance.event.spec.ts +3 -3
  184. package/src/store/event/store-balance.event.ts +2 -2
  185. package/src/store/event/store-candle.event.spec.ts +1 -1
  186. package/src/store/event/store-candle.event.ts +2 -2
  187. package/src/store/event/store-instrument.event.spec.ts +3 -3
  188. package/src/store/event/store-instrument.event.ts +5 -5
  189. package/src/store/event/store-order.event.spec.ts +1 -1
  190. package/src/store/event/store-order.event.ts +2 -2
  191. package/src/store/event/store-orderbook.event.ts +2 -2
  192. package/src/store/event/store-position.event.ts +2 -2
  193. package/src/store/event/store-trade.event.spec.ts +1 -1
  194. package/src/store/event/store-trade.event.ts +2 -2
  195. package/src/store/event/store.event.ts +1 -1
  196. package/src/store/store.state.ts +1 -1
  197. package/src/store/store.ts +1 -1
  198. package/src/tests/backtester-adapter.spec.ts +7 -7
  199. package/dist/adapter/paper/model/paper-margin-model.js.map +0 -1
  200. package/dist/adapter/paper/model/paper-model.js.map +0 -1
  201. package/dist/adapter/paper/model/paper-spot-model.js.map +0 -1
  202. package/dist/behaviour/behaviour.d.ts +0 -6
  203. package/dist/behaviour/behaviour.js +0 -3
  204. package/dist/behaviour/behaviour.js.map +0 -1
  205. package/dist/behaviour/combined-behaviour.d.ts +0 -14
  206. package/dist/behaviour/combined-behaviour.js +0 -26
  207. package/dist/behaviour/combined-behaviour.js.map +0 -1
  208. package/dist/behaviour/index.d.ts +0 -3
  209. package/dist/behaviour/index.js +0 -16
  210. package/dist/behaviour/index.js.map +0 -1
  211. package/dist/behaviour/statement/benchmark-statement.behaviour.d.ts +0 -15
  212. package/dist/behaviour/statement/benchmark-statement.behaviour.js +0 -41
  213. package/dist/behaviour/statement/benchmark-statement.behaviour.js.map +0 -1
  214. package/dist/behaviour/statement/equity-statement.behaviour.d.ts +0 -15
  215. package/dist/behaviour/statement/equity-statement.behaviour.js +0 -54
  216. package/dist/behaviour/statement/equity-statement.behaviour.js.map +0 -1
  217. package/dist/behaviour/statement/index.d.ts +0 -1
  218. package/dist/behaviour/statement/index.js +0 -14
  219. package/dist/behaviour/statement/index.js.map +0 -1
  220. package/dist/behaviour/statement/period-statement.behaviour.d.ts +0 -9
  221. package/dist/behaviour/statement/period-statement.behaviour.js +0 -20
  222. package/dist/behaviour/statement/period-statement.behaviour.js.map +0 -1
  223. package/dist/behaviour/statement/statement.behaviour.d.ts +0 -7
  224. package/dist/behaviour/statement/statement.behaviour.js +0 -19
  225. package/dist/behaviour/statement/statement.behaviour.js.map +0 -1
  226. package/dist/common/io.js.map +0 -1
  227. package/dist/domain/commision.js.map +0 -1
  228. package/src/behaviour/behaviour.ts +0 -7
  229. package/src/behaviour/combined-behaviour.ts +0 -23
  230. package/src/behaviour/index.ts +0 -3
  231. package/src/behaviour/statement/benchmark-statement.behaviour.ts +0 -53
  232. package/src/behaviour/statement/equity-statement.behaviour.ts +0 -71
  233. package/src/behaviour/statement/index.ts +0 -1
  234. package/src/behaviour/statement/period-statement.behaviour.ts +0 -26
  235. package/src/behaviour/statement/statement.behaviour.ts +0 -19
@@ -1,4 +1,4 @@
1
- import { pnl, weightedMean } from '../../../common';
1
+ import { pnl, weightedMean } from '../../../shared';
2
2
  import { Order } from '../../../domain';
3
3
  import {
4
4
  BalanceTransactEvent,
@@ -10,9 +10,9 @@ import {
10
10
  PositionPatchEvent
11
11
  } from '../../../store/event';
12
12
  import { PaperAdapter } from '..';
13
- import { PaperModel } from './paper-model';
13
+ import { PaperExecutor } from './paper-executor';
14
14
 
15
- export class PaperMarginModel extends PaperModel {
15
+ export class PaperMarginExecutor extends PaperExecutor {
16
16
  leverage = 10;
17
17
 
18
18
  constructor(adapter: PaperAdapter) {
@@ -31,7 +31,7 @@ export class PaperMarginModel extends PaperModel {
31
31
  this.adapter.store.snapshot.universe.instrument[order.instrument.toString()];
32
32
 
33
33
  let transact = instrument.quote.floor(
34
- -instrument.commision.calculateMakerFee(averageExecutionRate * order.quantity)
34
+ -instrument.commission.calculateMakerFee(averageExecutionRate * order.quantity)
35
35
  );
36
36
 
37
37
  const id = instrument.toString();
@@ -10,10 +10,10 @@ import {
10
10
  OrderPendingEvent
11
11
  } from '../../../store/event';
12
12
  import { PaperAdapter } from '..';
13
- import { PaperModel } from './paper-model';
14
- import { timestamp } from '../../../common';
13
+ import { PaperExecutor } from './paper-executor';
14
+ import { timestamp } from '../../../shared';
15
15
 
16
- export class PaperSpotModel extends PaperModel {
16
+ export class PaperSpotExecutor extends PaperExecutor {
17
17
  constructor(readonly adapter: PaperAdapter) {
18
18
  super(adapter);
19
19
  }
@@ -39,7 +39,7 @@ export class PaperSpotModel extends PaperModel {
39
39
  switch (order.side) {
40
40
  case 'BUY':
41
41
  transacted.base += instrument.base.floor(
42
- instrument.commision.applyMakerFee(order.quantity)
42
+ instrument.commission.applyMakerFee(order.quantity)
43
43
  );
44
44
  transacted.quote -= instrument.quote.floor(averageExecutionRate * order.quantity);
45
45
  break;
@@ -47,7 +47,7 @@ export class PaperSpotModel extends PaperModel {
47
47
  case 'SELL':
48
48
  transacted.base -= instrument.base.floor(order.quantity);
49
49
  transacted.quote += instrument.quote.floor(
50
- instrument.commision.applyMakerFee(averageExecutionRate * order.quantity)
50
+ instrument.commission.applyMakerFee(averageExecutionRate * order.quantity)
51
51
  );
52
52
  break;
53
53
  }
@@ -1,3 +1,3 @@
1
1
  export * from './paper-adapter';
2
- export * from './model/paper-spot-model';
3
- export * from './model/paper-margin-model';
2
+ export * from './executor/paper-spot-executor';
3
+ export * from './executor/paper-margin-executor';
@@ -1,7 +1,7 @@
1
- import { PaperSpotModel } from '.';
1
+ import { PaperSpotExecutor } from '.';
2
2
  import { Store } from '../../store';
3
3
  import { Adapter } from '../adapter';
4
- import { PaperModel } from './model/paper-model';
4
+ import { PaperExecutor } from './executor/paper-executor';
5
5
  import { PaperAdapter } from './paper-adapter';
6
6
 
7
7
  class DefaultAdapter extends Adapter {
@@ -11,8 +11,8 @@ class DefaultAdapter extends Adapter {
11
11
  return 123;
12
12
  }
13
13
 
14
- createPaperModel(adapter: PaperAdapter): PaperModel {
15
- return new PaperSpotModel(adapter);
14
+ createPaperExecutor(adapter: PaperAdapter): PaperExecutor {
15
+ return new PaperSpotExecutor(adapter);
16
16
  }
17
17
  }
18
18
 
@@ -1,7 +1,7 @@
1
1
  import { Adapter, AdapterContext } from '..';
2
2
  import { Store } from '../../store';
3
- import { PaperModel } from './model/paper-model';
4
- import { handler } from '../../common/topic';
3
+ import { PaperExecutor } from './executor/paper-executor';
4
+ import { handler } from '../../shared/topic';
5
5
  import { assetOf } from '../../domain';
6
6
  import { BalancePatchEvent } from '../../store/event';
7
7
  import {
@@ -16,7 +16,7 @@ export class PaperOptions {
16
16
 
17
17
  export class PaperAdapter extends Adapter {
18
18
  readonly name = this.decoratedAdapter.name;
19
- readonly platform: PaperModel;
19
+ readonly executor: PaperExecutor;
20
20
 
21
21
  constructor(
22
22
  readonly decoratedAdapter: Adapter,
@@ -25,15 +25,15 @@ export class PaperAdapter extends Adapter {
25
25
  ) {
26
26
  super();
27
27
 
28
- this.platform = this.createPaperModel(this);
28
+ this.executor = this.createPaperExecutor(this);
29
29
  }
30
30
 
31
31
  timestamp() {
32
32
  return this.decoratedAdapter.timestamp();
33
33
  }
34
34
 
35
- createPaperModel(adapter: PaperAdapter): PaperModel {
36
- return this.decoratedAdapter.createPaperModel(adapter);
35
+ createPaperExecutor(adapter: PaperAdapter): PaperExecutor {
36
+ return this.decoratedAdapter.createPaperExecutor(adapter);
37
37
  }
38
38
 
39
39
  onUnknownEvent(event: { type: string }, context: AdapterContext) {
@@ -67,14 +67,14 @@ export class PaperAdapter extends Adapter {
67
67
 
68
68
  @handler(AdapterOrderOpenCommand)
69
69
  onOrderOpen(event: AdapterOrderOpenCommand, context: AdapterContext) {
70
- this.platform.open(event.order);
70
+ this.executor.open(event.order);
71
71
 
72
72
  return Promise.resolve();
73
73
  }
74
74
 
75
75
  @handler(AdapterOrderCancelCommand)
76
76
  onOrderCancel(event: AdapterOrderCancelCommand, context: AdapterContext) {
77
- this.platform.cancel(event.order);
77
+ this.executor.cancel(event.order);
78
78
 
79
79
  return Promise.resolve();
80
80
  }
package/src/bin.ts CHANGED
@@ -8,9 +8,9 @@ import { PaperAdapter, PaperOptions } from './adapter/paper';
8
8
  import { Session, SessionDescriptor } from './session';
9
9
  import { Store } from './store';
10
10
  import { instrumentOf } from './domain';
11
- import { Topic, event, handler } from './common/topic';
11
+ import { Topic, event, handler } from './shared/topic';
12
12
  import minimist = require('minimist');
13
- import { Logger } from './common';
13
+ import { Logger } from './shared';
14
14
 
15
15
  export interface IpcCommand {
16
16
  type;
@@ -103,8 +103,6 @@ class ExecutionHandler extends Topic<{ type: string }, ExecutionAccessor> {
103
103
 
104
104
  await accessor.session.dispose();
105
105
 
106
- accessor.session.statement(statement);
107
-
108
106
  this.notify({ type: 'backtest:completed', statement });
109
107
 
110
108
  resolve();
@@ -1,7 +1,7 @@
1
- import { ceil, fixed, floor } from '../common/decimals';
1
+ import { ceil, fixed, floor } from '../shared/decimals';
2
2
 
3
3
  /**
4
- * Supposed to query specific @see Asset from code based.
4
+ * Supposed to query specific @see Asset from based on string notation.
5
5
  */
6
6
  export class AssetSelector {
7
7
  private readonly id: string;
@@ -1,10 +1,10 @@
1
- import { timestamp } from '../common';
1
+ import { timestamp } from '../shared';
2
2
  import { Asset } from './';
3
3
  import { Position, PositionMode } from './position';
4
4
  import { Component } from './component';
5
5
 
6
6
  /**
7
- * Represents single asset abalance in your wallet.
7
+ * Represents single asset balance in your wallet.
8
8
  */
9
9
  export class Balance implements Component {
10
10
  timestamp: timestamp;
@@ -38,9 +38,7 @@ export class Balance implements Component {
38
38
  */
39
39
  get total(): number {
40
40
  return (
41
- this._free +
42
- this._freezed +
43
- this.getEstimatedUnrealizedPnL() /* +
41
+ this._free + this._freezed + this.getEstimatedUnrealizedPnL() /* +
44
42
  this.getEstimatedMaintenanceMargin()*/
45
43
  );
46
44
  }
@@ -8,7 +8,7 @@ import {
8
8
  skipLast,
9
9
  withLatestFrom
10
10
  } from 'rxjs/operators';
11
- import { timestamp, toString } from '../common';
11
+ import { timestamp, toString } from '../shared';
12
12
  import { Candle } from './candle';
13
13
  import { tf } from './timeframe';
14
14
 
@@ -1,7 +1,7 @@
1
1
  import { from } from 'rxjs';
2
2
  import { map } from 'rxjs/operators';
3
3
  import { TradePatchEvent } from '../store/event';
4
- import { now } from '../common';
4
+ import { now } from '../shared';
5
5
  import { Candle } from './candle';
6
6
  import { mergeCandle } from './candle-builder';
7
7
  import { instrumentOf } from './instrument';
@@ -1,4 +1,4 @@
1
- import { timestamp } from '../common';
1
+ import { timestamp } from '../shared';
2
2
 
3
3
  export class Candle {
4
4
  constructor(
@@ -1,4 +1,4 @@
1
- export class Commision {
1
+ export class Commission {
2
2
  constructor(readonly makerRate: number, readonly takerRate: number) {}
3
3
 
4
4
  calculateMakerFee(value: number) {
@@ -18,6 +18,6 @@ export class Commision {
18
18
  }
19
19
  }
20
20
 
21
- export function commisionPercentOf(maker: number, taker: number) {
22
- return new Commision(maker / 100.0, taker / 100.0);
21
+ export function commissionPercentOf(maker: number, taker: number) {
22
+ return new Commission(maker / 100.0, taker / 100.0);
23
23
  }
@@ -1,4 +1,4 @@
1
- import { timestamp } from '../common';
1
+ import { timestamp } from '../shared';
2
2
 
3
3
  export interface Component {
4
4
  timestamp: timestamp;
@@ -3,7 +3,7 @@ export * from './instrument';
3
3
  export * from './balance';
4
4
  export * from './order';
5
5
  export * from './orderbook';
6
- export * from './commision';
6
+ export * from './commission';
7
7
  export * from './component';
8
8
  export * from './candle';
9
9
  export * from './candle-builder';
@@ -1,6 +1,6 @@
1
- import { timestamp } from '../common';
1
+ import { timestamp } from '../shared';
2
2
  import { Asset, AssetSelector } from './asset';
3
- import { Commision } from './commision';
3
+ import { Commission } from './commission';
4
4
  import { Component } from './component';
5
5
 
6
6
  export class InstrumentSelector {
@@ -23,7 +23,7 @@ export class InstrumentSelector {
23
23
 
24
24
  export class Instrument extends InstrumentSelector implements Component {
25
25
  timestamp: timestamp;
26
- commision: Commision;
26
+ commission: Commission;
27
27
  cross: Instrument;
28
28
  leverage?: number = null;
29
29
 
@@ -1,7 +1,7 @@
1
1
  import { Component } from './component';
2
2
  import { v4 } from 'uuid';
3
3
  import { InstrumentSelector } from './instrument';
4
- import { timestamp } from '../common';
4
+ import { timestamp } from '../shared';
5
5
 
6
6
  export type OrderSide = 'SELL' | 'BUY';
7
7
  export type OrderType = 'MARKET' | 'LIMIT' | 'STOP-MARKET' | 'STOP-LIMIT';
@@ -1,4 +1,4 @@
1
- import { timestamp } from '../common';
1
+ import { timestamp } from '../shared';
2
2
  import { Instrument } from '../domain';
3
3
  import { Component } from './component';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { Instrument } from '../domain';
2
2
  import { Component } from './component';
3
- import { pnl, timestamp, weightedMean } from '../common';
3
+ import { pnl, timestamp, weightedMean } from '../shared';
4
4
  import { Observable } from 'rxjs';
5
5
  import { map, share } from 'rxjs/operators';
6
6
 
@@ -34,7 +34,7 @@ export class Position implements Component {
34
34
  }
35
35
 
36
36
  export function positionsFlat() {
37
- return function(
37
+ return function (
38
38
  source: Observable<Position[]>
39
39
  ): Observable<{ size: number; rate: number }> {
40
40
  return source.pipe(
@@ -1,4 +1,4 @@
1
- import { timestamp } from '../common';
1
+ import { timestamp } from '../shared';
2
2
  import { Instrument } from '.';
3
3
  import { Component } from './component';
4
4
 
package/src/index.ts CHANGED
@@ -1,17 +1,11 @@
1
- export * from './behaviour';
2
- export * from './common';
3
-
1
+ export * from './shared';
4
2
  export * from './domain';
5
-
6
3
  export * from './adapter';
7
4
  export * from './adapter/backtester';
8
5
  export * from './adapter/paper';
9
-
10
6
  export * from './indicator';
11
7
  export * from './session';
12
8
  export * from './storage';
13
-
14
9
  export * from './store';
15
10
  export * from './store/event';
16
-
17
11
  export * from './bin';
@@ -2,7 +2,7 @@ import { from } from 'rxjs';
2
2
  import { Candle } from '../domain';
3
3
  import { truerange } from './truerange';
4
4
  import { sma } from './sma';
5
- import { now } from '../common';
5
+ import { now } from '../shared';
6
6
 
7
7
  describe('truerange atr tests', () => {
8
8
  test('should return expected value', done => {
@@ -1,3 +1,4 @@
1
1
  export * from './session';
2
2
  export * from './session-descriptor';
3
3
  export * from './session-optimizer';
4
+ export * from './session-statement';
@@ -2,20 +2,49 @@ import { Adapter } from '../adapter';
2
2
  import { Session } from '.';
3
3
  import { Measurement } from '../storage/measurement';
4
4
  import { Feed } from '../storage';
5
- import { Behaviour } from '../behaviour';
6
5
  import { Observable } from 'rxjs';
7
6
 
7
+ /**
8
+ * Describes a single session.
9
+ * You can use @run function to start a new session managed by CLI.
10
+ * To start managed session you should install @quantform/cli package and run
11
+ * specific command:
12
+ * - qf paper (to paper trade strategy)
13
+ * - qf backtest (to backtest strategy based on provided feed)
14
+ * - qf live (to live trade strategy)
15
+ * or run on your own in code:
16
+ * - paper(descriptor, options)
17
+ * - backtest(descriptor, options)
18
+ * - live(descriptor)
19
+ */
8
20
  export interface SessionDescriptor {
9
- id: number;
21
+ /**
22
+ * Unique session identifier, used to identify session in the storage.
23
+ * You can generate new id every time you start the new session or provide
24
+ * session id explicitly to resume previous session (in code or via CLI).
25
+ * If you don't provide session id, it will generate new one based on time.
26
+ */
27
+ id?: number;
10
28
 
11
- // provides trading adapters.
29
+ /**
30
+ * Collection of adapters used to connect to the exchanges.
31
+ */
12
32
  adapter: Adapter[];
13
33
 
14
- // provides input and output feed for backtesting purposes.
34
+ /**
35
+ * Provides historical data for backtest, it's not required for live and paper
36
+ * sessions.
37
+ */
15
38
  feed?: Feed;
16
39
 
17
- // defines measurement storage.
40
+ /**
41
+ * Stores session variables i.e. indicators, orders, or any other type of time
42
+ * series data. You can install @quantform/editor to render this data in your browser.
43
+ */
18
44
  measurement?: Measurement;
19
45
 
20
- behaviour?: Behaviour | Behaviour[] | ((session: Session) => Observable<any>);
46
+ /**
47
+ * Describes your trading strategy.
48
+ */
49
+ describe?: (session: Session) => Observable<any>;
21
50
  }
@@ -0,0 +1,119 @@
1
+ import { Session } from '.';
2
+ import { InstrumentSelector } from '../domain';
3
+ import { combineLatest, finalize, map, take, tap } from 'rxjs';
4
+ import { drawdown } from '../indicator';
5
+ import { floor, precision } from '../shared';
6
+
7
+ export function period() {
8
+ return (session: Session) => {
9
+ const period = session.useStatement('period');
10
+
11
+ return session.store.changes$.pipe(
12
+ finalize(() => (period.to = new Date(session.timestamp).toISOString())),
13
+ take(1),
14
+ tap(it => (period.from = new Date(it.timestamp).toISOString()))
15
+ );
16
+ };
17
+ }
18
+
19
+ export function benchmark(instrument: InstrumentSelector) {
20
+ return (session: Session) => {
21
+ const statement = session.useStatement('benchmark');
22
+
23
+ let balance: number, entry: number, exit: number;
24
+ let dd = 0;
25
+
26
+ return combineLatest([
27
+ session.orderbook(instrument),
28
+ session.balance(instrument.quote),
29
+ session.orderbook(instrument).pipe(
30
+ drawdown(it => it.midRate),
31
+ tap(it => (dd = it))
32
+ )
33
+ ]).pipe(
34
+ map(([orderbook, quote]) => {
35
+ const price = orderbook.midRate;
36
+
37
+ if (!balance) {
38
+ balance = quote.total;
39
+ }
40
+
41
+ if (!entry) {
42
+ entry = price;
43
+ }
44
+
45
+ exit = price;
46
+ }),
47
+ finalize(() => {
48
+ const pnl = exit / entry - 1;
49
+
50
+ statement['benchmark_entry'] = entry;
51
+ statement['benchmark_exit'] = exit;
52
+ statement['benchmark_pnl'] = floor(balance * pnl, precision(entry));
53
+ statement['benchmark_pnl_pp'] = floor(pnl * 100, 2);
54
+ statement['benchmark_drawdown_pp'] = floor(dd * 100, 2);
55
+ })
56
+ );
57
+ };
58
+ }
59
+
60
+ export function equity(instrument: InstrumentSelector) {
61
+ return (session: Session) => {
62
+ const statement = session.useStatement('benchmark');
63
+
64
+ let balance: number, min: number, max: number;
65
+ let dd = 0;
66
+ let equity = 0;
67
+
68
+ return combineLatest([
69
+ session.orderbook(instrument),
70
+ session.balance(instrument.base),
71
+ session.balance(instrument.quote),
72
+ session.positions(instrument)
73
+ ]).pipe(
74
+ tap(([, , quote]) => {
75
+ if (!balance) {
76
+ balance = quote.total;
77
+ }
78
+ }),
79
+ map(([orderbook, base, quote, positions]) =>
80
+ orderbook.instrument.quote.fixed(
81
+ quote.total +
82
+ base.total * orderbook.bestBidRate +
83
+ positions.reduce(
84
+ (agg, position) => agg + position.calculatePnL(orderbook.bestBidRate),
85
+ 0
86
+ )
87
+ )
88
+ ),
89
+ tap(it => {
90
+ if (!min) {
91
+ min = it;
92
+ } else {
93
+ min = Math.min(min, it);
94
+ }
95
+
96
+ if (!max) {
97
+ max = it;
98
+ } else {
99
+ max = Math.max(max, it);
100
+ }
101
+
102
+ equity = it;
103
+ }),
104
+ drawdown(it => it),
105
+ tap(it => (dd = it)),
106
+ finalize(() => {
107
+ const pnl = equity / balance - 1;
108
+ const scale = precision(equity);
109
+
110
+ statement['equity'] = equity;
111
+ statement['equity_min'] = min;
112
+ statement['equity_max'] = max;
113
+ statement['equity_pnl'] = floor(balance * pnl, scale);
114
+ statement['equity_pnl_pp'] = floor(pnl * 100, 2);
115
+ statement['equity_drawdown_pp'] = floor(dd * 100, 2);
116
+ })
117
+ );
118
+ };
119
+ }
@@ -1,8 +1,10 @@
1
1
  import { InstrumentPatchEvent } from '../store/event';
2
- import { Asset, Commision } from '../domain';
3
- import { now } from '../common';
2
+ import { Asset, Commission } from '../domain';
3
+ import { now } from '../shared';
4
4
  import { SessionDescriptor } from './session-descriptor';
5
5
  import { paper } from '../bin';
6
+ import { Session } from './session';
7
+ import { of } from 'rxjs';
6
8
 
7
9
  describe('session tests', () => {
8
10
  const descriptor: SessionDescriptor = {
@@ -29,14 +31,14 @@ describe('session tests', () => {
29
31
  now(),
30
32
  new Asset('de30', 'cex', 2),
31
33
  new Asset('usd', 'cex', 2),
32
- new Commision(0, 0),
34
+ new Commission(0, 0),
33
35
  ''
34
36
  ),
35
37
  new InstrumentPatchEvent(
36
38
  now(),
37
39
  new Asset('wig20', 'cex', 2),
38
40
  new Asset('pln', 'cex', 2),
39
- new Commision(0, 0),
41
+ new Commission(0, 0),
40
42
  ''
41
43
  )
42
44
  );