@123456btc/123456btc-cli 1.0.5 → 1.0.6
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/api/signals.d.ts +3 -3
- package/dist/api/signals.d.ts.map +1 -1
- package/dist/api/signals.js +3 -3
- package/dist/api/signals.js.map +1 -1
- package/dist/api/strategy-stream.d.ts +4 -9
- package/dist/api/strategy-stream.d.ts.map +1 -1
- package/dist/api/strategy-stream.js +14 -13
- package/dist/api/strategy-stream.js.map +1 -1
- package/dist/api/strategy.d.ts +3 -1
- package/dist/api/strategy.d.ts.map +1 -1
- package/dist/api/strategy.js +3 -1
- package/dist/api/strategy.js.map +1 -1
- package/dist/commands/exchange.d.ts +3 -0
- package/dist/commands/exchange.d.ts.map +1 -0
- package/dist/commands/exchange.js +141 -0
- package/dist/commands/exchange.js.map +1 -0
- package/dist/commands/signals.js +7 -7
- package/dist/commands/signals.js.map +1 -1
- package/dist/commands/strategy.d.ts.map +1 -1
- package/dist/commands/strategy.js +181 -8
- package/dist/commands/strategy.js.map +1 -1
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -3
- package/dist/commands/vault.js.map +1 -1
- package/dist/config/strategy-exchange.d.ts +30 -0
- package/dist/config/strategy-exchange.d.ts.map +1 -0
- package/dist/config/strategy-exchange.js +130 -0
- package/dist/config/strategy-exchange.js.map +1 -0
- package/dist/exchange/index.d.ts +106 -0
- package/dist/exchange/index.d.ts.map +1 -0
- package/dist/exchange/index.js +43 -0
- package/dist/exchange/index.js.map +1 -0
- package/dist/exchange/v2/adapters/base.d.ts +130 -0
- package/dist/exchange/v2/adapters/base.d.ts.map +1 -0
- package/dist/exchange/v2/adapters/base.js +296 -0
- package/dist/exchange/v2/adapters/base.js.map +1 -0
- package/dist/exchange/v2/adapters/binance.d.ts +51 -0
- package/dist/exchange/v2/adapters/binance.d.ts.map +1 -0
- package/dist/exchange/v2/adapters/binance.js +549 -0
- package/dist/exchange/v2/adapters/binance.js.map +1 -0
- package/dist/exchange/v2/adapters/bitget.d.ts +43 -0
- package/dist/exchange/v2/adapters/bitget.d.ts.map +1 -0
- package/dist/exchange/v2/adapters/bitget.js +524 -0
- package/dist/exchange/v2/adapters/bitget.js.map +1 -0
- package/dist/exchange/v2/adapters/hyperliquid.d.ts +102 -0
- package/dist/exchange/v2/adapters/hyperliquid.d.ts.map +1 -0
- package/dist/exchange/v2/adapters/hyperliquid.js +536 -0
- package/dist/exchange/v2/adapters/hyperliquid.js.map +1 -0
- package/dist/exchange/v2/adapters/okx.d.ts +38 -0
- package/dist/exchange/v2/adapters/okx.d.ts.map +1 -0
- package/dist/exchange/v2/adapters/okx.js +437 -0
- package/dist/exchange/v2/adapters/okx.js.map +1 -0
- package/dist/exchange/v2/algorithms/index.d.ts +78 -0
- package/dist/exchange/v2/algorithms/index.d.ts.map +1 -0
- package/dist/exchange/v2/algorithms/index.js +441 -0
- package/dist/exchange/v2/algorithms/index.js.map +1 -0
- package/dist/exchange/v2/executor/circuit-breaker.d.ts +44 -0
- package/dist/exchange/v2/executor/circuit-breaker.d.ts.map +1 -0
- package/dist/exchange/v2/executor/circuit-breaker.js +90 -0
- package/dist/exchange/v2/executor/circuit-breaker.js.map +1 -0
- package/dist/exchange/v2/executor/core.d.ts +64 -0
- package/dist/exchange/v2/executor/core.d.ts.map +1 -0
- package/dist/exchange/v2/executor/core.js +458 -0
- package/dist/exchange/v2/executor/core.js.map +1 -0
- package/dist/exchange/v2/executor/risk.d.ts +29 -0
- package/dist/exchange/v2/executor/risk.d.ts.map +1 -0
- package/dist/exchange/v2/executor/risk.js +144 -0
- package/dist/exchange/v2/executor/risk.js.map +1 -0
- package/dist/exchange/v2/executor/state.d.ts +29 -0
- package/dist/exchange/v2/executor/state.d.ts.map +1 -0
- package/dist/exchange/v2/executor/state.js +171 -0
- package/dist/exchange/v2/executor/state.js.map +1 -0
- package/dist/exchange/v2/index.d.ts +50 -0
- package/dist/exchange/v2/index.d.ts.map +1 -0
- package/dist/exchange/v2/index.js +82 -0
- package/dist/exchange/v2/index.js.map +1 -0
- package/dist/exchange/v2/registry.d.ts +50 -0
- package/dist/exchange/v2/registry.d.ts.map +1 -0
- package/dist/exchange/v2/registry.js +101 -0
- package/dist/exchange/v2/registry.js.map +1 -0
- package/dist/exchange/v2/types.d.ts +413 -0
- package/dist/exchange/v2/types.d.ts.map +1 -0
- package/dist/exchange/v2/types.js +3 -0
- package/dist/exchange/v2/types.js.map +1 -0
- package/dist/index.d.ts +105 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -37
- package/dist/index.js.map +1 -1
- package/dist/types/financial.d.ts +14 -0
- package/dist/types/financial.d.ts.map +1 -0
- package/dist/types/financial.js +6 -0
- package/dist/types/financial.js.map +1 -0
- package/dist/vault/crypto.js +3 -3
- package/dist/vault/crypto.js.map +1 -1
- package/dist/vault/index.d.ts +28 -0
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +70 -0
- package/dist/vault/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Risk Guard — Pre-execution checks
|
|
4
|
+
* Validates every order against configurable risk limits before sending to exchange.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RiskGuard = void 0;
|
|
8
|
+
class RiskGuard {
|
|
9
|
+
limits;
|
|
10
|
+
dailyLoss = 0;
|
|
11
|
+
openOrderCount = 0;
|
|
12
|
+
persistence;
|
|
13
|
+
constructor(limits, persistence) {
|
|
14
|
+
this.limits = limits;
|
|
15
|
+
this.persistence = persistence;
|
|
16
|
+
// Load persisted state asynchronously
|
|
17
|
+
if (persistence) {
|
|
18
|
+
Promise.resolve(persistence.load()).then((state) => {
|
|
19
|
+
this.dailyLoss = state.dailyLoss;
|
|
20
|
+
this.openOrderCount = state.openOrders;
|
|
21
|
+
}).catch((err) => {
|
|
22
|
+
console.error('[RiskGuard] failed to load persisted state:', err);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
_save() {
|
|
27
|
+
if (this.persistence) {
|
|
28
|
+
Promise.resolve(this.persistence.save({ dailyLoss: this.dailyLoss, openOrders: this.openOrderCount }))
|
|
29
|
+
.catch((err) => console.error('[RiskGuard] failed to persist state:', err));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Update running daily loss tracker (call on each filled order PnL) */
|
|
33
|
+
recordPnl(pnl) {
|
|
34
|
+
if (pnl < 0)
|
|
35
|
+
this.dailyLoss += Math.abs(pnl);
|
|
36
|
+
this._save();
|
|
37
|
+
}
|
|
38
|
+
recordOrderOpened() { this.openOrderCount++; this._save(); }
|
|
39
|
+
recordOrderClosed() { this.openOrderCount = Math.max(0, this.openOrderCount - 1); this._save(); }
|
|
40
|
+
resetDailyStats() {
|
|
41
|
+
this.dailyLoss = 0;
|
|
42
|
+
this._save();
|
|
43
|
+
}
|
|
44
|
+
async check(order, ticker) {
|
|
45
|
+
const results = [];
|
|
46
|
+
let worstAction = 'allow';
|
|
47
|
+
let adjustedRequest;
|
|
48
|
+
// ── 1. Symbol Whitelist / Blacklist ──────────────────────────────────
|
|
49
|
+
if (this.limits.allowedSymbols && this.limits.allowedSymbols.length > 0) {
|
|
50
|
+
const allowed = this.limits.allowedSymbols.includes(order.symbol);
|
|
51
|
+
if (!allowed) {
|
|
52
|
+
results.push({ rule: 'symbol_whitelist', action: 'block', message: `Symbol ${order.symbol} not in whitelist` });
|
|
53
|
+
worstAction = 'block';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (this.limits.blockedSymbols?.includes(order.symbol)) {
|
|
57
|
+
results.push({ rule: 'symbol_blacklist', action: 'block', message: `Symbol ${order.symbol} is blocked` });
|
|
58
|
+
worstAction = 'block';
|
|
59
|
+
}
|
|
60
|
+
// ── 2. Daily Loss Limit ───────────────────────────────────────────────
|
|
61
|
+
if (this.limits.maxDailyLoss !== undefined && this.dailyLoss >= this.limits.maxDailyLoss) {
|
|
62
|
+
results.push({
|
|
63
|
+
rule: 'daily_loss', action: 'block',
|
|
64
|
+
message: `Daily loss limit reached: $${this.dailyLoss.toFixed(2)} >= $${this.limits.maxDailyLoss}`,
|
|
65
|
+
});
|
|
66
|
+
worstAction = 'block';
|
|
67
|
+
}
|
|
68
|
+
// ── 3. Max Open Orders ────────────────────────────────────────────────
|
|
69
|
+
if (this.limits.maxOpenOrders !== undefined && this.openOrderCount >= this.limits.maxOpenOrders) {
|
|
70
|
+
results.push({
|
|
71
|
+
rule: 'max_open_orders', action: 'block',
|
|
72
|
+
message: `Open order limit reached: ${this.openOrderCount} >= ${this.limits.maxOpenOrders}`,
|
|
73
|
+
});
|
|
74
|
+
worstAction = 'block';
|
|
75
|
+
}
|
|
76
|
+
// ── 4. Order Size / Notional ──────────────────────────────────────────
|
|
77
|
+
if (ticker && this.limits.maxOrderSize !== undefined) {
|
|
78
|
+
const qty = getQuantity(order);
|
|
79
|
+
if (qty !== null) {
|
|
80
|
+
const price = getPrice(order) ?? ticker.last;
|
|
81
|
+
const notional = qty * price;
|
|
82
|
+
if (notional > this.limits.maxOrderSize) {
|
|
83
|
+
const cappedQty = this.limits.maxOrderSize / price;
|
|
84
|
+
results.push({
|
|
85
|
+
rule: 'max_order_size', action: 'reduce',
|
|
86
|
+
message: `Order notional $${notional.toFixed(2)} > limit $${this.limits.maxOrderSize}`,
|
|
87
|
+
adjustedQuantity: cappedQty,
|
|
88
|
+
});
|
|
89
|
+
if (worstAction === 'allow')
|
|
90
|
+
worstAction = 'reduce';
|
|
91
|
+
// Build adjusted request
|
|
92
|
+
adjustedRequest = adjustQty(order, cappedQty);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ── 5. Max Leverage ───────────────────────────────────────────────────
|
|
97
|
+
if (this.limits.maxLeverage !== undefined && order.leverage !== undefined) {
|
|
98
|
+
if (order.leverage > this.limits.maxLeverage) {
|
|
99
|
+
results.push({
|
|
100
|
+
rule: 'max_leverage', action: 'block',
|
|
101
|
+
message: `Leverage ${order.leverage}x exceeds limit ${this.limits.maxLeverage}x`,
|
|
102
|
+
});
|
|
103
|
+
worstAction = 'block';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── 6. Slippage Guard (market orders) ─────────────────────────────────
|
|
107
|
+
if (this.limits.maxSlippage !== undefined && order.type === 'market' && ticker) {
|
|
108
|
+
const mid = (ticker.bid + ticker.ask) / 2;
|
|
109
|
+
const spread = Math.abs(ticker.ask - ticker.bid) / mid * 100;
|
|
110
|
+
if (spread > this.limits.maxSlippage) {
|
|
111
|
+
results.push({
|
|
112
|
+
rule: 'slippage_guard', action: 'block',
|
|
113
|
+
message: `Spread ${spread.toFixed(3)}% > slippage limit ${this.limits.maxSlippage}%`,
|
|
114
|
+
});
|
|
115
|
+
worstAction = 'block';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const passed = worstAction !== 'block';
|
|
119
|
+
return {
|
|
120
|
+
passed,
|
|
121
|
+
action: worstAction,
|
|
122
|
+
results,
|
|
123
|
+
adjustedRequest: adjustedRequest ?? (worstAction === 'reduce' ? undefined : undefined),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.RiskGuard = RiskGuard;
|
|
128
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
129
|
+
function getQuantity(order) {
|
|
130
|
+
if ('quantity' in order)
|
|
131
|
+
return order.quantity ?? null;
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
function getPrice(order) {
|
|
135
|
+
if ('price' in order)
|
|
136
|
+
return order.price ?? null;
|
|
137
|
+
if ('entryPrice' in order)
|
|
138
|
+
return order.entryPrice ?? null;
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
function adjustQty(order, newQty) {
|
|
142
|
+
return { ...order, quantity: newQty };
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/risk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order State Manager
|
|
3
|
+
* Tracks every order through its lifecycle with a complete transition log.
|
|
4
|
+
* In-memory by default; can be extended to persist to D1/KV.
|
|
5
|
+
*/
|
|
6
|
+
import type { OrderStatus, OrderEvent, TrackedOrder, OrderRequest, OrderResponse, ExchangeId } from '../types';
|
|
7
|
+
export declare function applyTransition(current: OrderStatus, event: OrderEvent): OrderStatus | null;
|
|
8
|
+
export declare class OrderStateManager {
|
|
9
|
+
private orders;
|
|
10
|
+
private clientIdMap;
|
|
11
|
+
register(clientOrderId: string, exchange: ExchangeId, request: OrderRequest): TrackedOrder;
|
|
12
|
+
bind(clientOrderId: string, orderId: string): TrackedOrder | null;
|
|
13
|
+
transition(id: string, event: OrderEvent, detail?: string): TrackedOrder | null;
|
|
14
|
+
applyResponse(id: string, response: OrderResponse): TrackedOrder | null;
|
|
15
|
+
markError(id: string, error: string): TrackedOrder | null;
|
|
16
|
+
incrementRetry(id: string): number;
|
|
17
|
+
bindParentChild(parentId: string, childIds: string[]): void;
|
|
18
|
+
get(id: string): TrackedOrder | undefined;
|
|
19
|
+
getByClientId(clientOrderId: string): TrackedOrder | undefined;
|
|
20
|
+
list(filter?: {
|
|
21
|
+
status?: OrderStatus;
|
|
22
|
+
exchange?: ExchangeId;
|
|
23
|
+
}): TrackedOrder[];
|
|
24
|
+
remove(id: string): void;
|
|
25
|
+
/** Purge terminal orders older than maxAgeMs */
|
|
26
|
+
purge(maxAgeMs?: number): number;
|
|
27
|
+
size(): number;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EAEV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,MAAM,UAAU,CAAC;AAgBlB,wBAAgB,eAAe,CAC9B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,UAAU,GACf,WAAW,GAAG,IAAI,CAEpB;AAID,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,WAAW,CAAkC;IAErD,QAAQ,CACP,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,YAAY,GACnB,YAAY;IAoBf,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAUjE,UAAU,CACT,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,MAAM,GACb,YAAY,GAAG,IAAI;IAqBtB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI;IAqBvE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQzD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAQlC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAe3D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzC,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK9D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,YAAY,EAAE;IAU9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMxB,gDAAgD;IAChD,KAAK,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM;IAcrD,IAAI,IAAI,MAAM;CACd"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Order State Manager
|
|
4
|
+
* Tracks every order through its lifecycle with a complete transition log.
|
|
5
|
+
* In-memory by default; can be extended to persist to D1/KV.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.OrderStateManager = void 0;
|
|
9
|
+
exports.applyTransition = applyTransition;
|
|
10
|
+
// ─── State Machine ────────────────────────────────────────────────────────
|
|
11
|
+
/** Legal state transitions */
|
|
12
|
+
const TRANSITIONS = {
|
|
13
|
+
pending: { submit: 'pending', ack: 'open', reject: 'rejected', error: 'failed' },
|
|
14
|
+
open: { partial_fill: 'partially_filled', fill: 'filled', cancel_request: 'open', cancelled: 'cancelled', reject: 'rejected', expire: 'expired', error: 'failed' },
|
|
15
|
+
partially_filled: { partial_fill: 'partially_filled', fill: 'filled', cancel_request: 'partially_filled', cancelled: 'cancelled', error: 'failed' },
|
|
16
|
+
filled: {},
|
|
17
|
+
cancelled: {},
|
|
18
|
+
rejected: {},
|
|
19
|
+
expired: {},
|
|
20
|
+
failed: { submit: 'pending' }, // allow retry
|
|
21
|
+
};
|
|
22
|
+
function applyTransition(current, event) {
|
|
23
|
+
return TRANSITIONS[current]?.[event] ?? null;
|
|
24
|
+
}
|
|
25
|
+
// ─── In-Memory Store ──────────────────────────────────────────────────────
|
|
26
|
+
class OrderStateManager {
|
|
27
|
+
orders = new Map();
|
|
28
|
+
clientIdMap = new Map(); // clientOrderId → orderId
|
|
29
|
+
register(clientOrderId, exchange, request) {
|
|
30
|
+
const order = {
|
|
31
|
+
orderId: '',
|
|
32
|
+
clientOrderId,
|
|
33
|
+
runId: request.runId,
|
|
34
|
+
exchange,
|
|
35
|
+
request,
|
|
36
|
+
status: 'pending',
|
|
37
|
+
transitions: [],
|
|
38
|
+
retryCount: 0,
|
|
39
|
+
createdAt: Date.now(),
|
|
40
|
+
updatedAt: Date.now(),
|
|
41
|
+
parentOrderId: undefined,
|
|
42
|
+
childOrderIds: undefined,
|
|
43
|
+
};
|
|
44
|
+
this.orders.set(clientOrderId, order);
|
|
45
|
+
this.clientIdMap.set(clientOrderId, clientOrderId);
|
|
46
|
+
return order;
|
|
47
|
+
}
|
|
48
|
+
bind(clientOrderId, orderId) {
|
|
49
|
+
const order = this.orders.get(clientOrderId);
|
|
50
|
+
if (!order)
|
|
51
|
+
return null;
|
|
52
|
+
order.orderId = orderId;
|
|
53
|
+
this.orders.delete(clientOrderId);
|
|
54
|
+
this.orders.set(orderId, order);
|
|
55
|
+
this.clientIdMap.set(clientOrderId, orderId);
|
|
56
|
+
return order;
|
|
57
|
+
}
|
|
58
|
+
transition(id, event, detail) {
|
|
59
|
+
const order = this.get(id);
|
|
60
|
+
if (!order)
|
|
61
|
+
return null;
|
|
62
|
+
const next = applyTransition(order.status, event);
|
|
63
|
+
if (!next) {
|
|
64
|
+
// Illegal transition — log and ignore
|
|
65
|
+
console.warn(`[OrderState] Illegal transition: ${order.status} + ${event} (order ${id})`);
|
|
66
|
+
return order;
|
|
67
|
+
}
|
|
68
|
+
const t = {
|
|
69
|
+
from: order.status, event, to: next,
|
|
70
|
+
timestamp: Date.now(), detail,
|
|
71
|
+
};
|
|
72
|
+
order.transitions.push(t);
|
|
73
|
+
order.status = next;
|
|
74
|
+
order.updatedAt = Date.now();
|
|
75
|
+
return order;
|
|
76
|
+
}
|
|
77
|
+
applyResponse(id, response) {
|
|
78
|
+
const order = this.get(id);
|
|
79
|
+
if (!order)
|
|
80
|
+
return null;
|
|
81
|
+
order.response = response;
|
|
82
|
+
order.updatedAt = Date.now();
|
|
83
|
+
// Map response status to event
|
|
84
|
+
const eventMap = {
|
|
85
|
+
open: 'ack', pending: 'submit',
|
|
86
|
+
partially_filled: 'partial_fill',
|
|
87
|
+
filled: 'fill',
|
|
88
|
+
cancelled: 'cancelled',
|
|
89
|
+
rejected: 'reject',
|
|
90
|
+
expired: 'expire',
|
|
91
|
+
failed: 'error',
|
|
92
|
+
};
|
|
93
|
+
const event = eventMap[response.status];
|
|
94
|
+
if (event)
|
|
95
|
+
this.transition(id, event);
|
|
96
|
+
return order;
|
|
97
|
+
}
|
|
98
|
+
markError(id, error) {
|
|
99
|
+
const order = this.get(id);
|
|
100
|
+
if (!order)
|
|
101
|
+
return null;
|
|
102
|
+
order.error = error;
|
|
103
|
+
this.transition(id, 'error', error);
|
|
104
|
+
return order;
|
|
105
|
+
}
|
|
106
|
+
incrementRetry(id) {
|
|
107
|
+
const order = this.get(id);
|
|
108
|
+
if (!order)
|
|
109
|
+
return 0;
|
|
110
|
+
order.retryCount++;
|
|
111
|
+
order.updatedAt = Date.now();
|
|
112
|
+
return order.retryCount;
|
|
113
|
+
}
|
|
114
|
+
bindParentChild(parentId, childIds) {
|
|
115
|
+
const parent = this.get(parentId);
|
|
116
|
+
if (parent) {
|
|
117
|
+
parent.childOrderIds = [...(parent.childOrderIds ?? []), ...childIds];
|
|
118
|
+
parent.updatedAt = Date.now();
|
|
119
|
+
}
|
|
120
|
+
for (const childId of childIds) {
|
|
121
|
+
const child = this.get(childId);
|
|
122
|
+
if (child) {
|
|
123
|
+
child.parentOrderId = parentId;
|
|
124
|
+
child.updatedAt = Date.now();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
get(id) {
|
|
129
|
+
return this.orders.get(id) ?? this.orders.get(this.clientIdMap.get(id) ?? '');
|
|
130
|
+
}
|
|
131
|
+
getByClientId(clientOrderId) {
|
|
132
|
+
const realId = this.clientIdMap.get(clientOrderId);
|
|
133
|
+
return realId ? this.orders.get(realId) : undefined;
|
|
134
|
+
}
|
|
135
|
+
list(filter) {
|
|
136
|
+
const all = Array.from(this.orders.values());
|
|
137
|
+
if (!filter)
|
|
138
|
+
return all;
|
|
139
|
+
return all.filter(o => {
|
|
140
|
+
if (filter.status && o.status !== filter.status)
|
|
141
|
+
return false;
|
|
142
|
+
if (filter.exchange && o.exchange !== filter.exchange)
|
|
143
|
+
return false;
|
|
144
|
+
return true;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
remove(id) {
|
|
148
|
+
const order = this.get(id);
|
|
149
|
+
if (order?.clientOrderId)
|
|
150
|
+
this.clientIdMap.delete(order.clientOrderId);
|
|
151
|
+
this.orders.delete(id);
|
|
152
|
+
}
|
|
153
|
+
/** Purge terminal orders older than maxAgeMs */
|
|
154
|
+
purge(maxAgeMs = 24 * 60 * 60 * 1000) {
|
|
155
|
+
const terminal = ['filled', 'cancelled', 'rejected', 'expired', 'failed'];
|
|
156
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
157
|
+
let count = 0;
|
|
158
|
+
for (const [id, order] of this.orders) {
|
|
159
|
+
if (terminal.includes(order.status) && order.updatedAt < cutoff) {
|
|
160
|
+
if (order.clientOrderId)
|
|
161
|
+
this.clientIdMap.delete(order.clientOrderId);
|
|
162
|
+
this.orders.delete(id);
|
|
163
|
+
count++;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return count;
|
|
167
|
+
}
|
|
168
|
+
size() { return this.orders.size; }
|
|
169
|
+
}
|
|
170
|
+
exports.OrderStateManager = OrderStateManager;
|
|
171
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Institutional Order Execution Module — Public API Surface
|
|
3
|
+
* ============================================================
|
|
4
|
+
* Usage:
|
|
5
|
+
*
|
|
6
|
+
* import { createEngine, ExchangeRegistry } from './exchange/v2';
|
|
7
|
+
*
|
|
8
|
+
* // Single exchange
|
|
9
|
+
* const engine = createEngine({
|
|
10
|
+
* exchange: 'okx',
|
|
11
|
+
* credentials: { apiKey: '...', apiSecret: '...', passphrase: '...' },
|
|
12
|
+
* }, {
|
|
13
|
+
* riskLimits: { maxOrderSize: 10_000, maxDailyLoss: 500 },
|
|
14
|
+
* onOrderUpdate: (order) => console.log('Order update:', order.orderId, order.status),
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Place a limit order
|
|
18
|
+
* const tracked = await engine.submitOrder({
|
|
19
|
+
* symbol: 'BTC-USDT', side: 'buy', type: 'limit',
|
|
20
|
+
* quantity: 0.01, price: 65000, timeInForce: 'GTC',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Place TWAP
|
|
24
|
+
* const result = await engine.executeTWAP({
|
|
25
|
+
* symbol: 'ETH-USDT', side: 'buy',
|
|
26
|
+
* totalQuantity: 1.0, durationMs: 60_000, intervals: 6,
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Multi-exchange arbitrage
|
|
30
|
+
* const registry = new ExchangeRegistry();
|
|
31
|
+
* registry.add('okx', { exchange: 'okx', credentials: okxCreds });
|
|
32
|
+
* registry.add('binance', { exchange: 'binance', credentials: bnbCreds });
|
|
33
|
+
* const { bestBid, bestAsk } = await registry.bestBidAsk('BTCUSDT');
|
|
34
|
+
*/
|
|
35
|
+
export type { ExchangeId, MarketType, OrderSide, PositionSide, OrderType, TimeInForce, OrderStatus, MarginMode, ExchangeCredentials, TickerInfo, SymbolInfo, OHLCVBar, OrderBook, FundingInfo, AssetBalance, AccountSnapshot, PositionInfo, BaseOrderRequest, MarketOrderRequest, LimitOrderRequest, StopOrderRequest, TrailingStopRequest, BracketOrderRequest, OCOOrderRequest, OrderRequest, OrderResponse, RawOrderParams, TwapParams, VwapParams, IcebergParams, AlgoSlice, AlgoOrderResult, RiskAction, RiskRuleResult, RiskCheckResult, RiskLimits, OrderEvent, OrderStateTransition, TrackedOrder, EngineConfig, RetryPolicy, } from './types';
|
|
36
|
+
export type { IExchangeAdapter } from './adapters/base';
|
|
37
|
+
export { BaseExchangeAdapter, ExchangeError, InsufficientFundsError, RateLimitError, InvalidSymbolError, OrderNotFoundError, hmacSha256Hex, hmacSha256Base64, buildQueryString, buildQueryStringOrdered, genClientOrderId, roundToStep, roundToTick, TIMEFRAME_MS, } from './adapters/base';
|
|
38
|
+
export { OKXAdapter } from './adapters/okx';
|
|
39
|
+
export { BinanceAdapter } from './adapters/binance';
|
|
40
|
+
export { BitgetAdapter } from './adapters/bitget';
|
|
41
|
+
export { HyperliquidAdapter } from './adapters/hyperliquid';
|
|
42
|
+
export type { HyperliquidSignerFn } from './adapters/hyperliquid';
|
|
43
|
+
export { TWAPExecutor, VWAPExecutor, IcebergExecutor, BracketOrchestrator, TrailingStopMonitor, } from './algorithms/index';
|
|
44
|
+
export type { TrailingStopState, BracketResult } from './algorithms/index';
|
|
45
|
+
export { OrderEngine } from './executor/core';
|
|
46
|
+
export { RiskGuard } from './executor/risk';
|
|
47
|
+
export { OrderStateManager, applyTransition } from './executor/state';
|
|
48
|
+
export { createAdapter, createEngine, ExchangeRegistry, } from './registry';
|
|
49
|
+
export type { AdapterOptions } from './registry';
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/exchange/v2/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,YAAY,EAEX,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EACvE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAE5C,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAExD,YAAY,EAAE,eAAe,EAAE,YAAY,EAE3C,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EACzE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EACvE,aAAa,EAAE,cAAc,EAE7B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAEjE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAEvD,UAAU,EAAE,oBAAoB,EAAE,YAAY,EAE9C,YAAY,EAAE,WAAW,GACzB,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACN,mBAAmB,EACnB,aAAa,EAAE,sBAAsB,EAAE,cAAc,EACrD,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,gBAAgB,EAC/B,gBAAgB,EAAE,uBAAuB,EACzC,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,GACxD,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EACN,YAAY,EAAE,YAAY,EAAE,eAAe,EAC3C,mBAAmB,EAAE,mBAAmB,GACxC,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EACN,aAAa,EAAE,YAAY,EAC3B,gBAAgB,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Institutional Order Execution Module — Public API Surface
|
|
4
|
+
* ============================================================
|
|
5
|
+
* Usage:
|
|
6
|
+
*
|
|
7
|
+
* import { createEngine, ExchangeRegistry } from './exchange/v2';
|
|
8
|
+
*
|
|
9
|
+
* // Single exchange
|
|
10
|
+
* const engine = createEngine({
|
|
11
|
+
* exchange: 'okx',
|
|
12
|
+
* credentials: { apiKey: '...', apiSecret: '...', passphrase: '...' },
|
|
13
|
+
* }, {
|
|
14
|
+
* riskLimits: { maxOrderSize: 10_000, maxDailyLoss: 500 },
|
|
15
|
+
* onOrderUpdate: (order) => console.log('Order update:', order.orderId, order.status),
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Place a limit order
|
|
19
|
+
* const tracked = await engine.submitOrder({
|
|
20
|
+
* symbol: 'BTC-USDT', side: 'buy', type: 'limit',
|
|
21
|
+
* quantity: 0.01, price: 65000, timeInForce: 'GTC',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Place TWAP
|
|
25
|
+
* const result = await engine.executeTWAP({
|
|
26
|
+
* symbol: 'ETH-USDT', side: 'buy',
|
|
27
|
+
* totalQuantity: 1.0, durationMs: 60_000, intervals: 6,
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Multi-exchange arbitrage
|
|
31
|
+
* const registry = new ExchangeRegistry();
|
|
32
|
+
* registry.add('okx', { exchange: 'okx', credentials: okxCreds });
|
|
33
|
+
* registry.add('binance', { exchange: 'binance', credentials: bnbCreds });
|
|
34
|
+
* const { bestBid, bestAsk } = await registry.bestBidAsk('BTCUSDT');
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ExchangeRegistry = exports.createEngine = exports.createAdapter = exports.applyTransition = exports.OrderStateManager = exports.RiskGuard = exports.OrderEngine = exports.TrailingStopMonitor = exports.BracketOrchestrator = exports.IcebergExecutor = exports.VWAPExecutor = exports.TWAPExecutor = exports.HyperliquidAdapter = exports.BitgetAdapter = exports.BinanceAdapter = exports.OKXAdapter = exports.TIMEFRAME_MS = exports.roundToTick = exports.roundToStep = exports.genClientOrderId = exports.buildQueryStringOrdered = exports.buildQueryString = exports.hmacSha256Base64 = exports.hmacSha256Hex = exports.OrderNotFoundError = exports.InvalidSymbolError = exports.RateLimitError = exports.InsufficientFundsError = exports.ExchangeError = exports.BaseExchangeAdapter = void 0;
|
|
38
|
+
var base_1 = require("./adapters/base");
|
|
39
|
+
Object.defineProperty(exports, "BaseExchangeAdapter", { enumerable: true, get: function () { return base_1.BaseExchangeAdapter; } });
|
|
40
|
+
Object.defineProperty(exports, "ExchangeError", { enumerable: true, get: function () { return base_1.ExchangeError; } });
|
|
41
|
+
Object.defineProperty(exports, "InsufficientFundsError", { enumerable: true, get: function () { return base_1.InsufficientFundsError; } });
|
|
42
|
+
Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return base_1.RateLimitError; } });
|
|
43
|
+
Object.defineProperty(exports, "InvalidSymbolError", { enumerable: true, get: function () { return base_1.InvalidSymbolError; } });
|
|
44
|
+
Object.defineProperty(exports, "OrderNotFoundError", { enumerable: true, get: function () { return base_1.OrderNotFoundError; } });
|
|
45
|
+
Object.defineProperty(exports, "hmacSha256Hex", { enumerable: true, get: function () { return base_1.hmacSha256Hex; } });
|
|
46
|
+
Object.defineProperty(exports, "hmacSha256Base64", { enumerable: true, get: function () { return base_1.hmacSha256Base64; } });
|
|
47
|
+
Object.defineProperty(exports, "buildQueryString", { enumerable: true, get: function () { return base_1.buildQueryString; } });
|
|
48
|
+
Object.defineProperty(exports, "buildQueryStringOrdered", { enumerable: true, get: function () { return base_1.buildQueryStringOrdered; } });
|
|
49
|
+
Object.defineProperty(exports, "genClientOrderId", { enumerable: true, get: function () { return base_1.genClientOrderId; } });
|
|
50
|
+
Object.defineProperty(exports, "roundToStep", { enumerable: true, get: function () { return base_1.roundToStep; } });
|
|
51
|
+
Object.defineProperty(exports, "roundToTick", { enumerable: true, get: function () { return base_1.roundToTick; } });
|
|
52
|
+
Object.defineProperty(exports, "TIMEFRAME_MS", { enumerable: true, get: function () { return base_1.TIMEFRAME_MS; } });
|
|
53
|
+
// ─── Adapters ─────────────────────────────────────────────────────────────
|
|
54
|
+
var okx_1 = require("./adapters/okx");
|
|
55
|
+
Object.defineProperty(exports, "OKXAdapter", { enumerable: true, get: function () { return okx_1.OKXAdapter; } });
|
|
56
|
+
var binance_1 = require("./adapters/binance");
|
|
57
|
+
Object.defineProperty(exports, "BinanceAdapter", { enumerable: true, get: function () { return binance_1.BinanceAdapter; } });
|
|
58
|
+
var bitget_1 = require("./adapters/bitget");
|
|
59
|
+
Object.defineProperty(exports, "BitgetAdapter", { enumerable: true, get: function () { return bitget_1.BitgetAdapter; } });
|
|
60
|
+
var hyperliquid_1 = require("./adapters/hyperliquid");
|
|
61
|
+
Object.defineProperty(exports, "HyperliquidAdapter", { enumerable: true, get: function () { return hyperliquid_1.HyperliquidAdapter; } });
|
|
62
|
+
// ─── Algorithms ───────────────────────────────────────────────────────────
|
|
63
|
+
var index_1 = require("./algorithms/index");
|
|
64
|
+
Object.defineProperty(exports, "TWAPExecutor", { enumerable: true, get: function () { return index_1.TWAPExecutor; } });
|
|
65
|
+
Object.defineProperty(exports, "VWAPExecutor", { enumerable: true, get: function () { return index_1.VWAPExecutor; } });
|
|
66
|
+
Object.defineProperty(exports, "IcebergExecutor", { enumerable: true, get: function () { return index_1.IcebergExecutor; } });
|
|
67
|
+
Object.defineProperty(exports, "BracketOrchestrator", { enumerable: true, get: function () { return index_1.BracketOrchestrator; } });
|
|
68
|
+
Object.defineProperty(exports, "TrailingStopMonitor", { enumerable: true, get: function () { return index_1.TrailingStopMonitor; } });
|
|
69
|
+
// ─── Executor ────────────────────────────────────────────────────────────
|
|
70
|
+
var core_1 = require("./executor/core");
|
|
71
|
+
Object.defineProperty(exports, "OrderEngine", { enumerable: true, get: function () { return core_1.OrderEngine; } });
|
|
72
|
+
var risk_1 = require("./executor/risk");
|
|
73
|
+
Object.defineProperty(exports, "RiskGuard", { enumerable: true, get: function () { return risk_1.RiskGuard; } });
|
|
74
|
+
var state_1 = require("./executor/state");
|
|
75
|
+
Object.defineProperty(exports, "OrderStateManager", { enumerable: true, get: function () { return state_1.OrderStateManager; } });
|
|
76
|
+
Object.defineProperty(exports, "applyTransition", { enumerable: true, get: function () { return state_1.applyTransition; } });
|
|
77
|
+
// ─── Registry / Factory ──────────────────────────────────────────────────
|
|
78
|
+
var registry_1 = require("./registry");
|
|
79
|
+
Object.defineProperty(exports, "createAdapter", { enumerable: true, get: function () { return registry_1.createAdapter; } });
|
|
80
|
+
Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return registry_1.createEngine; } });
|
|
81
|
+
Object.defineProperty(exports, "ExchangeRegistry", { enumerable: true, get: function () { return registry_1.ExchangeRegistry; } });
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/exchange/v2/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;;;AA2BH,wCAOyB;AANxB,2GAAA,mBAAmB,OAAA;AACnB,qGAAA,aAAa,OAAA;AAAE,8GAAA,sBAAsB,OAAA;AAAE,sGAAA,cAAc,OAAA;AACrD,0GAAA,kBAAkB,OAAA;AAAE,0GAAA,kBAAkB,OAAA;AACtC,qGAAA,aAAa,OAAA;AAAE,wGAAA,gBAAgB,OAAA;AAC/B,wGAAA,gBAAgB,OAAA;AAAE,+GAAA,uBAAuB,OAAA;AACzC,wGAAA,gBAAgB,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,mGAAA,WAAW,OAAA;AAAE,oGAAA,YAAY,OAAA;AAGzD,6EAA6E;AAC7E,sCAA4C;AAAnC,iGAAA,UAAU,OAAA;AACnB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AACvB,4CAAkD;AAAzC,uGAAA,aAAa,OAAA;AACtB,sDAA4D;AAAnD,iHAAA,kBAAkB,OAAA;AAG3B,6EAA6E;AAC7E,4CAG4B;AAF3B,qGAAA,YAAY,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,wGAAA,eAAe,OAAA;AAC3C,4GAAA,mBAAmB,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAIzC,4EAA4E;AAC5E,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,wCAA4C;AAAnC,iGAAA,SAAS,OAAA;AAClB,0CAAsE;AAA7D,0GAAA,iBAAiB,OAAA;AAAE,wGAAA,eAAe,OAAA;AAE3C,4EAA4E;AAC5E,uCAGoB;AAFnB,yGAAA,aAAa,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC3B,4GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Registry / Factory
|
|
3
|
+
* Creates exchange adapters and fully-configured OrderEngines.
|
|
4
|
+
*/
|
|
5
|
+
import { type HyperliquidSignerFn } from './adapters/hyperliquid';
|
|
6
|
+
import { OrderEngine } from './executor/core';
|
|
7
|
+
import type { IExchangeAdapter } from './adapters/base';
|
|
8
|
+
import type { ExchangeId, ExchangeCredentials, EngineConfig } from './types';
|
|
9
|
+
import type { Price } from '../../types/financial';
|
|
10
|
+
export interface AdapterOptions {
|
|
11
|
+
exchange: ExchangeId;
|
|
12
|
+
credentials: ExchangeCredentials;
|
|
13
|
+
/** Required for Hyperliquid — inject your EIP-712 signer */
|
|
14
|
+
hyperliquidSignerFn?: HyperliquidSignerFn;
|
|
15
|
+
}
|
|
16
|
+
export declare function createAdapter(options: AdapterOptions): IExchangeAdapter;
|
|
17
|
+
export declare function createEngine(adapterOptions: AdapterOptions, engineConfig?: Partial<Omit<EngineConfig, 'exchange' | 'credentials'>>): OrderEngine;
|
|
18
|
+
/**
|
|
19
|
+
* Manages multiple exchange engines in one registry.
|
|
20
|
+
* Useful for cross-exchange strategies and arbitrage.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ExchangeRegistry {
|
|
23
|
+
private engines;
|
|
24
|
+
/** Add or replace an engine by key (e.g. 'okx_main', 'binance_futures') */
|
|
25
|
+
add(key: string, options: AdapterOptions, engineConfig?: Partial<Omit<EngineConfig, 'exchange' | 'credentials'>>): OrderEngine;
|
|
26
|
+
get(key: string): OrderEngine;
|
|
27
|
+
has(key: string): boolean;
|
|
28
|
+
keys(): string[];
|
|
29
|
+
remove(key: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Fetch the same ticker from all registered engines in parallel.
|
|
32
|
+
* Useful for finding the best bid/ask across exchanges.
|
|
33
|
+
*/
|
|
34
|
+
fetchTickers(symbol: string): Promise<Map<string, import('./types').TickerInfo>>;
|
|
35
|
+
/**
|
|
36
|
+
* Find the best bid (sell into) and ask (buy from) across all registered exchanges.
|
|
37
|
+
* Returns: { bestBid: { key, price }, bestAsk: { key, price } }
|
|
38
|
+
*/
|
|
39
|
+
bestBidAsk(symbol: string): Promise<{
|
|
40
|
+
bestBid: {
|
|
41
|
+
key: string;
|
|
42
|
+
price: Price;
|
|
43
|
+
} | null;
|
|
44
|
+
bestAsk: {
|
|
45
|
+
key: string;
|
|
46
|
+
price: Price;
|
|
47
|
+
} | null;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/exchange/v2/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAInD,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,mBAAmB,CAAC;IACjC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC1C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB,CAcvE;AAID,wBAAgB,YAAY,CAC3B,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,GACpE,WAAW,CAQb;AAID;;;GAGG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,OAAO,CAAuC;IAEtD,2EAA2E;IAC3E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,aAAa,CAAC,CAAC,GAAG,WAAW;IAM9H,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAM7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,MAAM,EAAE;IAIhB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE,UAAU,CAAC,CAAC;IAatF;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACzC,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,GAAG,IAAI,CAAC;QAC9C,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,CAAA;SAAE,GAAG,IAAI,CAAC;KAC9C,CAAC;CAWF"}
|