@quantform/core 0.3.210 → 0.3.215

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 (35) hide show
  1. package/dist/adapter/paper/model/paper-margin-model.d.ts +2 -2
  2. package/dist/adapter/paper/model/paper-margin-model.js +3 -4
  3. package/dist/adapter/paper/model/paper-margin-model.js.map +1 -1
  4. package/dist/adapter/paper/model/paper-model.d.ts +1 -1
  5. package/dist/adapter/paper/model/paper-model.js +4 -4
  6. package/dist/adapter/paper/model/paper-model.js.map +1 -1
  7. package/dist/adapter/paper/model/paper-spot-model.d.ts +3 -2
  8. package/dist/adapter/paper/model/paper-spot-model.js +2 -2
  9. package/dist/adapter/paper/model/paper-spot-model.js.map +1 -1
  10. package/dist/domain/order.d.ts +1 -1
  11. package/dist/session/session.d.ts +4 -1
  12. package/dist/session/session.js +16 -3
  13. package/dist/session/session.js.map +1 -1
  14. package/dist/store/event/store-balance.event.js +3 -0
  15. package/dist/store/event/store-balance.event.js.map +1 -1
  16. package/dist/store/event/store-order.event.d.ts +2 -2
  17. package/dist/store/event/store-order.event.js +27 -15
  18. package/dist/store/event/store-order.event.js.map +1 -1
  19. package/dist/store/store.d.ts +2 -2
  20. package/dist/store/store.js +5 -5
  21. package/dist/store/store.js.map +1 -1
  22. package/dist/store/store.state.d.ts +1 -1
  23. package/dist/store/store.state.js +1 -1
  24. package/dist/store/store.state.js.map +1 -1
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +1 -1
  27. package/src/adapter/paper/model/paper-margin-model.ts +10 -11
  28. package/src/adapter/paper/model/paper-model.ts +5 -5
  29. package/src/adapter/paper/model/paper-spot-model.ts +8 -9
  30. package/src/domain/order.ts +1 -1
  31. package/src/session/session.ts +39 -11
  32. package/src/store/event/store-balance.event.ts +3 -0
  33. package/src/store/event/store-order.event.ts +22 -11
  34. package/src/store/store.state.ts +2 -2
  35. package/src/store/store.ts +6 -6
@@ -16,7 +16,8 @@ import {
16
16
  InstrumentSelector,
17
17
  Order,
18
18
  Position,
19
- Orderbook
19
+ Orderbook,
20
+ OrderState
20
21
  } from '../domain';
21
22
  import { Store } from '../store';
22
23
  import { from, Observable, Subscription } from 'rxjs';
@@ -236,30 +237,57 @@ export class Session {
236
237
  );
237
238
  }
238
239
 
239
- orders(selector?: InstrumentSelector): Observable<Order[]> {
240
+ private ordersOf(
241
+ orders: Order[],
242
+ states: OrderState[],
243
+ selector?: InstrumentSelector
244
+ ): Observable<Order[]> {
240
245
  this.subscribe([selector]);
241
246
 
242
- const snapshot = this.store.snapshot;
243
-
244
247
  return this.store.changes$.pipe(
245
248
  filter(
246
249
  it =>
247
250
  it instanceof Order &&
248
- (!selector || it.instrument.toString() == selector.toString())
251
+ (!selector || it.instrument.toString() == selector.toString()) &&
252
+ (states.indexOf(it.state) >= 0 || states.length == 0)
249
253
  ),
250
254
  map(() =>
251
- Object.values(snapshot.order.pending).filter(
252
- it => !selector || it.instrument.toString() == selector.toString()
253
- )
255
+ Object.values(orders)
256
+ .filter(it => !selector || it.instrument.toString() == selector.toString())
257
+ .sort((lhs, rhs) => rhs.createdAt - lhs.createdAt)
254
258
  ),
255
259
  startWith(
256
- Object.values(snapshot.order.pending).filter(
257
- it => !selector || it.instrument.toString() == selector.toString()
258
- )
260
+ Object.values(orders)
261
+ .filter(it => !selector || it.instrument.toString() == selector.toString())
262
+ .sort((lhs, rhs) => rhs.createdAt - lhs.createdAt)
259
263
  )
260
264
  );
261
265
  }
262
266
 
267
+ pending(selector?: InstrumentSelector): Observable<Order[]> {
268
+ return this.ordersOf(
269
+ Object.values(this.store.snapshot.order.pending),
270
+ ['PENDING', 'NEW'],
271
+ selector
272
+ );
273
+ }
274
+
275
+ filled(selector?: InstrumentSelector): Observable<Order[]> {
276
+ return this.ordersOf(
277
+ Object.values(this.store.snapshot.order.filled),
278
+ ['FILLED'],
279
+ selector
280
+ );
281
+ }
282
+
283
+ canceled(selector?: InstrumentSelector): Observable<Order[]> {
284
+ return this.ordersOf(
285
+ Object.values(this.store.snapshot.order.canceled),
286
+ ['CANCELING', 'CANCELED'],
287
+ selector
288
+ );
289
+ }
290
+
263
291
  balance(selector?: AssetSelector): Observable<Balance> {
264
292
  return this.store.changes$.pipe(
265
293
  startWith(selector ? this.store.snapshot.balance[selector.toString()] : null),
@@ -72,6 +72,7 @@ export function BalanceTransactEventHandler(event: BalanceTransactEvent, state:
72
72
  state.balance[asset.toString()] = balance;
73
73
  }
74
74
 
75
+ balance.timestamp = event.timestamp;
75
76
  balance.transact(event.amount);
76
77
 
77
78
  state.timestamp = event.timestamp;
@@ -103,6 +104,7 @@ export function BalanceFreezEventHandler(event: BalanceFreezEvent, state: State)
103
104
  throw new Error('invalid balance');
104
105
  }
105
106
 
107
+ balance.timestamp = event.timestamp;
106
108
  balance.freez(event.amount);
107
109
 
108
110
  state.timestamp = event.timestamp;
@@ -134,6 +136,7 @@ export function BalanceUnfreezEventHandler(event: BalanceUnfreezEvent, state: St
134
136
  throw new Error('invalid balance');
135
137
  }
136
138
 
139
+ balance.timestamp = event.timestamp;
137
140
  balance.unfreez(event.amount);
138
141
 
139
142
  state.timestamp = event.timestamp;
@@ -15,16 +15,27 @@ export function OrderLoadEventHandler(event: OrderLoadEvent, state: State) {
15
15
  const instrumentKey = event.order.instrument.toString();
16
16
 
17
17
  if (!(instrumentKey in state.subscription.instrument)) {
18
- throw new Error(`Trying to order for unsubscribed instrument: ${instrumentKey}`);
19
- }
20
-
21
- if (event.order.state != 'PENDING') {
22
- throw new Error(`Order is not pending`);
18
+ throw new Error(`Trying to load order for unsubscribed instrument: ${instrumentKey}`);
23
19
  }
24
20
 
25
21
  event.order.timestamp = event.timestamp;
26
22
 
27
- state.order.pending[event.order.id] = event.order;
23
+ switch (event.order.state) {
24
+ case 'NEW':
25
+ case 'PENDING':
26
+ state.order.pending[event.order.id] = event.order;
27
+ break;
28
+ case 'FILLED':
29
+ state.order.filled[event.order.id] = event.order;
30
+ break;
31
+ case 'CANCELING':
32
+ case 'CANCELED':
33
+ state.order.canceled[event.order.id] = event.order;
34
+ break;
35
+ case 'REJECTED':
36
+ state.order.rejected[event.order.id] = event.order;
37
+ break;
38
+ }
28
39
 
29
40
  return event.order;
30
41
  }
@@ -80,8 +91,8 @@ export function OrderPendingEventHandler(event: OrderPendingEvent, state: State)
80
91
  }
81
92
 
82
93
  @event
83
- export class OrderCompletedEvent implements StoreEvent {
84
- type = 'order-completed';
94
+ export class OrderFilledEvent implements StoreEvent {
95
+ type = 'order-filled';
85
96
 
86
97
  constructor(
87
98
  readonly id: string,
@@ -90,7 +101,7 @@ export class OrderCompletedEvent implements StoreEvent {
90
101
  ) {}
91
102
  }
92
103
 
93
- export function OrderCompletedEventHandler(event: OrderCompletedEvent, state: State) {
104
+ export function OrderFilledEventHandler(event: OrderFilledEvent, state: State) {
94
105
  if (!(event.id in state.order.pending)) {
95
106
  throw new Error(`Trying to patch unknown order: ${event.id}`);
96
107
  }
@@ -101,14 +112,14 @@ export function OrderCompletedEventHandler(event: OrderCompletedEvent, state: St
101
112
  throw new Error('Order is not pending');
102
113
  }
103
114
 
104
- order.state = 'COMPLETED';
115
+ order.state = 'FILLED';
105
116
  order.timestamp = event.timestamp;
106
117
  order.quantityExecuted = order.quantity;
107
118
  order.averageExecutionRate = event.averageExecutionRate;
108
119
 
109
120
  delete state.order.pending[event.id];
110
121
 
111
- state.order.completed[event.id] = order;
122
+ state.order.filled[event.id] = order;
112
123
 
113
124
  return order;
114
125
  }
@@ -35,12 +35,12 @@ export class State {
35
35
 
36
36
  order: {
37
37
  pending: Record<string, Order>;
38
- completed: Record<string, Order>;
38
+ filled: Record<string, Order>;
39
39
  canceled: Record<string, Order>;
40
40
  rejected: Record<string, Order>;
41
41
  } = {
42
42
  pending: {},
43
- completed: {},
43
+ filled: {},
44
44
  canceled: {},
45
45
  rejected: {}
46
46
  };
@@ -26,8 +26,8 @@ import {
26
26
  OrderCancelFailedEventHandler,
27
27
  OrderCancelingEvent,
28
28
  OrderCancelingEventHandler,
29
- OrderCompletedEvent,
30
- OrderCompletedEventHandler,
29
+ OrderFilledEvent,
30
+ OrderFilledEventHandler,
31
31
  OrderLoadEvent,
32
32
  OrderLoadEventHandler,
33
33
  OrderNewEvent,
@@ -152,11 +152,11 @@ export class Store extends Topic<StoreEvent, any> {
152
152
  }
153
153
 
154
154
  /**
155
- * @see OrderCompletedEventHandler
155
+ * @see OrderFilledEventHandler
156
156
  */
157
- @handler(OrderCompletedEvent)
158
- onOrderCompleted(event: OrderCompletedEvent) {
159
- return OrderCompletedEventHandler(event, this.snapshot);
157
+ @handler(OrderFilledEvent)
158
+ onOrderFilled(event: OrderFilledEvent) {
159
+ return OrderFilledEventHandler(event, this.snapshot);
160
160
  }
161
161
 
162
162
  /**