@orderly.network/perp 1.0.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.mjs ADDED
@@ -0,0 +1,450 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/positions.ts
8
+ var positions_exports = {};
9
+ __export(positions_exports, {
10
+ MMR: () => MMR,
11
+ liqPrice: () => liqPrice,
12
+ maintenanceMargin: () => maintenanceMargin,
13
+ notional: () => notional,
14
+ totalNotional: () => totalNotional,
15
+ totalUnrealizedPnL: () => totalUnrealizedPnL,
16
+ totalUnsettlementPnL: () => totalUnsettlementPnL,
17
+ unrealizedPnL: () => unrealizedPnL,
18
+ unrealizedPnLROI: () => unrealizedPnLROI,
19
+ unsettlementPnL: () => unsettlementPnL
20
+ });
21
+ import { Decimal } from "@orderly.network/utils";
22
+
23
+ // src/constants.ts
24
+ var IMRFactorPower = 4 / 5;
25
+
26
+ // src/positions.ts
27
+ function notional(qty, mark_price) {
28
+ return new Decimal(qty).mul(mark_price).abs().toNumber();
29
+ }
30
+ function totalNotional(positions) {
31
+ return positions.reduce((acc, cur) => {
32
+ return acc + notional(cur.position_qty, cur.mark_price);
33
+ }, 0);
34
+ }
35
+ function unrealizedPnL(inputs) {
36
+ return new Decimal(inputs.qty).mul(inputs.markPrice - inputs.openPrice).toNumber();
37
+ }
38
+ function unrealizedPnLROI(inputs) {
39
+ const { openPrice, IMR: IMR2 } = inputs;
40
+ if (inputs.unrealizedPnL === 0 || inputs.positionQty === 0 || openPrice === 0 || IMR2 === 0)
41
+ return 0;
42
+ return new Decimal(inputs.unrealizedPnL).div(new Decimal(inputs.positionQty).mul(openPrice).mul(IMR2)).toNumber();
43
+ }
44
+ function totalUnrealizedPnL(positions) {
45
+ return positions.reduce((acc, cur) => {
46
+ return acc + unrealizedPnL({
47
+ qty: cur.position_qty,
48
+ openPrice: cur.average_open_price,
49
+ markPrice: cur.mark_price
50
+ });
51
+ }, 0);
52
+ }
53
+ function liqPrice(inputs) {
54
+ const { markPrice, totalCollateral: totalCollateral2, positionQty, MMR: MMR2 } = inputs;
55
+ const totalNotional2 = notional(positionQty, markPrice);
56
+ if (positionQty === 0) {
57
+ return 0;
58
+ }
59
+ return Math.max(
60
+ new Decimal(markPrice).add(
61
+ new Decimal(totalCollateral2).sub(new Decimal(totalNotional2).mul(MMR2)).div(new Decimal(positionQty).abs().mul(MMR2).sub(positionQty))
62
+ ).toNumber(),
63
+ 0
64
+ );
65
+ }
66
+ function maintenanceMargin(inputs) {
67
+ const { positionQty, markPrice, MMR: MMR2 } = inputs;
68
+ return new Decimal(positionQty).mul(markPrice).mul(MMR2).abs().toNumber();
69
+ }
70
+ function unsettlementPnL(inputs) {
71
+ const {
72
+ positionQty,
73
+ markPrice,
74
+ costPosition,
75
+ sumUnitaryFunding,
76
+ lastSumUnitaryFunding
77
+ } = inputs;
78
+ const qty = new Decimal(positionQty);
79
+ return qty.mul(markPrice).sub(costPosition).sub(qty.mul(new Decimal(sumUnitaryFunding).sub(lastSumUnitaryFunding))).toNumber();
80
+ }
81
+ function totalUnsettlementPnL(positions) {
82
+ if (!Array.isArray(positions) || positions.length === 0) {
83
+ return 0;
84
+ }
85
+ return positions.reduce((acc, cur) => {
86
+ return acc + unsettlementPnL({
87
+ positionQty: cur.position_qty,
88
+ markPrice: cur.mark_price,
89
+ costPosition: cur.cost_position,
90
+ sumUnitaryFunding: cur.sum_unitary_funding,
91
+ lastSumUnitaryFunding: cur.last_sum_unitary_funding
92
+ });
93
+ }, 0);
94
+ }
95
+ function MMR(inputs) {
96
+ const {
97
+ baseMMR,
98
+ baseIMR,
99
+ IMRFactor,
100
+ positionNotional,
101
+ IMR_factor_power = IMRFactorPower
102
+ } = inputs;
103
+ return Math.max(
104
+ baseMMR,
105
+ new Decimal(baseMMR).div(baseIMR).mul(IMRFactor).mul(Math.abs(positionNotional)).toPower(IMR_factor_power).toNumber()
106
+ );
107
+ }
108
+
109
+ // src/account.ts
110
+ var account_exports = {};
111
+ __export(account_exports, {
112
+ IMR: () => IMR,
113
+ availableBalance: () => availableBalance,
114
+ buyOrdersFilter_by_symbol: () => buyOrdersFilter_by_symbol,
115
+ currentLeverage: () => currentLeverage,
116
+ extractSymbols: () => extractSymbols,
117
+ freeCollateral: () => freeCollateral,
118
+ getPositonsAndOrdersNotionalBySymbol: () => getPositonsAndOrdersNotionalBySymbol,
119
+ getQtyFromOrdersBySide: () => getQtyFromOrdersBySide,
120
+ getQtyFromPositions: () => getQtyFromPositions,
121
+ groupOrdersBySymbol: () => groupOrdersBySymbol,
122
+ initialMarginWithOrder: () => initialMarginWithOrder,
123
+ maxQty: () => maxQty,
124
+ maxQtyByLong: () => maxQtyByLong,
125
+ maxQtyByShort: () => maxQtyByShort,
126
+ otherIMs: () => otherIMs,
127
+ positionNotionalWithOrder_by_symbol: () => positionNotionalWithOrder_by_symbol,
128
+ positionQtyWithOrders_by_symbol: () => positionQtyWithOrders_by_symbol,
129
+ sellOrdersFilter_by_symbol: () => sellOrdersFilter_by_symbol,
130
+ totalCollateral: () => totalCollateral,
131
+ totalInitialMarginWithOrders: () => totalInitialMarginWithOrders,
132
+ totalMarginRatio: () => totalMarginRatio,
133
+ totalUnrealizedROI: () => totalUnrealizedROI,
134
+ totalValue: () => totalValue
135
+ });
136
+ import { Decimal as Decimal2, zero } from "@orderly.network/utils";
137
+ import {
138
+ OrderSide
139
+ } from "@orderly.network/types";
140
+ function totalValue(inputs) {
141
+ const { totalUnsettlementPnL: totalUnsettlementPnL2, USDCHolding, nonUSDCHolding } = inputs;
142
+ const nonUSDCHoldingValue = nonUSDCHolding.reduce((acc, cur) => {
143
+ return new Decimal2(cur.holding).mul(cur.markPrice).add(acc);
144
+ }, zero);
145
+ return nonUSDCHoldingValue.add(USDCHolding).add(totalUnsettlementPnL2);
146
+ }
147
+ function freeCollateral(inputs) {
148
+ return inputs.totalCollateral.sub(inputs.totalInitialMarginWithOrders);
149
+ }
150
+ function totalCollateral(inputs) {
151
+ const { USDCHolding, nonUSDCHolding } = inputs;
152
+ const nonUSDCHoldingValue = nonUSDCHolding.reduce((acc, cur) => {
153
+ return acc + new Decimal2(cur.holding).mul(cur.markPrice).mul(cur.discount).toNumber();
154
+ }, 0);
155
+ return new Decimal2(USDCHolding).add(nonUSDCHoldingValue).add(inputs.unsettlementPnL);
156
+ }
157
+ function initialMarginWithOrder() {
158
+ }
159
+ function positionNotionalWithOrder_by_symbol(inputs) {
160
+ return new Decimal2(inputs.markPrice).mul(inputs.positionQtyWithOrders);
161
+ }
162
+ function positionQtyWithOrders_by_symbol(inputs) {
163
+ const { positionQty, buyOrdersQty, sellOrdersQty } = inputs;
164
+ const positionQtyDecimal = new Decimal2(positionQty);
165
+ const qty = Math.max(
166
+ positionQtyDecimal.add(buyOrdersQty).abs().toNumber(),
167
+ positionQtyDecimal.sub(sellOrdersQty).abs().toNumber()
168
+ );
169
+ return qty;
170
+ }
171
+ function IMR(inputs) {
172
+ const {
173
+ maxLeverage,
174
+ baseIMR,
175
+ IMR_Factor,
176
+ positionNotional,
177
+ ordersNotional: orderNotional,
178
+ IMR_factor_power = IMRFactorPower
179
+ } = inputs;
180
+ return Math.max(
181
+ 1 / maxLeverage,
182
+ baseIMR,
183
+ new Decimal2(IMR_Factor).mul(
184
+ new Decimal2(positionNotional).add(orderNotional).abs().toPower(IMR_factor_power)
185
+ ).toNumber()
186
+ );
187
+ }
188
+ function buyOrdersFilter_by_symbol(orders, symbol) {
189
+ return orders.filter(
190
+ (item) => item.symbol === symbol && item.side === OrderSide.BUY
191
+ );
192
+ }
193
+ function sellOrdersFilter_by_symbol(orders, symbol) {
194
+ return orders.filter(
195
+ (item) => item.symbol === symbol && item.side === OrderSide.SELL
196
+ );
197
+ }
198
+ function getQtyFromPositions(positions, symbol) {
199
+ if (!positions) {
200
+ return 0;
201
+ }
202
+ const position = positions.find((item) => item.symbol === symbol);
203
+ return (position == null ? void 0 : position.position_qty) || 0;
204
+ }
205
+ function getQtyFromOrdersBySide(orders, symbol, side) {
206
+ const ordersBySide = side === OrderSide.SELL ? sellOrdersFilter_by_symbol(orders, symbol) : buyOrdersFilter_by_symbol(orders, symbol);
207
+ return ordersBySide.reduce((acc, cur) => {
208
+ return acc + cur.quantity;
209
+ }, 0);
210
+ }
211
+ function getPositonsAndOrdersNotionalBySymbol(inputs) {
212
+ const { positions, orders, symbol, markPrice } = inputs;
213
+ const positionQty = getQtyFromPositions(positions, symbol);
214
+ const buyOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.BUY);
215
+ const sellOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.SELL);
216
+ const markPriceDecimal = new Decimal2(markPrice);
217
+ return markPriceDecimal.mul(positionQty).add(markPriceDecimal.mul(new Decimal2(buyOrdersQty).add(sellOrdersQty))).abs().toNumber();
218
+ }
219
+ function totalInitialMarginWithOrders(inputs) {
220
+ const {
221
+ positions,
222
+ orders,
223
+ markPrices,
224
+ IMR_Factors,
225
+ maxLeverage,
226
+ symbolInfo
227
+ } = inputs;
228
+ const symbols = extractSymbols(positions, orders);
229
+ const total_initial_margin_with_orders = symbols.reduce((acc, cur) => {
230
+ const symbol = cur;
231
+ const positionQty = getQtyFromPositions(positions, symbol);
232
+ const buyOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.BUY);
233
+ const sellOrdersQty = getQtyFromOrdersBySide(
234
+ orders,
235
+ symbol,
236
+ OrderSide.SELL
237
+ );
238
+ const markPrice = markPrices[symbol] || 0;
239
+ const positionQtyWithOrders = positionQtyWithOrders_by_symbol({
240
+ positionQty,
241
+ buyOrdersQty,
242
+ sellOrdersQty
243
+ });
244
+ const position_notional_with_orders = positionNotionalWithOrder_by_symbol({
245
+ markPrice,
246
+ positionQtyWithOrders
247
+ });
248
+ const markPriceDecimal = new Decimal2(markPrice);
249
+ const imr = IMR({
250
+ positionNotional: markPriceDecimal.mul(positionQty).toNumber(),
251
+ ordersNotional: markPriceDecimal.mul(new Decimal2(buyOrdersQty).add(sellOrdersQty)).toNumber(),
252
+ maxLeverage,
253
+ IMR_Factor: IMR_Factors[symbol],
254
+ baseIMR: symbolInfo[symbol]("base_imr", 0)
255
+ });
256
+ return position_notional_with_orders.mul(imr).add(acc).toNumber();
257
+ }, 0);
258
+ return total_initial_margin_with_orders;
259
+ }
260
+ function groupOrdersBySymbol(orders) {
261
+ const symbols = {};
262
+ orders.forEach((item) => {
263
+ if (!symbols[item.symbol]) {
264
+ symbols[item.symbol] = [];
265
+ }
266
+ symbols[item.symbol].push(item);
267
+ });
268
+ return symbols;
269
+ }
270
+ function extractSymbols(positions, orders) {
271
+ const symbols = /* @__PURE__ */ new Set();
272
+ positions.forEach((item) => {
273
+ symbols.add(item.symbol);
274
+ });
275
+ orders.forEach((item) => {
276
+ symbols.add(item.symbol);
277
+ });
278
+ return Array.from(symbols);
279
+ }
280
+ function otherIMs(inputs) {
281
+ const {
282
+ orders,
283
+ positions,
284
+ maxLeverage,
285
+ IMR_Factors,
286
+ symbolInfo,
287
+ markPrices
288
+ } = inputs;
289
+ const symbols = extractSymbols(positions, orders);
290
+ return symbols.reduce((acc, cur) => {
291
+ const symbol = cur;
292
+ if (typeof markPrices[symbol] === "undefined") {
293
+ console.warn("markPrices[%s] is undefined", symbol);
294
+ return acc;
295
+ }
296
+ const markPriceDecimal = new Decimal2(markPrices[symbol] || 0);
297
+ const positionQty = getQtyFromPositions(positions, symbol);
298
+ const positionNotional = markPriceDecimal.mul(positionQty).toNumber();
299
+ const buyOrdersQty = getQtyFromOrdersBySide(
300
+ orders,
301
+ symbol,
302
+ OrderSide.BUY
303
+ );
304
+ const sellOrdersQty = getQtyFromOrdersBySide(
305
+ orders,
306
+ symbol,
307
+ OrderSide.SELL
308
+ );
309
+ const ordersNotional = markPriceDecimal.mul(new Decimal2(buyOrdersQty).add(sellOrdersQty)).toNumber();
310
+ const IMR_Factor = IMR_Factors[symbol];
311
+ if (!IMR_Factor) {
312
+ console.warn("IMR_Factor is not found:", symbol);
313
+ return acc;
314
+ }
315
+ const imr = IMR({
316
+ maxLeverage,
317
+ IMR_Factor,
318
+ baseIMR: symbolInfo[symbol]("base_imr", 0),
319
+ positionNotional,
320
+ ordersNotional
321
+ });
322
+ const positionQtyWithOrders = positionQtyWithOrders_by_symbol({
323
+ positionQty,
324
+ buyOrdersQty,
325
+ sellOrdersQty
326
+ });
327
+ const positionNotionalWithOrders = positionNotionalWithOrder_by_symbol({
328
+ markPrice: markPrices[symbol] || 0,
329
+ positionQtyWithOrders
330
+ });
331
+ return acc.add(positionNotionalWithOrders.mul(imr));
332
+ }, zero).toNumber();
333
+ }
334
+ function maxQty(side, inputs, options) {
335
+ if (side === OrderSide.BUY) {
336
+ return maxQtyByLong(inputs);
337
+ }
338
+ return maxQtyByShort(inputs);
339
+ }
340
+ function maxQtyByLong(inputs) {
341
+ try {
342
+ const {
343
+ baseMaxQty,
344
+ totalCollateral: totalCollateral2,
345
+ otherIMs: otherIMs2,
346
+ maxLeverage,
347
+ baseIMR,
348
+ markPrice,
349
+ IMR_Factor,
350
+ positionQty,
351
+ buyOrdersQty,
352
+ takerFeeRate
353
+ } = inputs;
354
+ if (totalCollateral2 === 0) {
355
+ return 0;
356
+ }
357
+ const totalCollateralDecimal = new Decimal2(totalCollateral2);
358
+ const factor_1 = totalCollateralDecimal.sub(otherIMs2).div(
359
+ new Decimal2(takerFeeRate).mul(2).mul(1e-4).add(Math.max(1 / maxLeverage, baseIMR))
360
+ ).div(markPrice).mul(0.995).sub(new Decimal2(positionQty).add(buyOrdersQty).abs()).toNumber();
361
+ if (positionQty === 0 && buyOrdersQty === 0) {
362
+ return Math.min(baseMaxQty, factor_1);
363
+ }
364
+ const factor_2 = totalCollateralDecimal.sub(otherIMs2).div(IMR_Factor).toPower(1 / 1.8).div(markPrice).sub(
365
+ new Decimal2(positionQty).add(buyOrdersQty).abs().div(new Decimal2(takerFeeRate).mul(2).mul(1e-4).add(1))
366
+ ).mul(0.995).toNumber();
367
+ return Math.min(baseMaxQty, factor_1, factor_2);
368
+ } catch (error) {
369
+ return 0;
370
+ }
371
+ }
372
+ function maxQtyByShort(inputs) {
373
+ try {
374
+ const {
375
+ baseMaxQty,
376
+ totalCollateral: totalCollateral2,
377
+ otherIMs: otherIMs2,
378
+ maxLeverage,
379
+ baseIMR,
380
+ markPrice,
381
+ IMR_Factor,
382
+ positionQty,
383
+ buyOrdersQty,
384
+ sellOrdersQty,
385
+ takerFeeRate
386
+ } = inputs;
387
+ const totalCollateralDecimal = new Decimal2(totalCollateral2);
388
+ const factor_1 = totalCollateralDecimal.sub(otherIMs2).div(
389
+ new Decimal2(takerFeeRate).mul(2).mul(1e-4).add(Math.max(1 / maxLeverage, baseIMR))
390
+ ).div(markPrice).mul(0.995).add(new Decimal2(positionQty).add(sellOrdersQty).abs()).toNumber();
391
+ if (positionQty === 0 && buyOrdersQty === 0) {
392
+ return Math.min(baseMaxQty, factor_1);
393
+ }
394
+ const factor_2 = totalCollateralDecimal.sub(otherIMs2).div(IMR_Factor).toPower(1 / 1.8).div(markPrice).add(
395
+ new Decimal2(positionQty).add(buyOrdersQty).abs().div(new Decimal2(takerFeeRate).mul(2).mul(1e-4).add(1))
396
+ ).mul(0.995).toNumber();
397
+ return Math.min(baseMaxQty, factor_1, factor_2);
398
+ } catch (error) {
399
+ return 0;
400
+ }
401
+ }
402
+ function totalMarginRatio(inputs, dp) {
403
+ const { totalCollateral: totalCollateral2, markPrices, positions } = inputs;
404
+ if (totalCollateral2 === 0) {
405
+ return 0;
406
+ }
407
+ const totalCollateralDecimal = new Decimal2(totalCollateral2);
408
+ const totalPositionNotional = positions.reduce((acc, cur) => {
409
+ const markPrice = markPrices[cur.symbol] || 0;
410
+ return acc.add(new Decimal2(cur.position_qty).mul(markPrice).abs());
411
+ }, zero);
412
+ if (totalPositionNotional.eq(zero)) {
413
+ return 0;
414
+ }
415
+ return totalCollateralDecimal.div(totalPositionNotional).toNumber();
416
+ }
417
+ function totalUnrealizedROI(inputs) {
418
+ const { totalUnrealizedPnL: totalUnrealizedPnL2, totalValue: totalValue2 } = inputs;
419
+ return new Decimal2(totalUnrealizedPnL2).div(totalValue2 - totalUnrealizedPnL2).toNumber();
420
+ }
421
+ function currentLeverage(totalMarginRatio2) {
422
+ if (totalMarginRatio2 === 0) {
423
+ return 0;
424
+ }
425
+ return 1 / totalMarginRatio2;
426
+ }
427
+ function availableBalance(inputs) {
428
+ const { USDCHolding, unsettlementPnL: unsettlementPnL2 } = inputs;
429
+ return new Decimal2(USDCHolding).add(unsettlementPnL2).toNumber();
430
+ }
431
+
432
+ // src/order.ts
433
+ var order_exports = {};
434
+ __export(order_exports, {
435
+ maxPrice: () => maxPrice,
436
+ minPrice: () => minPrice
437
+ });
438
+ function maxPrice(markprice, range) {
439
+ return markprice * (1 + range);
440
+ }
441
+ function minPrice(markprice, range) {
442
+ return markprice * (1 - range);
443
+ }
444
+ export {
445
+ account_exports as account,
446
+ order_exports as order,
447
+ order_exports as orderUtils,
448
+ positions_exports as positions
449
+ };
450
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/positions.ts","../src/constants.ts","../src/account.ts","../src/order.ts"],"sourcesContent":["import { API } from \"@orderly.network/types\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { IMRFactorPower } from \"./constants\";\n\n/**\n * 单个仓位价值\n * @param qty 数量\n * @param mark_price 价格\n */\nexport function notional(qty: number, mark_price: number): number {\n return new Decimal(qty).mul(mark_price).abs().toNumber();\n}\n\n/**\n * 所有仓位价值\n * @param positions\n * @returns\n *\n * @link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-Notional\n */\nexport function totalNotional(positions: API.Position[]): number {\n return positions.reduce((acc, cur) => {\n return acc + notional(cur.position_qty, cur.mark_price);\n }, 0);\n}\n\nexport type UnrealPnLInputs = {\n markPrice: number;\n openPrice: number;\n qty: number;\n};\n\n/**\n * 单个仓位未实现盈亏\n * @param qty 数量\n * @param price 价格\n */\nexport function unrealizedPnL(inputs: UnrealPnLInputs): number {\n return new Decimal(inputs.qty)\n .mul(inputs.markPrice - inputs.openPrice)\n .toNumber();\n}\n\nexport type UnrealPnLROIInputs = {\n positionQty: number;\n openPrice: number;\n IMR: number;\n unrealizedPnL: number;\n};\nexport function unrealizedPnLROI(inputs: UnrealPnLROIInputs): number {\n const { openPrice, IMR } = inputs;\n\n if (\n inputs.unrealizedPnL === 0 ||\n inputs.positionQty === 0 ||\n openPrice === 0 ||\n IMR === 0\n )\n return 0;\n\n return new Decimal(inputs.unrealizedPnL)\n .div(new Decimal(inputs.positionQty).mul(openPrice).mul(IMR))\n .toNumber();\n}\n\n/**\n * 所有仓位未实现盈亏\n * @param inputs\n */\nexport function totalUnrealizedPnL(positions: API.Position[]): number {\n return positions.reduce((acc, cur) => {\n return (\n acc +\n unrealizedPnL({\n qty: cur.position_qty,\n openPrice: cur.average_open_price,\n markPrice: cur.mark_price,\n })\n );\n }, 0);\n}\n\nexport type LiqPriceInputs = {\n markPrice: number;\n totalCollateral: number;\n positionQty: number;\n MMR: number;\n};\n\n/**\n * 单个仓位强平价格\n *\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Position-Liq.-Price}\n */\nexport function liqPrice(inputs: LiqPriceInputs): number {\n const { markPrice, totalCollateral, positionQty, MMR } = inputs;\n const totalNotional = notional(positionQty, markPrice);\n\n if (positionQty === 0) {\n return 0;\n }\n\n return Math.max(\n new Decimal(markPrice)\n .add(\n new Decimal(totalCollateral)\n .sub(new Decimal(totalNotional).mul(MMR))\n .div(new Decimal(positionQty).abs().mul(MMR).sub(positionQty))\n )\n // .todp(4, Decimal.ROUND_DOWN)\n .toNumber(),\n 0\n );\n}\n\nexport type MMInputs = {\n positionQty: number;\n markPrice: number;\n MMR: number;\n};\n\nexport function maintenanceMargin(inputs: MMInputs) {\n const { positionQty, markPrice, MMR } = inputs;\n\n return new Decimal(positionQty).mul(markPrice).mul(MMR).abs().toNumber();\n}\n\nexport type UnsettlementPnLInputs = {\n positionQty: number;\n markPrice: number;\n costPosition: number;\n sumUnitaryFunding: number;\n lastSumUnitaryFunding: number;\n};\n/**\n * 计算每个仓位未结算 PnL\n * @link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-Unsettlement-PNL-%5BinlineExtension%5D\n */\nexport function unsettlementPnL(inputs: UnsettlementPnLInputs): number {\n const {\n positionQty,\n markPrice,\n costPosition,\n sumUnitaryFunding,\n lastSumUnitaryFunding,\n } = inputs;\n\n const qty = new Decimal(positionQty);\n\n return qty\n .mul(markPrice)\n .sub(costPosition)\n .sub(qty.mul(new Decimal(sumUnitaryFunding).sub(lastSumUnitaryFunding)))\n .toNumber();\n}\n\nexport type TotalUnsettlementPnLInputs = {\n positions: (API.Position & {\n sum_unitary_funding: number;\n })[];\n sumUnitaryFunding: number;\n};\n/**\n * 计算所有仓位未结算 PnL\n * @param inputs\n * @returns\n * @link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-Unsettlement-PNL-%5BinlineExtension%5D\n */\nexport function totalUnsettlementPnL(\n positions: (API.Position & {\n sum_unitary_funding: number;\n })[]\n): number {\n if (!Array.isArray(positions) || positions.length === 0) {\n return 0;\n }\n\n return positions.reduce((acc, cur) => {\n return (\n acc +\n unsettlementPnL({\n positionQty: cur.position_qty,\n markPrice: cur.mark_price,\n costPosition: cur.cost_position,\n sumUnitaryFunding: cur.sum_unitary_funding,\n lastSumUnitaryFunding: cur.last_sum_unitary_funding,\n })\n );\n }, 0);\n}\n\n/**\n * 计算仓位强平价格\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Position-Liq.-Price}\n */\nexport function MMR(inputs: {\n baseMMR: number;\n baseIMR: number;\n IMRFactor: number;\n positionNotional: number;\n IMR_factor_power: number;\n}): number {\n const {\n baseMMR,\n baseIMR,\n IMRFactor,\n positionNotional,\n IMR_factor_power = IMRFactorPower,\n } = inputs;\n return Math.max(\n baseMMR,\n new Decimal(baseMMR)\n .div(baseIMR)\n .mul(IMRFactor)\n .mul(Math.abs(positionNotional))\n .toPower(IMR_factor_power)\n .toNumber()\n );\n}\n","/**\n * The power of the IMR factor.\n * @constant\n * @default\n */\nexport const IMRFactorPower = 4 / 5;\n","import { Decimal, zero } from \"@orderly.network/utils\";\nimport { IMRFactorPower } from \"./constants\";\nimport {\n API,\n OrderSide,\n OrderType,\n type WSMessage,\n} from \"@orderly.network/types\";\n\nexport type ResultOptions = {\n dp: number;\n};\n\nexport type TotalValueInputs = {\n totalUnsettlementPnL: number;\n\n USDCHolding: number;\n nonUSDCHolding: {\n holding: number;\n markPrice: number;\n //保證金替代率 暂时默认0\n discount: number;\n }[];\n};\n/**\n * 用戶總資產價值 (USDC計價),包含無法作為保證金的資產\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-Value}\n */\nexport function totalValue(inputs: TotalValueInputs): Decimal {\n const { totalUnsettlementPnL, USDCHolding, nonUSDCHolding } = inputs;\n\n const nonUSDCHoldingValue = nonUSDCHolding.reduce((acc, cur) => {\n return new Decimal(cur.holding).mul(cur.markPrice).add(acc);\n }, zero);\n\n return nonUSDCHoldingValue.add(USDCHolding).add(totalUnsettlementPnL);\n}\n\n/**\n * 用戶帳戶當前可用保證金的價值總和 (USDC計價)\n *\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Free-collateral}\n */\nexport type FreeCollateralInputs = {\n // 总保证金\n totalCollateral: Decimal;\n // 总初始保证金\n totalInitialMarginWithOrders: number;\n};\n/**\n * 计算可用保证金\n */\nexport function freeCollateral(inputs: FreeCollateralInputs): Decimal {\n return inputs.totalCollateral.sub(inputs.totalInitialMarginWithOrders);\n}\n\nexport type TotalCollateralValueInputs = {\n // USDC 的 holding 數量\n USDCHolding: number;\n nonUSDCHolding: {\n holding: number;\n markPrice: number;\n //保證金替代率 暂时默认0\n discount: number;\n }[];\n // 未结算盈亏\n unsettlementPnL: number;\n};\n/**\n * 计算总保证金\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-collateral-%5BinlineExtension%5D}\n */\nexport function totalCollateral(inputs: TotalCollateralValueInputs): Decimal {\n const { USDCHolding, nonUSDCHolding } = inputs;\n const nonUSDCHoldingValue = nonUSDCHolding.reduce((acc, cur) => {\n return (\n acc +\n new Decimal(cur.holding).mul(cur.markPrice).mul(cur.discount).toNumber()\n );\n }, 0);\n\n return new Decimal(USDCHolding)\n .add(nonUSDCHoldingValue)\n .add(inputs.unsettlementPnL);\n}\n\nexport function initialMarginWithOrder() {}\n\nexport type PositionNotionalWithOrderInputs = {\n markPrice: number;\n positionQtyWithOrders: number;\n};\n/**\n * 單一 Symbol position / orders notional 加總\n */\nexport function positionNotionalWithOrder_by_symbol(\n inputs: PositionNotionalWithOrderInputs\n): Decimal {\n return new Decimal(inputs.markPrice).mul(inputs.positionQtyWithOrders);\n}\n\nexport type PositionQtyWithOrderInputs = {\n positionQty: number;\n // 单个Symbol的所有买单合计\n buyOrdersQty: number;\n // 单个Symbol的所有卖单合计\n sellOrdersQty: number;\n};\n/**\n * 單一 Symbol position / orders qty 加總\n */\nexport function positionQtyWithOrders_by_symbol(\n inputs: PositionQtyWithOrderInputs\n): number {\n const { positionQty, buyOrdersQty, sellOrdersQty } = inputs;\n const positionQtyDecimal = new Decimal(positionQty);\n const qty = Math.max(\n positionQtyDecimal.add(buyOrdersQty).abs().toNumber(),\n positionQtyDecimal.sub(sellOrdersQty).abs().toNumber()\n );\n\n return qty;\n}\n\nexport type IMRInputs = {\n maxLeverage: number;\n baseIMR: number;\n IMR_Factor: number;\n positionNotional: number;\n ordersNotional: number;\n IMR_factor_power?: number;\n};\n\n/**\n * 單一 Symbol 初始保證金率\n * Max(1 / Max Account Leverage, Base IMR i, IMR Factor i * Abs(Position Notional i + Order Notional i)^(4/5))\n */\nexport function IMR(inputs: IMRInputs): number {\n const {\n maxLeverage,\n baseIMR,\n IMR_Factor,\n positionNotional,\n ordersNotional: orderNotional,\n IMR_factor_power = IMRFactorPower,\n } = inputs;\n return Math.max(\n 1 / maxLeverage,\n baseIMR,\n new Decimal(IMR_Factor)\n .mul(\n new Decimal(positionNotional)\n .add(orderNotional)\n .abs()\n .toPower(IMR_factor_power)\n )\n .toNumber()\n );\n}\n\nexport function buyOrdersFilter_by_symbol(\n orders: API.Order[],\n symbol: string\n): API.Order[] {\n return orders.filter(\n (item) => item.symbol === symbol && item.side === OrderSide.BUY\n );\n}\n\nexport function sellOrdersFilter_by_symbol(\n orders: API.Order[],\n symbol: string\n): API.Order[] {\n return orders.filter(\n (item) => item.symbol === symbol && item.side === OrderSide.SELL\n );\n}\n\n/**\n * 从仓位列表中获取指定symbol的仓位数量\n */\nexport function getQtyFromPositions(\n positions: API.Position[],\n symbol: string\n): number {\n if (!positions) {\n return 0;\n }\n const position = positions.find((item) => item.symbol === symbol);\n return position?.position_qty || 0;\n}\n\n/**\n * 从订单列表中获取指定symbol的看多,看空订单数量,\n */\nexport function getQtyFromOrdersBySide(\n orders: API.Order[],\n symbol: string,\n side: OrderSide\n): number {\n const ordersBySide =\n side === OrderSide.SELL\n ? sellOrdersFilter_by_symbol(orders, symbol)\n : buyOrdersFilter_by_symbol(orders, symbol);\n return ordersBySide.reduce((acc, cur) => {\n return acc + cur.quantity;\n }, 0);\n}\n\nexport function getPositonsAndOrdersNotionalBySymbol(inputs: {\n positions: API.Position[];\n orders: API.Order[];\n symbol: string;\n markPrice: number;\n}): number {\n const { positions, orders, symbol, markPrice } = inputs;\n const positionQty = getQtyFromPositions(positions, symbol);\n const buyOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.BUY);\n const sellOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.SELL);\n\n const markPriceDecimal = new Decimal(markPrice);\n\n return markPriceDecimal\n .mul(positionQty)\n .add(markPriceDecimal.mul(new Decimal(buyOrdersQty).add(sellOrdersQty)))\n .abs()\n .toNumber();\n}\n\nexport type TotalInitialMarginWithOrdersInputs = {\n positions: API.Position[];\n orders: API.Order[];\n // account: API.AccountInfo;\n markPrices: { [key: string]: number };\n symbolInfo: any;\n IMR_Factors: { [key: string]: number };\n} & Pick<IMRInputs, \"maxLeverage\">;\n\n/**\n * 计算用戶已使用初始保證金加總 ( 包含 position / orders )\n */\nexport function totalInitialMarginWithOrders(\n inputs: TotalInitialMarginWithOrdersInputs\n): number {\n const {\n positions,\n orders,\n markPrices,\n IMR_Factors,\n maxLeverage,\n symbolInfo,\n } = inputs;\n\n const symbols = extractSymbols(positions, orders);\n\n const total_initial_margin_with_orders = symbols.reduce((acc, cur) => {\n const symbol = cur;\n const positionQty = getQtyFromPositions(positions, symbol);\n const buyOrdersQty = getQtyFromOrdersBySide(orders, symbol, OrderSide.BUY);\n const sellOrdersQty = getQtyFromOrdersBySide(\n orders,\n symbol,\n OrderSide.SELL\n );\n\n const markPrice = markPrices[symbol] || 0;\n\n //---\n const positionQtyWithOrders = positionQtyWithOrders_by_symbol({\n positionQty,\n buyOrdersQty,\n sellOrdersQty,\n });\n\n //---\n const position_notional_with_orders = positionNotionalWithOrder_by_symbol({\n markPrice,\n positionQtyWithOrders,\n });\n\n //----\n const markPriceDecimal = new Decimal(markPrice);\n\n const imr = IMR({\n positionNotional: markPriceDecimal.mul(positionQty).toNumber(),\n ordersNotional: markPriceDecimal\n .mul(new Decimal(buyOrdersQty).add(sellOrdersQty))\n .toNumber(),\n maxLeverage,\n IMR_Factor: IMR_Factors[symbol],\n baseIMR: symbolInfo[symbol](\"base_imr\", 0),\n });\n\n return position_notional_with_orders.mul(imr).add(acc).toNumber();\n }, 0);\n\n return total_initial_margin_with_orders;\n}\n\n/**\n * 把订单按照symbol分组, 因为一个symbol可以有多个挂单\n */\nexport function groupOrdersBySymbol(orders: API.Order[]) {\n const symbols: { [key: string]: API.Order[] } = {};\n\n orders.forEach((item) => {\n if (!symbols[item.symbol]) {\n symbols[item.symbol] = [];\n }\n\n symbols[item.symbol].push(item);\n });\n\n return symbols;\n}\n\n/**\n * Extracts all unique symbols from positions and orders.\n * @param positions - An array of position objects.\n * @param orders - An array of order objects.\n * @returns An array of unique symbols.\n */\nexport function extractSymbols(\n positions: Pick<API.Position, \"symbol\">[],\n orders: Pick<API.Order, \"symbol\">[]\n): string[] {\n const symbols = new Set<string>();\n\n positions.forEach((item) => {\n symbols.add(item.symbol);\n });\n\n orders.forEach((item) => {\n symbols.add(item.symbol);\n });\n\n return Array.from(symbols);\n}\n\n//=========== max qty ==================\n\n// function otherIM(inputs: {}): number {}\n\nexport type OtherIMsInputs = {\n // 传入除当前symbol外的其他symbol的仓位列表\n positions: API.Position[];\n // 传入除当前symbol外的其他symbol的订单列表\n orders: API.Order[];\n\n markPrices: { [key: string]: number };\n maxLeverage: number;\n symbolInfo: any;\n IMR_Factors: { [key: string]: number };\n};\n/**\n * 除当前symbol外的其他symbol已占用的总保证金\n */\nexport function otherIMs(inputs: OtherIMsInputs): number {\n const {\n orders,\n positions,\n maxLeverage,\n IMR_Factors,\n symbolInfo,\n markPrices,\n } = inputs;\n\n const symbols = extractSymbols(positions, orders);\n\n return symbols\n .reduce((acc, cur) => {\n const symbol = cur;\n\n if (typeof markPrices[symbol] === \"undefined\") {\n console.warn(\"markPrices[%s] is undefined\", symbol);\n return acc;\n }\n\n const markPriceDecimal = new Decimal(markPrices[symbol] || 0);\n\n const positionQty = getQtyFromPositions(positions, symbol);\n const positionNotional = markPriceDecimal.mul(positionQty).toNumber();\n\n const buyOrdersQty = getQtyFromOrdersBySide(\n orders,\n symbol,\n OrderSide.BUY\n );\n const sellOrdersQty = getQtyFromOrdersBySide(\n orders,\n symbol,\n OrderSide.SELL\n );\n\n const ordersNotional = markPriceDecimal\n .mul(new Decimal(buyOrdersQty).add(sellOrdersQty))\n .toNumber();\n\n const IMR_Factor = IMR_Factors[symbol];\n\n if (!IMR_Factor) {\n console.warn(\"IMR_Factor is not found:\", symbol);\n return acc;\n }\n\n const imr = IMR({\n maxLeverage,\n\n IMR_Factor,\n baseIMR: symbolInfo[symbol](\"base_imr\", 0),\n positionNotional,\n ordersNotional,\n });\n\n const positionQtyWithOrders = positionQtyWithOrders_by_symbol({\n positionQty,\n buyOrdersQty,\n sellOrdersQty,\n });\n\n const positionNotionalWithOrders = positionNotionalWithOrder_by_symbol({\n markPrice: markPrices[symbol] || 0,\n positionQtyWithOrders,\n });\n\n return acc.add(positionNotionalWithOrders.mul(imr));\n }, zero)\n .toNumber();\n}\n\nexport type MaxQtyInputs = {\n symbol: string;\n\n //單次開倉最大 Qty 限制, /v1/public/info.base_max\n baseMaxQty: number;\n /**\n * 用户保证金总额(USDC 计价), 可以由 totalCollateral 计算得出\n * @see totalCollateral\n */\n totalCollateral: number;\n maxLeverage: number;\n baseIMR: number;\n /**\n * @see otherIMs\n */\n otherIMs: number;\n markPrice: number;\n // 已开仓数量\n positionQty: number;\n // 已挂多单数量\n buyOrdersQty: number;\n // 已挂空单数量\n sellOrdersQty: number;\n\n IMR_Factor: number;\n\n takerFeeRate: number;\n};\n\n/**\n * 最大可下单数量\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Max-Order-QTY}\n */\nexport function maxQty(\n side: OrderSide,\n inputs: MaxQtyInputs,\n options?: ResultOptions\n): number {\n if (side === OrderSide.BUY) {\n return maxQtyByLong(inputs);\n }\n return maxQtyByShort(inputs);\n}\n\nexport function maxQtyByLong(inputs: Omit<MaxQtyInputs, \"side\">): number {\n try {\n const {\n baseMaxQty,\n totalCollateral,\n otherIMs,\n maxLeverage,\n baseIMR,\n markPrice,\n IMR_Factor,\n positionQty,\n buyOrdersQty,\n takerFeeRate,\n } = inputs;\n\n if (totalCollateral === 0) {\n return 0;\n }\n\n const totalCollateralDecimal = new Decimal(totalCollateral);\n\n const factor_1 = totalCollateralDecimal\n .sub(otherIMs)\n .div(\n new Decimal(takerFeeRate)\n .mul(2)\n .mul(0.0001)\n .add(Math.max(1 / maxLeverage, baseIMR))\n )\n .div(markPrice)\n .mul(0.995)\n .sub(new Decimal(positionQty).add(buyOrdersQty).abs())\n .toNumber();\n\n if (positionQty === 0 && buyOrdersQty === 0) {\n return Math.min(baseMaxQty, factor_1);\n }\n\n const factor_2 = totalCollateralDecimal\n .sub(otherIMs)\n .div(IMR_Factor)\n .toPower(1 / 1.8)\n .div(markPrice)\n .sub(\n new Decimal(positionQty)\n .add(buyOrdersQty)\n .abs()\n .div(new Decimal(takerFeeRate).mul(2).mul(0.0001).add(1))\n )\n .mul(0.995)\n .toNumber();\n\n return Math.min(baseMaxQty, factor_1, factor_2);\n } catch (error) {\n return 0;\n }\n}\n\nexport function maxQtyByShort(inputs: Omit<MaxQtyInputs, \"side\">): number {\n try {\n const {\n baseMaxQty,\n totalCollateral,\n otherIMs,\n maxLeverage,\n baseIMR,\n markPrice,\n IMR_Factor,\n positionQty,\n buyOrdersQty,\n sellOrdersQty,\n takerFeeRate,\n } = inputs;\n\n const totalCollateralDecimal = new Decimal(totalCollateral);\n\n const factor_1 = totalCollateralDecimal\n .sub(otherIMs)\n .div(\n new Decimal(takerFeeRate)\n .mul(2)\n .mul(0.0001)\n .add(Math.max(1 / maxLeverage, baseIMR))\n )\n .div(markPrice)\n .mul(0.995)\n .add(new Decimal(positionQty).add(sellOrdersQty).abs())\n\n .toNumber();\n\n if (positionQty === 0 && buyOrdersQty === 0) {\n return Math.min(baseMaxQty, factor_1);\n }\n\n const factor_2 = totalCollateralDecimal\n .sub(otherIMs)\n .div(IMR_Factor)\n .toPower(1 / 1.8)\n .div(markPrice)\n .add(\n new Decimal(positionQty)\n .add(buyOrdersQty)\n .abs()\n .div(new Decimal(takerFeeRate).mul(2).mul(0.0001).add(1))\n )\n .mul(0.995)\n .toNumber();\n\n return Math.min(baseMaxQty, factor_1, factor_2);\n } catch (error) {\n return 0;\n }\n}\n\nexport type TotalMarginRatioInputs = {\n totalCollateral: number;\n markPrices: { [key: string]: number };\n positions: API.Position[];\n};\n/**\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-Margin-Ratio}\n */\nexport function totalMarginRatio(\n inputs: TotalMarginRatioInputs,\n dp?: number\n): number {\n const { totalCollateral, markPrices, positions } = inputs;\n\n if (totalCollateral === 0) {\n return 0;\n }\n\n const totalCollateralDecimal = new Decimal(totalCollateral);\n\n const totalPositionNotional = positions.reduce((acc, cur) => {\n const markPrice = markPrices[cur.symbol] || 0;\n return acc.add(new Decimal(cur.position_qty).mul(markPrice).abs());\n }, zero);\n\n if (totalPositionNotional.eq(zero)) {\n return 0;\n }\n\n return totalCollateralDecimal.div(totalPositionNotional).toNumber();\n}\n\nexport type TotalUnrealizedROIInputs = {\n totalUnrealizedPnL: number;\n totalValue: number;\n};\n\n/**\n * totalUnrealizedROI\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Total-Unrealized-ROI}\n */\nexport function totalUnrealizedROI(inputs: TotalUnrealizedROIInputs) {\n const { totalUnrealizedPnL, totalValue } = inputs;\n\n return new Decimal(totalUnrealizedPnL)\n .div(totalValue - totalUnrealizedPnL)\n .toNumber();\n}\n\n/**\n * @see {@link https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Current-account-leverage}\n */\nexport function currentLeverage(totalMarginRatio: number) {\n if (totalMarginRatio === 0) {\n return 0;\n }\n return 1 / totalMarginRatio;\n}\n\nexport type AvailableBalanceInputs = {\n USDCHolding: number;\n unsettlementPnL: number;\n};\nexport function availableBalance(inputs: AvailableBalanceInputs) {\n const { USDCHolding, unsettlementPnL } = inputs;\n\n return new Decimal(USDCHolding).add(unsettlementPnL).toNumber();\n}\n","/**\n * 下单时的最高价格\n * @see https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Max-price\n */\nexport function maxPrice(markprice: number, range: number) {\n return markprice * (1 + range);\n}\n\n/**\n * 下单时的最低价格\n * @see https://wootraders.atlassian.net/wiki/spaces/WOOFI/pages/346030144/v2#Min-price\n */\nexport function minPrice(markprice: number, range: number) {\n return markprice * (1 - range);\n}\n"],"mappings":"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","names":["IMR","totalCollateral","MMR","totalNotional","Decimal","totalUnsettlementPnL","Decimal","totalCollateral","otherIMs","totalUnrealizedPnL","totalValue","totalMarginRatio","unsettlementPnL"]}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@orderly.network/perp",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "keywords": [],
8
+ "author": "leo",
9
+ "license": "ISC",
10
+ "peerDependencies": {
11
+ "@orderly.network/types": "0.1.0"
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "devDependencies": {
17
+ "@babel/core": "^7.22.9",
18
+ "@babel/preset-env": "^7.22.9",
19
+ "@babel/preset-typescript": "^7.22.5",
20
+ "@types/jest": "^29.5.3",
21
+ "babel-jest": "^29.6.1",
22
+ "jest": "^29.6.1",
23
+ "tsup": "^7.1.0",
24
+ "typedoc": "^0.24.8",
25
+ "typescript": "^5.1.6",
26
+ "tsconfig": "0.0.82"
27
+ },
28
+ "dependencies": {
29
+ "@orderly.network/types": "0.1.0",
30
+ "@orderly.network/utils": "0.0.75"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "scripts": {
36
+ "dev": "tsup --watch",
37
+ "build": "tsup",
38
+ "doc": "typedoc --out docs src",
39
+ "test": "echo \"Error: no test specified\" && exit 1"
40
+ }
41
+ }