@123456btc/123456btc-cli 1.0.4 → 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.
Files changed (147) hide show
  1. package/dist/api/auth.js +2 -2
  2. package/dist/api/auth.js.map +1 -1
  3. package/dist/api/client.d.ts +10 -6
  4. package/dist/api/client.d.ts.map +1 -1
  5. package/dist/api/client.js +62 -19
  6. package/dist/api/client.js.map +1 -1
  7. package/dist/api/client.test.js +24 -16
  8. package/dist/api/client.test.js.map +1 -1
  9. package/dist/api/signals.d.ts +3 -3
  10. package/dist/api/signals.d.ts.map +1 -1
  11. package/dist/api/signals.js +3 -3
  12. package/dist/api/signals.js.map +1 -1
  13. package/dist/api/strategy-stream.d.ts +4 -9
  14. package/dist/api/strategy-stream.d.ts.map +1 -1
  15. package/dist/api/strategy-stream.js +14 -13
  16. package/dist/api/strategy-stream.js.map +1 -1
  17. package/dist/api/strategy.d.ts +3 -1
  18. package/dist/api/strategy.d.ts.map +1 -1
  19. package/dist/api/strategy.js +3 -1
  20. package/dist/api/strategy.js.map +1 -1
  21. package/dist/api/token-manager.d.ts.map +1 -1
  22. package/dist/api/token-manager.js +4 -0
  23. package/dist/api/token-manager.js.map +1 -1
  24. package/dist/cli.js +5 -47
  25. package/dist/cli.js.map +1 -1
  26. package/dist/commands/auth.d.ts.map +1 -1
  27. package/dist/commands/auth.js +27 -93
  28. package/dist/commands/auth.js.map +1 -1
  29. package/dist/commands/exchange.d.ts +3 -0
  30. package/dist/commands/exchange.d.ts.map +1 -0
  31. package/dist/commands/exchange.js +141 -0
  32. package/dist/commands/exchange.js.map +1 -0
  33. package/dist/commands/gas.d.ts.map +1 -1
  34. package/dist/commands/gas.js +3 -2
  35. package/dist/commands/gas.js.map +1 -1
  36. package/dist/commands/health.d.ts.map +1 -1
  37. package/dist/commands/health.js +5 -3
  38. package/dist/commands/health.js.map +1 -1
  39. package/dist/commands/provider.d.ts.map +1 -1
  40. package/dist/commands/provider.js +17 -20
  41. package/dist/commands/provider.js.map +1 -1
  42. package/dist/commands/signals.d.ts.map +1 -1
  43. package/dist/commands/signals.js +10 -9
  44. package/dist/commands/signals.js.map +1 -1
  45. package/dist/commands/strategy.d.ts.map +1 -1
  46. package/dist/commands/strategy.js +184 -10
  47. package/dist/commands/strategy.js.map +1 -1
  48. package/dist/commands/tier.d.ts.map +1 -1
  49. package/dist/commands/tier.js +3 -2
  50. package/dist/commands/tier.js.map +1 -1
  51. package/dist/commands/vault.d.ts.map +1 -1
  52. package/dist/commands/vault.js +5 -3
  53. package/dist/commands/vault.js.map +1 -1
  54. package/dist/commands/wallet.d.ts.map +1 -1
  55. package/dist/commands/wallet.js +3 -2
  56. package/dist/commands/wallet.js.map +1 -1
  57. package/dist/config/strategy-exchange.d.ts +30 -0
  58. package/dist/config/strategy-exchange.d.ts.map +1 -0
  59. package/dist/config/strategy-exchange.js +130 -0
  60. package/dist/config/strategy-exchange.js.map +1 -0
  61. package/dist/config.d.ts +11 -4
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +28 -56
  64. package/dist/config.js.map +1 -1
  65. package/dist/exchange/index.d.ts +106 -0
  66. package/dist/exchange/index.d.ts.map +1 -0
  67. package/dist/exchange/index.js +43 -0
  68. package/dist/exchange/index.js.map +1 -0
  69. package/dist/exchange/v2/adapters/base.d.ts +130 -0
  70. package/dist/exchange/v2/adapters/base.d.ts.map +1 -0
  71. package/dist/exchange/v2/adapters/base.js +296 -0
  72. package/dist/exchange/v2/adapters/base.js.map +1 -0
  73. package/dist/exchange/v2/adapters/binance.d.ts +51 -0
  74. package/dist/exchange/v2/adapters/binance.d.ts.map +1 -0
  75. package/dist/exchange/v2/adapters/binance.js +549 -0
  76. package/dist/exchange/v2/adapters/binance.js.map +1 -0
  77. package/dist/exchange/v2/adapters/bitget.d.ts +43 -0
  78. package/dist/exchange/v2/adapters/bitget.d.ts.map +1 -0
  79. package/dist/exchange/v2/adapters/bitget.js +524 -0
  80. package/dist/exchange/v2/adapters/bitget.js.map +1 -0
  81. package/dist/exchange/v2/adapters/hyperliquid.d.ts +102 -0
  82. package/dist/exchange/v2/adapters/hyperliquid.d.ts.map +1 -0
  83. package/dist/exchange/v2/adapters/hyperliquid.js +536 -0
  84. package/dist/exchange/v2/adapters/hyperliquid.js.map +1 -0
  85. package/dist/exchange/v2/adapters/okx.d.ts +38 -0
  86. package/dist/exchange/v2/adapters/okx.d.ts.map +1 -0
  87. package/dist/exchange/v2/adapters/okx.js +437 -0
  88. package/dist/exchange/v2/adapters/okx.js.map +1 -0
  89. package/dist/exchange/v2/algorithms/index.d.ts +78 -0
  90. package/dist/exchange/v2/algorithms/index.d.ts.map +1 -0
  91. package/dist/exchange/v2/algorithms/index.js +441 -0
  92. package/dist/exchange/v2/algorithms/index.js.map +1 -0
  93. package/dist/exchange/v2/executor/circuit-breaker.d.ts +44 -0
  94. package/dist/exchange/v2/executor/circuit-breaker.d.ts.map +1 -0
  95. package/dist/exchange/v2/executor/circuit-breaker.js +90 -0
  96. package/dist/exchange/v2/executor/circuit-breaker.js.map +1 -0
  97. package/dist/exchange/v2/executor/core.d.ts +64 -0
  98. package/dist/exchange/v2/executor/core.d.ts.map +1 -0
  99. package/dist/exchange/v2/executor/core.js +458 -0
  100. package/dist/exchange/v2/executor/core.js.map +1 -0
  101. package/dist/exchange/v2/executor/risk.d.ts +29 -0
  102. package/dist/exchange/v2/executor/risk.d.ts.map +1 -0
  103. package/dist/exchange/v2/executor/risk.js +144 -0
  104. package/dist/exchange/v2/executor/risk.js.map +1 -0
  105. package/dist/exchange/v2/executor/state.d.ts +29 -0
  106. package/dist/exchange/v2/executor/state.d.ts.map +1 -0
  107. package/dist/exchange/v2/executor/state.js +171 -0
  108. package/dist/exchange/v2/executor/state.js.map +1 -0
  109. package/dist/exchange/v2/index.d.ts +50 -0
  110. package/dist/exchange/v2/index.d.ts.map +1 -0
  111. package/dist/exchange/v2/index.js +82 -0
  112. package/dist/exchange/v2/index.js.map +1 -0
  113. package/dist/exchange/v2/registry.d.ts +50 -0
  114. package/dist/exchange/v2/registry.d.ts.map +1 -0
  115. package/dist/exchange/v2/registry.js +101 -0
  116. package/dist/exchange/v2/registry.js.map +1 -0
  117. package/dist/exchange/v2/types.d.ts +413 -0
  118. package/dist/exchange/v2/types.d.ts.map +1 -0
  119. package/dist/exchange/v2/types.js +3 -0
  120. package/dist/exchange/v2/types.js.map +1 -0
  121. package/dist/index.d.ts +105 -23
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +40 -39
  124. package/dist/index.js.map +1 -1
  125. package/dist/session/store.d.ts +25 -0
  126. package/dist/session/store.d.ts.map +1 -0
  127. package/dist/session/store.js +108 -0
  128. package/dist/session/store.js.map +1 -0
  129. package/dist/session/store.test.d.ts +2 -0
  130. package/dist/session/store.test.d.ts.map +1 -0
  131. package/dist/session/store.test.js +118 -0
  132. package/dist/session/store.test.js.map +1 -0
  133. package/dist/types/financial.d.ts +14 -0
  134. package/dist/types/financial.d.ts.map +1 -0
  135. package/dist/types/financial.js +6 -0
  136. package/dist/types/financial.js.map +1 -0
  137. package/dist/utils/auth.d.ts +1 -1
  138. package/dist/utils/auth.d.ts.map +1 -1
  139. package/dist/utils/auth.js +5 -5
  140. package/dist/utils/auth.js.map +1 -1
  141. package/dist/vault/crypto.js +3 -3
  142. package/dist/vault/crypto.js.map +1 -1
  143. package/dist/vault/index.d.ts +28 -0
  144. package/dist/vault/index.d.ts.map +1 -1
  145. package/dist/vault/index.js +70 -0
  146. package/dist/vault/index.js.map +1 -1
  147. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/algorithms/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACX,SAAS,EAIT,eAAe,EACf,UAAU,EACV,UAAU,EACV,aAAa,EACb,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAsCrE,qBAAa,YAAY;IACZ,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEvC,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;CAoF3D;AAID,qBAAa,YAAY;IACZ,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEvC,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;CAqE3D;AAID,qBAAa,eAAe;IACf,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEvC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;CAsE9D;AAID,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;CAC7D;AAED,qBAAa,mBAAmB;IACnB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAE7C;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,SAAS,CAAC;QAChB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,KAAK,CAAC;QACxB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAwE9B;AAID,MAAM,WAAW,aAAa;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;IAC7D,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,mBAAmB;IACnB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,gBAAgB;IAEvC,OAAO,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,SAAS,CAAC;QAChB,QAAQ,EAAE,QAAQ,CAAC;QACnB,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC;QAC9B,UAAU,CAAC,EAAE,KAAK,CAAC;QACnB,eAAe,EAAE,KAAK,CAAC;QACvB,aAAa,EAAE,KAAK,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,aAAa,CAAC;IA4D1B,iFAAiF;IAC3E,OAAO,CACZ,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,SAAO,EACb,aAAa,SAAsB,GACjC,OAAO,CAAC,aAAa,CAAC;CAqCzB"}
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ /**
3
+ * Institutional Algorithm Execution Layer
4
+ * Provides: TWAP, VWAP, Iceberg, Trailing Stop, Bracket
5
+ * All algorithms are exchange-agnostic — they call the IExchangeAdapter interface.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BracketOrchestrator = exports.TrailingStopMonitor = exports.IcebergExecutor = exports.VWAPExecutor = exports.TWAPExecutor = void 0;
9
+ // ─── Shared Utilities ─────────────────────────────────────────────────────
10
+ function sleep(ms) {
11
+ return new Promise(r => setTimeout(r, ms));
12
+ }
13
+ function genAlgoId() {
14
+ return `algo_${Date.now()}_${crypto.randomUUID().replace(/-/g, '').slice(0, 7)}`;
15
+ }
16
+ function buildResult(params, algoId, type, slices, error) {
17
+ const filled = slices.filter(s => s.status === 'filled' || s.status === 'partially_filled');
18
+ const filledQty = filled.reduce((s, sl) => s + sl.filledQuantity, 0);
19
+ const totalValue = filled.reduce((s, sl) => s + sl.filledQuantity * (sl.avgFillPrice ?? sl.price ?? 0), 0);
20
+ const avgFillPrice = filledQty > 0 ? totalValue / filledQty : 0;
21
+ const allDone = slices.every(s => ['filled', 'cancelled', 'failed', 'rejected'].includes(s.status));
22
+ return {
23
+ algoId, type, symbol: params.symbol, side: params.side,
24
+ totalQuantity: params.totalQuantity, filledQuantity: filledQty,
25
+ avgFillPrice, slices,
26
+ status: error ? 'failed' : allDone && filledQty >= params.totalQuantity * 0.99 ? 'completed' : allDone ? 'cancelled' : 'running',
27
+ startedAt: slices[0]?.executedAt ?? Date.now(),
28
+ completedAt: allDone ? Date.now() : undefined,
29
+ error,
30
+ };
31
+ }
32
+ // ─── TWAP ────────────────────────────────────────────────────────────────
33
+ class TWAPExecutor {
34
+ adapter;
35
+ constructor(adapter) {
36
+ this.adapter = adapter;
37
+ }
38
+ async execute(params) {
39
+ const algoId = genAlgoId();
40
+ const slices = [];
41
+ const sliceQty = params.totalQuantity / params.intervals;
42
+ const intervalMs = params.durationMs / params.intervals;
43
+ for (let i = 0; i < params.intervals; i++) {
44
+ const sliceStart = Date.now();
45
+ try {
46
+ // Get current price for limit placement
47
+ const ticker = await this.adapter.getTicker(params.symbol);
48
+ const midPrice = (ticker.bid + ticker.ask) / 2;
49
+ // Apply price limit guard
50
+ if (params.priceLimit !== undefined) {
51
+ const overLimit = params.side === 'buy'
52
+ ? midPrice > params.priceLimit
53
+ : midPrice < params.priceLimit;
54
+ if (overLimit) {
55
+ slices.push({
56
+ sliceIndex: i, orderId: '', quantity: sliceQty, price: midPrice,
57
+ status: 'cancelled', filledQuantity: 0, executedAt: Date.now(),
58
+ });
59
+ continue;
60
+ }
61
+ }
62
+ // Place at best bid/ask for passive execution
63
+ const slicePrice = params.side === 'buy'
64
+ ? ticker.bid // join the bid (passive)
65
+ : ticker.ask; // join the ask (passive)
66
+ const order = await this.adapter.placeOrder({
67
+ symbol: params.symbol,
68
+ side: params.side,
69
+ type: 'limit',
70
+ quantity: sliceQty,
71
+ price: slicePrice,
72
+ timeInForce: 'IOC', // IOC ensures we don't leave resting slices
73
+ });
74
+ // Short wait for fill confirmation
75
+ await sleep(200);
76
+ const final = await this.adapter.getOrderStatus(order.orderId, params.symbol);
77
+ slices.push({
78
+ sliceIndex: i, orderId: final.orderId,
79
+ quantity: sliceQty, price: slicePrice,
80
+ status: final.status, filledQuantity: final.filledQuantity,
81
+ avgFillPrice: final.avgFillPrice, executedAt: Date.now(),
82
+ });
83
+ // If slice missed (IOC not filled), try market as fallback on last slice
84
+ if (i === params.intervals - 1 && final.filledQuantity < sliceQty * 0.5) {
85
+ const remaining = sliceQty - (final.filledQuantity ?? 0);
86
+ if (remaining > 0) {
87
+ const mktOrder = await this.adapter.placeOrder({
88
+ symbol: params.symbol, side: params.side, type: 'market', quantity: remaining,
89
+ });
90
+ slices.push({
91
+ sliceIndex: i + 0.5, orderId: mktOrder.orderId, quantity: remaining,
92
+ status: mktOrder.status, filledQuantity: mktOrder.filledQuantity,
93
+ avgFillPrice: mktOrder.avgFillPrice, executedAt: Date.now(),
94
+ });
95
+ }
96
+ }
97
+ }
98
+ catch (err) {
99
+ slices.push({
100
+ sliceIndex: i, orderId: '', quantity: sliceQty,
101
+ status: 'failed', filledQuantity: 0, executedAt: Date.now(),
102
+ });
103
+ }
104
+ // Wait for remaining interval time
105
+ if (i < params.intervals - 1) {
106
+ const elapsed = Date.now() - sliceStart;
107
+ const wait = Math.max(0, intervalMs - elapsed);
108
+ if (wait > 0)
109
+ await sleep(wait);
110
+ }
111
+ }
112
+ return buildResult(params, algoId, 'twap', slices);
113
+ }
114
+ }
115
+ exports.TWAPExecutor = TWAPExecutor;
116
+ // ─── VWAP ────────────────────────────────────────────────────────────────
117
+ class VWAPExecutor {
118
+ adapter;
119
+ constructor(adapter) {
120
+ this.adapter = adapter;
121
+ }
122
+ async execute(params) {
123
+ const algoId = genAlgoId();
124
+ const slices = [];
125
+ const windowMs = 60_000; // 1-minute sampling windows
126
+ const windows = Math.ceil(params.durationMs / windowMs);
127
+ let remaining = params.totalQuantity;
128
+ let sliceIdx = 0;
129
+ for (let w = 0; w < windows && remaining > 0.000001; w++) {
130
+ const windowStart = Date.now();
131
+ try {
132
+ // Sample current volume
133
+ const ticker = await this.adapter.getTicker(params.symbol);
134
+ const volume1m = ticker.volume24h / (24 * 60); // approx 1-min volume
135
+ const targetQty = Math.min(remaining, volume1m * params.participationRate);
136
+ if (targetQty <= 0) {
137
+ await sleep(windowMs);
138
+ continue;
139
+ }
140
+ // Price limit guard
141
+ if (params.priceLimit !== undefined) {
142
+ const midPrice = (ticker.bid + ticker.ask) / 2;
143
+ const overLimit = params.side === 'buy'
144
+ ? midPrice > params.priceLimit
145
+ : midPrice < params.priceLimit;
146
+ if (overLimit) {
147
+ await sleep(windowMs);
148
+ continue;
149
+ }
150
+ }
151
+ const slicePrice = params.side === 'buy' ? ticker.bid : ticker.ask;
152
+ const order = await this.adapter.placeOrder({
153
+ symbol: params.symbol, side: params.side, type: 'limit',
154
+ quantity: targetQty, price: slicePrice, timeInForce: 'IOC',
155
+ });
156
+ await sleep(300);
157
+ const final = await this.adapter.getOrderStatus(order.orderId, params.symbol);
158
+ slices.push({
159
+ sliceIndex: sliceIdx++, orderId: final.orderId, quantity: targetQty,
160
+ price: slicePrice, status: final.status, filledQuantity: final.filledQuantity,
161
+ avgFillPrice: final.avgFillPrice, executedAt: Date.now(),
162
+ });
163
+ remaining -= final.filledQuantity ?? 0;
164
+ }
165
+ catch {
166
+ slices.push({
167
+ sliceIndex: sliceIdx++, orderId: '', quantity: 0,
168
+ status: 'failed', filledQuantity: 0, executedAt: Date.now(),
169
+ });
170
+ }
171
+ const elapsed = Date.now() - windowStart;
172
+ if (elapsed < windowMs)
173
+ await sleep(windowMs - elapsed);
174
+ }
175
+ // Sweep remaining with market order if significant
176
+ if (remaining > params.totalQuantity * 0.01) {
177
+ try {
178
+ const mkt = await this.adapter.placeOrder({
179
+ symbol: params.symbol, side: params.side, type: 'market', quantity: remaining,
180
+ });
181
+ slices.push({
182
+ sliceIndex: sliceIdx++, orderId: mkt.orderId, quantity: remaining,
183
+ status: mkt.status, filledQuantity: mkt.filledQuantity,
184
+ avgFillPrice: mkt.avgFillPrice, executedAt: Date.now(),
185
+ });
186
+ }
187
+ catch { /* log */ }
188
+ }
189
+ return buildResult(params, algoId, 'vwap', slices);
190
+ }
191
+ }
192
+ exports.VWAPExecutor = VWAPExecutor;
193
+ // ─── Iceberg ─────────────────────────────────────────────────────────────
194
+ class IcebergExecutor {
195
+ adapter;
196
+ constructor(adapter) {
197
+ this.adapter = adapter;
198
+ }
199
+ async execute(params) {
200
+ const algoId = genAlgoId();
201
+ const slices = [];
202
+ let remaining = params.totalQuantity;
203
+ const intervalMs = params.intervalMs ?? 500;
204
+ let sliceIdx = 0;
205
+ while (remaining > 0.000001) {
206
+ const qty = Math.min(params.visibleQuantity, remaining);
207
+ try {
208
+ let price = params.price;
209
+ // If no fixed price, follow market (dynamic iceberg)
210
+ if (!price) {
211
+ const ticker = await this.adapter.getTicker(params.symbol);
212
+ price = params.side === 'buy' ? ticker.bid : ticker.ask;
213
+ // Deviation guard: if market moved too far, pause
214
+ if (params.priceDeviation !== undefined && slices.length > 0) {
215
+ const firstPrice = slices[0].price ?? price;
216
+ const deviation = Math.abs(price - firstPrice) / firstPrice * 100;
217
+ if (deviation > params.priceDeviation) {
218
+ await sleep(intervalMs * 3);
219
+ continue;
220
+ }
221
+ }
222
+ }
223
+ const order = await this.adapter.placeOrder({
224
+ symbol: params.symbol, side: params.side,
225
+ type: params.price ? 'limit' : 'market',
226
+ quantity: qty, price,
227
+ timeInForce: params.price ? 'GTC' : undefined,
228
+ });
229
+ // Wait for fill
230
+ let filled = order;
231
+ const deadline = Date.now() + 30_000;
232
+ while (Date.now() < deadline) {
233
+ filled = await this.adapter.getOrderStatus(order.orderId, params.symbol);
234
+ if (['filled', 'cancelled', 'rejected', 'expired'].includes(filled.status))
235
+ break;
236
+ await sleep(500);
237
+ }
238
+ slices.push({
239
+ sliceIndex: sliceIdx++, orderId: filled.orderId, quantity: qty,
240
+ price, status: filled.status, filledQuantity: filled.filledQuantity,
241
+ avgFillPrice: filled.avgFillPrice, executedAt: Date.now(),
242
+ });
243
+ remaining -= filled.filledQuantity ?? 0;
244
+ if (['cancelled', 'rejected', 'expired'].includes(filled.status)) {
245
+ // Slice was not filled; re-add to remaining
246
+ remaining += filled.filledQuantity ?? 0;
247
+ remaining = Math.max(remaining, 0);
248
+ }
249
+ }
250
+ catch {
251
+ slices.push({
252
+ sliceIndex: sliceIdx++, orderId: '', quantity: qty,
253
+ status: 'failed', filledQuantity: 0, executedAt: Date.now(),
254
+ });
255
+ await sleep(intervalMs * 2);
256
+ }
257
+ if (remaining > 0.000001)
258
+ await sleep(intervalMs);
259
+ }
260
+ return buildResult(params, algoId, 'iceberg', slices);
261
+ }
262
+ }
263
+ exports.IcebergExecutor = IcebergExecutor;
264
+ class TrailingStopMonitor {
265
+ adapter;
266
+ constructor(adapter) {
267
+ this.adapter = adapter;
268
+ }
269
+ /**
270
+ * Monitors price and triggers a market order when trailing stop fires.
271
+ * Returns when the stop is triggered or cancelled.
272
+ * Poll interval: tickMs (default 1000ms)
273
+ */
274
+ async monitor(params) {
275
+ const tickMs = params.tickMs ?? 1000;
276
+ const deadline = Date.now() + (params.maxDurationMs ?? 24 * 60 * 60 * 1000);
277
+ const state = {
278
+ symbol: params.symbol, side: params.side, quantity: params.quantity,
279
+ callbackRate: params.callbackRate, activationPrice: params.activationPrice,
280
+ peakPrice: 0, stopPrice: 0, activated: !params.activationPrice,
281
+ status: 'watching',
282
+ };
283
+ while (Date.now() < deadline && (state.status === 'watching' || state.status === 'activated')) {
284
+ try {
285
+ const ticker = await this.adapter.getTicker(params.symbol);
286
+ const price = (ticker.bid + ticker.ask) / 2;
287
+ // Check activation
288
+ if (!state.activated && params.activationPrice) {
289
+ const triggered = params.side === 'sell'
290
+ ? price >= params.activationPrice
291
+ : price <= params.activationPrice;
292
+ if (triggered) {
293
+ state.activated = true;
294
+ state.status = 'activated';
295
+ state.peakPrice = price;
296
+ }
297
+ }
298
+ if (state.activated) {
299
+ // Update peak
300
+ if (params.side === 'sell') {
301
+ if (price > state.peakPrice) {
302
+ state.peakPrice = price;
303
+ state.stopPrice = price * (1 - params.callbackRate / 100);
304
+ }
305
+ // Trigger check
306
+ if (state.peakPrice > 0 && price <= state.stopPrice) {
307
+ state.status = 'triggered';
308
+ const order = await this.adapter.placeOrder({
309
+ symbol: params.symbol, side: 'sell', type: 'market',
310
+ quantity: params.quantity, reduceOnly: true,
311
+ });
312
+ state.orderId = order.orderId;
313
+ break;
314
+ }
315
+ }
316
+ else {
317
+ // Buy trailing stop (for short positions)
318
+ if (state.peakPrice === 0 || price < state.peakPrice) {
319
+ state.peakPrice = price;
320
+ state.stopPrice = price * (1 + params.callbackRate / 100);
321
+ }
322
+ if (state.peakPrice > 0 && price >= state.stopPrice) {
323
+ state.status = 'triggered';
324
+ const order = await this.adapter.placeOrder({
325
+ symbol: params.symbol, side: 'buy', type: 'market',
326
+ quantity: params.quantity, reduceOnly: true,
327
+ });
328
+ state.orderId = order.orderId;
329
+ break;
330
+ }
331
+ }
332
+ }
333
+ }
334
+ catch { /* log error, continue monitoring */ }
335
+ await sleep(tickMs);
336
+ }
337
+ if (state.status === 'watching' || state.status === 'activated') {
338
+ state.status = 'cancelled'; // Timed out
339
+ }
340
+ return state;
341
+ }
342
+ }
343
+ exports.TrailingStopMonitor = TrailingStopMonitor;
344
+ class BracketOrchestrator {
345
+ adapter;
346
+ constructor(adapter) {
347
+ this.adapter = adapter;
348
+ }
349
+ async execute(params) {
350
+ const result = { entryOrderId: '', status: 'open' };
351
+ try {
352
+ // 1. Entry order
353
+ const entry = await this.adapter.placeOrder({
354
+ symbol: params.symbol, side: params.side,
355
+ type: params.entryType, quantity: params.quantity,
356
+ price: params.entryPrice,
357
+ });
358
+ result.entryOrderId = entry.orderId;
359
+ // Wait for fill
360
+ let entryFinal = entry;
361
+ const entryDeadline = Date.now() + 60_000;
362
+ while (Date.now() < entryDeadline && !['filled', 'partially_filled', 'cancelled', 'rejected'].includes(entryFinal.status)) {
363
+ await sleep(500);
364
+ entryFinal = await this.adapter.getOrderStatus(entry.orderId, params.symbol);
365
+ }
366
+ if (!['filled', 'partially_filled'].includes(entryFinal.status)) {
367
+ result.status = 'cancelled';
368
+ return result;
369
+ }
370
+ const filledQty = entryFinal.filledQuantity;
371
+ const closeSide = params.side === 'buy' ? 'sell' : 'buy';
372
+ // 2. TP order
373
+ try {
374
+ const tp = await this.adapter.placeOrder({
375
+ symbol: params.symbol, side: closeSide,
376
+ type: 'take_profit_market', stopPrice: params.takeProfitPrice,
377
+ quantity: filledQty, reduceOnly: true,
378
+ });
379
+ result.takeProfitOrderId = tp.orderId;
380
+ }
381
+ catch (e) {
382
+ result.error = `TP placement failed: ${e instanceof Error ? e.message : String(e)}`;
383
+ }
384
+ // 3. SL order
385
+ try {
386
+ const sl = await this.adapter.placeOrder({
387
+ symbol: params.symbol, side: closeSide,
388
+ type: 'stop_market', stopPrice: params.stopLossPrice,
389
+ quantity: filledQty, reduceOnly: true,
390
+ });
391
+ result.stopLossOrderId = sl.orderId;
392
+ }
393
+ catch (e) {
394
+ result.error = (result.error ?? '') + ` SL placement failed: ${e instanceof Error ? e.message : String(e)}`;
395
+ }
396
+ return result;
397
+ }
398
+ catch (err) {
399
+ result.status = 'error';
400
+ result.error = err instanceof Error ? err.message : String(err);
401
+ return result;
402
+ }
403
+ }
404
+ /** Monitor a bracket for completion (TP or SL hit), then cancel the other leg */
405
+ async monitor(result, symbol, tickMs = 5000, maxDurationMs = 24 * 60 * 60 * 1000) {
406
+ const deadline = Date.now() + maxDurationMs;
407
+ while (Date.now() < deadline && result.status === 'open') {
408
+ try {
409
+ const [tpStatus, slStatus] = await Promise.all([
410
+ result.takeProfitOrderId
411
+ ? this.adapter.getOrderStatus(result.takeProfitOrderId, symbol)
412
+ : Promise.resolve(null),
413
+ result.stopLossOrderId
414
+ ? this.adapter.getOrderStatus(result.stopLossOrderId, symbol)
415
+ : Promise.resolve(null),
416
+ ]);
417
+ if (tpStatus?.status === 'filled') {
418
+ result.status = 'tp_hit';
419
+ if (result.stopLossOrderId) {
420
+ await this.adapter.cancelOrder(result.stopLossOrderId, symbol).catch(() => { });
421
+ }
422
+ break;
423
+ }
424
+ if (slStatus?.status === 'filled') {
425
+ result.status = 'sl_hit';
426
+ if (result.takeProfitOrderId) {
427
+ await this.adapter.cancelOrder(result.takeProfitOrderId, symbol).catch(() => { });
428
+ }
429
+ break;
430
+ }
431
+ }
432
+ catch { /* continue */ }
433
+ await sleep(tickMs);
434
+ }
435
+ if (result.status === 'open')
436
+ result.status = 'cancelled';
437
+ return result;
438
+ }
439
+ }
440
+ exports.BracketOrchestrator = BracketOrchestrator;
441
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exchange/v2/algorithms/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Circuit Breaker — Per-exchange resilience guard
3
+ *
4
+ * States:
5
+ * closed → normal operation, count consecutive failures
6
+ * open → reject all calls, start recovery timer
7
+ * half_open → allow limited test calls after recovery timeout
8
+ *
9
+ * Transitions:
10
+ * closed --(failures >= threshold)--> open
11
+ * open --(timeout expires)--> half_open
12
+ * half_open --(any failure)--> open
13
+ * half_open --(successes >= halfOpenMaxCalls)--> closed
14
+ */
15
+ export type CircuitState = 'closed' | 'open' | 'half_open';
16
+ export interface CircuitBreakerConfig {
17
+ /** Consecutive failures before opening (default: 5) */
18
+ failureThreshold: number;
19
+ /** Milliseconds to wait before attempting recovery (default: 30_000) */
20
+ recoveryTimeoutMs: number;
21
+ /** Max test calls in half-open state before closing (default: 3) */
22
+ halfOpenMaxCalls: number;
23
+ }
24
+ export declare class CircuitBreaker {
25
+ private state;
26
+ private failureCount;
27
+ private successCount;
28
+ private lastFailureTime;
29
+ private config;
30
+ constructor(config?: Partial<CircuitBreakerConfig>);
31
+ /** Returns true if the call should be allowed through */
32
+ canExecute(): boolean;
33
+ recordSuccess(): void;
34
+ recordFailure(): void;
35
+ getState(): CircuitState;
36
+ getMetrics(): {
37
+ state: CircuitState;
38
+ failureCount: number;
39
+ successCount: number;
40
+ lastFailureTime: number;
41
+ };
42
+ private transitionTo;
43
+ }
44
+ //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;AAE1D,MAAM,WAAW,oBAAoB;IACpC,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAA;IACxB,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAA;IACzB,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAQD,qBAAa,cAAc;IAC1B,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAIlD,yDAAyD;IACzD,UAAU,IAAI,OAAO;IAiBrB,aAAa,IAAI,IAAI;IAWrB,aAAa,IAAI,IAAI;IAgBrB,QAAQ,IAAI,YAAY;IAIxB,UAAU,IAAI;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE;IAS1G,OAAO,CAAC,YAAY;CAKpB"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ /**
3
+ * Circuit Breaker — Per-exchange resilience guard
4
+ *
5
+ * States:
6
+ * closed → normal operation, count consecutive failures
7
+ * open → reject all calls, start recovery timer
8
+ * half_open → allow limited test calls after recovery timeout
9
+ *
10
+ * Transitions:
11
+ * closed --(failures >= threshold)--> open
12
+ * open --(timeout expires)--> half_open
13
+ * half_open --(any failure)--> open
14
+ * half_open --(successes >= halfOpenMaxCalls)--> closed
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.CircuitBreaker = void 0;
18
+ const DEFAULT_CONFIG = {
19
+ failureThreshold: 5,
20
+ recoveryTimeoutMs: 30_000,
21
+ halfOpenMaxCalls: 3,
22
+ };
23
+ class CircuitBreaker {
24
+ state = 'closed';
25
+ failureCount = 0;
26
+ successCount = 0;
27
+ lastFailureTime = 0;
28
+ config;
29
+ constructor(config) {
30
+ this.config = { ...DEFAULT_CONFIG, ...config };
31
+ }
32
+ /** Returns true if the call should be allowed through */
33
+ canExecute() {
34
+ if (this.state === 'closed')
35
+ return true;
36
+ if (this.state === 'open') {
37
+ const elapsed = Date.now() - this.lastFailureTime;
38
+ if (elapsed >= this.config.recoveryTimeoutMs) {
39
+ this.state = 'half_open';
40
+ this.successCount = 0;
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ // half_open
46
+ return this.successCount < this.config.halfOpenMaxCalls;
47
+ }
48
+ recordSuccess() {
49
+ if (this.state === 'half_open') {
50
+ this.successCount++;
51
+ if (this.successCount >= this.config.halfOpenMaxCalls) {
52
+ this.transitionTo('closed');
53
+ }
54
+ }
55
+ else if (this.state === 'closed') {
56
+ this.failureCount = 0;
57
+ }
58
+ }
59
+ recordFailure() {
60
+ this.lastFailureTime = Date.now();
61
+ if (this.state === 'half_open') {
62
+ this.transitionTo('open');
63
+ return;
64
+ }
65
+ if (this.state === 'closed') {
66
+ this.failureCount++;
67
+ if (this.failureCount >= this.config.failureThreshold) {
68
+ this.transitionTo('open');
69
+ }
70
+ }
71
+ }
72
+ getState() {
73
+ return this.state;
74
+ }
75
+ getMetrics() {
76
+ return {
77
+ state: this.state,
78
+ failureCount: this.failureCount,
79
+ successCount: this.successCount,
80
+ lastFailureTime: this.lastFailureTime,
81
+ };
82
+ }
83
+ transitionTo(newState) {
84
+ this.state = newState;
85
+ this.failureCount = 0;
86
+ this.successCount = 0;
87
+ }
88
+ }
89
+ exports.CircuitBreaker = CircuitBreaker;
90
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../../src/exchange/v2/executor/circuit-breaker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAaH,MAAM,cAAc,GAAyB;IAC5C,gBAAgB,EAAE,CAAC;IACnB,iBAAiB,EAAE,MAAM;IACzB,gBAAgB,EAAE,CAAC;CACnB,CAAA;AAED,MAAa,cAAc;IAClB,KAAK,GAAiB,QAAQ,CAAA;IAC9B,YAAY,GAAG,CAAC,CAAA;IAChB,YAAY,GAAG,CAAC,CAAA;IAChB,eAAe,GAAG,CAAC,CAAA;IACnB,MAAM,CAAsB;IAEpC,YAAY,MAAsC;QACjD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAA;IAC/C,CAAC;IAED,yDAAyD;IACzD,UAAU;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QAExC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;YACjD,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC9C,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;gBACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;gBACrB,OAAO,IAAI,CAAA;YACZ,CAAC;YACD,OAAO,KAAK,CAAA;QACb,CAAC;QAED,YAAY;QACZ,OAAO,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAA;IACxD,CAAC;IAED,aAAa;QACZ,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACvD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAC5B,CAAC;QACF,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QACtB,CAAC;IACF,CAAC;IAED,aAAa;QACZ,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEjC,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACzB,OAAM;QACP,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACvD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC1B,CAAC;QACF,CAAC;IACF,CAAC;IAED,QAAQ;QACP,OAAO,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,UAAU;QACT,OAAO;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;SACrC,CAAA;IACF,CAAC;IAEO,YAAY,CAAC,QAAsB;QAC1C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;IACtB,CAAC;CACD;AA1ED,wCA0EC"}