@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.
- package/dist/adapter/paper/model/paper-margin-model.d.ts +2 -2
- package/dist/adapter/paper/model/paper-margin-model.js +3 -4
- package/dist/adapter/paper/model/paper-margin-model.js.map +1 -1
- package/dist/adapter/paper/model/paper-model.d.ts +1 -1
- package/dist/adapter/paper/model/paper-model.js +4 -4
- package/dist/adapter/paper/model/paper-model.js.map +1 -1
- package/dist/adapter/paper/model/paper-spot-model.d.ts +3 -2
- package/dist/adapter/paper/model/paper-spot-model.js +2 -2
- package/dist/adapter/paper/model/paper-spot-model.js.map +1 -1
- package/dist/domain/order.d.ts +1 -1
- package/dist/session/session.d.ts +4 -1
- package/dist/session/session.js +16 -3
- package/dist/session/session.js.map +1 -1
- package/dist/store/event/store-balance.event.js +3 -0
- package/dist/store/event/store-balance.event.js.map +1 -1
- package/dist/store/event/store-order.event.d.ts +2 -2
- package/dist/store/event/store-order.event.js +27 -15
- package/dist/store/event/store-order.event.js.map +1 -1
- package/dist/store/store.d.ts +2 -2
- package/dist/store/store.js +5 -5
- package/dist/store/store.js.map +1 -1
- package/dist/store/store.state.d.ts +1 -1
- package/dist/store/store.state.js +1 -1
- package/dist/store/store.state.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/adapter/paper/model/paper-margin-model.ts +10 -11
- package/src/adapter/paper/model/paper-model.ts +5 -5
- package/src/adapter/paper/model/paper-spot-model.ts +8 -9
- package/src/domain/order.ts +1 -1
- package/src/session/session.ts +39 -11
- package/src/store/event/store-balance.event.ts +3 -0
- package/src/store/event/store-order.event.ts +22 -11
- package/src/store/store.state.ts +2 -2
- package/src/store/store.ts +6 -6
package/src/session/session.ts
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
|
84
|
-
type = 'order-
|
|
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
|
|
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 = '
|
|
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.
|
|
122
|
+
state.order.filled[event.id] = order;
|
|
112
123
|
|
|
113
124
|
return order;
|
|
114
125
|
}
|
package/src/store/store.state.ts
CHANGED
|
@@ -35,12 +35,12 @@ export class State {
|
|
|
35
35
|
|
|
36
36
|
order: {
|
|
37
37
|
pending: Record<string, Order>;
|
|
38
|
-
|
|
38
|
+
filled: Record<string, Order>;
|
|
39
39
|
canceled: Record<string, Order>;
|
|
40
40
|
rejected: Record<string, Order>;
|
|
41
41
|
} = {
|
|
42
42
|
pending: {},
|
|
43
|
-
|
|
43
|
+
filled: {},
|
|
44
44
|
canceled: {},
|
|
45
45
|
rejected: {}
|
|
46
46
|
};
|
package/src/store/store.ts
CHANGED
|
@@ -26,8 +26,8 @@ import {
|
|
|
26
26
|
OrderCancelFailedEventHandler,
|
|
27
27
|
OrderCancelingEvent,
|
|
28
28
|
OrderCancelingEventHandler,
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
155
|
+
* @see OrderFilledEventHandler
|
|
156
156
|
*/
|
|
157
|
-
@handler(
|
|
158
|
-
|
|
159
|
-
return
|
|
157
|
+
@handler(OrderFilledEvent)
|
|
158
|
+
onOrderFilled(event: OrderFilledEvent) {
|
|
159
|
+
return OrderFilledEventHandler(event, this.snapshot);
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
/**
|