@blackcube/xgate-sdk 0.24.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 +22 -6
- package/dist/index.cjs +10 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +55 -12
- package/dist/index.d.ts +55 -12
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
package/dist/index.d.cts
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[];
|
|
@@ -1261,16 +1286,34 @@ interface IEntryWithProtection {
|
|
|
1261
1286
|
size: number;
|
|
1262
1287
|
/** Prix d'entrée visé. Sert de référence aux pourcentages, et de prix limite. */
|
|
1263
1288
|
entry: number;
|
|
1264
|
-
/** Écart du stop au prix d'entrée, en fraction (0.02 = 2 %). Obligatoire. */
|
|
1265
|
-
slPct: number;
|
|
1266
1289
|
/**
|
|
1267
|
-
*
|
|
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.
|
|
1268
1312
|
*
|
|
1269
1313
|
* Au-dessus de 80 % cumulés, le dernier absorbe le reliquat et la position ferme entièrement ;
|
|
1270
1314
|
* à 80 % ou en dessous, le reste court.
|
|
1271
1315
|
*/
|
|
1272
|
-
tps: Array<{
|
|
1273
|
-
pct: number;
|
|
1316
|
+
tps: Array<ITarget & {
|
|
1274
1317
|
part: number;
|
|
1275
1318
|
}>;
|
|
1276
1319
|
/** `ioc` pour entrer au marché (taker), `alo` pour poster (maker). Défaut : `ioc`. */
|
|
@@ -1651,4 +1694,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
|
|
|
1651
1694
|
*/
|
|
1652
1695
|
declare function isDated(xtras?: Record<string, unknown>): boolean;
|
|
1653
1696
|
|
|
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 };
|
|
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 };
|
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[];
|
|
@@ -1261,16 +1286,34 @@ interface IEntryWithProtection {
|
|
|
1261
1286
|
size: number;
|
|
1262
1287
|
/** Prix d'entrée visé. Sert de référence aux pourcentages, et de prix limite. */
|
|
1263
1288
|
entry: number;
|
|
1264
|
-
/** Écart du stop au prix d'entrée, en fraction (0.02 = 2 %). Obligatoire. */
|
|
1265
|
-
slPct: number;
|
|
1266
1289
|
/**
|
|
1267
|
-
*
|
|
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.
|
|
1268
1312
|
*
|
|
1269
1313
|
* Au-dessus de 80 % cumulés, le dernier absorbe le reliquat et la position ferme entièrement ;
|
|
1270
1314
|
* à 80 % ou en dessous, le reste court.
|
|
1271
1315
|
*/
|
|
1272
|
-
tps: Array<{
|
|
1273
|
-
pct: number;
|
|
1316
|
+
tps: Array<ITarget & {
|
|
1274
1317
|
part: number;
|
|
1275
1318
|
}>;
|
|
1276
1319
|
/** `ioc` pour entrer au marché (taker), `alo` pour poster (maker). Défaut : `ioc`. */
|
|
@@ -1651,4 +1694,4 @@ declare function expiryOf(xtras?: Record<string, unknown>): Date | undefined;
|
|
|
1651
1694
|
*/
|
|
1652
1695
|
declare function isDated(xtras?: Record<string, unknown>): boolean;
|
|
1653
1696
|
|
|
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 };
|
|
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 };
|
package/dist/index.js
CHANGED
|
@@ -1075,6 +1075,13 @@ SpotWsCandlesService = __decorateClass([
|
|
|
1075
1075
|
], SpotWsCandlesService);
|
|
1076
1076
|
|
|
1077
1077
|
// src/helpers/protection.ts
|
|
1078
|
+
function priceOf(cible, entry, direction, gagnant) {
|
|
1079
|
+
if (cible.price !== void 0) {
|
|
1080
|
+
return round8(cible.price);
|
|
1081
|
+
}
|
|
1082
|
+
const dir = (direction === "long" ? 1 : -1) * (gagnant === true ? 1 : -1);
|
|
1083
|
+
return round8(entry * (1 + dir * cible.pct));
|
|
1084
|
+
}
|
|
1078
1085
|
var SLIPPAGE_DEFAUT = 5e-3;
|
|
1079
1086
|
var SEUIL_CLOTURE = 0.8;
|
|
1080
1087
|
function round8(value) {
|
|
@@ -1117,12 +1124,8 @@ function buildLevels(entry, direction, slPct, tpPcts) {
|
|
|
1117
1124
|
function buildProtection(input) {
|
|
1118
1125
|
const slippage = input.slippagePct ?? SLIPPAGE_DEFAUT;
|
|
1119
1126
|
const long = input.direction === "long";
|
|
1120
|
-
const
|
|
1121
|
-
|
|
1122
|
-
input.direction,
|
|
1123
|
-
input.slPct,
|
|
1124
|
-
input.tps.map((tp) => tp.pct)
|
|
1125
|
-
);
|
|
1127
|
+
const sl = priceOf(input.sl, input.entry, input.direction, false);
|
|
1128
|
+
const niveaux = input.tps.map((tp) => priceOf(tp, input.entry, input.direction, true));
|
|
1126
1129
|
const borne = (trigger) => long === true ? trigger * (1 - slippage) : trigger * (1 + slippage);
|
|
1127
1130
|
const sommeParts = input.tps.reduce((total, tp) => total + tp.part, 0);
|
|
1128
1131
|
const clotureIntegrale = sommeParts > SEUIL_CLOTURE;
|
|
@@ -1193,7 +1196,7 @@ var TradingService = class {
|
|
|
1193
1196
|
entry: input.entry,
|
|
1194
1197
|
direction: input.direction,
|
|
1195
1198
|
size: input.size,
|
|
1196
|
-
|
|
1199
|
+
sl: input.sl,
|
|
1197
1200
|
tps: input.tps,
|
|
1198
1201
|
tickSize: input.tickSize,
|
|
1199
1202
|
lotSize: input.lotSize,
|