@blackcube/xgate-sdk 0.58.0 → 0.58.1

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
@@ -1704,10 +1704,13 @@ declare class TradingService {
1704
1704
  * take-profit peut remplir en plusieurs fois. Seul l'historique porte le prix réellement obtenu, et
1705
1705
  * c'est lui qui doit servir au calcul du résultat — sinon le PnL affiché est une fiction.
1706
1706
  *
1707
- * On retient le **dernier** ordre de sortie rempli après `openedAt` : les précédents sont les
1708
- * take-profits partiels, celui-là est la clôture.
1707
+ * On lit les **exécutions** (`trades`), jamais les ordres : le prix d'un ordre est sa LIMITE — chez
1708
+ * hyperliquid, un market est un IOC borné à mark ± glissement, et son « prix » est cette borne, pas le
1709
+ * prix obtenu (BNB, 2026-10-01 : sortie lue à 844,44 pour des fills à 767,69). Le prix de sortie est la
1710
+ * moyenne des exécutions de sortie après `openedAt` — et avant `until` quand il est donné — pondérée par
1711
+ * leur taille : TP partiels et clôture compris, c'est le prix auquel la position est réellement sortie.
1709
1712
  */
1710
- exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date): Promise<string | null>;
1713
+ exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date, until?: Date): Promise<string | null>;
1711
1714
  /**
1712
1715
  * L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.
1713
1716
  *
package/dist/index.d.ts CHANGED
@@ -1704,10 +1704,13 @@ declare class TradingService {
1704
1704
  * take-profit peut remplir en plusieurs fois. Seul l'historique porte le prix réellement obtenu, et
1705
1705
  * c'est lui qui doit servir au calcul du résultat — sinon le PnL affiché est une fiction.
1706
1706
  *
1707
- * On retient le **dernier** ordre de sortie rempli après `openedAt` : les précédents sont les
1708
- * take-profits partiels, celui-là est la clôture.
1707
+ * On lit les **exécutions** (`trades`), jamais les ordres : le prix d'un ordre est sa LIMITE — chez
1708
+ * hyperliquid, un market est un IOC borné à mark ± glissement, et son « prix » est cette borne, pas le
1709
+ * prix obtenu (BNB, 2026-10-01 : sortie lue à 844,44 pour des fills à 767,69). Le prix de sortie est la
1710
+ * moyenne des exécutions de sortie après `openedAt` — et avant `until` quand il est donné — pondérée par
1711
+ * leur taille : TP partiels et clôture compris, c'est le prix auquel la position est réellement sortie.
1709
1712
  */
1710
- exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date): Promise<string | null>;
1713
+ exitPrice(access: ITradingAccess, symbolXex: string, direction: Direction, openedAt: Date, until?: Date): Promise<string | null>;
1711
1714
  /**
1712
1715
  * L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.
1713
1716
  *
package/dist/index.js CHANGED
@@ -1701,15 +1701,25 @@ var TradingService = class {
1701
1701
  * take-profit peut remplir en plusieurs fois. Seul l'historique porte le prix réellement obtenu, et
1702
1702
  * c'est lui qui doit servir au calcul du résultat — sinon le PnL affiché est une fiction.
1703
1703
  *
1704
- * On retient le **dernier** ordre de sortie rempli après `openedAt` : les précédents sont les
1705
- * take-profits partiels, celui-là est la clôture.
1704
+ * On lit les **exécutions** (`trades`), jamais les ordres : le prix d'un ordre est sa LIMITE — chez
1705
+ * hyperliquid, un market est un IOC borné à mark ± glissement, et son « prix » est cette borne, pas le
1706
+ * prix obtenu (BNB, 2026-10-01 : sortie lue à 844,44 pour des fills à 767,69). Le prix de sortie est la
1707
+ * moyenne des exécutions de sortie après `openedAt` — et avant `until` quand il est donné — pondérée par
1708
+ * leur taille : TP partiels et clôture compris, c'est le prix auquel la position est réellement sortie.
1706
1709
  */
1707
- async exitPrice(access, symbolXex, direction, openedAt) {
1710
+ async exitPrice(access, symbolXex, direction, openedAt, until) {
1708
1711
  const exit = direction === "long" ? "sell" : "buy";
1709
- const history = await this.perpOf(access).getHistory({ name: symbolXex });
1710
- const exits = history.filter((order) => order.name === symbolXex && order.side === exit).filter((order) => order.status === "filled" || order.status === "partiallyFilled").filter((order) => order.placedAt.getTime() > openedAt.getTime()).filter((order) => order.price !== null && Number(order.price) > 0).sort((left, right) => right.placedAt.getTime() - left.placedAt.getTime());
1711
- const last = exits[0];
1712
- return last === void 0 ? null : last.price;
1712
+ const fin = until === void 0 ? Number.POSITIVE_INFINITY : until.getTime();
1713
+ const fills = (await this.trades(access)).filter((fill) => fill.symbolXex === symbolXex && fill.side === exit).filter(
1714
+ (fill) => fill.filledAt.getTime() > openedAt.getTime() && fill.filledAt.getTime() <= fin
1715
+ ).filter((fill) => Number(fill.price) > 0 && Number(fill.size) > 0);
1716
+ const taille = fills.reduce((total, fill) => total + Number(fill.size), 0);
1717
+ if (taille === 0) {
1718
+ return null;
1719
+ }
1720
+ const moyenne = fills.reduce((total, fill) => total + Number(fill.price) * Number(fill.size), 0) / taille;
1721
+ const decimales = Math.max(...fills.map((fill) => (fill.price.split(".")[1] ?? "").length));
1722
+ return String(Number(moyenne.toFixed(decimales)));
1713
1723
  }
1714
1724
  /**
1715
1725
  * L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.