@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,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrderEngine — Core Execution Engine
|
|
3
|
+
* The main entry point for all order operations.
|
|
4
|
+
* Handles: pre-checks, order submission, retry with backoff, state tracking,
|
|
5
|
+
* callback notifications, and algo order dispatch.
|
|
6
|
+
*/
|
|
7
|
+
import type { IExchangeAdapter } from '../adapters/base';
|
|
8
|
+
import type { Price, Quantity } from '../../../types/financial';
|
|
9
|
+
import type { EngineConfig, OrderRequest, OrderResponse, TrackedOrder, AlgoOrderResult, BracketOrderRequest, TwapParams, VwapParams, IcebergParams, AccountSnapshot, PositionInfo, TickerInfo, SymbolInfo, OHLCVBar, OrderBook, MarketType, BatchOrderRequest, AmendOrderRequest, OrderHistoryQuery, OrderHistoryResponse, TradeHistoryQuery, TradeHistoryResponse, CancelAllOrdersRequest, MarginModeRequest } from '../types';
|
|
10
|
+
export declare class OrderEngine {
|
|
11
|
+
private adapter;
|
|
12
|
+
private state;
|
|
13
|
+
private risk;
|
|
14
|
+
private config;
|
|
15
|
+
private retry;
|
|
16
|
+
private _twap?;
|
|
17
|
+
private _vwap?;
|
|
18
|
+
private _iceberg?;
|
|
19
|
+
private _bracket?;
|
|
20
|
+
private _trailing?;
|
|
21
|
+
private _rateLimiter;
|
|
22
|
+
private _circuitBreaker;
|
|
23
|
+
constructor(adapter: IExchangeAdapter, config: EngineConfig);
|
|
24
|
+
getTicker(symbol: string): Promise<TickerInfo>;
|
|
25
|
+
getSymbolInfo(symbol: string): Promise<SymbolInfo>;
|
|
26
|
+
getOHLCV(symbol: string, timeframe: string, limit?: number): Promise<OHLCVBar[]>;
|
|
27
|
+
getOrderBook(symbol: string, depth?: number): Promise<OrderBook>;
|
|
28
|
+
listSymbols(marketType: MarketType): Promise<string[]>;
|
|
29
|
+
getAccount(): Promise<AccountSnapshot>;
|
|
30
|
+
getPositions(symbol?: string): Promise<PositionInfo[]>;
|
|
31
|
+
setLeverage(symbol: string, leverage: number, marginMode?: 'cross' | 'isolated'): Promise<void>;
|
|
32
|
+
setMarginMode(request: MarginModeRequest): Promise<void>;
|
|
33
|
+
submitOrders(batch: BatchOrderRequest): Promise<TrackedOrder[]>;
|
|
34
|
+
amendOrder(request: AmendOrderRequest): Promise<TrackedOrder | null>;
|
|
35
|
+
cancelAllOrders(request?: CancelAllOrdersRequest): Promise<boolean>;
|
|
36
|
+
getOrderHistory(query: OrderHistoryQuery): Promise<OrderHistoryResponse>;
|
|
37
|
+
getFills(query: TradeHistoryQuery): Promise<TradeHistoryResponse>;
|
|
38
|
+
submitOrder(request: OrderRequest): Promise<TrackedOrder>;
|
|
39
|
+
cancelOrder(orderId: string, symbol: string): Promise<boolean>;
|
|
40
|
+
syncOrderStatus(orderId: string, symbol: string): Promise<TrackedOrder | null>;
|
|
41
|
+
getOpenOrders(symbol?: string): Promise<OrderResponse[]>;
|
|
42
|
+
executeTWAP(params: TwapParams): Promise<AlgoOrderResult>;
|
|
43
|
+
executeVWAP(params: VwapParams): Promise<AlgoOrderResult>;
|
|
44
|
+
executeIceberg(params: IcebergParams): Promise<AlgoOrderResult>;
|
|
45
|
+
executeBracket(request: BracketOrderRequest): Promise<import('../algorithms/index').BracketResult>;
|
|
46
|
+
monitorTrailingStop(params: {
|
|
47
|
+
symbol: string;
|
|
48
|
+
side: import('../types').OrderSide;
|
|
49
|
+
quantity: Quantity;
|
|
50
|
+
callbackRate: number;
|
|
51
|
+
activationPrice?: Price;
|
|
52
|
+
tickMs?: number;
|
|
53
|
+
maxDurationMs?: number;
|
|
54
|
+
}): Promise<import('../algorithms/index').TrailingStopState>;
|
|
55
|
+
getTrackedOrder(id: string): TrackedOrder | undefined;
|
|
56
|
+
listTrackedOrders(filter?: {
|
|
57
|
+
status?: import('../types').OrderStatus;
|
|
58
|
+
}): TrackedOrder[];
|
|
59
|
+
purgeOldOrders(maxAgeMs?: number): number;
|
|
60
|
+
getCircuitBreakerState(): import('./circuit-breaker').CircuitState;
|
|
61
|
+
getCircuitBreakerMetrics(): ReturnType<import('./circuit-breaker').CircuitBreaker['getMetrics']>;
|
|
62
|
+
private emitUpdate;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OrderEngine — Core Execution Engine
|
|
4
|
+
* The main entry point for all order operations.
|
|
5
|
+
* Handles: pre-checks, order submission, retry with backoff, state tracking,
|
|
6
|
+
* callback notifications, and algo order dispatch.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.OrderEngine = void 0;
|
|
10
|
+
const base_1 = require("../adapters/base");
|
|
11
|
+
const state_1 = require("./state");
|
|
12
|
+
const risk_1 = require("./risk");
|
|
13
|
+
const circuit_breaker_1 = require("./circuit-breaker");
|
|
14
|
+
const index_1 = require("../algorithms/index");
|
|
15
|
+
const DEFAULT_RETRY = {
|
|
16
|
+
maxAttempts: 3,
|
|
17
|
+
baseDelayMs: 500,
|
|
18
|
+
maxDelayMs: 10_000,
|
|
19
|
+
backoffFactor: 2,
|
|
20
|
+
retryOn: ['rate limit', 'timeout', 'network', '429', 'too many'],
|
|
21
|
+
noRetryOn: ['insufficient', 'invalid symbol', 'invalid order', 'minimum'],
|
|
22
|
+
};
|
|
23
|
+
class OrderEngine {
|
|
24
|
+
adapter;
|
|
25
|
+
state;
|
|
26
|
+
risk;
|
|
27
|
+
config;
|
|
28
|
+
retry;
|
|
29
|
+
// Algo executors (lazy-initialized)
|
|
30
|
+
_twap;
|
|
31
|
+
_vwap;
|
|
32
|
+
_iceberg;
|
|
33
|
+
_bracket;
|
|
34
|
+
_trailing;
|
|
35
|
+
// Rate limiter
|
|
36
|
+
_rateLimiter;
|
|
37
|
+
// Circuit breaker
|
|
38
|
+
_circuitBreaker;
|
|
39
|
+
constructor(adapter, config) {
|
|
40
|
+
this.adapter = adapter;
|
|
41
|
+
this.config = config;
|
|
42
|
+
this.state = new state_1.OrderStateManager();
|
|
43
|
+
this.risk = new risk_1.RiskGuard(config.riskLimits ?? {}, config.riskStatePersistence);
|
|
44
|
+
this.retry = { ...DEFAULT_RETRY, ...config.retryPolicy };
|
|
45
|
+
// Default: 10 orders/sec burst, 5 orders/sec sustained
|
|
46
|
+
this._rateLimiter = new TokenBucket(10, 5 / 1000);
|
|
47
|
+
this._circuitBreaker = new circuit_breaker_1.CircuitBreaker(config.circuitBreaker);
|
|
48
|
+
// Register rate limit callback for dynamic token bucket adjustment
|
|
49
|
+
if (adapter instanceof base_1.BaseExchangeAdapter) {
|
|
50
|
+
adapter['onRateLimit'] = (info) => {
|
|
51
|
+
const used = info.usedWeight ?? (info.weightLimit ?? 0) - (info.remaining ?? 0);
|
|
52
|
+
const limit = info.weightLimit ?? 1200;
|
|
53
|
+
const ratio = used / limit;
|
|
54
|
+
if (ratio > 0.8) {
|
|
55
|
+
// Reduce to 2 orders/sec sustained when near limit
|
|
56
|
+
this._rateLimiter.setRate(2 / 1000, 5);
|
|
57
|
+
console.warn(`[OrderEngine] Rate limit throttle: ${used}/${limit} (${(ratio * 100).toFixed(0)}%). Reduced to 2/s.`);
|
|
58
|
+
}
|
|
59
|
+
else if (ratio < 0.3) {
|
|
60
|
+
// Restore to normal when well below limit
|
|
61
|
+
this._rateLimiter.setRate(5 / 1000, 10);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ─── Market Data Passthrough ──────────────────────────────────────────────
|
|
67
|
+
getTicker(symbol) {
|
|
68
|
+
return this.adapter.getTicker(symbol);
|
|
69
|
+
}
|
|
70
|
+
getSymbolInfo(symbol) {
|
|
71
|
+
return this.adapter.getSymbolInfo(symbol);
|
|
72
|
+
}
|
|
73
|
+
getOHLCV(symbol, timeframe, limit) {
|
|
74
|
+
return this.adapter.getOHLCV(symbol, timeframe, limit);
|
|
75
|
+
}
|
|
76
|
+
getOrderBook(symbol, depth) {
|
|
77
|
+
return this.adapter.getOrderBook(symbol, depth);
|
|
78
|
+
}
|
|
79
|
+
listSymbols(marketType) {
|
|
80
|
+
return this.adapter.listSymbols(marketType);
|
|
81
|
+
}
|
|
82
|
+
// ─── Account ──────────────────────────────────────────────────────────────
|
|
83
|
+
getAccount() {
|
|
84
|
+
return this.adapter.getAccount();
|
|
85
|
+
}
|
|
86
|
+
getPositions(symbol) {
|
|
87
|
+
return this.adapter.getPositions(symbol);
|
|
88
|
+
}
|
|
89
|
+
async setLeverage(symbol, leverage, marginMode) {
|
|
90
|
+
if (this.adapter.setLeverage) {
|
|
91
|
+
await this.adapter.setLeverage(symbol, leverage, marginMode);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async setMarginMode(request) {
|
|
95
|
+
if (this.adapter.setMarginMode) {
|
|
96
|
+
await this.adapter.setMarginMode(request);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ─── Batch & Advanced Order Operations ────────────────────────────────────
|
|
100
|
+
async submitOrders(batch) {
|
|
101
|
+
if (!this.adapter.placeOrders) {
|
|
102
|
+
// Fallback to sequential submission
|
|
103
|
+
const tracked = [];
|
|
104
|
+
for (const req of batch.orders) {
|
|
105
|
+
try {
|
|
106
|
+
tracked.push(await this.submitOrder(req));
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
// Continue with remaining orders; caller can inspect state
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return tracked;
|
|
113
|
+
}
|
|
114
|
+
// Batch path
|
|
115
|
+
const results = [];
|
|
116
|
+
const rawBatch = { grouping: batch.grouping, orders: batch.orders.map(requestToRaw) };
|
|
117
|
+
const resp = await this.adapter.placeOrders(rawBatch);
|
|
118
|
+
for (let i = 0; i < resp.results.length; i++) {
|
|
119
|
+
const r = resp.results[i];
|
|
120
|
+
const clientOrderId = batch.orders[i].clientOrderId ?? (0, base_1.genClientOrderId)();
|
|
121
|
+
const tracked = this.state.register(clientOrderId, this.config.exchange, batch.orders[i]);
|
|
122
|
+
const bound = this.state.bind(clientOrderId, r.orderId) ?? tracked;
|
|
123
|
+
this.state.applyResponse(r.orderId, r);
|
|
124
|
+
this.risk.recordOrderOpened();
|
|
125
|
+
this.emitUpdate(bound);
|
|
126
|
+
results.push(bound);
|
|
127
|
+
}
|
|
128
|
+
for (const f of resp.failed) {
|
|
129
|
+
const clientOrderId = batch.orders[f.index].clientOrderId ?? '';
|
|
130
|
+
this.state.markError(clientOrderId, f.error);
|
|
131
|
+
const order = this.state.get(clientOrderId);
|
|
132
|
+
if (order)
|
|
133
|
+
this.emitUpdate(order);
|
|
134
|
+
}
|
|
135
|
+
return results;
|
|
136
|
+
}
|
|
137
|
+
async amendOrder(request) {
|
|
138
|
+
if (!this.adapter.amendOrder) {
|
|
139
|
+
throw new base_1.ExchangeError('amendOrder not supported by this exchange', this.config.exchange);
|
|
140
|
+
}
|
|
141
|
+
const resp = await this.adapter.amendOrder(request);
|
|
142
|
+
this.state.applyResponse(request.orderId, resp);
|
|
143
|
+
const tracked = this.state.get(request.orderId);
|
|
144
|
+
if (tracked)
|
|
145
|
+
this.emitUpdate(tracked);
|
|
146
|
+
return tracked ?? null;
|
|
147
|
+
}
|
|
148
|
+
async cancelAllOrders(request) {
|
|
149
|
+
if (!this.adapter.cancelAllOrders) {
|
|
150
|
+
throw new base_1.ExchangeError('cancelAllOrders not supported by this exchange', this.config.exchange);
|
|
151
|
+
}
|
|
152
|
+
const success = await this.adapter.cancelAllOrders(request);
|
|
153
|
+
if (success) {
|
|
154
|
+
// Mark all tracked open orders as cancelled for this symbol
|
|
155
|
+
const openOrders = this.state.list({ status: 'open' });
|
|
156
|
+
for (const o of openOrders) {
|
|
157
|
+
if (!request?.symbol || o.request.symbol === request.symbol) {
|
|
158
|
+
this.state.transition(o.orderId, 'cancelled');
|
|
159
|
+
this.risk.recordOrderClosed();
|
|
160
|
+
this.emitUpdate(o);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return success;
|
|
165
|
+
}
|
|
166
|
+
async getOrderHistory(query) {
|
|
167
|
+
if (!this.adapter.getOrderHistory) {
|
|
168
|
+
throw new base_1.ExchangeError('getOrderHistory not supported by this exchange', this.config.exchange);
|
|
169
|
+
}
|
|
170
|
+
return this.adapter.getOrderHistory(query);
|
|
171
|
+
}
|
|
172
|
+
async getFills(query) {
|
|
173
|
+
if (!this.adapter.getFills) {
|
|
174
|
+
throw new base_1.ExchangeError('getFills not supported by this exchange', this.config.exchange);
|
|
175
|
+
}
|
|
176
|
+
return this.adapter.getFills(query);
|
|
177
|
+
}
|
|
178
|
+
// ─── Standard Order Execution ─────────────────────────────────────────────
|
|
179
|
+
async submitOrder(request) {
|
|
180
|
+
const clientOrderId = request.clientOrderId ?? (0, base_1.genClientOrderId)();
|
|
181
|
+
request = { ...request, clientOrderId };
|
|
182
|
+
// 0. Circuit breaker check
|
|
183
|
+
if (!this._circuitBreaker.canExecute()) {
|
|
184
|
+
throw new base_1.ExchangeError('Circuit breaker is open', this.config.exchange);
|
|
185
|
+
}
|
|
186
|
+
// 1. Rate limit check
|
|
187
|
+
if (!this._rateLimiter.tryConsume(1)) {
|
|
188
|
+
this._circuitBreaker.recordFailure();
|
|
189
|
+
throw new base_1.ExchangeError('Order rate limit exceeded', this.config.exchange);
|
|
190
|
+
}
|
|
191
|
+
// 1. Register in state manager
|
|
192
|
+
const tracked = this.state.register(clientOrderId, this.config.exchange, request);
|
|
193
|
+
// 2. Fetch symbol info for validation & rounding
|
|
194
|
+
let symbolInfo = null;
|
|
195
|
+
try {
|
|
196
|
+
symbolInfo = await this.adapter.getSymbolInfo(request.symbol);
|
|
197
|
+
}
|
|
198
|
+
catch { /* proceed without symbol info */ }
|
|
199
|
+
// 3. Pre-flight validation (precision, min qty, etc.)
|
|
200
|
+
if (symbolInfo && this.adapter.validateOrder) {
|
|
201
|
+
const rawParams = requestToRaw(request);
|
|
202
|
+
const validationErrors = await this.adapter.validateOrder(rawParams, symbolInfo);
|
|
203
|
+
if (validationErrors.length > 0) {
|
|
204
|
+
const reason = validationErrors.join('; ');
|
|
205
|
+
this.state.markError(clientOrderId, `Validation failed: ${reason}`);
|
|
206
|
+
const order = this.state.get(clientOrderId);
|
|
207
|
+
this.emitUpdate(order);
|
|
208
|
+
throw new base_1.ExchangeError(`Order validation failed: ${reason}`, this.config.exchange);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// 4. Auto-round quantity and price to exchange precision
|
|
212
|
+
if (symbolInfo) {
|
|
213
|
+
if ('quantity' in request && request.quantity !== undefined) {
|
|
214
|
+
request.quantity = (0, base_1.roundToStep)(request.quantity, symbolInfo.stepSize);
|
|
215
|
+
}
|
|
216
|
+
if ('price' in request && request.price !== undefined) {
|
|
217
|
+
request.price = (0, base_1.roundToTick)(request.price, symbolInfo.tickSize);
|
|
218
|
+
}
|
|
219
|
+
if ('entryPrice' in request && request.entryPrice !== undefined) {
|
|
220
|
+
request.entryPrice = (0, base_1.roundToTick)(request.entryPrice, symbolInfo.tickSize);
|
|
221
|
+
}
|
|
222
|
+
if ('stopPrice' in request && request.stopPrice !== undefined) {
|
|
223
|
+
request.stopPrice = (0, base_1.roundToTick)(request.stopPrice, symbolInfo.tickSize);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// 5. Risk check
|
|
227
|
+
let ticker = null;
|
|
228
|
+
try {
|
|
229
|
+
ticker = await this.adapter.getTicker(request.symbol);
|
|
230
|
+
}
|
|
231
|
+
catch { /* proceed without ticker */ }
|
|
232
|
+
// Conservative mode: if ticker fails, reject market orders and warn on others
|
|
233
|
+
if (!ticker && request.type === 'market') {
|
|
234
|
+
this.state.markError(clientOrderId, 'Market order blocked: unable to fetch ticker for slippage check');
|
|
235
|
+
const order = this.state.get(clientOrderId);
|
|
236
|
+
this.emitUpdate(order);
|
|
237
|
+
throw new base_1.ExchangeError('Market order blocked: unable to fetch ticker for slippage check', this.config.exchange);
|
|
238
|
+
}
|
|
239
|
+
const riskResult = await this.risk.check(request, ticker);
|
|
240
|
+
if (!riskResult.passed) {
|
|
241
|
+
const reason = riskResult.results.map(r => r.message).join('; ');
|
|
242
|
+
this.state.markError(clientOrderId, `Risk block: ${reason}`);
|
|
243
|
+
const order = this.state.get(clientOrderId);
|
|
244
|
+
this.emitUpdate(order);
|
|
245
|
+
throw new base_1.ExchangeError(`Order blocked by risk guard: ${reason}`, this.config.exchange);
|
|
246
|
+
}
|
|
247
|
+
// Use adjusted request if risk guard reduced quantity
|
|
248
|
+
const effectiveRequest = riskResult.adjustedRequest ?? request;
|
|
249
|
+
// 6. Submit with retry
|
|
250
|
+
let lastError;
|
|
251
|
+
for (let attempt = 0; attempt < this.retry.maxAttempts; attempt++) {
|
|
252
|
+
if (attempt > 0) {
|
|
253
|
+
const delay = Math.min(this.retry.baseDelayMs * Math.pow(this.retry.backoffFactor, attempt - 1), this.retry.maxDelayMs);
|
|
254
|
+
await sleep(delay);
|
|
255
|
+
this.state.incrementRetry(clientOrderId);
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
// Convert high-level request to raw adapter params
|
|
259
|
+
const rawParams = requestToRaw(effectiveRequest);
|
|
260
|
+
const response = await this.adapter.placeOrder(rawParams);
|
|
261
|
+
// Bind exchange orderId to our tracking
|
|
262
|
+
const bound = this.state.bind(clientOrderId, response.orderId) ?? tracked;
|
|
263
|
+
this.state.applyResponse(response.orderId, response);
|
|
264
|
+
this.risk.recordOrderOpened();
|
|
265
|
+
this._circuitBreaker.recordSuccess();
|
|
266
|
+
this.emitUpdate(bound);
|
|
267
|
+
return bound;
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
lastError = err;
|
|
271
|
+
const msg = lastError.message?.toLowerCase() ?? '';
|
|
272
|
+
// Never retry on these
|
|
273
|
+
const noRetry = this.retry.noRetryOn?.some(s => msg.includes(s.toLowerCase()));
|
|
274
|
+
if (noRetry || err instanceof base_1.InsufficientFundsError) {
|
|
275
|
+
this.state.markError(clientOrderId, lastError.message);
|
|
276
|
+
this._circuitBreaker.recordFailure();
|
|
277
|
+
const order = this.state.get(clientOrderId);
|
|
278
|
+
this.emitUpdate(order);
|
|
279
|
+
throw lastError;
|
|
280
|
+
}
|
|
281
|
+
// Rate limit hit: halve the token bucket rate and retry
|
|
282
|
+
if (err instanceof base_1.RateLimitError) {
|
|
283
|
+
const currentRate = 5 / 1000; // default
|
|
284
|
+
this._rateLimiter.setRate(currentRate / 2, 5);
|
|
285
|
+
console.warn(`[OrderEngine] RateLimitError: halving rate to ${(currentRate / 2 * 1000).toFixed(1)}/s. Retry ${attempt + 1}/${this.retry.maxAttempts}`);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
// Only retry on known transient errors
|
|
289
|
+
const shouldRetry = this.retry.retryOn?.some(s => msg.includes(s.toLowerCase()));
|
|
290
|
+
if (!shouldRetry) {
|
|
291
|
+
this.state.markError(clientOrderId, lastError.message);
|
|
292
|
+
this._circuitBreaker.recordFailure();
|
|
293
|
+
const order = this.state.get(clientOrderId);
|
|
294
|
+
this.emitUpdate(order);
|
|
295
|
+
throw lastError;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// All retries exhausted
|
|
300
|
+
this.state.markError(clientOrderId, lastError?.message ?? 'Max retries exceeded');
|
|
301
|
+
this._circuitBreaker.recordFailure();
|
|
302
|
+
const order = this.state.get(clientOrderId);
|
|
303
|
+
this.emitUpdate(order);
|
|
304
|
+
throw lastError ?? new Error('Order submission failed after max retries');
|
|
305
|
+
}
|
|
306
|
+
async cancelOrder(orderId, symbol) {
|
|
307
|
+
const success = await this.adapter.cancelOrder(orderId, symbol);
|
|
308
|
+
if (success) {
|
|
309
|
+
this.state.transition(orderId, 'cancelled');
|
|
310
|
+
const order = this.state.get(orderId);
|
|
311
|
+
if (order) {
|
|
312
|
+
this.risk.recordOrderClosed();
|
|
313
|
+
this.emitUpdate(order);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return success;
|
|
317
|
+
}
|
|
318
|
+
async syncOrderStatus(orderId, symbol) {
|
|
319
|
+
const response = await this.adapter.getOrderStatus(orderId, symbol);
|
|
320
|
+
this.state.applyResponse(orderId, response);
|
|
321
|
+
const tracked = this.state.get(orderId);
|
|
322
|
+
if (tracked) {
|
|
323
|
+
if (['filled', 'partially_filled', 'cancelled', 'rejected', 'expired'].includes(response.status)) {
|
|
324
|
+
this.risk.recordOrderClosed();
|
|
325
|
+
}
|
|
326
|
+
this.emitUpdate(tracked);
|
|
327
|
+
}
|
|
328
|
+
return tracked ?? null;
|
|
329
|
+
}
|
|
330
|
+
async getOpenOrders(symbol) {
|
|
331
|
+
return this.adapter.getOpenOrders(symbol);
|
|
332
|
+
}
|
|
333
|
+
// ─── Algo Order Dispatch ──────────────────────────────────────────────────
|
|
334
|
+
async executeTWAP(params) {
|
|
335
|
+
if (!this._twap)
|
|
336
|
+
this._twap = new index_1.TWAPExecutor(this.adapter);
|
|
337
|
+
return this._twap.execute(params);
|
|
338
|
+
}
|
|
339
|
+
async executeVWAP(params) {
|
|
340
|
+
if (!this._vwap)
|
|
341
|
+
this._vwap = new index_1.VWAPExecutor(this.adapter);
|
|
342
|
+
return this._vwap.execute(params);
|
|
343
|
+
}
|
|
344
|
+
async executeIceberg(params) {
|
|
345
|
+
if (!this._iceberg)
|
|
346
|
+
this._iceberg = new index_1.IcebergExecutor(this.adapter);
|
|
347
|
+
return this._iceberg.execute(params);
|
|
348
|
+
}
|
|
349
|
+
async executeBracket(request) {
|
|
350
|
+
if (!this._bracket)
|
|
351
|
+
this._bracket = new index_1.BracketOrchestrator(this.adapter);
|
|
352
|
+
return this._bracket.execute({
|
|
353
|
+
symbol: request.symbol,
|
|
354
|
+
side: request.side,
|
|
355
|
+
quantity: request.quantity,
|
|
356
|
+
entryType: request.entryType,
|
|
357
|
+
entryPrice: request.entryPrice,
|
|
358
|
+
takeProfitPrice: request.takeProfitPrice,
|
|
359
|
+
stopLossPrice: request.stopLossPrice,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
async monitorTrailingStop(params) {
|
|
363
|
+
if (!this._trailing)
|
|
364
|
+
this._trailing = new index_1.TrailingStopMonitor(this.adapter);
|
|
365
|
+
return this._trailing.monitor(params);
|
|
366
|
+
}
|
|
367
|
+
// ─── State Queries ────────────────────────────────────────────────────────
|
|
368
|
+
getTrackedOrder(id) {
|
|
369
|
+
return this.state.get(id);
|
|
370
|
+
}
|
|
371
|
+
listTrackedOrders(filter) {
|
|
372
|
+
return this.state.list(filter);
|
|
373
|
+
}
|
|
374
|
+
purgeOldOrders(maxAgeMs) {
|
|
375
|
+
return this.state.purge(maxAgeMs);
|
|
376
|
+
}
|
|
377
|
+
getCircuitBreakerState() {
|
|
378
|
+
return this._circuitBreaker.getState();
|
|
379
|
+
}
|
|
380
|
+
getCircuitBreakerMetrics() {
|
|
381
|
+
return this._circuitBreaker.getMetrics();
|
|
382
|
+
}
|
|
383
|
+
// ─── Internal ────────────────────────────────────────────────────────────
|
|
384
|
+
emitUpdate(order) {
|
|
385
|
+
if (this.config.onOrderUpdate) {
|
|
386
|
+
Promise.resolve(this.config.onOrderUpdate(order)).catch(e => {
|
|
387
|
+
this.config.onError?.(e, order);
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
exports.OrderEngine = OrderEngine;
|
|
393
|
+
// ─── Request Conversion ───────────────────────────────────────────────────
|
|
394
|
+
function requestToRaw(req) {
|
|
395
|
+
const base = {
|
|
396
|
+
symbol: req.symbol,
|
|
397
|
+
side: req.side,
|
|
398
|
+
type: req.type,
|
|
399
|
+
reduceOnly: req.reduceOnly,
|
|
400
|
+
positionSide: req.positionSide,
|
|
401
|
+
clientOrderId: req.clientOrderId,
|
|
402
|
+
};
|
|
403
|
+
switch (req.type) {
|
|
404
|
+
case 'market':
|
|
405
|
+
return { ...base, quantity: req.quantity, quoteQuantity: req.quoteQuantity };
|
|
406
|
+
case 'limit':
|
|
407
|
+
return { ...base, quantity: req.quantity, price: req.price, timeInForce: req.timeInForce, postOnly: req.postOnly };
|
|
408
|
+
case 'stop_market':
|
|
409
|
+
case 'stop_limit':
|
|
410
|
+
case 'take_profit_market':
|
|
411
|
+
case 'take_profit_limit':
|
|
412
|
+
return { ...base, quantity: req.quantity, stopPrice: req.stopPrice, price: req.price, timeInForce: req.timeInForce };
|
|
413
|
+
case 'trailing_stop':
|
|
414
|
+
return { ...base, quantity: req.quantity, extra: { callbackRate: req.callbackRate, callbackValue: req.callbackValue, activationPrice: req.activationPrice } };
|
|
415
|
+
case 'bracket':
|
|
416
|
+
return {
|
|
417
|
+
...base, quantity: req.quantity, price: req.entryPrice,
|
|
418
|
+
extra: { entryType: req.entryType, takeProfitPrice: req.takeProfitPrice, stopLossPrice: req.stopLossPrice },
|
|
419
|
+
};
|
|
420
|
+
case 'oco':
|
|
421
|
+
return { ...base, quantity: req.quantity, price: req.price, stopPrice: req.stopPrice, extra: { stopLimitPrice: req.stopLimitPrice } };
|
|
422
|
+
default:
|
|
423
|
+
return { ...base, quantity: req.quantity };
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
function sleep(ms) {
|
|
427
|
+
return new Promise(r => setTimeout(r, ms));
|
|
428
|
+
}
|
|
429
|
+
// ─── Token Bucket Rate Limiter ────────────────────────────────────────────
|
|
430
|
+
class TokenBucket {
|
|
431
|
+
maxTokens;
|
|
432
|
+
refillRatePerMs;
|
|
433
|
+
tokens;
|
|
434
|
+
lastRefill;
|
|
435
|
+
constructor(maxTokens, refillRatePerMs) {
|
|
436
|
+
this.maxTokens = maxTokens;
|
|
437
|
+
this.refillRatePerMs = refillRatePerMs;
|
|
438
|
+
this.tokens = maxTokens;
|
|
439
|
+
this.lastRefill = Date.now();
|
|
440
|
+
}
|
|
441
|
+
setRate(ratePerMs, maxTokens) {
|
|
442
|
+
this.refillRatePerMs = ratePerMs;
|
|
443
|
+
if (maxTokens !== undefined)
|
|
444
|
+
this.maxTokens = maxTokens;
|
|
445
|
+
}
|
|
446
|
+
tryConsume(amount = 1) {
|
|
447
|
+
const now = Date.now();
|
|
448
|
+
const elapsed = now - this.lastRefill;
|
|
449
|
+
this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRatePerMs);
|
|
450
|
+
this.lastRefill = now;
|
|
451
|
+
if (this.tokens >= amount) {
|
|
452
|
+
this.tokens -= amount;
|
|
453
|
+
return true;
|
|
454
|
+
}
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk Guard — Pre-execution checks
|
|
3
|
+
* Validates every order against configurable risk limits before sending to exchange.
|
|
4
|
+
*/
|
|
5
|
+
import type { Pnl } from '../../../types/financial';
|
|
6
|
+
import type { OrderRequest, RiskLimits, RiskCheckResult, TickerInfo } from '../types';
|
|
7
|
+
export interface RiskStateSnapshot {
|
|
8
|
+
dailyLoss: number;
|
|
9
|
+
openOrders: number;
|
|
10
|
+
}
|
|
11
|
+
export interface RiskStatePersistence {
|
|
12
|
+
load: () => RiskStateSnapshot | Promise<RiskStateSnapshot>;
|
|
13
|
+
save: (state: RiskStateSnapshot) => void | Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare class RiskGuard {
|
|
16
|
+
private limits;
|
|
17
|
+
private dailyLoss;
|
|
18
|
+
private openOrderCount;
|
|
19
|
+
private persistence?;
|
|
20
|
+
constructor(limits: RiskLimits, persistence?: RiskStatePersistence);
|
|
21
|
+
private _save;
|
|
22
|
+
/** Update running daily loss tracker (call on each filled order PnL) */
|
|
23
|
+
recordPnl(pnl: Pnl): void;
|
|
24
|
+
recordOrderOpened(): void;
|
|
25
|
+
recordOrderClosed(): void;
|
|
26
|
+
resetDailyStats(): void;
|
|
27
|
+
check(order: OrderRequest, ticker: TickerInfo | null): Promise<RiskCheckResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/risk.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAmB,GAAG,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EAGf,UAAU,EACV,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,qBAAa,SAAS;IAKT,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAC,CAAuB;gBAEvB,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,oBAAoB;IAa1E,OAAO,CAAC,KAAK;IAOb,wEAAwE;IACxE,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAKzB,iBAAiB,IAAI,IAAI;IACzB,iBAAiB,IAAI,IAAI;IAEzB,eAAe,IAAI,IAAI;IAKjB,KAAK,CACV,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,UAAU,GAAG,IAAI,GACvB,OAAO,CAAC,eAAe,CAAC;CAyF3B"}
|