@blackcube/xgate-sdk 0.23.0 → 0.25.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/README.md +196 -20
- package/dist/index.cjs +464 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +309 -12
- package/dist/index.d.ts +309 -12
- package/dist/index.js +465 -27
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
package/dist/index.d.ts
CHANGED
|
@@ -969,23 +969,42 @@ interface IProtection {
|
|
|
969
969
|
* Ce que l'appelant fournit. **Les pourcentages sont des écarts au prix d'entrée**, en fraction
|
|
970
970
|
* (0.01 = 1 %) : `slPct: 0.02` place le stop 2 % sous l'entrée en long, 2 % au-dessus en short.
|
|
971
971
|
*/
|
|
972
|
+
/**
|
|
973
|
+
* UN NIVEAU DE SORTIE — dit en ÉCART ou en PRIX, jamais les deux.
|
|
974
|
+
*
|
|
975
|
+
* Les deux façons de penser un objectif coexistent réellement : « je sors si ça monte de 10 % »
|
|
976
|
+
* raisonne en risque, « je sors si ça touche 62 500 » raisonne en niveau technique. Obliger à
|
|
977
|
+
* convertir l'un dans l'autre revient à faire calculer l'appelant, donc à déplacer l'erreur chez lui.
|
|
978
|
+
*
|
|
979
|
+
* L'union est **exclusive** par construction : donner les deux ne compile pas, et n'en donner aucun
|
|
980
|
+
* non plus. C'est ce qui rend impossible un objectif à moitié défini.
|
|
981
|
+
*/
|
|
982
|
+
type ITarget = {
|
|
983
|
+
pct: number;
|
|
984
|
+
price?: never;
|
|
985
|
+
} | {
|
|
986
|
+
price: number;
|
|
987
|
+
pct?: never;
|
|
988
|
+
};
|
|
972
989
|
interface IProtectionInput {
|
|
973
990
|
/** Prix d'entrée de référence. */
|
|
974
991
|
entry: number;
|
|
975
992
|
direction: Direction;
|
|
976
993
|
/** Taille de la position, **en unités de base**. */
|
|
977
994
|
size: number;
|
|
978
|
-
/** Écart du stop au prix d'entrée, en fraction. Toujours du côté perdant. */
|
|
979
|
-
slPct: number;
|
|
980
995
|
/**
|
|
981
|
-
*
|
|
982
|
-
*
|
|
996
|
+
* Le stop — en **écart** au prix d'entrée (`{ pct: 0.02 }`) ou en **prix absolu**
|
|
997
|
+
* (`{ price: 62500 }`). Toujours du côté perdant quand il est donné en écart.
|
|
998
|
+
*/
|
|
999
|
+
sl: ITarget;
|
|
1000
|
+
/**
|
|
1001
|
+
* Les take-profits, dans l'ordre. Chacun porte son niveau — en écart ou en prix — et `part`, la
|
|
1002
|
+
* fraction de la POSITION à sortir là (toujours un pourcentage, jamais un prix).
|
|
983
1003
|
*
|
|
984
1004
|
* **Une part à 0 ne produit AUCUN leg** — c'est un marqueur (un palier de breakeven, par exemple),
|
|
985
1005
|
* pas un ordre. Sauf s'il s'agit du dernier : celui-là clôture toujours.
|
|
986
1006
|
*/
|
|
987
|
-
tps: Array<{
|
|
988
|
-
pct: number;
|
|
1007
|
+
tps: Array<ITarget & {
|
|
989
1008
|
part: number;
|
|
990
1009
|
}>;
|
|
991
1010
|
/** Pas de prix de la paire. */
|
|
@@ -1016,6 +1035,12 @@ declare function roundPrice(value: number, tickSize?: string | null, lotSize?: s
|
|
|
1016
1035
|
* L'appelant donne un prix d'entrée, un sens et des écarts ; il ne calcule aucun prix lui-même.
|
|
1017
1036
|
* Le stop part du côté perdant, les take-profits du côté gagnant — le sens s'en occupe.
|
|
1018
1037
|
*/
|
|
1038
|
+
/**
|
|
1039
|
+
* Les niveaux depuis des POURCENTAGES seuls — forme courte quand tout est exprimé en écart.
|
|
1040
|
+
*
|
|
1041
|
+
* {@link buildProtection} ne l'utilise plus : il résout chaque niveau séparément, puisqu'un stop
|
|
1042
|
+
* peut être donné en écart et un take-profit en prix absolu dans le même appel.
|
|
1043
|
+
*/
|
|
1019
1044
|
declare function buildLevels(entry: number, direction: Direction, slPct: number, tpPcts: readonly number[]): {
|
|
1020
1045
|
sl: number;
|
|
1021
1046
|
tps: number[];
|
|
@@ -1128,6 +1153,69 @@ interface IPosition {
|
|
|
1128
1153
|
margin: string | null;
|
|
1129
1154
|
xtras?: Record<string, unknown>;
|
|
1130
1155
|
}
|
|
1156
|
+
/**
|
|
1157
|
+
* UNE TRANSACTION PUBLIQUE — celles de tout le monde sur un marché, pas les siennes.
|
|
1158
|
+
*
|
|
1159
|
+
* À ne pas confondre avec {@link ITrade}, qui est une exécution **du compte**. Celle-ci n'a ni
|
|
1160
|
+
* frais, ni PnL, ni identifiant d'ordre : on ne voit que ce que le marché montre.
|
|
1161
|
+
*/
|
|
1162
|
+
interface IPublicTrade {
|
|
1163
|
+
xex: XgateEx;
|
|
1164
|
+
symbolXex: string;
|
|
1165
|
+
price: string;
|
|
1166
|
+
size: string;
|
|
1167
|
+
/** Sens de l'AGRESSEUR : `buy` = quelqu'un a pris l'offre. */
|
|
1168
|
+
side: Side;
|
|
1169
|
+
tradedAt: Date;
|
|
1170
|
+
xtras?: Record<string, unknown>;
|
|
1171
|
+
}
|
|
1172
|
+
/**
|
|
1173
|
+
* L'ÉTAT D'UN COMPTE — ce que toutes les venues disent, sous des noms différents.
|
|
1174
|
+
*
|
|
1175
|
+
* Les formes natives ne se ressemblent pas : hyperliquid range son équité sous
|
|
1176
|
+
* `marginSummary.accountValue`, pacifica sous `accountEquity`, aster sous `totalMarginBalance`.
|
|
1177
|
+
* **Mais les concepts, eux, sont les mêmes** — c'est exactement ce qu'XGate existe pour normaliser.
|
|
1178
|
+
*
|
|
1179
|
+
* `xtras` conserve la forme native complète : ce qui est propre à une venue n'est pas perdu, il
|
|
1180
|
+
* n'est simplement pas promu au rang de contrat.
|
|
1181
|
+
*/
|
|
1182
|
+
interface IAccountState {
|
|
1183
|
+
xex: XgateEx;
|
|
1184
|
+
/** Valeur totale du compte, PnL latent compris. */
|
|
1185
|
+
equity: string;
|
|
1186
|
+
/** Ce qui reste mobilisable — pour ouvrir ou retirer. `null` si la venue ne le publie pas. */
|
|
1187
|
+
available: string | null;
|
|
1188
|
+
/** Marge immobilisée par les positions et ordres en cours. */
|
|
1189
|
+
marginUsed: string | null;
|
|
1190
|
+
/** Marge de maintenance : sous ce seuil, la liquidation menace. */
|
|
1191
|
+
maintenanceMargin: string | null;
|
|
1192
|
+
/**
|
|
1193
|
+
* PnL non réalisé des positions ouvertes.
|
|
1194
|
+
*
|
|
1195
|
+
* **Seule aster le publie au niveau du compte.** hyperliquid et pacifica ne l'exposent pas là —
|
|
1196
|
+
* il se lit alors sur les positions (`IPosition.unrealizedPnl`), qui le portent toutes. On rend
|
|
1197
|
+
* `null` plutôt que de le reconstituer : une somme calculée ici passerait pour une donnée de la
|
|
1198
|
+
* venue.
|
|
1199
|
+
*/
|
|
1200
|
+
unrealizedPnl: string | null;
|
|
1201
|
+
/** L'état natif COMPLET, tel que la venue le publie. */
|
|
1202
|
+
xtras?: Record<string, unknown>;
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* UN FUNDING PAYÉ — ce qui a réellement été prélevé ou reçu sur une position.
|
|
1206
|
+
*
|
|
1207
|
+
* À ne pas confondre avec le taux courant d'`IPrice.funding`, qui annonce ce qui *sera* payé. Un
|
|
1208
|
+
* calcul de résultat qui ignore ce qui l'a été surestime toute position tenue longtemps.
|
|
1209
|
+
*/
|
|
1210
|
+
interface IFundingPaid {
|
|
1211
|
+
xex: XgateEx;
|
|
1212
|
+
symbolXex: string;
|
|
1213
|
+
/** Le taux appliqué, en fraction. */
|
|
1214
|
+
rate: string;
|
|
1215
|
+
/** Moment où il a été prélevé. */
|
|
1216
|
+
appliedAt: Date;
|
|
1217
|
+
xtras?: Record<string, unknown>;
|
|
1218
|
+
}
|
|
1131
1219
|
/** UNE EXÉCUTION du compte — ce qui a réellement été rempli, par opposition à ce qui a été demandé. */
|
|
1132
1220
|
interface ITrade {
|
|
1133
1221
|
xex: XgateEx;
|
|
@@ -1198,16 +1286,34 @@ interface IEntryWithProtection {
|
|
|
1198
1286
|
size: number;
|
|
1199
1287
|
/** Prix d'entrée visé. Sert de référence aux pourcentages, et de prix limite. */
|
|
1200
1288
|
entry: number;
|
|
1201
|
-
/** Écart du stop au prix d'entrée, en fraction (0.02 = 2 %). Obligatoire. */
|
|
1202
|
-
slPct: number;
|
|
1203
1289
|
/**
|
|
1204
|
-
*
|
|
1290
|
+
* LE STOP — en **écart** au prix d'entrée ou en **prix absolu**, jamais les deux.
|
|
1291
|
+
*
|
|
1292
|
+
* ```typescript
|
|
1293
|
+
* sl: { pct: 0.02 } // 2 % sous l'entrée en long, 2 % au-dessus en short
|
|
1294
|
+
* sl: { price: 62500 } // exactement 62 500, quel que soit le prix d'entrée
|
|
1295
|
+
* ```
|
|
1296
|
+
*
|
|
1297
|
+
* **Obligatoire.** C'est la règle qui a motivé tout ce chemin : jamais un ordre sans stop.
|
|
1298
|
+
*/
|
|
1299
|
+
sl: ITarget;
|
|
1300
|
+
/**
|
|
1301
|
+
* LES TAKE-PROFITS, dans l'ordre. Chacun dit son NIVEAU et sa PART.
|
|
1302
|
+
*
|
|
1303
|
+
* ```typescript
|
|
1304
|
+
* tps: [{ pct: 0.03, part: 0.5 }, // sortir 50 % si ça monte de 3 %
|
|
1305
|
+
* { price: 62500, part: 0.5 }] // sortir 50 % si ça touche 62 500
|
|
1306
|
+
* ```
|
|
1307
|
+
*
|
|
1308
|
+
* **`part` est toujours une fraction de la POSITION**, jamais un prix : les deux modes ne portent
|
|
1309
|
+
* que sur le niveau. Un objectif se pense soit en risque (« +3 % »), soit en niveau technique
|
|
1310
|
+
* (« 62 500 ») — obliger à convertir l'un dans l'autre déplacerait le calcul, donc l'erreur, chez
|
|
1311
|
+
* l'appelant.
|
|
1205
1312
|
*
|
|
1206
1313
|
* Au-dessus de 80 % cumulés, le dernier absorbe le reliquat et la position ferme entièrement ;
|
|
1207
1314
|
* à 80 % ou en dessous, le reste court.
|
|
1208
1315
|
*/
|
|
1209
|
-
tps: Array<{
|
|
1210
|
-
pct: number;
|
|
1316
|
+
tps: Array<ITarget & {
|
|
1211
1317
|
part: number;
|
|
1212
1318
|
}>;
|
|
1213
1319
|
/** `ioc` pour entrer au marché (taker), `alo` pour poster (maker). Défaut : `ioc`. */
|
|
@@ -1254,6 +1360,18 @@ declare class TradingService {
|
|
|
1254
1360
|
* conditionnels. Le SDK de la venue s'en charge ; xgate fournit des niveaux justes.
|
|
1255
1361
|
*/
|
|
1256
1362
|
openWithProtection(access: ITradingAccess, input: IEntryWithProtection): Promise<IOrder[]>;
|
|
1363
|
+
/**
|
|
1364
|
+
* CE QUE LA VENUE A RÉELLEMENT FAIT, après une réponse perdue.
|
|
1365
|
+
*
|
|
1366
|
+
* Un timeout ne dit pas « rien n'a été créé » : mesuré sur aster, deux exécutions identiques ont
|
|
1367
|
+
* produit deux sous-ensembles différents — une fois le stop et un take-profit, une fois l'entrée
|
|
1368
|
+
* seule. La seule vérité est au carnet, donc on va l'y chercher.
|
|
1369
|
+
*
|
|
1370
|
+
* **Lève si la position est nue** : une entrée remplie sans stop est exactement ce que ce service
|
|
1371
|
+
* existe pour empêcher, et le silence serait pire que l'erreur. L'appelant doit savoir qu'il a une
|
|
1372
|
+
* position à protéger, tout de suite.
|
|
1373
|
+
*/
|
|
1374
|
+
private etatApres;
|
|
1257
1375
|
/** Les positions ouvertes d'un compte. */
|
|
1258
1376
|
positions(access: ITradingAccess, symbolXex?: string): Promise<IPosition[]>;
|
|
1259
1377
|
/** Les ordres encore au carnet. */
|
|
@@ -1302,10 +1420,120 @@ declare class TradingService {
|
|
|
1302
1420
|
* take-profits partiels, celui-là est la clôture.
|
|
1303
1421
|
*/
|
|
1304
1422
|
exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date): Promise<string | null>;
|
|
1423
|
+
/**
|
|
1424
|
+
* L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.
|
|
1425
|
+
*
|
|
1426
|
+
* À distinguer de {@link trades} : un ordre est une **intention**, une exécution est un **fait**.
|
|
1427
|
+
* Un ordre `filled` peut avoir été rempli en plusieurs fois, à des prix différents.
|
|
1428
|
+
*
|
|
1429
|
+
* Servi par les huit venues qui tradent.
|
|
1430
|
+
*/
|
|
1431
|
+
orderHistory(access: ITradingAccess, symbolXex?: string): Promise<IOrder[]>;
|
|
1432
|
+
/**
|
|
1433
|
+
* L'ÉTAT DU COMPTE — équité, disponible, marge immobilisée, marge de maintenance, PnL latent.
|
|
1434
|
+
*
|
|
1435
|
+
* Les venues rangent ces valeurs sous des noms qui n'ont rien à voir : `marginSummary.accountValue`
|
|
1436
|
+
* chez hyperliquid, `accountEquity` chez pacifica, `totalMarginBalance` chez aster — **mais elles
|
|
1437
|
+
* disent la même chose**. La forme native complète reste dans `xtras`, rien n'est perdu.
|
|
1438
|
+
*
|
|
1439
|
+
* **blofin ne l'expose pas** et lève ; les sept autres le servent.
|
|
1440
|
+
*/
|
|
1441
|
+
accountInfo(access: ITradingAccess): Promise<IAccountState>;
|
|
1442
|
+
/**
|
|
1443
|
+
* RÈGLE LE LEVIER d'une paire, avant d'ouvrir.
|
|
1444
|
+
*
|
|
1445
|
+
* Le levier détermine la marge immobilisée, donc la taille tenable : le changer après l'ouverture
|
|
1446
|
+
* ne rejoue pas la position déjà prise. C'est un réglage préalable, pas un ajustement.
|
|
1447
|
+
*
|
|
1448
|
+
* **bullet ne l'expose pas** — son levier se fixe au compte, pas à la position — et lève.
|
|
1449
|
+
*/
|
|
1450
|
+
setLeverage(access: ITradingAccess, symbolXex: string, leverage: number): Promise<void>;
|
|
1451
|
+
/**
|
|
1452
|
+
* CHOISIT LE MODE DE MARGE d'une paire : **isolée** ou **croisée**.
|
|
1453
|
+
*
|
|
1454
|
+
* En **croisée**, tout le solde du compte garantit la position : elle tient plus longtemps, mais
|
|
1455
|
+
* une liquidation emporte l'ensemble. En **isolée**, seule la marge affectée est en jeu : la perte
|
|
1456
|
+
* est bornée à ce montant, la liquidation arrive plus tôt.
|
|
1457
|
+
*
|
|
1458
|
+
* **À régler AVANT d'ouvrir.** Changer le mode d'une position vivante est refusé par la plupart
|
|
1459
|
+
* des venues, et là où c'est accepté, cela redistribue la garantie sous les pieds de la position.
|
|
1460
|
+
*
|
|
1461
|
+
* Servi par les trois venues de référence.
|
|
1462
|
+
*/
|
|
1463
|
+
setMarginMode(access: ITradingAccess, symbolXex: string, isolated: boolean): Promise<void>;
|
|
1464
|
+
/**
|
|
1465
|
+
* AJOUTE DE LA MARGE à une position isolée — pour éloigner le prix de liquidation.
|
|
1466
|
+
*
|
|
1467
|
+
* C'est le geste qui sauve une position sous pression sans la réduire : on renforce la garantie
|
|
1468
|
+
* plutôt que de couper. **N'a de sens qu'en marge isolée** ; en croisée, tout le solde garantit
|
|
1469
|
+
* déjà la position et il n'y a rien à ajouter.
|
|
1470
|
+
*
|
|
1471
|
+
* Servi par les trois venues de référence.
|
|
1472
|
+
*/
|
|
1473
|
+
addMargin(access: ITradingAccess, symbolXex: string, amount: string): Promise<void>;
|
|
1474
|
+
/**
|
|
1475
|
+
* RETIRE DE LA MARGE d'une position isolée — pour libérer du capital.
|
|
1476
|
+
*
|
|
1477
|
+
* L'inverse d'{@link addMargin} : la garantie diminue, donc le prix de liquidation **se rapproche**.
|
|
1478
|
+
* La venue refuse ce qui mettrait la position sous son seuil de maintenance.
|
|
1479
|
+
*
|
|
1480
|
+
* ⚠️ **pacifica ne l'expose pas** et lève : chez elle, la marge s'ajoute mais ne se retire pas.
|
|
1481
|
+
* Fermer partiellement la position libère alors le capital.
|
|
1482
|
+
*/
|
|
1483
|
+
removeMargin(access: ITradingAccess, symbolXex: string, amount: string): Promise<void>;
|
|
1484
|
+
/**
|
|
1485
|
+
* L'HISTORIQUE DU FUNDING **PAYÉ** sur une paire — ce qui a réellement été prélevé ou reçu.
|
|
1486
|
+
*
|
|
1487
|
+
* À ne pas confondre avec le taux courant, que rend `PricesService` : celui-ci annonce ce qui
|
|
1488
|
+
* *sera* payé, celui-là dit ce qui *l'a été*. Un backtest qui ignore le funding réel surestime le
|
|
1489
|
+
* résultat d'une position tenue longtemps.
|
|
1490
|
+
*
|
|
1491
|
+
* Servi par les huit venues qui tradent.
|
|
1492
|
+
*/
|
|
1493
|
+
fundingHistory(access: ITradingAccess, symbolXex: string, range?: {
|
|
1494
|
+
startTime?: Date;
|
|
1495
|
+
endTime?: Date;
|
|
1496
|
+
limit?: number;
|
|
1497
|
+
}): Promise<IFundingPaid[]>;
|
|
1498
|
+
/**
|
|
1499
|
+
* UN IDENTIFIANT APPLICATIF pour un ordre, **au format que la venue accepte**.
|
|
1500
|
+
*
|
|
1501
|
+
* C'est lui qui relie un ordre à la décision qui l'a produit : la venue le rend tel quel dans
|
|
1502
|
+
* `IOrder.clientId`, ce qui permet de retrouver son origine sans tenir de table de correspondance.
|
|
1503
|
+
*
|
|
1504
|
+
* **hyperliquid exige un hexadécimal préfixé `0x`** (128 bits) là où les autres acceptent un UUID
|
|
1505
|
+
* ordinaire. Passer le mauvais format fait rejeter l'ordre — d'où cette méthode plutôt qu'un
|
|
1506
|
+
* `randomUUID()` chez l'appelant.
|
|
1507
|
+
*/
|
|
1508
|
+
newClientOrderId(xex: XgateEx): string;
|
|
1509
|
+
/**
|
|
1510
|
+
* LE COUPE-CIRCUIT : annule TOUS les ordres d'une paire, d'un geste.
|
|
1511
|
+
*
|
|
1512
|
+
* À réserver aux situations où l'on veut reprendre la main sans discuter — un état incohérent, un
|
|
1513
|
+
* arrêt d'urgence, une reprise après incident. Annuler un par un laisse une fenêtre pendant
|
|
1514
|
+
* laquelle certains ordres vivent encore.
|
|
1515
|
+
*
|
|
1516
|
+
* ⚠️ **Cela retire aussi les PROTECTIONS.** Stops et take-profits sont des ordres comme les
|
|
1517
|
+
* autres : une position ouverte se retrouve **nue** après ce geste. À n'employer que si la
|
|
1518
|
+
* position est fermée, ou si l'on repose une protection immédiatement — jamais pour « faire le
|
|
1519
|
+
* ménage » sur une position vivante.
|
|
1520
|
+
*
|
|
1521
|
+
* Rend le nombre d'ordres annulés quand la venue le publie, `null` sinon.
|
|
1522
|
+
*/
|
|
1523
|
+
cancelAll(access: ITradingAccess, symbolXex: string): Promise<number | null>;
|
|
1305
1524
|
/** Annule un ordre par son identifiant de venue. */
|
|
1306
1525
|
cancel(access: ITradingAccess, symbolXex: string, orderId: string): Promise<void>;
|
|
1307
1526
|
/** Le scope `perp()` de la venue, typé au plus près de ce que le contrat commun garantit. */
|
|
1308
1527
|
private perpOf;
|
|
1528
|
+
/**
|
|
1529
|
+
* L'état natif d'une venue → {@link IAccountState}.
|
|
1530
|
+
*
|
|
1531
|
+
* Une lecture EXPLICITE par venue plutôt qu'un parcours à l'aveugle : les noms ne se devinent pas,
|
|
1532
|
+
* et prendre le premier champ qui ressemble à une équité produirait un chiffre faux sans que rien
|
|
1533
|
+
* ne le signale. `null` là où la venue ne publie pas la valeur — pas `0`, qui se lirait comme
|
|
1534
|
+
* « rien » alors que personne n'a rien dit.
|
|
1535
|
+
*/
|
|
1536
|
+
private toAccountState;
|
|
1309
1537
|
/**
|
|
1310
1538
|
* Le statut de la venue, VALIDÉ — jamais casté. Une venue qui inventerait un statut rendrait sinon
|
|
1311
1539
|
* une valeur absente de tous les `switch` en aval, et personne ne la rattraperait.
|
|
@@ -1314,6 +1542,75 @@ declare class TradingService {
|
|
|
1314
1542
|
private toOrder;
|
|
1315
1543
|
}
|
|
1316
1544
|
|
|
1545
|
+
/**
|
|
1546
|
+
* LE FLUX DES EXÉCUTIONS DU COMPTE — savoir ce qui s'est rempli, à l'instant où ça se remplit.
|
|
1547
|
+
*
|
|
1548
|
+
* **C'est la seule façon de connaître son état exact.** Sans lui, on interroge en boucle et on
|
|
1549
|
+
* apprend un remplissage avec le retard du sondage : entre-temps, un take-profit partiel a pu
|
|
1550
|
+
* modifier la taille de la position, et toute décision prise sur l'ancienne valeur est fausse.
|
|
1551
|
+
*
|
|
1552
|
+
* Le flux ne dit pas ce qu'on a **demandé** mais ce qui a été **obtenu** : un ordre annoncé `filled`
|
|
1553
|
+
* peut l'avoir été en plusieurs fois, à des prix différents. Chaque exécution porte son prix réel.
|
|
1554
|
+
*
|
|
1555
|
+
* **ON NE TRANSMET QUE CE QUI ARRIVE APRÈS L'OUVERTURE DU FLUX.** Les venues rejouent leur
|
|
1556
|
+
* historique à la souscription : mesuré le 2026-08-09 sur hyperliquid, 30 exécutions arrivent dans
|
|
1557
|
+
* les six premières secondes, **toutes antérieures** à l'abonnement, la plus ancienne de plus de
|
|
1558
|
+
* deux jours. Sans filtre, chaque reconnexion rejouerait deux jours de trades — et un consommateur
|
|
1559
|
+
* qui compte les remplissages compterait deux fois les mêmes.
|
|
1560
|
+
*
|
|
1561
|
+
* Le filtre se fait sur `filledAt` contre l'instant d'abonnement. Un flux dit le **présent** ;
|
|
1562
|
+
* l'historique se lit avec `TradingService.trades()`, qui est fait pour ça.
|
|
1563
|
+
*
|
|
1564
|
+
* **blofin est la seule venue qui ne l'expose pas** ; elle lève. Les sept autres le servent.
|
|
1565
|
+
*/
|
|
1566
|
+
declare class WsTradesService {
|
|
1567
|
+
private readonly logger;
|
|
1568
|
+
/**
|
|
1569
|
+
* S'abonne aux exécutions d'un compte. Rend la fonction de désabonnement.
|
|
1570
|
+
*
|
|
1571
|
+
* Le handler reçoit **une exécution à la fois**, au format unifié, et **uniquement celles
|
|
1572
|
+
* survenues après l'abonnement** — le rejeu d'historique de la venue est écarté.
|
|
1573
|
+
*/
|
|
1574
|
+
subscribe(access: ITradingAccess, handler: (trade: ITrade) => void): Unsubscribe;
|
|
1575
|
+
/**
|
|
1576
|
+
* S'abonne aux exécutions de PLUSIEURS comptes, avec un seul handler.
|
|
1577
|
+
*
|
|
1578
|
+
* Chaque exécution porte son `xex` : l'appelant sait toujours de quelle venue elle vient. La
|
|
1579
|
+
* fonction rendue coupe tous les flux d'un coup — sinon il faudrait en garder N et n'en oublier
|
|
1580
|
+
* aucun.
|
|
1581
|
+
*
|
|
1582
|
+
* Une venue qui refuse est journalisée et ignorée : le reste des comptes doit continuer d'être
|
|
1583
|
+
* suivi. Sur un seul accès, l'échec est celui de l'appel.
|
|
1584
|
+
*/
|
|
1585
|
+
subscribeAll(accesses: ITradingAccess[], handler: (trade: ITrade) => void): Unsubscribe;
|
|
1586
|
+
/**
|
|
1587
|
+
* S'abonne aux ORDRES du compte — leur naissance, leur remplissage, leur mort.
|
|
1588
|
+
*
|
|
1589
|
+
* À distinguer des exécutions : un ordre est une **intention** dont on suit le cycle de vie
|
|
1590
|
+
* (`open` → `partiallyFilled` → `filled`, ou `canceled`), une exécution est un **fait** ponctuel.
|
|
1591
|
+
* Pour savoir qu'un stop vient de se déclencher, c'est ici qu'il faut écouter ; pour savoir à quel
|
|
1592
|
+
* prix, c'est {@link subscribe}.
|
|
1593
|
+
*
|
|
1594
|
+
* **Même règle que pour les exécutions** : seuls les ordres postérieurs à l'abonnement sont
|
|
1595
|
+
* transmis, le rejeu d'historique est écarté.
|
|
1596
|
+
*/
|
|
1597
|
+
subscribeOrders(access: ITradingAccess, handler: (order: IOrder) => void): Unsubscribe;
|
|
1598
|
+
/**
|
|
1599
|
+
* S'abonne aux TRANSACTIONS PUBLIQUES d'un marché — celles de tout le monde, pas les siennes.
|
|
1600
|
+
*
|
|
1601
|
+
* C'est le flux qui dit ce qui se négocie réellement : prix, taille, sens agresseur. Il sert à
|
|
1602
|
+
* mesurer l'activité d'une paire, pas à suivre son compte — pour cela, {@link subscribe}.
|
|
1603
|
+
*
|
|
1604
|
+
* **Aucun filtre temporel ici** : un trade public est daté de son exécution et arrive en direct,
|
|
1605
|
+
* il n'y a pas d'historique rejoué à écarter.
|
|
1606
|
+
*/
|
|
1607
|
+
subscribePublicTrades(access: ITradingAccess, symbolXex: string, handler: (trade: IPublicTrade) => void): Unsubscribe;
|
|
1608
|
+
/** Le client temps réel d'un compte, avec ses souscriptions signées. */
|
|
1609
|
+
private wsOf;
|
|
1610
|
+
private toOrder;
|
|
1611
|
+
private toTrade;
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1317
1614
|
/** La venue sert-elle cet intervalle de première main ? */
|
|
1318
1615
|
declare function servesNatively(xex: XgateEx, interval: Timeframe): boolean;
|
|
1319
1616
|
/**
|
|
@@ -1397,4 +1694,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
|
|
|
1397
1694
|
*/
|
|
1398
1695
|
declare function isDated(xtras?: Record<string, unknown>): boolean;
|
|
1399
1696
|
|
|
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 };
|
|
1697
|
+
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 ITarget, 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 };
|