@newyorkcompute/kalshi-core 0.3.0 → 0.5.0

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 (59) hide show
  1. package/dist/config.d.ts.map +1 -1
  2. package/dist/config.js +5 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/mm/index.d.ts +11 -0
  9. package/dist/mm/index.d.ts.map +1 -0
  10. package/dist/mm/index.js +14 -0
  11. package/dist/mm/index.js.map +1 -0
  12. package/dist/mm/inventory.d.ts +70 -0
  13. package/dist/mm/inventory.d.ts.map +1 -0
  14. package/dist/mm/inventory.js +171 -0
  15. package/dist/mm/inventory.js.map +1 -0
  16. package/dist/mm/inventory.test.d.ts +2 -0
  17. package/dist/mm/inventory.test.d.ts.map +1 -0
  18. package/dist/mm/inventory.test.js +358 -0
  19. package/dist/mm/inventory.test.js.map +1 -0
  20. package/dist/mm/order-manager.d.ts +93 -0
  21. package/dist/mm/order-manager.d.ts.map +1 -0
  22. package/dist/mm/order-manager.js +262 -0
  23. package/dist/mm/order-manager.js.map +1 -0
  24. package/dist/mm/order-manager.test.d.ts +2 -0
  25. package/dist/mm/order-manager.test.d.ts.map +1 -0
  26. package/dist/mm/order-manager.test.js +333 -0
  27. package/dist/mm/order-manager.test.js.map +1 -0
  28. package/dist/mm/orderbook.d.ts +162 -0
  29. package/dist/mm/orderbook.d.ts.map +1 -0
  30. package/dist/mm/orderbook.js +271 -0
  31. package/dist/mm/orderbook.js.map +1 -0
  32. package/dist/mm/orderbook.test.d.ts +2 -0
  33. package/dist/mm/orderbook.test.d.ts.map +1 -0
  34. package/dist/mm/orderbook.test.js +264 -0
  35. package/dist/mm/orderbook.test.js.map +1 -0
  36. package/dist/mm/risk.d.ts +77 -0
  37. package/dist/mm/risk.d.ts.map +1 -0
  38. package/dist/mm/risk.js +179 -0
  39. package/dist/mm/risk.js.map +1 -0
  40. package/dist/mm/risk.test.d.ts +2 -0
  41. package/dist/mm/risk.test.d.ts.map +1 -0
  42. package/dist/mm/risk.test.js +297 -0
  43. package/dist/mm/risk.test.js.map +1 -0
  44. package/dist/mm/types.d.ts +128 -0
  45. package/dist/mm/types.d.ts.map +1 -0
  46. package/dist/mm/types.js +7 -0
  47. package/dist/mm/types.js.map +1 -0
  48. package/dist/websocket/auth.d.ts +9 -2
  49. package/dist/websocket/auth.d.ts.map +1 -1
  50. package/dist/websocket/auth.js +18 -13
  51. package/dist/websocket/auth.js.map +1 -1
  52. package/dist/websocket/auth.test.js +15 -6
  53. package/dist/websocket/auth.test.js.map +1 -1
  54. package/dist/websocket/client.d.ts.map +1 -1
  55. package/dist/websocket/client.js +6 -0
  56. package/dist/websocket/client.js.map +1 -1
  57. package/dist/websocket/types.d.ts +13 -1
  58. package/dist/websocket/types.d.ts.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,264 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { LocalOrderbook, OrderbookManager } from "./orderbook.js";
3
+ describe("LocalOrderbook", () => {
4
+ let orderbook;
5
+ beforeEach(() => {
6
+ orderbook = new LocalOrderbook("TEST-MARKET");
7
+ });
8
+ describe("applySnapshot", () => {
9
+ it("should initialize from snapshot", () => {
10
+ const snapshot = {
11
+ market_ticker: "TEST-MARKET",
12
+ market_id: "123",
13
+ yes: [[50, 10], [49, 20], [48, 30]], // YES bids
14
+ no: [[60, 15], [59, 25]], // NO bids (YES asks = 100 - price)
15
+ };
16
+ orderbook.applySnapshot(snapshot);
17
+ const bbo = orderbook.getBBO();
18
+ expect(bbo).not.toBeNull();
19
+ expect(bbo?.bidPrice).toBe(50); // Best YES bid
20
+ expect(bbo?.askPrice).toBe(40); // 100 - 60 (best NO bid)
21
+ expect(bbo?.spread).toBe(-10); // 40 - 50 = -10 (crossed market)
22
+ });
23
+ it("should handle empty snapshot", () => {
24
+ const snapshot = {
25
+ market_ticker: "TEST-MARKET",
26
+ market_id: "123",
27
+ yes: [],
28
+ no: [],
29
+ };
30
+ orderbook.applySnapshot(snapshot);
31
+ expect(orderbook.getBBO()).toBeNull();
32
+ expect(orderbook.getBestBid()).toBeNull();
33
+ expect(orderbook.getBestAsk()).toBeNull();
34
+ });
35
+ it("should filter zero quantity levels", () => {
36
+ const snapshot = {
37
+ market_ticker: "TEST-MARKET",
38
+ market_id: "123",
39
+ yes: [[50, 10], [49, 0], [48, 5]], // 49 has zero qty
40
+ no: [[90, 15]],
41
+ };
42
+ orderbook.applySnapshot(snapshot);
43
+ const depth = orderbook.getDepth(5);
44
+ expect(depth.bids).toHaveLength(2); // 50 and 48, not 49
45
+ });
46
+ });
47
+ describe("applyDelta", () => {
48
+ beforeEach(() => {
49
+ const snapshot = {
50
+ market_ticker: "TEST-MARKET",
51
+ market_id: "123",
52
+ yes: [[50, 10]],
53
+ no: [[90, 15]],
54
+ };
55
+ orderbook.applySnapshot(snapshot);
56
+ });
57
+ it("should update existing level", () => {
58
+ const delta = {
59
+ market_ticker: "TEST-MARKET",
60
+ price: 50,
61
+ delta: 25, // Update to 25
62
+ side: "yes",
63
+ };
64
+ orderbook.applyDelta(delta);
65
+ const bid = orderbook.getBestBid();
66
+ expect(bid?.quantity).toBe(25);
67
+ });
68
+ it("should add new level", () => {
69
+ const delta = {
70
+ market_ticker: "TEST-MARKET",
71
+ price: 51,
72
+ delta: 5,
73
+ side: "yes",
74
+ };
75
+ orderbook.applyDelta(delta);
76
+ const bid = orderbook.getBestBid();
77
+ expect(bid?.price).toBe(51); // New best bid
78
+ expect(bid?.quantity).toBe(5);
79
+ });
80
+ it("should remove level when delta is zero", () => {
81
+ const delta = {
82
+ market_ticker: "TEST-MARKET",
83
+ price: 50,
84
+ delta: 0, // Remove
85
+ side: "yes",
86
+ };
87
+ orderbook.applyDelta(delta);
88
+ expect(orderbook.getBestBid()).toBeNull();
89
+ });
90
+ it("should track sequence number", () => {
91
+ const initialSeq = orderbook.getSequence();
92
+ orderbook.applyDelta({
93
+ market_ticker: "TEST-MARKET",
94
+ price: 51,
95
+ delta: 5,
96
+ side: "yes",
97
+ });
98
+ expect(orderbook.getSequence()).toBe(initialSeq + 1);
99
+ });
100
+ });
101
+ describe("getMicroprice", () => {
102
+ it("should calculate size-weighted mid", () => {
103
+ const snapshot = {
104
+ market_ticker: "TEST-MARKET",
105
+ market_id: "123",
106
+ yes: [[50, 10]], // Bid at 50 with size 10
107
+ no: [[40, 20]], // NO bid at 40 = YES ask at 60, size 20
108
+ };
109
+ orderbook.applySnapshot(snapshot);
110
+ const microprice = orderbook.getMicroprice();
111
+ // microprice = (bid * askSize + ask * bidSize) / (bidSize + askSize)
112
+ // = (50 * 20 + 60 * 10) / (10 + 20) = (1000 + 600) / 30 = 53.33
113
+ expect(microprice).toBeCloseTo(53.33, 1);
114
+ });
115
+ it("should return null for empty orderbook", () => {
116
+ expect(orderbook.getMicroprice()).toBeNull();
117
+ });
118
+ });
119
+ describe("getImbalance", () => {
120
+ it("should calculate bid/ask imbalance", () => {
121
+ const snapshot = {
122
+ market_ticker: "TEST-MARKET",
123
+ market_id: "123",
124
+ yes: [[50, 30]], // More bid depth
125
+ no: [[90, 10]],
126
+ };
127
+ orderbook.applySnapshot(snapshot);
128
+ const imbalance = orderbook.getImbalance();
129
+ // (bidDepth - askDepth) / (bidDepth + askDepth) = (30 - 10) / 40 = 0.5
130
+ expect(imbalance).toBe(0.5);
131
+ });
132
+ it("should return 0 for empty orderbook", () => {
133
+ expect(orderbook.getImbalance()).toBe(0);
134
+ });
135
+ });
136
+ describe("getDepth", () => {
137
+ it("should return sorted levels", () => {
138
+ const snapshot = {
139
+ market_ticker: "TEST-MARKET",
140
+ market_id: "123",
141
+ yes: [[48, 30], [50, 10], [49, 20]], // Unsorted
142
+ no: [[90, 15], [88, 25]], // NO bids
143
+ };
144
+ orderbook.applySnapshot(snapshot);
145
+ const depth = orderbook.getDepth(3);
146
+ // Bids should be sorted descending (highest first)
147
+ expect(depth.bids[0].price).toBe(50);
148
+ expect(depth.bids[1].price).toBe(49);
149
+ expect(depth.bids[2].price).toBe(48);
150
+ // Asks should be sorted ascending (lowest first)
151
+ expect(depth.asks[0].price).toBe(10); // 100 - 90
152
+ expect(depth.asks[1].price).toBe(12); // 100 - 88
153
+ });
154
+ it("should limit to requested levels", () => {
155
+ const snapshot = {
156
+ market_ticker: "TEST-MARKET",
157
+ market_id: "123",
158
+ yes: [[50, 10], [49, 20], [48, 30], [47, 40], [46, 50]],
159
+ no: [],
160
+ };
161
+ orderbook.applySnapshot(snapshot);
162
+ const depth = orderbook.getDepth(2);
163
+ expect(depth.bids).toHaveLength(2);
164
+ });
165
+ });
166
+ describe("staleness", () => {
167
+ it("should track last update time", () => {
168
+ const snapshot = {
169
+ market_ticker: "TEST-MARKET",
170
+ market_id: "123",
171
+ yes: [[50, 10]],
172
+ no: [],
173
+ };
174
+ orderbook.applySnapshot(snapshot);
175
+ expect(orderbook.getAge()).toBeLessThan(100); // Should be very recent
176
+ expect(orderbook.isStale(5000)).toBe(false);
177
+ });
178
+ });
179
+ });
180
+ describe("OrderbookManager", () => {
181
+ let manager;
182
+ beforeEach(() => {
183
+ manager = new OrderbookManager();
184
+ });
185
+ it("should create orderbook on demand", () => {
186
+ const ob1 = manager.getOrderbook("MARKET-1");
187
+ const ob2 = manager.getOrderbook("MARKET-1");
188
+ expect(ob1).toBe(ob2); // Same instance
189
+ });
190
+ it("should apply snapshot to correct orderbook", () => {
191
+ const snapshot = {
192
+ market_ticker: "MARKET-1",
193
+ market_id: "123",
194
+ yes: [[50, 10]],
195
+ no: [[90, 15]],
196
+ };
197
+ manager.applySnapshot(snapshot);
198
+ const bbo = manager.getBBO("MARKET-1");
199
+ expect(bbo).not.toBeNull();
200
+ expect(bbo?.bidPrice).toBe(50);
201
+ });
202
+ it("should apply delta to correct orderbook", () => {
203
+ // First apply snapshot
204
+ manager.applySnapshot({
205
+ market_ticker: "MARKET-1",
206
+ market_id: "123",
207
+ yes: [[50, 10]],
208
+ no: [[90, 15]],
209
+ });
210
+ // Then apply delta
211
+ manager.applyDelta({
212
+ market_ticker: "MARKET-1",
213
+ price: 51,
214
+ delta: 5,
215
+ side: "yes",
216
+ });
217
+ const bbo = manager.getBBO("MARKET-1");
218
+ expect(bbo?.bidPrice).toBe(51);
219
+ });
220
+ it("should track multiple markets", () => {
221
+ manager.applySnapshot({
222
+ market_ticker: "MARKET-1",
223
+ market_id: "1",
224
+ yes: [[50, 10]],
225
+ no: [],
226
+ });
227
+ manager.applySnapshot({
228
+ market_ticker: "MARKET-2",
229
+ market_id: "2",
230
+ yes: [[60, 10]],
231
+ no: [],
232
+ });
233
+ expect(manager.getTickers()).toContain("MARKET-1");
234
+ expect(manager.getTickers()).toContain("MARKET-2");
235
+ expect(manager.getTickers()).toHaveLength(2);
236
+ });
237
+ it("should clear all orderbooks", () => {
238
+ manager.applySnapshot({
239
+ market_ticker: "MARKET-1",
240
+ market_id: "1",
241
+ yes: [[50, 10]],
242
+ no: [],
243
+ });
244
+ manager.clear();
245
+ expect(manager.getTickers()).toHaveLength(0);
246
+ expect(manager.getBBO("MARKET-1")).toBeNull();
247
+ });
248
+ });
249
+ describe("LocalOrderbook - clear", () => {
250
+ it("should clear all data", () => {
251
+ const orderbook = new LocalOrderbook("TEST");
252
+ orderbook.applySnapshot({
253
+ market_ticker: "TEST",
254
+ market_id: "123",
255
+ yes: [[50, 10]],
256
+ no: [[90, 15]],
257
+ });
258
+ expect(orderbook.getBBO()).not.toBeNull();
259
+ orderbook.clear();
260
+ expect(orderbook.getBBO()).toBeNull();
261
+ expect(orderbook.getSequence()).toBe(0);
262
+ });
263
+ });
264
+ //# sourceMappingURL=orderbook.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderbook.test.js","sourceRoot":"","sources":["../../src/mm/orderbook.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Risk Manager
3
+ *
4
+ * Enforces risk limits for market making.
5
+ */
6
+ import type { RiskLimits, RiskCheckResult, Quote, Fill } from "./types.js";
7
+ import type { InventoryTracker } from "./inventory.js";
8
+ /** Default risk limits (conservative) */
9
+ export declare const DEFAULT_RISK_LIMITS: RiskLimits;
10
+ /**
11
+ * RiskManager enforces trading limits
12
+ */
13
+ export declare class RiskManager {
14
+ private limits;
15
+ private dailyPnL;
16
+ private halted;
17
+ private haltReason?;
18
+ constructor(limits?: Partial<RiskLimits>);
19
+ /**
20
+ * Check if a quote passes risk limits
21
+ */
22
+ checkQuote(quote: Quote, inventory: InventoryTracker): RiskCheckResult;
23
+ /**
24
+ * Check a single order (simpler than quote)
25
+ */
26
+ checkOrder(order: {
27
+ ticker: string;
28
+ count: number;
29
+ }, inventory: InventoryTracker): RiskCheckResult;
30
+ /**
31
+ * Update PnL on fill (checks daily loss limit)
32
+ */
33
+ onFill(fill: Fill, realizedPnL: number): void;
34
+ /**
35
+ * Check if trading should be halted
36
+ */
37
+ shouldHalt(): boolean;
38
+ /**
39
+ * Get halt reason if halted
40
+ */
41
+ getHaltReason(): string | undefined;
42
+ /**
43
+ * Emergency halt trading
44
+ */
45
+ halt(reason: string): void;
46
+ /**
47
+ * Resume trading after halt
48
+ */
49
+ resume(): void;
50
+ /**
51
+ * Reset daily PnL (call at start of trading day)
52
+ */
53
+ resetDaily(): void;
54
+ /**
55
+ * Get current daily PnL
56
+ */
57
+ getDailyPnL(): number;
58
+ /**
59
+ * Get current limits
60
+ */
61
+ getLimits(): RiskLimits;
62
+ /**
63
+ * Update limits (for dynamic adjustment)
64
+ */
65
+ updateLimits(newLimits: Partial<RiskLimits>): void;
66
+ /**
67
+ * Get risk status summary
68
+ */
69
+ getStatus(inventory: InventoryTracker): {
70
+ halted: boolean;
71
+ haltReason?: string;
72
+ dailyPnL: number;
73
+ totalExposure: number;
74
+ utilizationPercent: number;
75
+ };
76
+ }
77
+ //# sourceMappingURL=risk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/mm/risk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,KAAK,EACL,IAAI,EACL,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,yCAAyC;AACzC,eAAO,MAAM,mBAAmB,EAAE,UAMjC,CAAC;AAEF;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM;IAI5C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,GAAG,eAAe;IAsDtE;;OAEG;IACH,UAAU,CACR,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EACxC,SAAS,EAAE,gBAAgB,GAC1B,eAAe;IA+BlB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAS7C;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,SAAS,IAAI,UAAU;IAIvB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,gBAAgB,GAAG;QACtC,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;KAC5B;CAUF"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Risk Manager
3
+ *
4
+ * Enforces risk limits for market making.
5
+ */
6
+ /** Default risk limits (conservative) */
7
+ export const DEFAULT_RISK_LIMITS = {
8
+ maxPositionPerMarket: 100,
9
+ maxTotalExposure: 500,
10
+ maxDailyLoss: 5000, // $50
11
+ maxOrderSize: 25,
12
+ minSpread: 2,
13
+ };
14
+ /**
15
+ * RiskManager enforces trading limits
16
+ */
17
+ export class RiskManager {
18
+ limits;
19
+ dailyPnL = 0;
20
+ halted = false;
21
+ haltReason;
22
+ constructor(limits = {}) {
23
+ this.limits = { ...DEFAULT_RISK_LIMITS, ...limits };
24
+ }
25
+ /**
26
+ * Check if a quote passes risk limits
27
+ */
28
+ checkQuote(quote, inventory) {
29
+ // Check if halted
30
+ if (this.halted) {
31
+ return { allowed: false, reason: `Trading halted: ${this.haltReason}` };
32
+ }
33
+ // Check spread
34
+ const spread = quote.askPrice - quote.bidPrice;
35
+ if (spread < this.limits.minSpread) {
36
+ return {
37
+ allowed: false,
38
+ reason: `Spread ${spread}¢ below minimum ${this.limits.minSpread}¢`,
39
+ };
40
+ }
41
+ // Check order sizes
42
+ if (quote.bidSize > this.limits.maxOrderSize) {
43
+ return {
44
+ allowed: false,
45
+ reason: `Bid size ${quote.bidSize} exceeds max ${this.limits.maxOrderSize}`,
46
+ };
47
+ }
48
+ if (quote.askSize > this.limits.maxOrderSize) {
49
+ return {
50
+ allowed: false,
51
+ reason: `Ask size ${quote.askSize} exceeds max ${this.limits.maxOrderSize}`,
52
+ };
53
+ }
54
+ // Check position limits
55
+ const currentPosition = Math.abs(inventory.getNetExposure(quote.ticker));
56
+ const potentialPosition = currentPosition + Math.max(quote.bidSize, quote.askSize);
57
+ if (potentialPosition > this.limits.maxPositionPerMarket) {
58
+ return {
59
+ allowed: false,
60
+ reason: `Position ${potentialPosition} would exceed max ${this.limits.maxPositionPerMarket}`,
61
+ };
62
+ }
63
+ // Check total exposure
64
+ const currentTotal = inventory.getTotalExposure();
65
+ const potentialTotal = currentTotal + Math.max(quote.bidSize, quote.askSize);
66
+ if (potentialTotal > this.limits.maxTotalExposure) {
67
+ return {
68
+ allowed: false,
69
+ reason: `Total exposure ${potentialTotal} would exceed max ${this.limits.maxTotalExposure}`,
70
+ };
71
+ }
72
+ return { allowed: true };
73
+ }
74
+ /**
75
+ * Check a single order (simpler than quote)
76
+ */
77
+ checkOrder(order, inventory) {
78
+ if (this.halted) {
79
+ return { allowed: false, reason: `Trading halted: ${this.haltReason}` };
80
+ }
81
+ if (order.count > this.limits.maxOrderSize) {
82
+ return {
83
+ allowed: false,
84
+ reason: `Order size ${order.count} exceeds max ${this.limits.maxOrderSize}`,
85
+ };
86
+ }
87
+ const currentPosition = Math.abs(inventory.getNetExposure(order.ticker));
88
+ if (currentPosition + order.count > this.limits.maxPositionPerMarket) {
89
+ return {
90
+ allowed: false,
91
+ reason: `Would exceed position limit for ${order.ticker}`,
92
+ };
93
+ }
94
+ const currentTotal = inventory.getTotalExposure();
95
+ if (currentTotal + order.count > this.limits.maxTotalExposure) {
96
+ return {
97
+ allowed: false,
98
+ reason: `Would exceed total exposure limit`,
99
+ };
100
+ }
101
+ return { allowed: true };
102
+ }
103
+ /**
104
+ * Update PnL on fill (checks daily loss limit)
105
+ */
106
+ onFill(fill, realizedPnL) {
107
+ this.dailyPnL += realizedPnL;
108
+ // Check daily loss limit
109
+ if (this.dailyPnL < -this.limits.maxDailyLoss) {
110
+ this.halt(`Daily loss limit reached: ${this.dailyPnL}¢`);
111
+ }
112
+ }
113
+ /**
114
+ * Check if trading should be halted
115
+ */
116
+ shouldHalt() {
117
+ return this.halted;
118
+ }
119
+ /**
120
+ * Get halt reason if halted
121
+ */
122
+ getHaltReason() {
123
+ return this.haltReason;
124
+ }
125
+ /**
126
+ * Emergency halt trading
127
+ */
128
+ halt(reason) {
129
+ this.halted = true;
130
+ this.haltReason = reason;
131
+ }
132
+ /**
133
+ * Resume trading after halt
134
+ */
135
+ resume() {
136
+ this.halted = false;
137
+ this.haltReason = undefined;
138
+ }
139
+ /**
140
+ * Reset daily PnL (call at start of trading day)
141
+ */
142
+ resetDaily() {
143
+ this.dailyPnL = 0;
144
+ // Don't auto-resume if halted for loss limit
145
+ // Operator must explicitly resume
146
+ }
147
+ /**
148
+ * Get current daily PnL
149
+ */
150
+ getDailyPnL() {
151
+ return this.dailyPnL;
152
+ }
153
+ /**
154
+ * Get current limits
155
+ */
156
+ getLimits() {
157
+ return { ...this.limits };
158
+ }
159
+ /**
160
+ * Update limits (for dynamic adjustment)
161
+ */
162
+ updateLimits(newLimits) {
163
+ this.limits = { ...this.limits, ...newLimits };
164
+ }
165
+ /**
166
+ * Get risk status summary
167
+ */
168
+ getStatus(inventory) {
169
+ const totalExposure = inventory.getTotalExposure();
170
+ return {
171
+ halted: this.halted,
172
+ haltReason: this.haltReason,
173
+ dailyPnL: this.dailyPnL,
174
+ totalExposure,
175
+ utilizationPercent: (totalExposure / this.limits.maxTotalExposure) * 100,
176
+ };
177
+ }
178
+ }
179
+ //# sourceMappingURL=risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/mm/risk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=risk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk.test.d.ts","sourceRoot":"","sources":["../../src/mm/risk.test.ts"],"names":[],"mappings":""}