@blackcube/xgate-sdk 0.58.0 → 0.58.2

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
@@ -159,17 +159,22 @@ function createAccountXex(xex, access) {
159
159
  },
160
160
  { default: "a" }
161
161
  );
162
- case "pacifica" /* Pacifica */:
162
+ case "pacifica" /* Pacifica */: {
163
+ const secretKey = access.privateKey ?? "";
164
+ const signataire = secretKey === "" ? null : new Pacifica().helpers().solanaAddress(secretKey);
165
+ const compte = adresse();
163
166
  return new Pacifica(
164
167
  {
165
168
  a: {
166
- secretKey: access.privateKey ?? "",
167
- publicKey: adresse(),
168
- network: access.network ?? "mainnet"
169
+ secretKey,
170
+ publicKey: compte,
171
+ network: access.network ?? "mainnet",
172
+ ...signataire !== null && signataire !== compte ? { agentWallet: signataire } : {}
169
173
  }
170
174
  },
171
175
  { default: "a" }
172
176
  );
177
+ }
173
178
  case "lighter" /* Lighter */:
174
179
  return new Lighter(
175
180
  {
@@ -1701,15 +1706,25 @@ var TradingService = class {
1701
1706
  * take-profit peut remplir en plusieurs fois. Seul l'historique porte le prix réellement obtenu, et
1702
1707
  * c'est lui qui doit servir au calcul du résultat — sinon le PnL affiché est une fiction.
1703
1708
  *
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.
1709
+ * On lit les **exécutions** (`trades`), jamais les ordres : le prix d'un ordre est sa LIMITE — chez
1710
+ * hyperliquid, un market est un IOC borné à mark ± glissement, et son « prix » est cette borne, pas le
1711
+ * prix obtenu (BNB, 2026-10-01 : sortie lue à 844,44 pour des fills à 767,69). Le prix de sortie est la
1712
+ * moyenne des exécutions de sortie après `openedAt` — et avant `until` quand il est donné — pondérée par
1713
+ * leur taille : TP partiels et clôture compris, c'est le prix auquel la position est réellement sortie.
1706
1714
  */
1707
- async exitPrice(access, symbolXex, direction, openedAt) {
1715
+ async exitPrice(access, symbolXex, direction, openedAt, until) {
1708
1716
  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;
1717
+ const fin = until === void 0 ? Number.POSITIVE_INFINITY : until.getTime();
1718
+ const fills = (await this.trades(access)).filter((fill) => fill.symbolXex === symbolXex && fill.side === exit).filter(
1719
+ (fill) => fill.filledAt.getTime() > openedAt.getTime() && fill.filledAt.getTime() <= fin
1720
+ ).filter((fill) => Number(fill.price) > 0 && Number(fill.size) > 0);
1721
+ const taille = fills.reduce((total, fill) => total + Number(fill.size), 0);
1722
+ if (taille === 0) {
1723
+ return null;
1724
+ }
1725
+ const moyenne = fills.reduce((total, fill) => total + Number(fill.price) * Number(fill.size), 0) / taille;
1726
+ const decimales = Math.max(...fills.map((fill) => (fill.price.split(".")[1] ?? "").length));
1727
+ return String(Number(moyenne.toFixed(decimales)));
1713
1728
  }
1714
1729
  /**
1715
1730
  * L'HISTORIQUE DES ORDRES du compte — ce qui a été soumis, rempli, annulé ou expiré.