@yuants/vendor-huobi 0.11.41 → 0.12.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/account-info.js +235 -0
- package/dist/account-info.js.map +1 -0
- package/dist/api/private-api.js +251 -0
- package/dist/api/private-api.js.map +1 -0
- package/dist/api/public-api.js +145 -0
- package/dist/api/public-api.js.map +1 -0
- package/dist/api.js +0 -279
- package/dist/api.js.map +1 -1
- package/dist/index.js +28 -524
- package/dist/index.js.map +1 -1
- package/dist/interest_rate.js +2 -2
- package/dist/interest_rate.js.map +1 -1
- package/dist/order-actions-with-credentials.js +31 -0
- package/dist/order-actions-with-credentials.js.map +1 -0
- package/dist/order-actions.js +29 -0
- package/dist/order-actions.js.map +1 -0
- package/dist/orders/submitOrder.js +82 -0
- package/dist/orders/submitOrder.js.map +1 -0
- package/dist/product.js +4 -4
- package/dist/product.js.map +1 -1
- package/dist/quote.js +5 -5
- package/dist/quote.js.map +1 -1
- package/dist/transfer.js +248 -0
- package/dist/transfer.js.map +1 -0
- package/dist/uid.js +22 -0
- package/dist/uid.js.map +1 -0
- package/lib/account-info.d.ts +35 -0
- package/lib/account-info.d.ts.map +1 -0
- package/lib/account-info.js +243 -0
- package/lib/account-info.js.map +1 -0
- package/lib/api/private-api.d.ts +471 -0
- package/lib/api/private-api.d.ts.map +1 -0
- package/lib/api/private-api.js +280 -0
- package/lib/api/private-api.js.map +1 -0
- package/lib/api/public-api.d.ts +308 -0
- package/lib/api/public-api.d.ts.map +1 -0
- package/lib/api/public-api.js +158 -0
- package/lib/api/public-api.js.map +1 -0
- package/lib/api.d.ts +2 -621
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +0 -279
- package/lib/api.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +26 -522
- package/lib/index.js.map +1 -1
- package/lib/interest_rate.js +2 -2
- package/lib/interest_rate.js.map +1 -1
- package/lib/order-actions-with-credentials.d.ts +2 -0
- package/lib/order-actions-with-credentials.d.ts.map +1 -0
- package/lib/order-actions-with-credentials.js +33 -0
- package/lib/order-actions-with-credentials.js.map +1 -0
- package/lib/order-actions.d.ts +7 -0
- package/lib/order-actions.d.ts.map +1 -0
- package/lib/order-actions.js +33 -0
- package/lib/order-actions.js.map +1 -0
- package/lib/orders/submitOrder.d.ts +11 -0
- package/lib/orders/submitOrder.d.ts.map +1 -0
- package/lib/orders/submitOrder.js +87 -0
- package/lib/orders/submitOrder.js.map +1 -0
- package/lib/product.js +4 -4
- package/lib/product.js.map +1 -1
- package/lib/quote.js +5 -5
- package/lib/quote.js.map +1 -1
- package/lib/transfer.d.ts +19 -0
- package/lib/transfer.d.ts.map +1 -0
- package/lib/transfer.js +255 -0
- package/lib/transfer.js.map +1 -0
- package/lib/uid.d.ts +13 -0
- package/lib/uid.d.ts.map +1 -0
- package/lib/uid.js +26 -0
- package/lib/uid.js.map +1 -0
- package/package.json +1 -1
- package/temp/package-deps.json +16 -9
- package/dist/logger.js +0 -91
- package/dist/logger.js.map +0 -1
- package/lib/logger.d.ts +0 -21
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -98
- package/lib/logger.js.map +0 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { provideAccountInfoService } from '@yuants/data-account';
|
|
2
|
+
import { formatTime } from '@yuants/utils';
|
|
3
|
+
import { defer, distinct, filter, first, firstValueFrom, from, map, mergeMap, repeat, retry, shareReplay, tap, timeout, toArray, } from 'rxjs';
|
|
4
|
+
import { client } from './api';
|
|
5
|
+
import { getSpotAccountBalance, getSpotTick, getSwapCrossPositionInfo, getUnifiedAccountInfo, } from './api/private-api';
|
|
6
|
+
import { swapProductService } from './product';
|
|
7
|
+
/**
|
|
8
|
+
* 提供 SWAP 账户信息服务
|
|
9
|
+
*/
|
|
10
|
+
export const provideSwapAccountInfoService = (terminal, accountId, credential) => {
|
|
11
|
+
provideAccountInfoService(terminal, accountId, async () => {
|
|
12
|
+
// balance
|
|
13
|
+
const balance = await getUnifiedAccountInfo(credential);
|
|
14
|
+
if (!balance.data) {
|
|
15
|
+
throw new Error('Failed to get unified account info');
|
|
16
|
+
}
|
|
17
|
+
const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');
|
|
18
|
+
if (!balanceData) {
|
|
19
|
+
throw new Error('No USDT balance found in unified account');
|
|
20
|
+
}
|
|
21
|
+
const equity = balanceData.margin_balance;
|
|
22
|
+
const free = balanceData.withdraw_available;
|
|
23
|
+
// positions
|
|
24
|
+
const positionsRes = await getSwapCrossPositionInfo(credential);
|
|
25
|
+
const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);
|
|
26
|
+
const positions = (positionsRes.data || []).map((v) => {
|
|
27
|
+
const product_id = v.contract_code;
|
|
28
|
+
const theProduct = mapProductIdToPerpetualProduct === null || mapProductIdToPerpetualProduct === void 0 ? void 0 : mapProductIdToPerpetualProduct.get(product_id);
|
|
29
|
+
const valuation = v.volume * v.last_price * ((theProduct === null || theProduct === void 0 ? void 0 : theProduct.value_scale) || 1);
|
|
30
|
+
return {
|
|
31
|
+
position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,
|
|
32
|
+
datasource_id: 'HUOBI-SWAP',
|
|
33
|
+
product_id,
|
|
34
|
+
direction: v.direction === 'buy' ? 'LONG' : 'SHORT',
|
|
35
|
+
volume: v.volume,
|
|
36
|
+
free_volume: v.available,
|
|
37
|
+
position_price: v.cost_hold,
|
|
38
|
+
closable_price: v.last_price,
|
|
39
|
+
floating_profit: v.profit_unreal,
|
|
40
|
+
valuation,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
// orders
|
|
44
|
+
// const orders: IOrder[] = [];
|
|
45
|
+
// let page_index = 1;
|
|
46
|
+
// const page_size = 50;
|
|
47
|
+
// while (true) {
|
|
48
|
+
// const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });
|
|
49
|
+
// if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {
|
|
50
|
+
// break;
|
|
51
|
+
// }
|
|
52
|
+
// const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {
|
|
53
|
+
// return {
|
|
54
|
+
// order_id: v.order_id_str,
|
|
55
|
+
// account_id: SWAP_ACCOUNT_ID,
|
|
56
|
+
// product_id: v.contract_code,
|
|
57
|
+
// order_type: ['lightning'].includes(v.order_price_type)
|
|
58
|
+
// ? 'MARKET'
|
|
59
|
+
// : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(
|
|
60
|
+
// v.order_price_type,
|
|
61
|
+
// )
|
|
62
|
+
// ? 'LIMIT'
|
|
63
|
+
// : ['fok'].includes(v.order_price_type)
|
|
64
|
+
// ? 'FOK'
|
|
65
|
+
// : v.order_price_type.includes('ioc')
|
|
66
|
+
// ? 'IOC'
|
|
67
|
+
// : 'STOP', // unreachable code
|
|
68
|
+
// order_direction:
|
|
69
|
+
// v.direction === 'open'
|
|
70
|
+
// ? v.offset === 'buy'
|
|
71
|
+
// ? 'OPEN_LONG'
|
|
72
|
+
// : 'OPEN_SHORT'
|
|
73
|
+
// : v.offset === 'buy'
|
|
74
|
+
// ? 'CLOSE_SHORT'
|
|
75
|
+
// : 'CLOSE_LONG',
|
|
76
|
+
// volume: v.volume,
|
|
77
|
+
// submit_at: v.created_at,
|
|
78
|
+
// price: v.price,
|
|
79
|
+
// traded_volume: v.trade_volume,
|
|
80
|
+
// };
|
|
81
|
+
// });
|
|
82
|
+
// orders.push(...pageOrders);
|
|
83
|
+
// page_index++;
|
|
84
|
+
// }
|
|
85
|
+
return {
|
|
86
|
+
money: {
|
|
87
|
+
currency: 'USDT',
|
|
88
|
+
equity,
|
|
89
|
+
free,
|
|
90
|
+
},
|
|
91
|
+
positions,
|
|
92
|
+
};
|
|
93
|
+
}, { auto_refresh_interval: 1000 });
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* 获取超级保证金账户余额流
|
|
97
|
+
*/
|
|
98
|
+
export const getSuperMarginAccountBalance$ = (credential, superMarginAccountUid) => {
|
|
99
|
+
return defer(() => getSpotAccountBalance(credential, superMarginAccountUid)).pipe(
|
|
100
|
+
//
|
|
101
|
+
map((res) => res.data), repeat({ delay: 1000 }), tap({
|
|
102
|
+
error: (e) => {
|
|
103
|
+
console.error(formatTime(Date.now()), 'unifiedRaw', e);
|
|
104
|
+
},
|
|
105
|
+
}), retry({ delay: 5000 }), shareReplay(1));
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* 设置超级保证金账户的 WebSocket 订阅
|
|
109
|
+
*/
|
|
110
|
+
export const setupSuperMarginWebSocketSubscriptions = (superMarginAccountBalance$, subscriptions) => {
|
|
111
|
+
from(client.spot_ws.connection$).subscribe(() => {
|
|
112
|
+
subscriptions.clear();
|
|
113
|
+
});
|
|
114
|
+
// subscribe the symbols of positions we held
|
|
115
|
+
superMarginAccountBalance$
|
|
116
|
+
.pipe(
|
|
117
|
+
//
|
|
118
|
+
mergeMap((res) => from((res === null || res === void 0 ? void 0 : res.list) || []).pipe(filter((v) => v.currency !== 'usdt'), map((v) => v.currency), distinct(), toArray(), map((v) => new Set(v)))))
|
|
119
|
+
.subscribe((v) => {
|
|
120
|
+
const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));
|
|
121
|
+
const toSubscribe = [...v].filter((x) => !subscriptions.has(x));
|
|
122
|
+
for (const symbol of toUnsubscribe) {
|
|
123
|
+
client.spot_ws.output$.next({
|
|
124
|
+
unsub: `market.${symbol}usdt.ticker`,
|
|
125
|
+
});
|
|
126
|
+
subscriptions.delete(symbol);
|
|
127
|
+
}
|
|
128
|
+
for (const symbol of toSubscribe) {
|
|
129
|
+
client.spot_ws.output$.next({
|
|
130
|
+
sub: `market.${symbol}usdt.ticker`,
|
|
131
|
+
});
|
|
132
|
+
subscriptions.add(symbol);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* 提供超级保证金账户信息服务
|
|
138
|
+
*/
|
|
139
|
+
export const provideSuperMarginAccountInfoService = (terminal, accountId, credential, superMarginAccountUid, subscriptions) => {
|
|
140
|
+
const superMarginAccountBalance$ = getSuperMarginAccountBalance$(credential, superMarginAccountUid);
|
|
141
|
+
setupSuperMarginWebSocketSubscriptions(superMarginAccountBalance$, subscriptions);
|
|
142
|
+
provideAccountInfoService(terminal, accountId, async () => {
|
|
143
|
+
var _a;
|
|
144
|
+
// get account balance
|
|
145
|
+
const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);
|
|
146
|
+
const balanceList = ((_a = accountBalance.data) === null || _a === void 0 ? void 0 : _a.list) || [];
|
|
147
|
+
// calculate usdt balance
|
|
148
|
+
const usdtBalance = balanceList
|
|
149
|
+
.filter((v) => v.currency === 'usdt')
|
|
150
|
+
.reduce((acc, cur) => acc + +cur.balance, 0);
|
|
151
|
+
// get positions (non-usdt currencies)
|
|
152
|
+
const positions = [];
|
|
153
|
+
const nonUsdtCurrencies = balanceList
|
|
154
|
+
.filter((v) => v.currency !== 'usdt')
|
|
155
|
+
.reduce((acc, cur) => {
|
|
156
|
+
const existing = acc.find((item) => item.currency === cur.currency);
|
|
157
|
+
if (existing) {
|
|
158
|
+
existing.balance += +cur.balance;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
acc.push({ currency: cur.currency, balance: +cur.balance });
|
|
162
|
+
}
|
|
163
|
+
return acc;
|
|
164
|
+
}, []);
|
|
165
|
+
// get prices and create positions
|
|
166
|
+
for (const currencyData of nonUsdtCurrencies) {
|
|
167
|
+
if (currencyData.balance > 0) {
|
|
168
|
+
try {
|
|
169
|
+
// get current price from websocket or fallback to REST API
|
|
170
|
+
let price;
|
|
171
|
+
try {
|
|
172
|
+
const tickPrice = await firstValueFrom(client.spot_ws.input$.pipe(
|
|
173
|
+
//
|
|
174
|
+
first((v) => { var _a, _b; return ((_a = v.ch) === null || _a === void 0 ? void 0 : _a.includes('ticker')) && ((_b = v.ch) === null || _b === void 0 ? void 0 : _b.includes(currencyData.currency)) && v.tick; }), map((v) => v.tick.bid), timeout(5000), tap({
|
|
175
|
+
error: (e) => {
|
|
176
|
+
subscriptions.clear();
|
|
177
|
+
},
|
|
178
|
+
})));
|
|
179
|
+
price = tickPrice;
|
|
180
|
+
}
|
|
181
|
+
catch (_b) {
|
|
182
|
+
// fallback to REST API
|
|
183
|
+
const tickerRes = await getSpotTick(credential, { symbol: `${currencyData.currency}usdt` });
|
|
184
|
+
price = tickerRes.tick.close;
|
|
185
|
+
}
|
|
186
|
+
positions.push({
|
|
187
|
+
position_id: `${currencyData.currency}/usdt/spot`,
|
|
188
|
+
product_id: `${currencyData.currency}usdt`,
|
|
189
|
+
direction: 'LONG',
|
|
190
|
+
volume: currencyData.balance,
|
|
191
|
+
free_volume: currencyData.balance,
|
|
192
|
+
position_price: price,
|
|
193
|
+
closable_price: price,
|
|
194
|
+
floating_profit: 0,
|
|
195
|
+
valuation: currencyData.balance * price,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// calculate equity
|
|
204
|
+
const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;
|
|
205
|
+
return {
|
|
206
|
+
money: {
|
|
207
|
+
currency: 'USDT',
|
|
208
|
+
equity,
|
|
209
|
+
free: equity,
|
|
210
|
+
},
|
|
211
|
+
positions,
|
|
212
|
+
};
|
|
213
|
+
}, { auto_refresh_interval: 1000 });
|
|
214
|
+
return superMarginAccountBalance$;
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* 提供 SPOT 账户信息服务
|
|
218
|
+
*/
|
|
219
|
+
export const provideSpotAccountInfoService = (terminal, accountId, credential, spotAccountUid) => {
|
|
220
|
+
provideAccountInfoService(terminal, accountId, async () => {
|
|
221
|
+
var _a, _b;
|
|
222
|
+
const spotBalance = await getSpotAccountBalance(credential, spotAccountUid);
|
|
223
|
+
const equity = +((_b = (_a = spotBalance.data.list.find((v) => v.currency === 'usdt')) === null || _a === void 0 ? void 0 : _a.balance) !== null && _b !== void 0 ? _b : 0);
|
|
224
|
+
const free = equity;
|
|
225
|
+
return {
|
|
226
|
+
money: {
|
|
227
|
+
currency: 'USDT',
|
|
228
|
+
equity,
|
|
229
|
+
free,
|
|
230
|
+
},
|
|
231
|
+
positions: [],
|
|
232
|
+
};
|
|
233
|
+
}, { auto_refresh_interval: 1000 });
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=account-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-info.js","sourceRoot":"","sources":["../src/account-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport {\n defer,\n distinct,\n filter,\n first,\n firstValueFrom,\n from,\n map,\n mergeMap,\n repeat,\n retry,\n shareReplay,\n tap,\n timeout,\n toArray,\n} from 'rxjs';\nimport { client } from './api';\nimport {\n getSpotAccountBalance,\n getSpotTick,\n getSwapCrossPositionInfo,\n getUnifiedAccountInfo,\n ICredential,\n} from './api/private-api';\nimport { swapProductService } from './product';\n\n/**\n * 提供 SWAP 账户信息服务\n */\nexport const provideSwapAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n) => {\n provideAccountInfoService(\n terminal,\n accountId,\n async () => {\n // balance\n const balance = await getUnifiedAccountInfo(credential);\n if (!balance.data) {\n throw new Error('Failed to get unified account info');\n }\n const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');\n if (!balanceData) {\n throw new Error('No USDT balance found in unified account');\n }\n const equity = balanceData.margin_balance;\n const free = balanceData.withdraw_available;\n\n // positions\n const positionsRes = await getSwapCrossPositionInfo(credential);\n const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);\n const positions: IPosition[] = (positionsRes.data || []).map((v): IPosition => {\n const product_id = v.contract_code;\n const theProduct = mapProductIdToPerpetualProduct?.get(product_id);\n const valuation = v.volume * v.last_price * (theProduct?.value_scale || 1);\n return {\n position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,\n datasource_id: 'HUOBI-SWAP',\n product_id,\n direction: v.direction === 'buy' ? 'LONG' : 'SHORT',\n volume: v.volume,\n free_volume: v.available,\n position_price: v.cost_hold,\n closable_price: v.last_price,\n floating_profit: v.profit_unreal,\n valuation,\n };\n });\n\n // orders\n // const orders: IOrder[] = [];\n // let page_index = 1;\n // const page_size = 50;\n\n // while (true) {\n // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });\n // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {\n // break;\n // }\n\n // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {\n // return {\n // order_id: v.order_id_str,\n // account_id: SWAP_ACCOUNT_ID,\n // product_id: v.contract_code,\n // order_type: ['lightning'].includes(v.order_price_type)\n // ? 'MARKET'\n // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(\n // v.order_price_type,\n // )\n // ? 'LIMIT'\n // : ['fok'].includes(v.order_price_type)\n // ? 'FOK'\n // : v.order_price_type.includes('ioc')\n // ? 'IOC'\n // : 'STOP', // unreachable code\n // order_direction:\n // v.direction === 'open'\n // ? v.offset === 'buy'\n // ? 'OPEN_LONG'\n // : 'OPEN_SHORT'\n // : v.offset === 'buy'\n // ? 'CLOSE_SHORT'\n // : 'CLOSE_LONG',\n // volume: v.volume,\n // submit_at: v.created_at,\n // price: v.price,\n // traded_volume: v.trade_volume,\n // };\n // });\n\n // orders.push(...pageOrders);\n // page_index++;\n // }\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n};\n\n/**\n * 获取超级保证金账户余额流\n */\nexport const getSuperMarginAccountBalance$ = (credential: ICredential, superMarginAccountUid: number) => {\n return defer(() => getSpotAccountBalance(credential, superMarginAccountUid)).pipe(\n //\n map((res) => res.data),\n repeat({ delay: 1000 }),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'unifiedRaw', e);\n },\n }),\n retry({ delay: 5000 }),\n shareReplay(1),\n );\n};\n\n/**\n * 设置超级保证金账户的 WebSocket 订阅\n */\nexport const setupSuperMarginWebSocketSubscriptions = (\n superMarginAccountBalance$: ReturnType<typeof getSuperMarginAccountBalance$>,\n subscriptions: Set<string>,\n) => {\n from(client.spot_ws.connection$).subscribe(() => {\n subscriptions.clear();\n });\n // subscribe the symbols of positions we held\n superMarginAccountBalance$\n .pipe(\n //\n mergeMap((res) =>\n from(res?.list || []).pipe(\n filter((v) => v.currency !== 'usdt'),\n map((v) => v.currency),\n distinct(),\n toArray(),\n map((v) => new Set(v)),\n ),\n ),\n )\n .subscribe((v: Set<string>) => {\n const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));\n const toSubscribe = [...v].filter((x) => !subscriptions.has(x));\n\n for (const symbol of toUnsubscribe) {\n client.spot_ws.output$.next({\n unsub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.delete(symbol);\n }\n for (const symbol of toSubscribe) {\n client.spot_ws.output$.next({\n sub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.add(symbol);\n }\n });\n};\n\n/**\n * 提供超级保证金账户信息服务\n */\nexport const provideSuperMarginAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n superMarginAccountUid: number,\n subscriptions: Set<string>,\n) => {\n const superMarginAccountBalance$ = getSuperMarginAccountBalance$(credential, superMarginAccountUid);\n setupSuperMarginWebSocketSubscriptions(superMarginAccountBalance$, subscriptions);\n\n provideAccountInfoService(\n terminal,\n accountId,\n async () => {\n // get account balance\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // calculate usdt balance\n const usdtBalance = balanceList\n .filter((v) => v.currency === 'usdt')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n // get positions (non-usdt currencies)\n const positions: IPosition[] = [];\n const nonUsdtCurrencies = balanceList\n .filter((v) => v.currency !== 'usdt')\n .reduce((acc, cur) => {\n const existing = acc.find((item) => item.currency === cur.currency);\n if (existing) {\n existing.balance += +cur.balance;\n } else {\n acc.push({ currency: cur.currency, balance: +cur.balance });\n }\n return acc;\n }, [] as { currency: string; balance: number }[]);\n\n // get prices and create positions\n for (const currencyData of nonUsdtCurrencies) {\n if (currencyData.balance > 0) {\n try {\n // get current price from websocket or fallback to REST API\n let price: number;\n try {\n const tickPrice = await firstValueFrom(\n client.spot_ws.input$.pipe(\n //\n first((v) => v.ch?.includes('ticker') && v.ch?.includes(currencyData.currency) && v.tick),\n map((v): number => v.tick.bid),\n timeout(5000),\n tap({\n error: (e) => {\n subscriptions.clear();\n },\n }),\n ),\n );\n price = tickPrice;\n } catch {\n // fallback to REST API\n const tickerRes = await getSpotTick(credential, { symbol: `${currencyData.currency}usdt` });\n price = tickerRes.tick.close;\n }\n\n positions.push({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: `${currencyData.currency}usdt`,\n direction: 'LONG',\n volume: currencyData.balance,\n free_volume: currencyData.balance,\n position_price: price,\n closable_price: price,\n floating_profit: 0,\n valuation: currencyData.balance * price,\n });\n } catch (error) {\n console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);\n }\n }\n }\n\n // calculate equity\n const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free: equity,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n return superMarginAccountBalance$;\n};\n\n/**\n * 提供 SPOT 账户信息服务\n */\nexport const provideSpotAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n spotAccountUid: number,\n) => {\n provideAccountInfoService(\n terminal,\n accountId,\n async () => {\n const spotBalance = await getSpotAccountBalance(credential, spotAccountUid);\n\n const equity = +(spotBalance.data.list.find((v) => v.currency === 'usdt')?.balance ?? 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 1000 },\n );\n};\n"]}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';
|
|
2
|
+
export const getDefaultCredential = () => {
|
|
3
|
+
return {
|
|
4
|
+
access_key: process.env.ACCESS_KEY,
|
|
5
|
+
secret_key: process.env.SECRET_KEY,
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
export const privateRequest = async (credential, method, path, api_root, params) => {
|
|
9
|
+
const requestParams = `AccessKeyId=${credential.access_key}&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(new Date().toISOString().split('.')[0])}${method === 'GET' && params !== undefined
|
|
10
|
+
? `&${Object.entries(params)
|
|
11
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
12
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
13
|
+
.join('&')}`
|
|
14
|
+
: ''}`;
|
|
15
|
+
const body = method === 'GET' ? '' : JSON.stringify(params);
|
|
16
|
+
const requestString = `${method}\n${api_root}\n${path}\n${requestParams}`;
|
|
17
|
+
const str = encodeBase64(await HmacSHA256(new TextEncoder().encode(requestString), new TextEncoder().encode(credential.secret_key)));
|
|
18
|
+
const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);
|
|
19
|
+
// url.searchParams.sort();
|
|
20
|
+
console.info(formatTime(Date.now()), method, url.href, body);
|
|
21
|
+
const res = await fetch(url.href, {
|
|
22
|
+
method,
|
|
23
|
+
headers: { 'Content-Type': 'application/json' },
|
|
24
|
+
body: body || undefined,
|
|
25
|
+
});
|
|
26
|
+
const retStr = await res.text();
|
|
27
|
+
console.info(formatTime(Date.now()), 'PrivateResponse', url.toString(), res.status);
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(retStr);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 获取账户信息
|
|
38
|
+
*
|
|
39
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003
|
|
40
|
+
*/
|
|
41
|
+
export const getAccount = (credential) => {
|
|
42
|
+
return privateRequest(credential, 'GET', '/v1/account/accounts', 'api.huobi.pro');
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 获取用户ID
|
|
46
|
+
*
|
|
47
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003
|
|
48
|
+
*/
|
|
49
|
+
export const getUid = (credential) => {
|
|
50
|
+
return privateRequest(credential, 'GET', '/v2/user/uid', 'api.huobi.pro');
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* 获取统一账户信息
|
|
54
|
+
*
|
|
55
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003
|
|
56
|
+
*/
|
|
57
|
+
export const getUnifiedAccountInfo = (credential) => {
|
|
58
|
+
return privateRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info', 'api.hbdm.com');
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* 获取合约持仓信息
|
|
62
|
+
*
|
|
63
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003
|
|
64
|
+
*/
|
|
65
|
+
export const getSwapCrossPositionInfo = (credential, params) => {
|
|
66
|
+
return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_position_info', 'api.hbdm.com', params);
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* 获取合约挂单
|
|
70
|
+
*
|
|
71
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003
|
|
72
|
+
*/
|
|
73
|
+
export const getSwapOpenOrders = (credential, params) => {
|
|
74
|
+
return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_openorders', 'api.hbdm.com', params);
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 获取现货账户余额
|
|
78
|
+
*
|
|
79
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003
|
|
80
|
+
*/
|
|
81
|
+
export const getSpotAccountBalance = (credential, account_uid) => {
|
|
82
|
+
return privateRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`, 'api.huobi.pro');
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* 获取杠杆借贷信息
|
|
86
|
+
*
|
|
87
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003
|
|
88
|
+
*/
|
|
89
|
+
export const getCrossMarginLoanInfo = (credential) => {
|
|
90
|
+
return privateRequest(credential, 'GET', '/v1/cross-margin/loan-info', 'api.huobi.pro');
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* 获取现货行情
|
|
94
|
+
*
|
|
95
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003
|
|
96
|
+
*/
|
|
97
|
+
export const getSpotTick = (credential, params) => {
|
|
98
|
+
return privateRequest(credential, 'GET', `/market/detail/merged`, 'api.huobi.pro', params);
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* 现货下单
|
|
102
|
+
*
|
|
103
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003
|
|
104
|
+
*/
|
|
105
|
+
export const postSpotOrder = (credential, params) => {
|
|
106
|
+
return privateRequest(credential, 'POST', `/v1/order/auto/place`, 'api.huobi.pro', params);
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* 合约下单
|
|
110
|
+
*
|
|
111
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003
|
|
112
|
+
*/
|
|
113
|
+
export const postSwapOrder = (credential, params) => {
|
|
114
|
+
return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', 'api.hbdm.com', params);
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* 获取现货存款地址
|
|
118
|
+
*
|
|
119
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003
|
|
120
|
+
*/
|
|
121
|
+
export const getSpotAccountDepositAddresses = (credential, params) => {
|
|
122
|
+
return privateRequest(credential, 'GET', `/v2/account/deposit/address`, 'api.huobi.pro', params);
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* 获取账户流水
|
|
126
|
+
*
|
|
127
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003
|
|
128
|
+
*/
|
|
129
|
+
export const getAccountLedger = (credential, params) => {
|
|
130
|
+
return privateRequest(credential, 'GET', `/v2/account/ledger`, 'api.huobi.pro', params);
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* 超级杠杆转出
|
|
134
|
+
*
|
|
135
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003
|
|
136
|
+
*/
|
|
137
|
+
export const postSuperMarginAccountTransferOut = (credential, params) => {
|
|
138
|
+
return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, 'api.huobi.pro', params);
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* 超级杠杆转入
|
|
142
|
+
*
|
|
143
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003
|
|
144
|
+
*/
|
|
145
|
+
export const postSuperMarginAccountTransferIn = (credential, params) => {
|
|
146
|
+
return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, 'api.huobi.pro', params);
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* 现货账户转账
|
|
150
|
+
*
|
|
151
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003
|
|
152
|
+
*/
|
|
153
|
+
export const postSpotAccountTransfer = (credential, params) => {
|
|
154
|
+
return privateRequest(credential, 'POST', `/v2/account/transfer`, 'api.huobi.pro', params);
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* 借贷
|
|
158
|
+
*
|
|
159
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003
|
|
160
|
+
*/
|
|
161
|
+
export const postBorrow = (credential, params) => {
|
|
162
|
+
return privateRequest(credential, 'POST', `/v1/cross-margin/orders`, 'api.huobi.pro', params);
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* 提现
|
|
166
|
+
*
|
|
167
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003
|
|
168
|
+
*/
|
|
169
|
+
export const postWithdraw = (credential, params) => {
|
|
170
|
+
return privateRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, 'api.huobi.pro', params);
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* 获取充提历史
|
|
174
|
+
*
|
|
175
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003
|
|
176
|
+
*/
|
|
177
|
+
export const getDepositWithdrawHistory = (credential, params) => {
|
|
178
|
+
return privateRequest(credential, 'GET', `/v1/query/deposit-withdraw`, 'api.huobi.pro', params);
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* 资产划转(母子用户之间)
|
|
182
|
+
*
|
|
183
|
+
* 接口权限: 交易
|
|
184
|
+
*
|
|
185
|
+
* 限频: 2次/2s
|
|
186
|
+
*
|
|
187
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003
|
|
188
|
+
*/
|
|
189
|
+
export const postSubUserTransfer = (credential, params) => {
|
|
190
|
+
return privateRequest(credential, 'POST', '/v1/subuser/transfer', 'api.huobi.pro', params);
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* 获取子用户列表
|
|
194
|
+
*
|
|
195
|
+
* 接口权限: 读取
|
|
196
|
+
*
|
|
197
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003
|
|
198
|
+
*/
|
|
199
|
+
export const getSubUserList = (credential, params) => {
|
|
200
|
+
return privateRequest(credential, 'GET', `/v2/sub-user/user-list`, 'api.huobi.pro', params);
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* 账户类型查询
|
|
204
|
+
*
|
|
205
|
+
* 是否验签: 是
|
|
206
|
+
*
|
|
207
|
+
* 接口权限: 读取
|
|
208
|
+
*
|
|
209
|
+
* 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。
|
|
210
|
+
*
|
|
211
|
+
* 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。
|
|
212
|
+
* 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。
|
|
213
|
+
*
|
|
214
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003
|
|
215
|
+
*/
|
|
216
|
+
export const getSwapUnifiedAccountType = (credential) => {
|
|
217
|
+
return privateRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type', 'api.hbdm.com');
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* 账户类型更改接口
|
|
221
|
+
*
|
|
222
|
+
* 是否验签: 是
|
|
223
|
+
*
|
|
224
|
+
* 接口权限: 交易
|
|
225
|
+
*
|
|
226
|
+
* 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。
|
|
227
|
+
*
|
|
228
|
+
* 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。
|
|
229
|
+
*
|
|
230
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003
|
|
231
|
+
*/
|
|
232
|
+
export const postSwapSwitchAccountType = (credential, params) => {
|
|
233
|
+
return privateRequest(credential, 'POST', '/linear-swap-api/v3/swap_switch_account_type', 'api.hbdm.com', params);
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* APIv2币链参考信息
|
|
237
|
+
*
|
|
238
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003
|
|
239
|
+
*/
|
|
240
|
+
export const getV2ReferenceCurrencies = (credential, params) => {
|
|
241
|
+
return privateRequest(credential, 'GET', '/v2/reference/currencies', 'api.huobi.pro', params);
|
|
242
|
+
};
|
|
243
|
+
/**
|
|
244
|
+
* 获取账户历史
|
|
245
|
+
*
|
|
246
|
+
* https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003
|
|
247
|
+
*/
|
|
248
|
+
export const getAccountHistory = (credential, params) => {
|
|
249
|
+
return privateRequest(credential, 'GET', '/v1/account/history', 'api.huobi.pro', params);
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=private-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport const getDefaultCredential = (): ICredential => {\n return {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n };\n};\n\nexport const privateRequest = async (\n credential: ICredential,\n method: string,\n path: string,\n api_root: string,\n params?: any,\n) => {\n const requestParams = `AccessKeyId=${\n credential.access_key\n }&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(\n new Date().toISOString().split('.')[0],\n )}${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const requestString = `${method}\\n${api_root}\\n${path}\\n${requestParams}`;\n\n const str = encodeBase64(\n await HmacSHA256(\n new TextEncoder().encode(requestString),\n new TextEncoder().encode(credential.secret_key),\n ),\n );\n\n const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n console.info(formatTime(Date.now()), 'PrivateResponse', url.toString(), res.status);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n};\n\n/**\n * 获取账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003\n */\nexport const getAccount = (\n credential: ICredential,\n): Promise<{\n status: string;\n data: {\n id: number;\n type: string;\n state: string;\n subtype: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/accounts', 'api.huobi.pro');\n};\n\n/**\n * 获取用户ID\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003\n */\nexport const getUid = (credential: ICredential): Promise<{ data: number; code: number }> => {\n return privateRequest(credential, 'GET', '/v2/user/uid', 'api.huobi.pro');\n};\n\n/**\n * 获取统一账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003\n */\nexport const getUnifiedAccountInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n msg: string;\n data: {\n margin_asset: string;\n margin_balance: number;\n cross_margin_static: number;\n cross_profit_unreal: number;\n withdraw_available: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info', 'api.hbdm.com');\n};\n\n/**\n * 获取合约持仓信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapCrossPositionInfo = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n contract_type: string;\n },\n): Promise<{\n status: string;\n ts: number;\n data: {\n contract_code: string;\n contract_type: string;\n direction: string;\n margin_mode: string;\n volume: number;\n available: number;\n cost_hold: number;\n last_price: number;\n profit_unreal: number;\n lever_rate: number;\n }[];\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_position_info',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取合约挂单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapOpenOrders = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n page_index?: number;\n page_size?: number;\n sort_by?: string;\n trade_type?: string;\n },\n): Promise<{\n status: string;\n data: {\n orders: {\n order_id_str: string;\n contract_code: string;\n order_price_type: string;\n direction: string;\n offset: string;\n volume: number;\n created_at: number;\n price: number;\n trade_volume: number;\n }[];\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_openorders',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取现货账户余额\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountBalance = (\n credential: ICredential,\n account_uid: number,\n): Promise<{\n status: string;\n data: {\n list: {\n currency: string;\n balance: string;\n type: string;\n }[];\n };\n}> => {\n return privateRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`, 'api.huobi.pro');\n};\n\n/**\n * 获取杠杆借贷信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003\n */\nexport const getCrossMarginLoanInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n data: {\n currency: string;\n 'loanable-amt': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/cross-margin/loan-info', 'api.huobi.pro');\n};\n\n/**\n * 获取现货行情\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003\n */\nexport const getSpotTick = (\n credential: ICredential,\n params: { symbol: string },\n): Promise<{\n status: string;\n tick: {\n close: number;\n };\n}> => {\n return privateRequest(credential, 'GET', `/market/detail/merged`, 'api.huobi.pro', params);\n};\n\n/**\n * 现货下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotOrder = (\n credential: ICredential,\n params: {\n symbol: string;\n 'account-id': string;\n amount: string;\n market_amount?: string;\n 'borrow-amount'?: string;\n type: string;\n 'trade-purpose': string;\n price?: string;\n source: string;\n },\n): Promise<{ success: boolean; code: number; message: string }> => {\n return privateRequest(credential, 'POST', `/v1/order/auto/place`, 'api.huobi.pro', params);\n};\n\n/**\n * 合约下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapOrder = (\n credential: ICredential,\n params: {\n contract_code: string;\n contract_type: string;\n price?: number;\n volume: number;\n offset: string;\n direction: string;\n lever_rate: number;\n order_price_type: string;\n },\n): Promise<{ status: string; ts: number; data: { order_id: number; order_id_str: string } }> => {\n return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', 'api.hbdm.com', params);\n};\n\n/**\n * 获取现货存款地址\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountDepositAddresses = (\n credential: ICredential,\n params: { currency: string },\n): Promise<{\n code: number;\n message: string;\n data: {\n currency: string;\n chain: string;\n address: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/deposit/address`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户流水\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003\n */\nexport const getAccountLedger = (\n credential: ICredential,\n params: { accountId: string; currency: string },\n): Promise<{\n status: string;\n data: {\n transactTime: number;\n transactAmt: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/ledger`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转出\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferOut = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转入\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferIn = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, 'api.huobi.pro', params);\n};\n\n/**\n * 现货账户转账\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotAccountTransfer = (\n credential: ICredential,\n params: {\n from: string;\n to: string;\n currency: string;\n amount: number;\n 'margin-account': string;\n },\n): Promise<{ success: boolean; data: number; code: number; message: string }> => {\n return privateRequest(credential, 'POST', `/v2/account/transfer`, 'api.huobi.pro', params);\n};\n\n/**\n * 借贷\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003\n */\nexport const postBorrow = (\n credential: ICredential,\n params: { currency: string; amount: string },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/orders`, 'api.huobi.pro', params);\n};\n\n/**\n * 提现\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003\n */\nexport const postWithdraw = (\n credential: ICredential,\n params: {\n address: string;\n amount: string;\n currency: string;\n fee: string;\n chain: string;\n },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取充提历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003\n */\nexport const getDepositWithdrawHistory = (\n credential: ICredential,\n params: {\n currency: string;\n type: string;\n from?: string;\n size?: string;\n direct?: string;\n },\n): Promise<{\n status: string;\n 'error-code': string;\n 'error-msg': string;\n data: {\n id: number;\n type: string;\n currency: string;\n 'tx-hash': string;\n chain: string;\n amount: string;\n address: string;\n 'address-tag': string;\n fee: string;\n state: string;\n 'create-at': number;\n 'update-at': number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v1/query/deposit-withdraw`, 'api.huobi.pro', params);\n};\n\n/**\n * 资产划转(母子用户之间)\n *\n * 接口权限: 交易\n *\n * 限频: 2次/2s\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003\n */\nexport const postSubUserTransfer = (\n credential: ICredential,\n params: {\n 'sub-uid': number;\n currency: string;\n amount: number;\n 'client-order-id'?: string;\n type: string;\n },\n): Promise<{\n data: number;\n status: string;\n}> => {\n return privateRequest(credential, 'POST', '/v1/subuser/transfer', 'api.huobi.pro', params);\n};\n\n/**\n * 获取子用户列表\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003\n */\nexport const getSubUserList = (\n credential: ICredential,\n params?: { fromId?: number },\n): Promise<{\n code: number;\n message?: string;\n data: {\n uid: number;\n userState: string;\n subUserName: string;\n note: string;\n }[];\n nextId?: number;\n ok: boolean;\n}> => {\n return privateRequest(credential, 'GET', `/v2/sub-user/user-list`, 'api.huobi.pro', params);\n};\n\n/**\n * 账户类型查询\n *\n * 是否验签: 是\n *\n * 接口权限: 读取\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。\n * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapUnifiedAccountType = (\n credential: ICredential,\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type', 'api.hbdm.com');\n};\n\n/**\n * 账户类型更改接口\n *\n * 是否验签: 是\n *\n * 接口权限: 交易\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapSwitchAccountType = (\n credential: ICredential,\n params: { account_type: number },\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v3/swap_switch_account_type',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport const getV2ReferenceCurrencies = (\n credential: ICredential,\n params: {\n currency?: string;\n authorizedUser?: string;\n },\n): Promise<{\n code: number;\n data: {\n currency: string;\n assetType: number;\n chains: {\n chain: string;\n displayName: string;\n fullName: string;\n baseChain?: string;\n baseChainProtocol?: string;\n isDynamic?: boolean;\n numOfConfirmations: number;\n numOfFastConfirmations: number;\n depositStatus: string;\n minDepositAmt: string;\n withdrawStatus: string;\n minWithdrawAmt: string;\n withdrawPrecision: number;\n maxWithdrawAmt: string;\n withdrawQuotaPerDay: string;\n withdrawQuotaPerYear: null;\n withdrawQuotaTotal: null;\n withdrawFeeType: string;\n transactFeeWithdraw?: string;\n addrWithTag: boolean;\n addrDepositTag: boolean;\n minTransactFeeWithdraw?: string;\n transactFeeRateWithdraw?: string;\n maxTransactFeeWithdraw?: string;\n }[];\n instStatus: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v2/reference/currencies', 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003\n */\nexport const getAccountHistory = (\n credential: ICredential,\n params: {\n 'account-id': string;\n currency?: string;\n 'transact-types'?: number;\n 'start-time'?: number;\n 'end-time'?: number;\n sort?: 'asc' | 'desc';\n size?: number;\n 'from-id'?: number;\n },\n): Promise<{\n // code: number;\n 'transact-amt': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n 'record-id': string;\n status: string;\n data: {\n 'account-id': string;\n currency: string;\n 'record-id': string;\n 'transact-amt': string;\n 'transact-type': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/history', 'api.huobi.pro', params);\n};\n"]}
|