@blackcube/xgate-sdk 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1128,6 +1128,69 @@ interface IPosition {
1128
1128
  margin: string | null;
1129
1129
  xtras?: Record<string, unknown>;
1130
1130
  }
1131
+ /**
1132
+ * UNE TRANSACTION PUBLIQUE — celles de tout le monde sur un marché, pas les siennes.
1133
+ *
1134
+ * À ne pas confondre avec {@link ITrade}, qui est une exécution **du compte**. Celle-ci n'a ni
1135
+ * frais, ni PnL, ni identifiant d'ordre : on ne voit que ce que le marché montre.
1136
+ */
1137
+ interface IPublicTrade {
1138
+ xex: XgateEx;
1139
+ symbolXex: string;
1140
+ price: string;
1141
+ size: string;
1142
+ /** Sens de l'AGRESSEUR : `buy` = quelqu'un a pris l'offre. */
1143
+ side: Side;
1144
+ tradedAt: Date;
1145
+ xtras?: Record<string, unknown>;
1146
+ }
1147
+ /**
1148
+ * L'ÉTAT D'UN COMPTE — ce que toutes les venues disent, sous des noms différents.
1149
+ *
1150
+ * Les formes natives ne se ressemblent pas : hyperliquid range son équité sous
1151
+ * `marginSummary.accountValue`, pacifica sous `accountEquity`, aster sous `totalMarginBalance`.
1152
+ * **Mais les concepts, eux, sont les mêmes** — c'est exactement ce qu'XGate existe pour normaliser.
1153
+ *
1154
+ * `xtras` conserve la forme native complète : ce qui est propre à une venue n'est pas perdu, il
1155
+ * n'est simplement pas promu au rang de contrat.
1156
+ */
1157
+ interface IAccountState {
1158
+ xex: XgateEx;
1159
+ /** Valeur totale du compte, PnL latent compris. */
1160
+ equity: string;
1161
+ /** Ce qui reste mobilisable — pour ouvrir ou retirer. `null` si la venue ne le publie pas. */
1162
+ available: string | null;
1163
+ /** Marge immobilisée par les positions et ordres en cours. */
1164
+ marginUsed: string | null;
1165
+ /** Marge de maintenance : sous ce seuil, la liquidation menace. */
1166
+ maintenanceMargin: string | null;
1167
+ /**
1168
+ * PnL non réalisé des positions ouvertes.
1169
+ *
1170
+ * **Seule aster le publie au niveau du compte.** hyperliquid et pacifica ne l'exposent pas là —
1171
+ * il se lit alors sur les positions (`IPosition.unrealizedPnl`), qui le portent toutes. On rend
1172
+ * `null` plutôt que de le reconstituer : une somme calculée ici passerait pour une donnée de la
1173
+ * venue.
1174
+ */
1175
+ unrealizedPnl: string | null;
1176
+ /** L'état natif COMPLET, tel que la venue le publie. */
1177
+ xtras?: Record<string, unknown>;
1178
+ }
1179
+ /**
1180
+ * UN FUNDING PAYÉ — ce qui a réellement été prélevé ou reçu sur une position.
1181
+ *
1182
+ * À ne pas confondre avec le taux courant d'`IPrice.funding`, qui annonce ce qui *sera* payé. Un
1183
+ * calcul de résultat qui ignore ce qui l'a été surestime toute position tenue longtemps.
1184
+ */
1185
+ interface IFundingPaid {
1186
+ xex: XgateEx;
1187
+ symbolXex: string;
1188
+ /** Le taux appliqué, en fraction. */
1189
+ rate: string;
1190
+ /** Moment où il a été prélevé. */
1191
+ appliedAt: Date;
1192
+ xtras?: Record<string, unknown>;
1193
+ }
1131
1194
  /** UNE EXÉCUTION du compte — ce qui a réellement été rempli, par opposition à ce qui a été demandé. */
1132
1195
  interface ITrade {
1133
1196
  xex: XgateEx;
@@ -1254,6 +1317,18 @@ declare class TradingService {
1254
1317
  * conditionnels. Le SDK de la venue s'en charge ; xgate fournit des niveaux justes.
1255
1318
  */
1256
1319
  openWithProtection(access: ITradingAccess, input: IEntryWithProtection): Promise<IOrder[]>;
1320
+ /**
1321
+ * CE QUE LA VENUE A RÉELLEMENT FAIT, après une réponse perdue.
1322
+ *
1323
+ * Un timeout ne dit pas « rien n'a été créé » : mesuré sur aster, deux exécutions identiques ont
1324
+ * produit deux sous-ensembles différents — une fois le stop et un take-profit, une fois l'entrée
1325
+ * seule. La seule vérité est au carnet, donc on va l'y chercher.
1326
+ *
1327
+ * **Lève si la position est nue** : une entrée remplie sans stop est exactement ce que ce service
1328
+ * existe pour empêcher, et le silence serait pire que l'erreur. L'appelant doit savoir qu'il a une
1329
+ * position à protéger, tout de suite.
1330
+ */
1331
+ private etatApres;
1257
1332
  /** Les positions ouvertes d'un compte. */
1258
1333
  positions(access: ITradingAccess, symbolXex?: string): Promise<IPosition[]>;
1259
1334
  /** Les ordres encore au carnet. */
@@ -1302,10 +1377,120 @@ declare class TradingService {
1302
1377
  * take-profits partiels, celui-là est la clôture.
1303
1378
  */
1304
1379
  exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date): Promise<string | null>;
1380
+ /**
1381
+ * L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.
1382
+ *
1383
+ * À distinguer de {@link trades} : un ordre est une **intention**, une exécution est un **fait**.
1384
+ * Un ordre `filled` peut avoir été rempli en plusieurs fois, à des prix différents.
1385
+ *
1386
+ * Servi par les huit venues qui tradent.
1387
+ */
1388
+ orderHistory(access: ITradingAccess, symbolXex?: string): Promise<IOrder[]>;
1389
+ /**
1390
+ * L'ÉTAT DU COMPTE — équité, disponible, marge immobilisée, marge de maintenance, PnL latent.
1391
+ *
1392
+ * Les venues rangent ces valeurs sous des noms qui n'ont rien à voir : `marginSummary.accountValue`
1393
+ * chez hyperliquid, `accountEquity` chez pacifica, `totalMarginBalance` chez aster — **mais elles
1394
+ * disent la même chose**. La forme native complète reste dans `xtras`, rien n'est perdu.
1395
+ *
1396
+ * **blofin ne l'expose pas** et lève ; les sept autres le servent.
1397
+ */
1398
+ accountInfo(access: ITradingAccess): Promise<IAccountState>;
1399
+ /**
1400
+ * RÈGLE LE LEVIER d'une paire, avant d'ouvrir.
1401
+ *
1402
+ * Le levier détermine la marge immobilisée, donc la taille tenable : le changer après l'ouverture
1403
+ * ne rejoue pas la position déjà prise. C'est un réglage préalable, pas un ajustement.
1404
+ *
1405
+ * **bullet ne l'expose pas** — son levier se fixe au compte, pas à la position — et lève.
1406
+ */
1407
+ setLeverage(access: ITradingAccess, symbolXex: string, leverage: number): Promise<void>;
1408
+ /**
1409
+ * CHOISIT LE MODE DE MARGE d'une paire : **isolée** ou **croisée**.
1410
+ *
1411
+ * En **croisée**, tout le solde du compte garantit la position : elle tient plus longtemps, mais
1412
+ * une liquidation emporte l'ensemble. En **isolée**, seule la marge affectée est en jeu : la perte
1413
+ * est bornée à ce montant, la liquidation arrive plus tôt.
1414
+ *
1415
+ * **À régler AVANT d'ouvrir.** Changer le mode d'une position vivante est refusé par la plupart
1416
+ * des venues, et là où c'est accepté, cela redistribue la garantie sous les pieds de la position.
1417
+ *
1418
+ * Servi par les trois venues de référence.
1419
+ */
1420
+ setMarginMode(access: ITradingAccess, symbolXex: string, isolated: boolean): Promise<void>;
1421
+ /**
1422
+ * AJOUTE DE LA MARGE à une position isolée — pour éloigner le prix de liquidation.
1423
+ *
1424
+ * C'est le geste qui sauve une position sous pression sans la réduire : on renforce la garantie
1425
+ * plutôt que de couper. **N'a de sens qu'en marge isolée** ; en croisée, tout le solde garantit
1426
+ * déjà la position et il n'y a rien à ajouter.
1427
+ *
1428
+ * Servi par les trois venues de référence.
1429
+ */
1430
+ addMargin(access: ITradingAccess, symbolXex: string, amount: string): Promise<void>;
1431
+ /**
1432
+ * RETIRE DE LA MARGE d'une position isolée — pour libérer du capital.
1433
+ *
1434
+ * L'inverse d'{@link addMargin} : la garantie diminue, donc le prix de liquidation **se rapproche**.
1435
+ * La venue refuse ce qui mettrait la position sous son seuil de maintenance.
1436
+ *
1437
+ * ⚠️ **pacifica ne l'expose pas** et lève : chez elle, la marge s'ajoute mais ne se retire pas.
1438
+ * Fermer partiellement la position libère alors le capital.
1439
+ */
1440
+ removeMargin(access: ITradingAccess, symbolXex: string, amount: string): Promise<void>;
1441
+ /**
1442
+ * L'HISTORIQUE DU FUNDING **PAYÉ** sur une paire — ce qui a réellement été prélevé ou reçu.
1443
+ *
1444
+ * À ne pas confondre avec le taux courant, que rend `PricesService` : celui-ci annonce ce qui
1445
+ * *sera* payé, celui-là dit ce qui *l'a été*. Un backtest qui ignore le funding réel surestime le
1446
+ * résultat d'une position tenue longtemps.
1447
+ *
1448
+ * Servi par les huit venues qui tradent.
1449
+ */
1450
+ fundingHistory(access: ITradingAccess, symbolXex: string, range?: {
1451
+ startTime?: Date;
1452
+ endTime?: Date;
1453
+ limit?: number;
1454
+ }): Promise<IFundingPaid[]>;
1455
+ /**
1456
+ * UN IDENTIFIANT APPLICATIF pour un ordre, **au format que la venue accepte**.
1457
+ *
1458
+ * C'est lui qui relie un ordre à la décision qui l'a produit : la venue le rend tel quel dans
1459
+ * `IOrder.clientId`, ce qui permet de retrouver son origine sans tenir de table de correspondance.
1460
+ *
1461
+ * **hyperliquid exige un hexadécimal préfixé `0x`** (128 bits) là où les autres acceptent un UUID
1462
+ * ordinaire. Passer le mauvais format fait rejeter l'ordre — d'où cette méthode plutôt qu'un
1463
+ * `randomUUID()` chez l'appelant.
1464
+ */
1465
+ newClientOrderId(xex: XgateEx): string;
1466
+ /**
1467
+ * LE COUPE-CIRCUIT : annule TOUS les ordres d'une paire, d'un geste.
1468
+ *
1469
+ * À réserver aux situations où l'on veut reprendre la main sans discuter — un état incohérent, un
1470
+ * arrêt d'urgence, une reprise après incident. Annuler un par un laisse une fenêtre pendant
1471
+ * laquelle certains ordres vivent encore.
1472
+ *
1473
+ * ⚠️ **Cela retire aussi les PROTECTIONS.** Stops et take-profits sont des ordres comme les
1474
+ * autres : une position ouverte se retrouve **nue** après ce geste. À n'employer que si la
1475
+ * position est fermée, ou si l'on repose une protection immédiatement — jamais pour « faire le
1476
+ * ménage » sur une position vivante.
1477
+ *
1478
+ * Rend le nombre d'ordres annulés quand la venue le publie, `null` sinon.
1479
+ */
1480
+ cancelAll(access: ITradingAccess, symbolXex: string): Promise<number | null>;
1305
1481
  /** Annule un ordre par son identifiant de venue. */
1306
1482
  cancel(access: ITradingAccess, symbolXex: string, orderId: string): Promise<void>;
1307
1483
  /** Le scope `perp()` de la venue, typé au plus près de ce que le contrat commun garantit. */
1308
1484
  private perpOf;
1485
+ /**
1486
+ * L'état natif d'une venue → {@link IAccountState}.
1487
+ *
1488
+ * Une lecture EXPLICITE par venue plutôt qu'un parcours à l'aveugle : les noms ne se devinent pas,
1489
+ * et prendre le premier champ qui ressemble à une équité produirait un chiffre faux sans que rien
1490
+ * ne le signale. `null` là où la venue ne publie pas la valeur — pas `0`, qui se lirait comme
1491
+ * « rien » alors que personne n'a rien dit.
1492
+ */
1493
+ private toAccountState;
1309
1494
  /**
1310
1495
  * Le statut de la venue, VALIDÉ — jamais casté. Une venue qui inventerait un statut rendrait sinon
1311
1496
  * une valeur absente de tous les `switch` en aval, et personne ne la rattraperait.
@@ -1314,6 +1499,75 @@ declare class TradingService {
1314
1499
  private toOrder;
1315
1500
  }
1316
1501
 
1502
+ /**
1503
+ * LE FLUX DES EXÉCUTIONS DU COMPTE — savoir ce qui s'est rempli, à l'instant où ça se remplit.
1504
+ *
1505
+ * **C'est la seule façon de connaître son état exact.** Sans lui, on interroge en boucle et on
1506
+ * apprend un remplissage avec le retard du sondage : entre-temps, un take-profit partiel a pu
1507
+ * modifier la taille de la position, et toute décision prise sur l'ancienne valeur est fausse.
1508
+ *
1509
+ * Le flux ne dit pas ce qu'on a **demandé** mais ce qui a été **obtenu** : un ordre annoncé `filled`
1510
+ * peut l'avoir été en plusieurs fois, à des prix différents. Chaque exécution porte son prix réel.
1511
+ *
1512
+ * **ON NE TRANSMET QUE CE QUI ARRIVE APRÈS L'OUVERTURE DU FLUX.** Les venues rejouent leur
1513
+ * historique à la souscription : mesuré le 2026-08-09 sur hyperliquid, 30 exécutions arrivent dans
1514
+ * les six premières secondes, **toutes antérieures** à l'abonnement, la plus ancienne de plus de
1515
+ * deux jours. Sans filtre, chaque reconnexion rejouerait deux jours de trades — et un consommateur
1516
+ * qui compte les remplissages compterait deux fois les mêmes.
1517
+ *
1518
+ * Le filtre se fait sur `filledAt` contre l'instant d'abonnement. Un flux dit le **présent** ;
1519
+ * l'historique se lit avec `TradingService.trades()`, qui est fait pour ça.
1520
+ *
1521
+ * **blofin est la seule venue qui ne l'expose pas** ; elle lève. Les sept autres le servent.
1522
+ */
1523
+ declare class WsTradesService {
1524
+ private readonly logger;
1525
+ /**
1526
+ * S'abonne aux exécutions d'un compte. Rend la fonction de désabonnement.
1527
+ *
1528
+ * Le handler reçoit **une exécution à la fois**, au format unifié, et **uniquement celles
1529
+ * survenues après l'abonnement** — le rejeu d'historique de la venue est écarté.
1530
+ */
1531
+ subscribe(access: ITradingAccess, handler: (trade: ITrade) => void): Unsubscribe;
1532
+ /**
1533
+ * S'abonne aux exécutions de PLUSIEURS comptes, avec un seul handler.
1534
+ *
1535
+ * Chaque exécution porte son `xex` : l'appelant sait toujours de quelle venue elle vient. La
1536
+ * fonction rendue coupe tous les flux d'un coup — sinon il faudrait en garder N et n'en oublier
1537
+ * aucun.
1538
+ *
1539
+ * Une venue qui refuse est journalisée et ignorée : le reste des comptes doit continuer d'être
1540
+ * suivi. Sur un seul accès, l'échec est celui de l'appel.
1541
+ */
1542
+ subscribeAll(accesses: ITradingAccess[], handler: (trade: ITrade) => void): Unsubscribe;
1543
+ /**
1544
+ * S'abonne aux ORDRES du compte — leur naissance, leur remplissage, leur mort.
1545
+ *
1546
+ * À distinguer des exécutions : un ordre est une **intention** dont on suit le cycle de vie
1547
+ * (`open` → `partiallyFilled` → `filled`, ou `canceled`), une exécution est un **fait** ponctuel.
1548
+ * Pour savoir qu'un stop vient de se déclencher, c'est ici qu'il faut écouter ; pour savoir à quel
1549
+ * prix, c'est {@link subscribe}.
1550
+ *
1551
+ * **Même règle que pour les exécutions** : seuls les ordres postérieurs à l'abonnement sont
1552
+ * transmis, le rejeu d'historique est écarté.
1553
+ */
1554
+ subscribeOrders(access: ITradingAccess, handler: (order: IOrder) => void): Unsubscribe;
1555
+ /**
1556
+ * S'abonne aux TRANSACTIONS PUBLIQUES d'un marché — celles de tout le monde, pas les siennes.
1557
+ *
1558
+ * C'est le flux qui dit ce qui se négocie réellement : prix, taille, sens agresseur. Il sert à
1559
+ * mesurer l'activité d'une paire, pas à suivre son compte — pour cela, {@link subscribe}.
1560
+ *
1561
+ * **Aucun filtre temporel ici** : un trade public est daté de son exécution et arrive en direct,
1562
+ * il n'y a pas d'historique rejoué à écarter.
1563
+ */
1564
+ subscribePublicTrades(access: ITradingAccess, symbolXex: string, handler: (trade: IPublicTrade) => void): Unsubscribe;
1565
+ /** Le client temps réel d'un compte, avec ses souscriptions signées. */
1566
+ private wsOf;
1567
+ private toOrder;
1568
+ private toTrade;
1569
+ }
1570
+
1317
1571
  /** La venue sert-elle cet intervalle de première main ? */
1318
1572
  declare function servesNatively(xex: XgateEx, interval: Timeframe): boolean;
1319
1573
  /**
@@ -1397,4 +1651,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
1397
1651
  */
1398
1652
  declare function isDated(xtras?: Record<string, unknown>): boolean;
1399
1653
 
1400
- export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
1654
+ export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IAccountState, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IFundingPaid, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type IPublicTrade, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
package/dist/index.d.ts CHANGED
@@ -1128,6 +1128,69 @@ interface IPosition {
1128
1128
  margin: string | null;
1129
1129
  xtras?: Record<string, unknown>;
1130
1130
  }
1131
+ /**
1132
+ * UNE TRANSACTION PUBLIQUE — celles de tout le monde sur un marché, pas les siennes.
1133
+ *
1134
+ * À ne pas confondre avec {@link ITrade}, qui est une exécution **du compte**. Celle-ci n'a ni
1135
+ * frais, ni PnL, ni identifiant d'ordre : on ne voit que ce que le marché montre.
1136
+ */
1137
+ interface IPublicTrade {
1138
+ xex: XgateEx;
1139
+ symbolXex: string;
1140
+ price: string;
1141
+ size: string;
1142
+ /** Sens de l'AGRESSEUR : `buy` = quelqu'un a pris l'offre. */
1143
+ side: Side;
1144
+ tradedAt: Date;
1145
+ xtras?: Record<string, unknown>;
1146
+ }
1147
+ /**
1148
+ * L'ÉTAT D'UN COMPTE — ce que toutes les venues disent, sous des noms différents.
1149
+ *
1150
+ * Les formes natives ne se ressemblent pas : hyperliquid range son équité sous
1151
+ * `marginSummary.accountValue`, pacifica sous `accountEquity`, aster sous `totalMarginBalance`.
1152
+ * **Mais les concepts, eux, sont les mêmes** — c'est exactement ce qu'XGate existe pour normaliser.
1153
+ *
1154
+ * `xtras` conserve la forme native complète : ce qui est propre à une venue n'est pas perdu, il
1155
+ * n'est simplement pas promu au rang de contrat.
1156
+ */
1157
+ interface IAccountState {
1158
+ xex: XgateEx;
1159
+ /** Valeur totale du compte, PnL latent compris. */
1160
+ equity: string;
1161
+ /** Ce qui reste mobilisable — pour ouvrir ou retirer. `null` si la venue ne le publie pas. */
1162
+ available: string | null;
1163
+ /** Marge immobilisée par les positions et ordres en cours. */
1164
+ marginUsed: string | null;
1165
+ /** Marge de maintenance : sous ce seuil, la liquidation menace. */
1166
+ maintenanceMargin: string | null;
1167
+ /**
1168
+ * PnL non réalisé des positions ouvertes.
1169
+ *
1170
+ * **Seule aster le publie au niveau du compte.** hyperliquid et pacifica ne l'exposent pas là —
1171
+ * il se lit alors sur les positions (`IPosition.unrealizedPnl`), qui le portent toutes. On rend
1172
+ * `null` plutôt que de le reconstituer : une somme calculée ici passerait pour une donnée de la
1173
+ * venue.
1174
+ */
1175
+ unrealizedPnl: string | null;
1176
+ /** L'état natif COMPLET, tel que la venue le publie. */
1177
+ xtras?: Record<string, unknown>;
1178
+ }
1179
+ /**
1180
+ * UN FUNDING PAYÉ — ce qui a réellement été prélevé ou reçu sur une position.
1181
+ *
1182
+ * À ne pas confondre avec le taux courant d'`IPrice.funding`, qui annonce ce qui *sera* payé. Un
1183
+ * calcul de résultat qui ignore ce qui l'a été surestime toute position tenue longtemps.
1184
+ */
1185
+ interface IFundingPaid {
1186
+ xex: XgateEx;
1187
+ symbolXex: string;
1188
+ /** Le taux appliqué, en fraction. */
1189
+ rate: string;
1190
+ /** Moment où il a été prélevé. */
1191
+ appliedAt: Date;
1192
+ xtras?: Record<string, unknown>;
1193
+ }
1131
1194
  /** UNE EXÉCUTION du compte — ce qui a réellement été rempli, par opposition à ce qui a été demandé. */
1132
1195
  interface ITrade {
1133
1196
  xex: XgateEx;
@@ -1254,6 +1317,18 @@ declare class TradingService {
1254
1317
  * conditionnels. Le SDK de la venue s'en charge ; xgate fournit des niveaux justes.
1255
1318
  */
1256
1319
  openWithProtection(access: ITradingAccess, input: IEntryWithProtection): Promise<IOrder[]>;
1320
+ /**
1321
+ * CE QUE LA VENUE A RÉELLEMENT FAIT, après une réponse perdue.
1322
+ *
1323
+ * Un timeout ne dit pas « rien n'a été créé » : mesuré sur aster, deux exécutions identiques ont
1324
+ * produit deux sous-ensembles différents — une fois le stop et un take-profit, une fois l'entrée
1325
+ * seule. La seule vérité est au carnet, donc on va l'y chercher.
1326
+ *
1327
+ * **Lève si la position est nue** : une entrée remplie sans stop est exactement ce que ce service
1328
+ * existe pour empêcher, et le silence serait pire que l'erreur. L'appelant doit savoir qu'il a une
1329
+ * position à protéger, tout de suite.
1330
+ */
1331
+ private etatApres;
1257
1332
  /** Les positions ouvertes d'un compte. */
1258
1333
  positions(access: ITradingAccess, symbolXex?: string): Promise<IPosition[]>;
1259
1334
  /** Les ordres encore au carnet. */
@@ -1302,10 +1377,120 @@ declare class TradingService {
1302
1377
  * take-profits partiels, celui-là est la clôture.
1303
1378
  */
1304
1379
  exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date): Promise<string | null>;
1380
+ /**
1381
+ * L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.
1382
+ *
1383
+ * À distinguer de {@link trades} : un ordre est une **intention**, une exécution est un **fait**.
1384
+ * Un ordre `filled` peut avoir été rempli en plusieurs fois, à des prix différents.
1385
+ *
1386
+ * Servi par les huit venues qui tradent.
1387
+ */
1388
+ orderHistory(access: ITradingAccess, symbolXex?: string): Promise<IOrder[]>;
1389
+ /**
1390
+ * L'ÉTAT DU COMPTE — équité, disponible, marge immobilisée, marge de maintenance, PnL latent.
1391
+ *
1392
+ * Les venues rangent ces valeurs sous des noms qui n'ont rien à voir : `marginSummary.accountValue`
1393
+ * chez hyperliquid, `accountEquity` chez pacifica, `totalMarginBalance` chez aster — **mais elles
1394
+ * disent la même chose**. La forme native complète reste dans `xtras`, rien n'est perdu.
1395
+ *
1396
+ * **blofin ne l'expose pas** et lève ; les sept autres le servent.
1397
+ */
1398
+ accountInfo(access: ITradingAccess): Promise<IAccountState>;
1399
+ /**
1400
+ * RÈGLE LE LEVIER d'une paire, avant d'ouvrir.
1401
+ *
1402
+ * Le levier détermine la marge immobilisée, donc la taille tenable : le changer après l'ouverture
1403
+ * ne rejoue pas la position déjà prise. C'est un réglage préalable, pas un ajustement.
1404
+ *
1405
+ * **bullet ne l'expose pas** — son levier se fixe au compte, pas à la position — et lève.
1406
+ */
1407
+ setLeverage(access: ITradingAccess, symbolXex: string, leverage: number): Promise<void>;
1408
+ /**
1409
+ * CHOISIT LE MODE DE MARGE d'une paire : **isolée** ou **croisée**.
1410
+ *
1411
+ * En **croisée**, tout le solde du compte garantit la position : elle tient plus longtemps, mais
1412
+ * une liquidation emporte l'ensemble. En **isolée**, seule la marge affectée est en jeu : la perte
1413
+ * est bornée à ce montant, la liquidation arrive plus tôt.
1414
+ *
1415
+ * **À régler AVANT d'ouvrir.** Changer le mode d'une position vivante est refusé par la plupart
1416
+ * des venues, et là où c'est accepté, cela redistribue la garantie sous les pieds de la position.
1417
+ *
1418
+ * Servi par les trois venues de référence.
1419
+ */
1420
+ setMarginMode(access: ITradingAccess, symbolXex: string, isolated: boolean): Promise<void>;
1421
+ /**
1422
+ * AJOUTE DE LA MARGE à une position isolée — pour éloigner le prix de liquidation.
1423
+ *
1424
+ * C'est le geste qui sauve une position sous pression sans la réduire : on renforce la garantie
1425
+ * plutôt que de couper. **N'a de sens qu'en marge isolée** ; en croisée, tout le solde garantit
1426
+ * déjà la position et il n'y a rien à ajouter.
1427
+ *
1428
+ * Servi par les trois venues de référence.
1429
+ */
1430
+ addMargin(access: ITradingAccess, symbolXex: string, amount: string): Promise<void>;
1431
+ /**
1432
+ * RETIRE DE LA MARGE d'une position isolée — pour libérer du capital.
1433
+ *
1434
+ * L'inverse d'{@link addMargin} : la garantie diminue, donc le prix de liquidation **se rapproche**.
1435
+ * La venue refuse ce qui mettrait la position sous son seuil de maintenance.
1436
+ *
1437
+ * ⚠️ **pacifica ne l'expose pas** et lève : chez elle, la marge s'ajoute mais ne se retire pas.
1438
+ * Fermer partiellement la position libère alors le capital.
1439
+ */
1440
+ removeMargin(access: ITradingAccess, symbolXex: string, amount: string): Promise<void>;
1441
+ /**
1442
+ * L'HISTORIQUE DU FUNDING **PAYÉ** sur une paire — ce qui a réellement été prélevé ou reçu.
1443
+ *
1444
+ * À ne pas confondre avec le taux courant, que rend `PricesService` : celui-ci annonce ce qui
1445
+ * *sera* payé, celui-là dit ce qui *l'a été*. Un backtest qui ignore le funding réel surestime le
1446
+ * résultat d'une position tenue longtemps.
1447
+ *
1448
+ * Servi par les huit venues qui tradent.
1449
+ */
1450
+ fundingHistory(access: ITradingAccess, symbolXex: string, range?: {
1451
+ startTime?: Date;
1452
+ endTime?: Date;
1453
+ limit?: number;
1454
+ }): Promise<IFundingPaid[]>;
1455
+ /**
1456
+ * UN IDENTIFIANT APPLICATIF pour un ordre, **au format que la venue accepte**.
1457
+ *
1458
+ * C'est lui qui relie un ordre à la décision qui l'a produit : la venue le rend tel quel dans
1459
+ * `IOrder.clientId`, ce qui permet de retrouver son origine sans tenir de table de correspondance.
1460
+ *
1461
+ * **hyperliquid exige un hexadécimal préfixé `0x`** (128 bits) là où les autres acceptent un UUID
1462
+ * ordinaire. Passer le mauvais format fait rejeter l'ordre — d'où cette méthode plutôt qu'un
1463
+ * `randomUUID()` chez l'appelant.
1464
+ */
1465
+ newClientOrderId(xex: XgateEx): string;
1466
+ /**
1467
+ * LE COUPE-CIRCUIT : annule TOUS les ordres d'une paire, d'un geste.
1468
+ *
1469
+ * À réserver aux situations où l'on veut reprendre la main sans discuter — un état incohérent, un
1470
+ * arrêt d'urgence, une reprise après incident. Annuler un par un laisse une fenêtre pendant
1471
+ * laquelle certains ordres vivent encore.
1472
+ *
1473
+ * ⚠️ **Cela retire aussi les PROTECTIONS.** Stops et take-profits sont des ordres comme les
1474
+ * autres : une position ouverte se retrouve **nue** après ce geste. À n'employer que si la
1475
+ * position est fermée, ou si l'on repose une protection immédiatement — jamais pour « faire le
1476
+ * ménage » sur une position vivante.
1477
+ *
1478
+ * Rend le nombre d'ordres annulés quand la venue le publie, `null` sinon.
1479
+ */
1480
+ cancelAll(access: ITradingAccess, symbolXex: string): Promise<number | null>;
1305
1481
  /** Annule un ordre par son identifiant de venue. */
1306
1482
  cancel(access: ITradingAccess, symbolXex: string, orderId: string): Promise<void>;
1307
1483
  /** Le scope `perp()` de la venue, typé au plus près de ce que le contrat commun garantit. */
1308
1484
  private perpOf;
1485
+ /**
1486
+ * L'état natif d'une venue → {@link IAccountState}.
1487
+ *
1488
+ * Une lecture EXPLICITE par venue plutôt qu'un parcours à l'aveugle : les noms ne se devinent pas,
1489
+ * et prendre le premier champ qui ressemble à une équité produirait un chiffre faux sans que rien
1490
+ * ne le signale. `null` là où la venue ne publie pas la valeur — pas `0`, qui se lirait comme
1491
+ * « rien » alors que personne n'a rien dit.
1492
+ */
1493
+ private toAccountState;
1309
1494
  /**
1310
1495
  * Le statut de la venue, VALIDÉ — jamais casté. Une venue qui inventerait un statut rendrait sinon
1311
1496
  * une valeur absente de tous les `switch` en aval, et personne ne la rattraperait.
@@ -1314,6 +1499,75 @@ declare class TradingService {
1314
1499
  private toOrder;
1315
1500
  }
1316
1501
 
1502
+ /**
1503
+ * LE FLUX DES EXÉCUTIONS DU COMPTE — savoir ce qui s'est rempli, à l'instant où ça se remplit.
1504
+ *
1505
+ * **C'est la seule façon de connaître son état exact.** Sans lui, on interroge en boucle et on
1506
+ * apprend un remplissage avec le retard du sondage : entre-temps, un take-profit partiel a pu
1507
+ * modifier la taille de la position, et toute décision prise sur l'ancienne valeur est fausse.
1508
+ *
1509
+ * Le flux ne dit pas ce qu'on a **demandé** mais ce qui a été **obtenu** : un ordre annoncé `filled`
1510
+ * peut l'avoir été en plusieurs fois, à des prix différents. Chaque exécution porte son prix réel.
1511
+ *
1512
+ * **ON NE TRANSMET QUE CE QUI ARRIVE APRÈS L'OUVERTURE DU FLUX.** Les venues rejouent leur
1513
+ * historique à la souscription : mesuré le 2026-08-09 sur hyperliquid, 30 exécutions arrivent dans
1514
+ * les six premières secondes, **toutes antérieures** à l'abonnement, la plus ancienne de plus de
1515
+ * deux jours. Sans filtre, chaque reconnexion rejouerait deux jours de trades — et un consommateur
1516
+ * qui compte les remplissages compterait deux fois les mêmes.
1517
+ *
1518
+ * Le filtre se fait sur `filledAt` contre l'instant d'abonnement. Un flux dit le **présent** ;
1519
+ * l'historique se lit avec `TradingService.trades()`, qui est fait pour ça.
1520
+ *
1521
+ * **blofin est la seule venue qui ne l'expose pas** ; elle lève. Les sept autres le servent.
1522
+ */
1523
+ declare class WsTradesService {
1524
+ private readonly logger;
1525
+ /**
1526
+ * S'abonne aux exécutions d'un compte. Rend la fonction de désabonnement.
1527
+ *
1528
+ * Le handler reçoit **une exécution à la fois**, au format unifié, et **uniquement celles
1529
+ * survenues après l'abonnement** — le rejeu d'historique de la venue est écarté.
1530
+ */
1531
+ subscribe(access: ITradingAccess, handler: (trade: ITrade) => void): Unsubscribe;
1532
+ /**
1533
+ * S'abonne aux exécutions de PLUSIEURS comptes, avec un seul handler.
1534
+ *
1535
+ * Chaque exécution porte son `xex` : l'appelant sait toujours de quelle venue elle vient. La
1536
+ * fonction rendue coupe tous les flux d'un coup — sinon il faudrait en garder N et n'en oublier
1537
+ * aucun.
1538
+ *
1539
+ * Une venue qui refuse est journalisée et ignorée : le reste des comptes doit continuer d'être
1540
+ * suivi. Sur un seul accès, l'échec est celui de l'appel.
1541
+ */
1542
+ subscribeAll(accesses: ITradingAccess[], handler: (trade: ITrade) => void): Unsubscribe;
1543
+ /**
1544
+ * S'abonne aux ORDRES du compte — leur naissance, leur remplissage, leur mort.
1545
+ *
1546
+ * À distinguer des exécutions : un ordre est une **intention** dont on suit le cycle de vie
1547
+ * (`open` → `partiallyFilled` → `filled`, ou `canceled`), une exécution est un **fait** ponctuel.
1548
+ * Pour savoir qu'un stop vient de se déclencher, c'est ici qu'il faut écouter ; pour savoir à quel
1549
+ * prix, c'est {@link subscribe}.
1550
+ *
1551
+ * **Même règle que pour les exécutions** : seuls les ordres postérieurs à l'abonnement sont
1552
+ * transmis, le rejeu d'historique est écarté.
1553
+ */
1554
+ subscribeOrders(access: ITradingAccess, handler: (order: IOrder) => void): Unsubscribe;
1555
+ /**
1556
+ * S'abonne aux TRANSACTIONS PUBLIQUES d'un marché — celles de tout le monde, pas les siennes.
1557
+ *
1558
+ * C'est le flux qui dit ce qui se négocie réellement : prix, taille, sens agresseur. Il sert à
1559
+ * mesurer l'activité d'une paire, pas à suivre son compte — pour cela, {@link subscribe}.
1560
+ *
1561
+ * **Aucun filtre temporel ici** : un trade public est daté de son exécution et arrive en direct,
1562
+ * il n'y a pas d'historique rejoué à écarter.
1563
+ */
1564
+ subscribePublicTrades(access: ITradingAccess, symbolXex: string, handler: (trade: IPublicTrade) => void): Unsubscribe;
1565
+ /** Le client temps réel d'un compte, avec ses souscriptions signées. */
1566
+ private wsOf;
1567
+ private toOrder;
1568
+ private toTrade;
1569
+ }
1570
+
1317
1571
  /** La venue sert-elle cet intervalle de première main ? */
1318
1572
  declare function servesNatively(xex: XgateEx, interval: Timeframe): boolean;
1319
1573
  /**
@@ -1397,4 +1651,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
1397
1651
  */
1398
1652
  declare function isDated(xtras?: Record<string, unknown>): boolean;
1399
1653
 
1400
- export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };
1654
+ export { CandlesService, CandlesStreamRegistry, CandlesStreamService, CatalogService, type Direction, type IAccountState, type IBalance, type ICandle, type ICandlesQuery, type IEntryWithProtection, type IEquityPoint, type IFundingPaid, type IMoveStop, type IMovement, type IOrder, type IPair, type IPosition, type IPrice, type IProtection, type IProtectionInput, type IProtectionLeg, type IPublicTrade, type ITrade, type ITradingAccess, type IWalletAccess, type IXexAccess, type IXexSpotSource, type MarketKind, type MovementKind, type MovementStatus, ORDER_STATUSES, type OrderStatus, type OrderType, PricesService, SPOT_XEXES, type Side, SpotCandlesService, SpotCatalogService, SpotPricesService, SpotWsCandlesService, TIMEFRAME_MINUTES, type TimeInForce, Timeframe, TradingService, type Unsubscribe, WALLET_XEXES, WS_SUBSCRIPTION_LIMITS, WalletService, WsCandlesService, WsTradesService, XGATE_EXCHANGES, XgateEx, XgateModule, buildLevels, buildProtection, canonicalFromBase, canonicalFromXex, expiryOf, isDated, multiplierFromXex, roundPrice, roundToStep, servesNatively, servesSpot, sourceFor, subscriptionLimitOf, timeframeMs };