@newyorkcompute/kalshi-core 0.4.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.
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mm/index.d.ts +1 -0
- package/dist/mm/index.d.ts.map +1 -1
- package/dist/mm/index.js +2 -0
- package/dist/mm/index.js.map +1 -1
- package/dist/mm/order-manager.d.ts +15 -3
- package/dist/mm/order-manager.d.ts.map +1 -1
- package/dist/mm/order-manager.js +51 -5
- package/dist/mm/order-manager.js.map +1 -1
- package/dist/mm/orderbook.d.ts +162 -0
- package/dist/mm/orderbook.d.ts.map +1 -0
- package/dist/mm/orderbook.js +271 -0
- package/dist/mm/orderbook.js.map +1 -0
- package/dist/mm/orderbook.test.d.ts +2 -0
- package/dist/mm/orderbook.test.d.ts.map +1 -0
- package/dist/mm/orderbook.test.js +264 -0
- package/dist/mm/orderbook.test.js.map +1 -0
- package/package.json +1 -1
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,mBAAmB,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,kDAAkD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,cAAc,4CAA4C,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,mBAAmB,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,kDAAkD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,cAAc,4CAA4C,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAmB9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAMnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAG/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAGrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAG/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAG/D"}
|
package/dist/config.js
CHANGED
|
@@ -31,7 +31,7 @@ export const DEMO_BASE_PATH = "https://demo-api.kalshi.co/trade-api/v2";
|
|
|
31
31
|
*/
|
|
32
32
|
export function getKalshiConfig() {
|
|
33
33
|
const apiKey = process.env.KALSHI_API_KEY;
|
|
34
|
-
|
|
34
|
+
let privateKey = process.env.KALSHI_PRIVATE_KEY;
|
|
35
35
|
const basePath = process.env.KALSHI_BASE_PATH || DEFAULT_BASE_PATH;
|
|
36
36
|
if (!apiKey) {
|
|
37
37
|
throw new Error("KALSHI_API_KEY environment variable is required");
|
|
@@ -39,6 +39,10 @@ export function getKalshiConfig() {
|
|
|
39
39
|
if (!privateKey) {
|
|
40
40
|
throw new Error("KALSHI_PRIVATE_KEY environment variable is required");
|
|
41
41
|
}
|
|
42
|
+
// Handle escaped newlines from .env files
|
|
43
|
+
if (privateKey.includes("\\n")) {
|
|
44
|
+
privateKey = privateKey.replace(/\\n/g, "\n");
|
|
45
|
+
}
|
|
42
46
|
return { apiKey, privateKey, basePath };
|
|
43
47
|
}
|
|
44
48
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,GACV,MAAM,mBAAmB,CAAC;AAe3B;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,+CAA+C,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,yCAAyC,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,GACV,MAAM,mBAAmB,CAAC;AAe3B;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,+CAA+C,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,yCAAyC,CAAC;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iBAAiB,CAAC;IAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,0CAA0C;IAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,OAAO,IAAI,aAAa,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,UAAU;QAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,5 +11,5 @@ export * from "./types.js";
|
|
|
11
11
|
export { withTimeout, TimeoutError } from "./with-timeout.js";
|
|
12
12
|
export { validateOrder, type OrderValidationInput, type OrderValidationResult, } from "./validate-order.js";
|
|
13
13
|
export { KalshiWsClient, generateWsAuthHeaders, generateSignedWsUrl, type KalshiWsConfig, type KalshiWsEventHandlers, type SubscriptionChannel, type ConnectionState, type ActiveSubscriptions, type OrderbookDeltaMessage, type TickerMessage, type TradeMessage, type FillMessage, type WsMessage, WS_ENDPOINTS, } from "./websocket/index.js";
|
|
14
|
-
export { OrderManager, InventoryTracker, RiskManager, DEFAULT_RISK_LIMITS, type Side, type Action, type OrderStatus, type ManagedOrder, type Quote, type Position, type RiskLimits, type RiskCheckResult, type Fill, type PnLSummary, type CreateOrderInput, type PlaceOrderResult, } from "./mm/index.js";
|
|
14
|
+
export { OrderManager, InventoryTracker, RiskManager, LocalOrderbook, OrderbookManager, DEFAULT_RISK_LIMITS, type Side, type Action, type OrderStatus, type ManagedOrder, type Quote, type Position, type RiskLimits, type RiskCheckResult, type Fill, type PnLSummary, type CreateOrderInput, type PlaceOrderResult, type PriceLevel, type OrderbookSnapshot, type OrderbookDelta, type BBO, } from "./mm/index.js";
|
|
15
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,GAAG,GACT,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,5 +20,5 @@ export { validateOrder, } from "./validate-order.js";
|
|
|
20
20
|
// WebSocket (real-time data)
|
|
21
21
|
export { KalshiWsClient, generateWsAuthHeaders, generateSignedWsUrl, WS_ENDPOINTS, } from "./websocket/index.js";
|
|
22
22
|
// Market Making primitives
|
|
23
|
-
export { OrderManager, InventoryTracker, RiskManager, DEFAULT_RISK_LIMITS, } from "./mm/index.js";
|
|
23
|
+
export { OrderManager, InventoryTracker, RiskManager, LocalOrderbook, OrderbookManager, DEFAULT_RISK_LIMITS, } from "./mm/index.js";
|
|
24
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,kBAAkB;AAClB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,gBAAgB;AAChB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9D,aAAa;AACb,OAAO,EACL,aAAa,GAGd,MAAM,qBAAqB,CAAC;AAE7B,6BAA6B;AAC7B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EAWnB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,2BAA2B;AAC3B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,kBAAkB;AAClB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,gBAAgB;AAChB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9D,aAAa;AACb,OAAO,EACL,aAAa,GAGd,MAAM,qBAAqB,CAAC;AAE7B,6BAA6B;AAC7B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EAWnB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,2BAA2B;AAC3B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GAiBpB,MAAM,eAAe,CAAC"}
|
package/dist/mm/index.d.ts
CHANGED
|
@@ -7,4 +7,5 @@ export type { Side, Action, OrderStatus, ManagedOrder, Quote, Position, RiskLimi
|
|
|
7
7
|
export { OrderManager, type CreateOrderInput, type PlaceOrderResult, } from "./order-manager.js";
|
|
8
8
|
export { InventoryTracker } from "./inventory.js";
|
|
9
9
|
export { RiskManager, DEFAULT_RISK_LIMITS } from "./risk.js";
|
|
10
|
+
export { LocalOrderbook, OrderbookManager, type PriceLevel, type OrderbookSnapshot, type OrderbookDelta, type BBO, } from "./orderbook.js";
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,IAAI,EACJ,MAAM,EACN,WAAW,EACX,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,UAAU,EACV,eAAe,EACf,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,IAAI,EACJ,MAAM,EACN,WAAW,EACX,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,UAAU,EACV,eAAe,EACf,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,GAAG,GACT,MAAM,gBAAgB,CAAC"}
|
package/dist/mm/index.js
CHANGED
|
@@ -9,4 +9,6 @@ export { OrderManager, } from "./order-manager.js";
|
|
|
9
9
|
export { InventoryTracker } from "./inventory.js";
|
|
10
10
|
// Risk Manager
|
|
11
11
|
export { RiskManager, DEFAULT_RISK_LIMITS } from "./risk.js";
|
|
12
|
+
// Local Orderbook
|
|
13
|
+
export { LocalOrderbook, OrderbookManager, } from "./orderbook.js";
|
|
12
14
|
//# sourceMappingURL=index.js.map
|
package/dist/mm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,gBAAgB;AAChB,OAAO,EACL,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,gBAAgB;AAChB,OAAO,EACL,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAE7D,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,gBAAgB,GAKjB,MAAM,gBAAgB,CAAC"}
|
|
@@ -60,15 +60,27 @@ export declare class OrderManager {
|
|
|
60
60
|
*/
|
|
61
61
|
updateStatus(clientOrderId: string, status: OrderStatus, filledCount?: number, avgFillPrice?: number): void;
|
|
62
62
|
/**
|
|
63
|
-
* Update quotes for a market (
|
|
63
|
+
* Update quotes for a market (ATOMIC: place new BEFORE canceling old)
|
|
64
64
|
*
|
|
65
|
-
* This is the main method for market making - it
|
|
66
|
-
*
|
|
65
|
+
* This is the main method for market making - it updates quotes with
|
|
66
|
+
* minimal exposure gap:
|
|
67
|
+
* 1. Place new orders first (briefly have double exposure)
|
|
68
|
+
* 2. Cancel old orders only after new ones confirmed
|
|
69
|
+
*
|
|
70
|
+
* This prevents the "naked" period where we have no quotes in market.
|
|
67
71
|
*/
|
|
68
72
|
updateQuote(quote: Quote): Promise<{
|
|
69
73
|
cancelled: number;
|
|
70
74
|
placed: PlaceOrderResult[];
|
|
71
75
|
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Update quotes (legacy mode: cancel first, then place)
|
|
78
|
+
* Use this if you're hitting rate limits from double orders
|
|
79
|
+
*/
|
|
80
|
+
updateQuoteLegacy(quote: Quote): Promise<{
|
|
81
|
+
cancelled: number;
|
|
82
|
+
placed: PlaceOrderResult[];
|
|
83
|
+
}>;
|
|
72
84
|
/**
|
|
73
85
|
* Clean up old completed orders (keep memory bounded)
|
|
74
86
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-manager.d.ts","sourceRoot":"","sources":["../../src/mm/order-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EACV,YAAY,EACZ,IAAI,EACJ,MAAM,EACN,WAAW,EACX,KAAK,EACN,MAAM,YAAY,CAAC;AAEpB,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAY;gBAEjB,SAAS,EAAE,SAAS;IAIhC;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6C/D;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKxE;;OAEG;IACG,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBrD;;OAEG;IACG,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBjD;;OAEG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAa1C;;OAEG;IACH,MAAM,IAAI,YAAY,EAAE;IAIxB;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIpD;;OAEG;IACH,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI;IAaP
|
|
1
|
+
{"version":3,"file":"order-manager.d.ts","sourceRoot":"","sources":["../../src/mm/order-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EACV,YAAY,EACZ,IAAI,EACJ,MAAM,EACN,WAAW,EACX,KAAK,EACN,MAAM,YAAY,CAAC;AAEpB,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAY;gBAEjB,SAAS,EAAE,SAAS;IAIhC;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6C/D;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKxE;;OAEG;IACG,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBrD;;OAEG;IACG,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBjD;;OAEG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAa1C;;OAEG;IACH,MAAM,IAAI,YAAY,EAAE;IAIxB;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIpD;;OAEG;IACH,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI;IAaP;;;;;;;;;OASG;IACG,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;KAC5B,CAAC;IAiDF;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;QAC7C,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;KAC5B,CAAC;IAgCF;;OAEG;IACH,OAAO,CAAC,MAAM,GAAE,MAA4B,GAAG,MAAM;IAgBrD;;OAEG;IACH,OAAO,CAAC,eAAe;CAexB"}
|
package/dist/mm/order-manager.js
CHANGED
|
@@ -144,17 +144,64 @@ export class OrderManager {
|
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
/**
|
|
147
|
-
* Update quotes for a market (
|
|
147
|
+
* Update quotes for a market (ATOMIC: place new BEFORE canceling old)
|
|
148
148
|
*
|
|
149
|
-
* This is the main method for market making - it
|
|
150
|
-
*
|
|
149
|
+
* This is the main method for market making - it updates quotes with
|
|
150
|
+
* minimal exposure gap:
|
|
151
|
+
* 1. Place new orders first (briefly have double exposure)
|
|
152
|
+
* 2. Cancel old orders only after new ones confirmed
|
|
153
|
+
*
|
|
154
|
+
* This prevents the "naked" period where we have no quotes in market.
|
|
151
155
|
*/
|
|
152
156
|
async updateQuote(quote) {
|
|
157
|
+
// Get existing orders for this ticker BEFORE placing new ones
|
|
158
|
+
const existingOrders = this.getActive(quote.ticker);
|
|
159
|
+
// Build new orders
|
|
160
|
+
const newOrders = [];
|
|
161
|
+
// Bid (buy YES at bid price)
|
|
162
|
+
if (quote.bidSize > 0 && quote.bidPrice >= 1 && quote.bidPrice <= 99) {
|
|
163
|
+
newOrders.push({
|
|
164
|
+
ticker: quote.ticker,
|
|
165
|
+
side: quote.side,
|
|
166
|
+
action: "buy",
|
|
167
|
+
price: quote.bidPrice,
|
|
168
|
+
count: quote.bidSize,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// Ask (sell YES at ask price, or buy NO)
|
|
172
|
+
if (quote.askSize > 0 && quote.askPrice >= 1 && quote.askPrice <= 99) {
|
|
173
|
+
newOrders.push({
|
|
174
|
+
ticker: quote.ticker,
|
|
175
|
+
side: quote.side,
|
|
176
|
+
action: "sell",
|
|
177
|
+
price: quote.askPrice,
|
|
178
|
+
count: quote.askSize,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// 1. Place new orders FIRST (we briefly have double exposure)
|
|
182
|
+
const placed = await this.placeBulk(newOrders);
|
|
183
|
+
// 2. Cancel old orders AFTER new ones are placed
|
|
184
|
+
// Even if new orders fail, we still cancel old stale quotes
|
|
185
|
+
let cancelled = 0;
|
|
186
|
+
if (existingOrders.length > 0) {
|
|
187
|
+
const cancelResults = await Promise.allSettled(existingOrders.map((order) => this.cancel(order.clientOrderId)));
|
|
188
|
+
for (const result of cancelResults) {
|
|
189
|
+
if (result.status === "fulfilled" && result.value) {
|
|
190
|
+
cancelled++;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { cancelled, placed };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Update quotes (legacy mode: cancel first, then place)
|
|
198
|
+
* Use this if you're hitting rate limits from double orders
|
|
199
|
+
*/
|
|
200
|
+
async updateQuoteLegacy(quote) {
|
|
153
201
|
// 1. Cancel existing orders for this ticker
|
|
154
202
|
const cancelled = await this.cancelAll(quote.ticker);
|
|
155
203
|
// 2. Place new bid and ask orders
|
|
156
204
|
const orders = [];
|
|
157
|
-
// Bid (buy YES at bid price)
|
|
158
205
|
if (quote.bidSize > 0 && quote.bidPrice >= 1 && quote.bidPrice <= 99) {
|
|
159
206
|
orders.push({
|
|
160
207
|
ticker: quote.ticker,
|
|
@@ -164,7 +211,6 @@ export class OrderManager {
|
|
|
164
211
|
count: quote.bidSize,
|
|
165
212
|
});
|
|
166
213
|
}
|
|
167
|
-
// Ask (sell YES at ask price, or buy NO)
|
|
168
214
|
if (quote.askSize > 0 && quote.askPrice >= 1 && quote.askPrice <= 99) {
|
|
169
215
|
orders.push({
|
|
170
216
|
ticker: quote.ticker,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-manager.js","sourceRoot":"","sources":["../../src/mm/order-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"order-manager.js","sourceRoot":"","sources":["../../src/mm/order-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Orderbook
|
|
3
|
+
*
|
|
4
|
+
* Maintains a local copy of the orderbook from WebSocket snapshots and deltas.
|
|
5
|
+
* This allows for fast quote updates without waiting for ticker messages.
|
|
6
|
+
*/
|
|
7
|
+
/** Single price level in the orderbook */
|
|
8
|
+
export interface PriceLevel {
|
|
9
|
+
price: number;
|
|
10
|
+
quantity: number;
|
|
11
|
+
}
|
|
12
|
+
/** Orderbook snapshot from WebSocket */
|
|
13
|
+
export interface OrderbookSnapshot {
|
|
14
|
+
market_ticker: string;
|
|
15
|
+
market_id: string;
|
|
16
|
+
/** YES side bids: [price, quantity][] */
|
|
17
|
+
yes: [number, number][];
|
|
18
|
+
/** NO side bids: [price, quantity][] */
|
|
19
|
+
no: [number, number][];
|
|
20
|
+
}
|
|
21
|
+
/** Orderbook delta from WebSocket */
|
|
22
|
+
export interface OrderbookDelta {
|
|
23
|
+
market_ticker: string;
|
|
24
|
+
/** Price that changed */
|
|
25
|
+
price: number;
|
|
26
|
+
/** New quantity (0 = level removed) */
|
|
27
|
+
delta: number;
|
|
28
|
+
/** Which side: 'yes' or 'no' */
|
|
29
|
+
side: "yes" | "no";
|
|
30
|
+
}
|
|
31
|
+
/** Best bid/ask with size */
|
|
32
|
+
export interface BBO {
|
|
33
|
+
bidPrice: number;
|
|
34
|
+
bidSize: number;
|
|
35
|
+
askPrice: number;
|
|
36
|
+
askSize: number;
|
|
37
|
+
midPrice: number;
|
|
38
|
+
spread: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* LocalOrderbook maintains orderbook state from WebSocket messages.
|
|
42
|
+
*
|
|
43
|
+
* Key insight for Kalshi:
|
|
44
|
+
* - YES bids are stored in `yes` array
|
|
45
|
+
* - NO bids are stored in `no` array
|
|
46
|
+
* - YES ask = 100 - NO bid price
|
|
47
|
+
*
|
|
48
|
+
* Example: If there's a NO bid at 90¢, that's equivalent to a YES ask at 10¢
|
|
49
|
+
*/
|
|
50
|
+
export declare class LocalOrderbook {
|
|
51
|
+
private ticker;
|
|
52
|
+
/** YES bids: price → quantity */
|
|
53
|
+
private yesBids;
|
|
54
|
+
/** NO bids: price → quantity (YES asks = 100 - NO bid) */
|
|
55
|
+
private noBids;
|
|
56
|
+
/** Last update timestamp */
|
|
57
|
+
private lastUpdate;
|
|
58
|
+
/** Sequence number for ordering */
|
|
59
|
+
private sequence;
|
|
60
|
+
constructor(ticker: string);
|
|
61
|
+
/**
|
|
62
|
+
* Apply a full orderbook snapshot
|
|
63
|
+
*/
|
|
64
|
+
applySnapshot(snapshot: OrderbookSnapshot): void;
|
|
65
|
+
/**
|
|
66
|
+
* Apply an incremental delta update
|
|
67
|
+
*/
|
|
68
|
+
applyDelta(delta: OrderbookDelta): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get best bid (highest YES bid)
|
|
71
|
+
*/
|
|
72
|
+
getBestBid(): PriceLevel | null;
|
|
73
|
+
/**
|
|
74
|
+
* Get best ask (100 - highest NO bid)
|
|
75
|
+
*/
|
|
76
|
+
getBestAsk(): PriceLevel | null;
|
|
77
|
+
/**
|
|
78
|
+
* Get best bid and offer (BBO)
|
|
79
|
+
*/
|
|
80
|
+
getBBO(): BBO | null;
|
|
81
|
+
/**
|
|
82
|
+
* Get microprice (size-weighted mid)
|
|
83
|
+
* Better estimate of "fair value" than simple mid
|
|
84
|
+
*
|
|
85
|
+
* microprice = (bid * askSize + ask * bidSize) / (bidSize + askSize)
|
|
86
|
+
*
|
|
87
|
+
* If ask size is smaller, price is closer to ask (more selling pressure)
|
|
88
|
+
* If bid size is smaller, price is closer to bid (more buying pressure)
|
|
89
|
+
*/
|
|
90
|
+
getMicroprice(): number | null;
|
|
91
|
+
/**
|
|
92
|
+
* Get depth at N levels
|
|
93
|
+
*/
|
|
94
|
+
getDepth(levels?: number): {
|
|
95
|
+
bids: PriceLevel[];
|
|
96
|
+
asks: PriceLevel[];
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Get total bid depth (sum of all bid quantities)
|
|
100
|
+
*/
|
|
101
|
+
getTotalBidDepth(): number;
|
|
102
|
+
/**
|
|
103
|
+
* Get total ask depth (sum of all ask quantities)
|
|
104
|
+
*/
|
|
105
|
+
getTotalAskDepth(): number;
|
|
106
|
+
/**
|
|
107
|
+
* Get imbalance ratio: (bidDepth - askDepth) / (bidDepth + askDepth)
|
|
108
|
+
* Positive = more bids (bullish), Negative = more asks (bearish)
|
|
109
|
+
*/
|
|
110
|
+
getImbalance(): number;
|
|
111
|
+
/**
|
|
112
|
+
* Check if orderbook is stale (no updates for X ms)
|
|
113
|
+
*/
|
|
114
|
+
isStale(maxAgeMs?: number): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Get time since last update
|
|
117
|
+
*/
|
|
118
|
+
getAge(): number;
|
|
119
|
+
/**
|
|
120
|
+
* Get sequence number (for ordering/debugging)
|
|
121
|
+
*/
|
|
122
|
+
getSequence(): number;
|
|
123
|
+
/**
|
|
124
|
+
* Get ticker
|
|
125
|
+
*/
|
|
126
|
+
getTicker(): string;
|
|
127
|
+
/**
|
|
128
|
+
* Clear the orderbook
|
|
129
|
+
*/
|
|
130
|
+
clear(): void;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* OrderbookManager manages multiple LocalOrderbook instances
|
|
134
|
+
*/
|
|
135
|
+
export declare class OrderbookManager {
|
|
136
|
+
private orderbooks;
|
|
137
|
+
/**
|
|
138
|
+
* Get or create orderbook for a ticker
|
|
139
|
+
*/
|
|
140
|
+
getOrderbook(ticker: string): LocalOrderbook;
|
|
141
|
+
/**
|
|
142
|
+
* Apply snapshot to appropriate orderbook
|
|
143
|
+
*/
|
|
144
|
+
applySnapshot(snapshot: OrderbookSnapshot): void;
|
|
145
|
+
/**
|
|
146
|
+
* Apply delta to appropriate orderbook
|
|
147
|
+
*/
|
|
148
|
+
applyDelta(delta: OrderbookDelta): void;
|
|
149
|
+
/**
|
|
150
|
+
* Get BBO for a ticker
|
|
151
|
+
*/
|
|
152
|
+
getBBO(ticker: string): BBO | null;
|
|
153
|
+
/**
|
|
154
|
+
* Get all managed tickers
|
|
155
|
+
*/
|
|
156
|
+
getTickers(): string[];
|
|
157
|
+
/**
|
|
158
|
+
* Clear all orderbooks
|
|
159
|
+
*/
|
|
160
|
+
clear(): void;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=orderbook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderbook.d.ts","sourceRoot":"","sources":["../../src/mm/orderbook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACxB,wCAAwC;IACxC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CACxB;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;CACpB;AAED,6BAA6B;AAC7B,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,iCAAiC;IACjC,OAAO,CAAC,OAAO,CAAkC;IACjD,0DAA0D;IAC1D,OAAO,CAAC,MAAM,CAAkC;IAChD,4BAA4B;IAC5B,OAAO,CAAC,UAAU,CAAa;IAC/B,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAsBhD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAevC;;OAEG;IACH,UAAU,IAAI,UAAU,GAAG,IAAI;IAgB/B;;OAEG;IACH,UAAU,IAAI,UAAU,GAAG,IAAI;IAmB/B;;OAEG;IACH,MAAM,IAAI,GAAG,GAAG,IAAI;IAgBpB;;;;;;;;OAQG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAY9B;;OAEG;IACH,QAAQ,CAAC,MAAM,GAAE,MAAU,GAAG;QAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAAC,IAAI,EAAE,UAAU,EAAE,CAAA;KAAE;IAkBxE;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;;OAGG;IACH,YAAY,IAAI,MAAM;IAStB;;OAEG;IACH,OAAO,CAAC,QAAQ,GAAE,MAAa,GAAG,OAAO;IAIzC;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAA0C;IAE5D;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAS5C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAKhD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAKvC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAIlC;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Orderbook
|
|
3
|
+
*
|
|
4
|
+
* Maintains a local copy of the orderbook from WebSocket snapshots and deltas.
|
|
5
|
+
* This allows for fast quote updates without waiting for ticker messages.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* LocalOrderbook maintains orderbook state from WebSocket messages.
|
|
9
|
+
*
|
|
10
|
+
* Key insight for Kalshi:
|
|
11
|
+
* - YES bids are stored in `yes` array
|
|
12
|
+
* - NO bids are stored in `no` array
|
|
13
|
+
* - YES ask = 100 - NO bid price
|
|
14
|
+
*
|
|
15
|
+
* Example: If there's a NO bid at 90¢, that's equivalent to a YES ask at 10¢
|
|
16
|
+
*/
|
|
17
|
+
export class LocalOrderbook {
|
|
18
|
+
ticker;
|
|
19
|
+
/** YES bids: price → quantity */
|
|
20
|
+
yesBids = new Map();
|
|
21
|
+
/** NO bids: price → quantity (YES asks = 100 - NO bid) */
|
|
22
|
+
noBids = new Map();
|
|
23
|
+
/** Last update timestamp */
|
|
24
|
+
lastUpdate = 0;
|
|
25
|
+
/** Sequence number for ordering */
|
|
26
|
+
sequence = 0;
|
|
27
|
+
constructor(ticker) {
|
|
28
|
+
this.ticker = ticker;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Apply a full orderbook snapshot
|
|
32
|
+
*/
|
|
33
|
+
applySnapshot(snapshot) {
|
|
34
|
+
this.yesBids.clear();
|
|
35
|
+
this.noBids.clear();
|
|
36
|
+
// Load YES bids
|
|
37
|
+
for (const [price, qty] of snapshot.yes) {
|
|
38
|
+
if (qty > 0) {
|
|
39
|
+
this.yesBids.set(price, qty);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Load NO bids
|
|
43
|
+
for (const [price, qty] of snapshot.no) {
|
|
44
|
+
if (qty > 0) {
|
|
45
|
+
this.noBids.set(price, qty);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.lastUpdate = Date.now();
|
|
49
|
+
this.sequence++;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Apply an incremental delta update
|
|
53
|
+
*/
|
|
54
|
+
applyDelta(delta) {
|
|
55
|
+
const map = delta.side === "yes" ? this.yesBids : this.noBids;
|
|
56
|
+
if (delta.delta <= 0) {
|
|
57
|
+
// Remove level
|
|
58
|
+
map.delete(delta.price);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Update level
|
|
62
|
+
map.set(delta.price, delta.delta);
|
|
63
|
+
}
|
|
64
|
+
this.lastUpdate = Date.now();
|
|
65
|
+
this.sequence++;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get best bid (highest YES bid)
|
|
69
|
+
*/
|
|
70
|
+
getBestBid() {
|
|
71
|
+
if (this.yesBids.size === 0)
|
|
72
|
+
return null;
|
|
73
|
+
let bestPrice = 0;
|
|
74
|
+
let bestQty = 0;
|
|
75
|
+
for (const [price, qty] of this.yesBids) {
|
|
76
|
+
if (price > bestPrice && qty > 0) {
|
|
77
|
+
bestPrice = price;
|
|
78
|
+
bestQty = qty;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return bestPrice > 0 ? { price: bestPrice, quantity: bestQty } : null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get best ask (100 - highest NO bid)
|
|
85
|
+
*/
|
|
86
|
+
getBestAsk() {
|
|
87
|
+
if (this.noBids.size === 0)
|
|
88
|
+
return null;
|
|
89
|
+
let bestNoPrice = 0;
|
|
90
|
+
let bestQty = 0;
|
|
91
|
+
for (const [price, qty] of this.noBids) {
|
|
92
|
+
if (price > bestNoPrice && qty > 0) {
|
|
93
|
+
bestNoPrice = price;
|
|
94
|
+
bestQty = qty;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (bestNoPrice === 0)
|
|
98
|
+
return null;
|
|
99
|
+
// Convert NO bid to YES ask
|
|
100
|
+
return { price: 100 - bestNoPrice, quantity: bestQty };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get best bid and offer (BBO)
|
|
104
|
+
*/
|
|
105
|
+
getBBO() {
|
|
106
|
+
const bid = this.getBestBid();
|
|
107
|
+
const ask = this.getBestAsk();
|
|
108
|
+
if (!bid || !ask)
|
|
109
|
+
return null;
|
|
110
|
+
return {
|
|
111
|
+
bidPrice: bid.price,
|
|
112
|
+
bidSize: bid.quantity,
|
|
113
|
+
askPrice: ask.price,
|
|
114
|
+
askSize: ask.quantity,
|
|
115
|
+
midPrice: (bid.price + ask.price) / 2,
|
|
116
|
+
spread: ask.price - bid.price,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get microprice (size-weighted mid)
|
|
121
|
+
* Better estimate of "fair value" than simple mid
|
|
122
|
+
*
|
|
123
|
+
* microprice = (bid * askSize + ask * bidSize) / (bidSize + askSize)
|
|
124
|
+
*
|
|
125
|
+
* If ask size is smaller, price is closer to ask (more selling pressure)
|
|
126
|
+
* If bid size is smaller, price is closer to bid (more buying pressure)
|
|
127
|
+
*/
|
|
128
|
+
getMicroprice() {
|
|
129
|
+
const bid = this.getBestBid();
|
|
130
|
+
const ask = this.getBestAsk();
|
|
131
|
+
if (!bid || !ask)
|
|
132
|
+
return null;
|
|
133
|
+
const totalSize = bid.quantity + ask.quantity;
|
|
134
|
+
if (totalSize === 0)
|
|
135
|
+
return (bid.price + ask.price) / 2;
|
|
136
|
+
return (bid.price * ask.quantity + ask.price * bid.quantity) / totalSize;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get depth at N levels
|
|
140
|
+
*/
|
|
141
|
+
getDepth(levels = 5) {
|
|
142
|
+
// Sort bids descending (highest first)
|
|
143
|
+
const sortedBids = Array.from(this.yesBids.entries())
|
|
144
|
+
.filter(([, qty]) => qty > 0)
|
|
145
|
+
.sort(([a], [b]) => b - a)
|
|
146
|
+
.slice(0, levels)
|
|
147
|
+
.map(([price, quantity]) => ({ price, quantity }));
|
|
148
|
+
// Convert NO bids to YES asks, sort ascending (lowest first)
|
|
149
|
+
const sortedAsks = Array.from(this.noBids.entries())
|
|
150
|
+
.filter(([, qty]) => qty > 0)
|
|
151
|
+
.map(([noPrice, quantity]) => ({ price: 100 - noPrice, quantity }))
|
|
152
|
+
.sort((a, b) => a.price - b.price)
|
|
153
|
+
.slice(0, levels);
|
|
154
|
+
return { bids: sortedBids, asks: sortedAsks };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get total bid depth (sum of all bid quantities)
|
|
158
|
+
*/
|
|
159
|
+
getTotalBidDepth() {
|
|
160
|
+
let total = 0;
|
|
161
|
+
for (const qty of this.yesBids.values()) {
|
|
162
|
+
total += qty;
|
|
163
|
+
}
|
|
164
|
+
return total;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get total ask depth (sum of all ask quantities)
|
|
168
|
+
*/
|
|
169
|
+
getTotalAskDepth() {
|
|
170
|
+
let total = 0;
|
|
171
|
+
for (const qty of this.noBids.values()) {
|
|
172
|
+
total += qty;
|
|
173
|
+
}
|
|
174
|
+
return total;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get imbalance ratio: (bidDepth - askDepth) / (bidDepth + askDepth)
|
|
178
|
+
* Positive = more bids (bullish), Negative = more asks (bearish)
|
|
179
|
+
*/
|
|
180
|
+
getImbalance() {
|
|
181
|
+
const bidDepth = this.getTotalBidDepth();
|
|
182
|
+
const askDepth = this.getTotalAskDepth();
|
|
183
|
+
const total = bidDepth + askDepth;
|
|
184
|
+
if (total === 0)
|
|
185
|
+
return 0;
|
|
186
|
+
return (bidDepth - askDepth) / total;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if orderbook is stale (no updates for X ms)
|
|
190
|
+
*/
|
|
191
|
+
isStale(maxAgeMs = 5000) {
|
|
192
|
+
return Date.now() - this.lastUpdate > maxAgeMs;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get time since last update
|
|
196
|
+
*/
|
|
197
|
+
getAge() {
|
|
198
|
+
return Date.now() - this.lastUpdate;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get sequence number (for ordering/debugging)
|
|
202
|
+
*/
|
|
203
|
+
getSequence() {
|
|
204
|
+
return this.sequence;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get ticker
|
|
208
|
+
*/
|
|
209
|
+
getTicker() {
|
|
210
|
+
return this.ticker;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Clear the orderbook
|
|
214
|
+
*/
|
|
215
|
+
clear() {
|
|
216
|
+
this.yesBids.clear();
|
|
217
|
+
this.noBids.clear();
|
|
218
|
+
this.lastUpdate = 0;
|
|
219
|
+
this.sequence = 0;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* OrderbookManager manages multiple LocalOrderbook instances
|
|
224
|
+
*/
|
|
225
|
+
export class OrderbookManager {
|
|
226
|
+
orderbooks = new Map();
|
|
227
|
+
/**
|
|
228
|
+
* Get or create orderbook for a ticker
|
|
229
|
+
*/
|
|
230
|
+
getOrderbook(ticker) {
|
|
231
|
+
let ob = this.orderbooks.get(ticker);
|
|
232
|
+
if (!ob) {
|
|
233
|
+
ob = new LocalOrderbook(ticker);
|
|
234
|
+
this.orderbooks.set(ticker, ob);
|
|
235
|
+
}
|
|
236
|
+
return ob;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Apply snapshot to appropriate orderbook
|
|
240
|
+
*/
|
|
241
|
+
applySnapshot(snapshot) {
|
|
242
|
+
const ob = this.getOrderbook(snapshot.market_ticker);
|
|
243
|
+
ob.applySnapshot(snapshot);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Apply delta to appropriate orderbook
|
|
247
|
+
*/
|
|
248
|
+
applyDelta(delta) {
|
|
249
|
+
const ob = this.getOrderbook(delta.market_ticker);
|
|
250
|
+
ob.applyDelta(delta);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get BBO for a ticker
|
|
254
|
+
*/
|
|
255
|
+
getBBO(ticker) {
|
|
256
|
+
return this.orderbooks.get(ticker)?.getBBO() ?? null;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get all managed tickers
|
|
260
|
+
*/
|
|
261
|
+
getTickers() {
|
|
262
|
+
return Array.from(this.orderbooks.keys());
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Clear all orderbooks
|
|
266
|
+
*/
|
|
267
|
+
clear() {
|
|
268
|
+
this.orderbooks.clear();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=orderbook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderbook.js","sourceRoot":"","sources":["../../src/mm/orderbook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderbook.test.d.ts","sourceRoot":"","sources":["../../src/mm/orderbook.test.ts"],"names":[],"mappings":""}
|
|
@@ -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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"}
|
package/package.json
CHANGED