@yuants/vendor-okx 0.23.23 → 0.23.25
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.js +11 -9
- package/dist/account.js.map +1 -1
- package/dist/api-service.js +29 -0
- package/dist/api-service.js.map +1 -0
- package/dist/api.js +445 -510
- package/dist/api.js.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/interest_rate.js +4 -4
- package/dist/interest_rate.js.map +1 -1
- package/dist/loan-account.js +3 -2
- package/dist/loan-account.js.map +1 -1
- package/dist/market-order.js +1 -1
- package/dist/market-order.js.map +1 -1
- package/dist/ohlc.js +3 -3
- package/dist/ohlc.js.map +1 -1
- package/dist/order-actions.js +211 -0
- package/dist/order-actions.js.map +1 -0
- package/dist/order.js +3 -3
- package/dist/order.js.map +1 -1
- package/dist/product.js +4 -4
- package/dist/product.js.map +1 -1
- package/dist/public-api.js +146 -0
- package/dist/public-api.js.map +1 -0
- package/dist/quote.js +80 -11
- package/dist/quote.js.map +1 -1
- package/dist/services.js +3 -2
- package/dist/services.js.map +1 -1
- package/dist/strategy-account.js +5 -4
- package/dist/strategy-account.js.map +1 -1
- package/dist/trade.js +6 -5
- package/dist/trade.js.map +1 -1
- package/dist/transfer.js +279 -0
- package/dist/transfer.js.map +1 -0
- package/dist/websocket.js.map +1 -1
- package/lib/account.d.ts +2 -2
- package/lib/account.d.ts.map +1 -1
- package/lib/account.js +10 -8
- package/lib/account.js.map +1 -1
- package/lib/api-service.d.ts +2 -0
- package/lib/api-service.d.ts.map +1 -0
- package/lib/api-service.js +31 -0
- package/lib/api-service.js.map +1 -0
- package/lib/api.d.ts +1251 -1558
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +477 -514
- package/lib/api.js.map +1 -1
- package/lib/index.d.ts +5 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -3
- package/lib/index.js.map +1 -1
- package/lib/interest_rate.js +4 -4
- package/lib/interest_rate.js.map +1 -1
- package/lib/loan-account.js +2 -1
- package/lib/loan-account.js.map +1 -1
- package/lib/market-order.d.ts.map +1 -1
- package/lib/market-order.js +1 -1
- package/lib/market-order.js.map +1 -1
- package/lib/ohlc.js +3 -3
- package/lib/ohlc.js.map +1 -1
- package/lib/order-actions.d.ts +2 -0
- package/lib/order-actions.d.ts.map +1 -0
- package/lib/order-actions.js +213 -0
- package/lib/order-actions.js.map +1 -0
- package/lib/order.js +2 -2
- package/lib/order.js.map +1 -1
- package/lib/product.js +4 -4
- package/lib/product.js.map +1 -1
- package/lib/public-api.d.ts +359 -0
- package/lib/public-api.d.ts.map +1 -0
- package/lib/public-api.js +161 -0
- package/lib/public-api.js.map +1 -0
- package/lib/quote.d.ts +1 -1
- package/lib/quote.d.ts.map +1 -1
- package/lib/quote.js +78 -9
- package/lib/quote.js.map +1 -1
- package/lib/services.js +2 -1
- package/lib/services.js.map +1 -1
- package/lib/strategy-account.d.ts +2 -2
- package/lib/strategy-account.d.ts.map +1 -1
- package/lib/strategy-account.js +4 -3
- package/lib/strategy-account.js.map +1 -1
- package/lib/trade.js +6 -5
- package/lib/trade.js.map +1 -1
- package/lib/transfer.d.ts +2 -0
- package/lib/transfer.d.ts.map +1 -0
- package/lib/transfer.js +281 -0
- package/lib/transfer.js.map +1 -0
- package/lib/websocket.js.map +1 -1
- package/package.json +13 -12
- package/temp/package-deps.json +34 -31
- package/dist/legacy_index.js +0 -562
- package/dist/legacy_index.js.map +0 -1
- package/dist/logger.js +0 -91
- package/dist/logger.js.map +0 -1
- package/lib/legacy_index.d.ts +0 -2
- package/lib/legacy_index.d.ts.map +0 -1
- package/lib/legacy_index.js +0 -564
- package/lib/legacy_index.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
package/dist/transfer.js
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { createCache } from '@yuants/cache';
|
|
2
|
+
import { Terminal } from '@yuants/protocol';
|
|
3
|
+
import { addAccountTransferAddress } from '@yuants/transfer';
|
|
4
|
+
import { formatTime } from '@yuants/utils';
|
|
5
|
+
import { defer, firstValueFrom } from 'rxjs';
|
|
6
|
+
import { accountConfig$ } from './account';
|
|
7
|
+
import { getAssetCurrencies, getAssetDepositAddress, getAssetDepositHistory, getAssetWithdrawalHistory, getDefaultCredential, getSubAccountList, postAssetTransfer, postAssetWithdrawal, postFinanceSavingsPurchaseRedempt, } from './api';
|
|
8
|
+
const terminal = Terminal.fromNodeEnv();
|
|
9
|
+
const credential = getDefaultCredential();
|
|
10
|
+
const cacheOfAssetCurrencies = createCache(() => getAssetCurrencies(credential), { expire: 3600000 });
|
|
11
|
+
defer(async () => {
|
|
12
|
+
const account_config = await firstValueFrom(accountConfig$);
|
|
13
|
+
console.info(formatTime(Date.now()), 'AccountConfig', JSON.stringify(account_config));
|
|
14
|
+
const { mainUid, uid } = account_config.data[0];
|
|
15
|
+
const isMainAccount = mainUid === uid;
|
|
16
|
+
const TRADING_ACCOUNT_ID = `okx/${uid}/trading`;
|
|
17
|
+
const FUNDING_ACCOUNT_ID = `okx/${uid}/funding/USDT`;
|
|
18
|
+
const EARNING_ACCOUNT_ID = `okx/${uid}/earning/USDT`;
|
|
19
|
+
// BLOCK_CHAIN: only available for main account
|
|
20
|
+
if (isMainAccount) {
|
|
21
|
+
const depositAddressRes = await getAssetDepositAddress(credential, { ccy: 'USDT' });
|
|
22
|
+
console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes.data));
|
|
23
|
+
const addresses = depositAddressRes.data.filter((v) => v.chain === 'USDT-TRC20' && v.to === '6');
|
|
24
|
+
for (const address of addresses) {
|
|
25
|
+
addAccountTransferAddress({
|
|
26
|
+
terminal,
|
|
27
|
+
account_id: FUNDING_ACCOUNT_ID,
|
|
28
|
+
network_id: 'TRC20',
|
|
29
|
+
currency: 'USDT',
|
|
30
|
+
address: address.addr,
|
|
31
|
+
onApply: {
|
|
32
|
+
INIT: async (order) => {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
if (!order.current_amount ||
|
|
35
|
+
order.current_amount < 3 // 最小提币额度
|
|
36
|
+
) {
|
|
37
|
+
return { state: 'ERROR', message: 'Amount too small' };
|
|
38
|
+
}
|
|
39
|
+
const res = await cacheOfAssetCurrencies.query('');
|
|
40
|
+
const theRes = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.find((x) => x.ccy === 'USDT' && x.chain === 'USDT-TRC20');
|
|
41
|
+
const _fee = theRes === null || theRes === void 0 ? void 0 : theRes.minFee;
|
|
42
|
+
if (!_fee)
|
|
43
|
+
return { state: 'ERROR', message: 'Currency Info not found, cannot get fee' };
|
|
44
|
+
const fee = +_fee;
|
|
45
|
+
const amt = Math.floor(order.current_amount - fee);
|
|
46
|
+
const transferResult = await postAssetWithdrawal(credential, {
|
|
47
|
+
amt: `${amt}`,
|
|
48
|
+
ccy: 'USDT',
|
|
49
|
+
chain: 'USDT-TRC20',
|
|
50
|
+
fee: `${fee}`,
|
|
51
|
+
dest: '4',
|
|
52
|
+
toAddr: order.current_rx_address,
|
|
53
|
+
});
|
|
54
|
+
if (transferResult.code !== '0') {
|
|
55
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
56
|
+
}
|
|
57
|
+
const wdId = (_b = transferResult.data[0]) === null || _b === void 0 ? void 0 : _b.wdId;
|
|
58
|
+
return { state: 'AWAIT_TX_ID', context: wdId };
|
|
59
|
+
},
|
|
60
|
+
AWAIT_TX_ID: async (transferOrder) => {
|
|
61
|
+
var _a, _b;
|
|
62
|
+
const wdId = transferOrder.current_tx_context;
|
|
63
|
+
const withdrawalHistory = await getAssetWithdrawalHistory(credential, { wdId });
|
|
64
|
+
const txId = (_b = (_a = withdrawalHistory.data) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.txId;
|
|
65
|
+
if (!txId) {
|
|
66
|
+
return { state: 'AWAIT_TX_ID', context: wdId };
|
|
67
|
+
}
|
|
68
|
+
return { state: 'COMPLETE', transaction_id: txId };
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
onEval: async (transferOrder) => {
|
|
72
|
+
const checkResult = await getAssetDepositHistory(credential, {
|
|
73
|
+
ccy: 'USDT',
|
|
74
|
+
txId: transferOrder.current_transaction_id,
|
|
75
|
+
type: '4',
|
|
76
|
+
});
|
|
77
|
+
if (checkResult.code !== '0') {
|
|
78
|
+
return {
|
|
79
|
+
state: 'INIT',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (checkResult.data[0].state !== '2') {
|
|
83
|
+
return { state: 'PENDING' };
|
|
84
|
+
}
|
|
85
|
+
const received_amount = +checkResult.data[0].amt;
|
|
86
|
+
return { state: 'COMPLETE', received_amount };
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Funding-Trading
|
|
92
|
+
{
|
|
93
|
+
const FUNDING_TRADING_NETWORK_ID = `OKX/${uid}/Funding-Trading`;
|
|
94
|
+
addAccountTransferAddress({
|
|
95
|
+
terminal,
|
|
96
|
+
account_id: FUNDING_ACCOUNT_ID,
|
|
97
|
+
network_id: FUNDING_TRADING_NETWORK_ID,
|
|
98
|
+
currency: 'USDT',
|
|
99
|
+
address: 'funding',
|
|
100
|
+
onApply: {
|
|
101
|
+
INIT: async (order) => {
|
|
102
|
+
const transferResult = await postAssetTransfer(credential, {
|
|
103
|
+
type: '0',
|
|
104
|
+
ccy: 'USDT',
|
|
105
|
+
amt: `${order.current_amount}`,
|
|
106
|
+
from: '6',
|
|
107
|
+
to: '18',
|
|
108
|
+
});
|
|
109
|
+
if (transferResult.code !== '0') {
|
|
110
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
111
|
+
}
|
|
112
|
+
const transaction_id = transferResult.data[0].transId;
|
|
113
|
+
return { state: 'COMPLETE', transaction_id };
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
onEval: async (transferOrder) => {
|
|
117
|
+
return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
addAccountTransferAddress({
|
|
121
|
+
terminal,
|
|
122
|
+
account_id: TRADING_ACCOUNT_ID,
|
|
123
|
+
network_id: FUNDING_TRADING_NETWORK_ID,
|
|
124
|
+
currency: 'USDT',
|
|
125
|
+
address: 'trading',
|
|
126
|
+
onApply: {
|
|
127
|
+
INIT: async (order) => {
|
|
128
|
+
const transferResult = await postAssetTransfer(credential, {
|
|
129
|
+
type: '0',
|
|
130
|
+
ccy: order.currency,
|
|
131
|
+
amt: `${order.current_amount}`,
|
|
132
|
+
from: '18',
|
|
133
|
+
to: '6',
|
|
134
|
+
});
|
|
135
|
+
if (transferResult.code !== '0') {
|
|
136
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
137
|
+
}
|
|
138
|
+
const transaction_id = transferResult.data[0].transId;
|
|
139
|
+
return { state: 'COMPLETE', transaction_id };
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
onEval: async (transferOrder) => {
|
|
143
|
+
return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Funding-Earning
|
|
148
|
+
{
|
|
149
|
+
const FUNDING_EARNING_NETWORK_ID = `OKX/${uid}/Funding-Earning`;
|
|
150
|
+
addAccountTransferAddress({
|
|
151
|
+
terminal,
|
|
152
|
+
account_id: FUNDING_ACCOUNT_ID,
|
|
153
|
+
network_id: FUNDING_EARNING_NETWORK_ID,
|
|
154
|
+
currency: 'USDT',
|
|
155
|
+
address: 'funding',
|
|
156
|
+
onApply: {
|
|
157
|
+
INIT: async (order) => {
|
|
158
|
+
const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {
|
|
159
|
+
ccy: 'USDT',
|
|
160
|
+
amt: `${order.current_amount}`,
|
|
161
|
+
side: 'purchase',
|
|
162
|
+
rate: '0.01',
|
|
163
|
+
});
|
|
164
|
+
if (transferResult.code !== '0') {
|
|
165
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
166
|
+
}
|
|
167
|
+
return { state: 'COMPLETE', transaction_id: 'ok' };
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
onEval: async (transferOrder) => {
|
|
171
|
+
return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
addAccountTransferAddress({
|
|
175
|
+
terminal,
|
|
176
|
+
account_id: EARNING_ACCOUNT_ID,
|
|
177
|
+
network_id: FUNDING_EARNING_NETWORK_ID,
|
|
178
|
+
currency: 'USDT',
|
|
179
|
+
address: 'earning',
|
|
180
|
+
onApply: {
|
|
181
|
+
INIT: async (order) => {
|
|
182
|
+
const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {
|
|
183
|
+
ccy: 'USDT',
|
|
184
|
+
amt: `${order.current_amount}`,
|
|
185
|
+
side: 'redempt',
|
|
186
|
+
rate: '0.01',
|
|
187
|
+
});
|
|
188
|
+
if (transferResult.code !== '0') {
|
|
189
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
190
|
+
}
|
|
191
|
+
return { state: 'COMPLETE', transaction_id: 'ok' };
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
onEval: async (transferOrder) => {
|
|
195
|
+
return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// SubAccount
|
|
200
|
+
{
|
|
201
|
+
const getSubAccountNetworkId = (subUid) => `OKX/${mainUid}/SubAccount/${subUid}`;
|
|
202
|
+
if (isMainAccount) {
|
|
203
|
+
const subAcctsRes = await getSubAccountList(credential);
|
|
204
|
+
for (const item of subAcctsRes.data || []) {
|
|
205
|
+
addAccountTransferAddress({
|
|
206
|
+
terminal,
|
|
207
|
+
account_id: FUNDING_ACCOUNT_ID,
|
|
208
|
+
network_id: getSubAccountNetworkId(item.uid),
|
|
209
|
+
currency: 'USDT',
|
|
210
|
+
address: 'main',
|
|
211
|
+
onApply: {
|
|
212
|
+
INIT: async (order) => {
|
|
213
|
+
const transferResult = await postAssetTransfer(credential, {
|
|
214
|
+
type: '1',
|
|
215
|
+
ccy: 'USDT',
|
|
216
|
+
amt: `${order.current_amount}`,
|
|
217
|
+
from: '6',
|
|
218
|
+
to: '6',
|
|
219
|
+
subAcct: item.subAcct,
|
|
220
|
+
});
|
|
221
|
+
if (transferResult.code !== '0') {
|
|
222
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
223
|
+
}
|
|
224
|
+
const transaction_id = transferResult.data[0].transId;
|
|
225
|
+
return { state: 'COMPLETE', transaction_id };
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
onEval: async (order) => {
|
|
229
|
+
// ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’
|
|
230
|
+
// const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });
|
|
231
|
+
// const received_amount = checkResult?.data?.[0]?.amt;
|
|
232
|
+
// if (!received_amount) {
|
|
233
|
+
// return { state: 'INIT', message: checkResult.msg };
|
|
234
|
+
// }
|
|
235
|
+
// return { state: 'COMPLETE', received_amount: +received_amount };
|
|
236
|
+
return { state: 'COMPLETE', received_amount: order.current_amount };
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// SubAccount API
|
|
242
|
+
else {
|
|
243
|
+
addAccountTransferAddress({
|
|
244
|
+
terminal,
|
|
245
|
+
account_id: FUNDING_ACCOUNT_ID,
|
|
246
|
+
network_id: getSubAccountNetworkId(uid),
|
|
247
|
+
currency: 'USDT',
|
|
248
|
+
address: 'sub',
|
|
249
|
+
onApply: {
|
|
250
|
+
INIT: async (order) => {
|
|
251
|
+
const transferResult = await postAssetTransfer(credential, {
|
|
252
|
+
type: '3',
|
|
253
|
+
ccy: 'USDT',
|
|
254
|
+
amt: `${order.current_amount}`,
|
|
255
|
+
from: '6',
|
|
256
|
+
to: '6',
|
|
257
|
+
});
|
|
258
|
+
if (transferResult.code !== '0') {
|
|
259
|
+
return { state: 'INIT', message: transferResult.msg };
|
|
260
|
+
}
|
|
261
|
+
const transaction_id = transferResult.data[0].transId;
|
|
262
|
+
return { state: 'COMPLETE', transaction_id };
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
onEval: async (order) => {
|
|
266
|
+
// ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’
|
|
267
|
+
// const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });
|
|
268
|
+
// const received_amount = checkResult?.data?.[0]?.amt;
|
|
269
|
+
// if (!received_amount) {
|
|
270
|
+
// return { state: 'INIT', message: checkResult.msg };
|
|
271
|
+
// }
|
|
272
|
+
// return { state: 'COMPLETE', received_amount: +received_amount };
|
|
273
|
+
return { state: 'COMPLETE', received_amount: order.current_amount };
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}).subscribe();
|
|
279
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime } from '@yuants/utils';\nimport { defer, firstValueFrom } from 'rxjs';\nimport { accountConfig$ } from './account';\nimport {\n getAssetCurrencies,\n getAssetDepositAddress,\n getAssetDepositHistory,\n getAssetWithdrawalHistory,\n getDefaultCredential,\n getSubAccountList,\n postAssetTransfer,\n postAssetWithdrawal,\n postFinanceSavingsPurchaseRedempt,\n} from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nconst cacheOfAssetCurrencies = createCache(() => getAssetCurrencies(credential), { expire: 3600_000 });\n\ndefer(async () => {\n const account_config = await firstValueFrom(accountConfig$);\n console.info(formatTime(Date.now()), 'AccountConfig', JSON.stringify(account_config));\n const { mainUid, uid } = account_config.data[0];\n const isMainAccount = mainUid === uid;\n\n const TRADING_ACCOUNT_ID = `okx/${uid}/trading`;\n const FUNDING_ACCOUNT_ID = `okx/${uid}/funding/USDT`;\n const EARNING_ACCOUNT_ID = `okx/${uid}/earning/USDT`;\n\n // BLOCK_CHAIN: only available for main account\n if (isMainAccount) {\n const depositAddressRes = await getAssetDepositAddress(credential, { ccy: 'USDT' });\n console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes.data));\n const addresses = depositAddressRes.data.filter((v) => v.chain === 'USDT-TRC20' && v.to === '6');\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: address.addr,\n onApply: {\n INIT: async (order) => {\n if (\n !order.current_amount ||\n order.current_amount < 3 // 最小提币额度\n ) {\n return { state: 'ERROR', message: 'Amount too small' };\n }\n const res = await cacheOfAssetCurrencies.query('');\n const theRes = res?.data?.find((x) => x.ccy === 'USDT' && x.chain === 'USDT-TRC20');\n const _fee = theRes?.minFee;\n if (!_fee) return { state: 'ERROR', message: 'Currency Info not found, cannot get fee' };\n const fee = +_fee;\n const amt = Math.floor(order.current_amount - fee);\n const transferResult = await postAssetWithdrawal(credential, {\n amt: `${amt}`,\n ccy: 'USDT',\n chain: 'USDT-TRC20',\n fee: `${fee}`,\n dest: '4', // 链上提币\n toAddr: order.current_rx_address!,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const wdId = transferResult.data[0]?.wdId;\n return { state: 'AWAIT_TX_ID', context: wdId };\n },\n AWAIT_TX_ID: async (transferOrder) => {\n const wdId = transferOrder.current_tx_context;\n const withdrawalHistory = await getAssetWithdrawalHistory(credential, { wdId });\n const txId = withdrawalHistory.data?.[0]?.txId;\n if (!txId) {\n return { state: 'AWAIT_TX_ID', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (transferOrder) => {\n const checkResult = await getAssetDepositHistory(credential, {\n ccy: 'USDT',\n txId: transferOrder.current_transaction_id,\n type: '4',\n });\n\n if (checkResult.code !== '0') {\n return {\n state: 'INIT',\n };\n }\n\n if (checkResult.data[0].state !== '2') {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult.data[0].amt;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // Funding-Trading\n {\n const FUNDING_TRADING_NETWORK_ID = `OKX/${uid}/Funding-Trading`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '18',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: TRADING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'trading',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: order.currency,\n amt: `${order.current_amount}`,\n from: '18',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n // Funding-Earning\n {\n const FUNDING_EARNING_NETWORK_ID = `OKX/${uid}/Funding-Earning`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'purchase',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: EARNING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'earning',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'redempt',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n\n // SubAccount\n {\n const getSubAccountNetworkId = (subUid: string) => `OKX/${mainUid}/SubAccount/${subUid}`;\n if (isMainAccount) {\n const subAcctsRes = await getSubAccountList(credential);\n for (const item of subAcctsRes.data || []) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(item.uid),\n currency: 'USDT',\n address: 'main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '1',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n subAcct: item.subAcct,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n // SubAccount API\n else {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(uid),\n currency: 'USDT',\n address: 'sub',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '3',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n}).subscribe();\n"]}
|
package/dist/websocket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import { PromRegistry, Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { catchError, defer, EMPTY, interval, Observable, Subscription, tap, timeout } from 'rxjs';\n\nconst MetricsWebSocketConnectionsGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_connections',\n 'Number of active OKX WebSocket connections',\n);\n\nconst MetricsWebSocketChannelGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_channel',\n 'Number of OKX WebSocket channels subscribed',\n);\n\nconst terminal = Terminal.fromNodeEnv();\n\nclass OKXWsClient {\n ws: WebSocket;\n connected: boolean = false;\n subscriptions: Set<string>;\n handlers: Record<string, Function>;\n pendingSub: string[];\n keepAlive: Subscription;\n\n baseURL: string = `wss://ws.okx.com:8443`;\n constructor(path: string) {\n // this.instId = instId;\n this.ws = new WebSocket(`${this.baseURL}/${path}`);\n\n MetricsWebSocketConnectionsGauge.inc({ path, terminal_id: terminal.terminal_id });\n\n this.pendingSub = [];\n this.keepAlive = interval(25000)\n .pipe(\n tap(() => {\n if (this.connected) {\n this.ws.send('ping');\n }\n }),\n )\n .subscribe();\n // this.ws.\n this.ws.addEventListener('open', () => {\n this.connected = true;\n console.info(formatTime(Date.now()), '✅ WS connected');\n while (this.pendingSub.length > 0) {\n const msg = this.pendingSub.shift();\n if (msg) {\n this.ws.send(msg);\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${msg}`);\n }\n }\n });\n\n this.ws.addEventListener('message', (raw) => this.handleMessage(raw));\n this.ws.addEventListener('error', (raw) => {\n console.error(formatTime(Date.now()), '❌ WS error', raw);\n });\n this.ws.addEventListener('close', (event) => {\n console.error(formatTime(Date.now()), '❌ WS closed', event);\n\n MetricsWebSocketConnectionsGauge.dec({ path });\n });\n this.subscriptions = new Set();\n this.handlers = {}; // key: channel, value: callback\n }\n\n // 处理消息\n handleMessage(raw: any) {\n if (raw.data === 'pong') {\n return;\n }\n const msg = JSON.parse(raw.data);\n if (msg.arg?.channel) {\n const channelId = encodePath(msg.arg.channel, msg.arg.instId);\n const data = msg.data?.[0];\n if (data && this.handlers[channelId]) {\n this.handlers[channelId](data, msg.arg);\n }\n } else if (msg.event) {\n console.info(formatTime(Date.now()), 'Event:', msg);\n }\n }\n\n // 调用订阅\n subscribe(channel: string, instId?: string, handler?: Function) {\n const channelId = encodePath(channel, instId);\n if (this.subscriptions.has(channelId)) {\n console.info(formatTime(Date.now()), `⚠️ Already subscribed: ${channelId}`);\n return;\n }\n\n const subMsg = {\n op: 'subscribe',\n args: [{ channel, instId }],\n };\n\n if (this.connected) {\n this.ws.send(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${channelId}`);\n } else {\n this.pendingSub.push(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 add subscribe for ${channelId} to pending list`);\n }\n MetricsWebSocketChannelGauge.inc({ channel, terminal_id: terminal.terminal_id });\n this.subscriptions.add(channelId);\n if (handler) {\n this.handlers[channelId] = handler;\n }\n }\n\n // 取消订阅\n unsubscribe(channel: string, instId?: string) {\n const channelId = encodePath(channel, instId);\n if (!this.subscriptions.has(channelId)) return;\n\n const unSubMsg = {\n op: 'unsubscribe',\n args: [{ channel, instId }],\n };\n\n this.ws.send(JSON.stringify(unSubMsg));\n this.subscriptions.delete(channelId);\n if (this.subscriptions.size === 0) {\n this.keepAlive.unsubscribe();\n }\n MetricsWebSocketChannelGauge.dec({ channel });\n delete this.handlers[channelId];\n console.info(formatTime(Date.now()), `📩 Sent unsubscribe for ${channelId}`);\n }\n}\n\nconst wsPool: {\n path: string;\n client: OKXWsClient;\n requests: number;\n isFull: boolean;\n}[] = [];\n\n// ISSUE: 连接限制:3 次/秒 (基于IP)\n//\n// https://www.okx.com/docs-v5/zh/#overview-websocket-connect\n//\n// 当订阅公有频道时,使用公有服务的地址;当订阅私有频道时,使用私有服务的地址\n//\n// 请求限制:\n//\n// 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时\nconst getWsClient = (path: string) => {\n const existing = wsPool.find((item) => item.path === path && !item.isFull);\n if (existing) {\n existing.requests++;\n if (existing.requests >= 480) {\n existing.isFull = true;\n }\n return existing.client;\n }\n const newClient = new OKXWsClient(path);\n wsPool.push({ path, client: newClient, requests: 1, isFull: false });\n return newClient;\n};\n\nconst fromWsChannelAndInstId = <T>(path: string, channel: string, instId: string) =>\n defer(\n () =>\n new Observable<T>((subscriber) => {\n const client = getWsClient(path);\n client.subscribe(channel, instId, (data: T) => {\n subscriber.next(data);\n });\n client.ws.addEventListener('error', (err) => {\n subscriber.error(err);\n });\n client.ws.addEventListener('close', () => {\n subscriber.error('WS Connection Closed');\n });\n subscriber.add(() => {\n client.unsubscribe(channel, instId);\n });\n }),\n ).pipe(\n // 防止单个连接断开导致数据流关闭\n timeout(60_000),\n tap({\n error: (err) => {\n console.info(formatTime(Date.now()), 'WS_SUBSCRIBE_ERROR', channel, instId, err);\n },\n }),\n // 暂时不太确定是否能支持 retry\n // retry({ delay: 1000 }),\n catchError(() => EMPTY),\n );\n\nexport const useTicker = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n last: string;\n askPx: string;\n bidPx: string;\n askSz: string;\n bidSz: string;\n }>('ws/v5/public', 'tickers', instId);\n\nexport const useOpenInterest = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n oi: string; // open interest\n }>('ws/v5/public', 'open-interest', instId);\n\nexport const useOHLC = (candleType: string, instId: string) =>\n fromWsChannelAndInstId<string[]>('ws/v5/business', candleType, instId);\n"]}
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAgB,GAAG,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAElG,MAAM,gCAAgC,GAAG,YAAY,CAAC,MAAM,CAC1D,OAAO,EACP,2BAA2B,EAC3B,4CAA4C,CAC7C,CAAC;AAEF,MAAM,4BAA4B,GAAG,YAAY,CAAC,MAAM,CACtD,OAAO,EACP,uBAAuB,EACvB,6CAA6C,CAC9C,CAAC;AAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,WAAW;IASf,YAAY,IAAY;QAPxB,cAAS,GAAY,KAAK,CAAC;QAM3B,YAAO,GAAW,uBAAuB,CAAC;QAExC,wBAAwB;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;QAEnD,gCAAgC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAElF,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;aAC7B,IAAI,CACH,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACtB;QACH,CAAC,CAAC,CACH;aACA,SAAS,EAAE,CAAC;QACf,WAAW;QACX,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,GAAG,EAAE;oBACP,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;iBACtE;aACF;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAE5D,gCAAgC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,gCAAgC;IACtD,CAAC;IAED,OAAO;IACP,aAAa,CAAC,GAAqB;;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;YACvB,OAAO;SACR;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAA,GAAG,CAAC,GAAG,0CAAE,OAAO,EAAE;YACpB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAA,GAAG,CAAC,IAAI,0CAAG,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;gBACpC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;aACzC;SACF;aAAM,IAAI,GAAG,CAAC,KAAK,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;SACrD;IACH,CAAC;IAED,OAAO;IACP,SAAS,CAAC,OAAe,EAAE,MAAe,EAAE,OAAkB;QAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACrC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,0BAA0B,SAAS,EAAE,CAAC,CAAC;YAC5E,OAAO;SACR;QAED,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAC;QAEF,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,yBAAyB,SAAS,EAAE,CAAC,CAAC;SAC5E;aAAM;YACL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,wBAAwB,SAAS,kBAAkB,CAAC,CAAC;SAC3F;QACD,4BAA4B,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;SACpC;IACH,CAAC;IAED,OAAO;IACP,WAAW,CAAC,OAAe,EAAE,MAAe;QAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QAE/C,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;SAC9B;QACD,4BAA4B,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,2BAA2B,SAAS,EAAE,CAAC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,MAAM,GAKN,EAAE,CAAC;AAET,2BAA2B;AAC3B,EAAE;AACF,6DAA6D;AAC7D,EAAE;AACF,wCAAwC;AACxC,EAAE;AACF,QAAQ;AACR,EAAE;AACF,wCAAwC;AACxC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAI,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE;YAC5B,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;SACxB;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC;KACxB;IACD,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAI,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,EAAE,CAClF,KAAK,CACH,GAAG,EAAE,CACH,IAAI,UAAU,CAAI,CAAC,UAAU,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,IAAO,EAAE,EAAE;QAC5C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QAC1C,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACvC,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;QAClB,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACL,CAAC,IAAI;AACJ,kBAAkB;AAClB,OAAO,CAAC,KAAM,CAAC,EACf,GAAG,CAAC;IACF,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;CACF,CAAC;AACF,oBAAoB;AACpB,0BAA0B;AAC1B,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CACxB,CAAC;AAEJ,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE,CAC1C,sBAAsB,CAOnB,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE,CAChD,sBAAsB,CAGnB,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAAkB,EAAE,MAAc,EAAE,EAAE,CAC5D,sBAAsB,CAAW,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC","sourcesContent":["import { PromRegistry, Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { catchError, defer, EMPTY, interval, Observable, Subscription, tap, timeout } from 'rxjs';\n\nconst MetricsWebSocketConnectionsGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_connections',\n 'Number of active OKX WebSocket connections',\n);\n\nconst MetricsWebSocketChannelGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_channel',\n 'Number of OKX WebSocket channels subscribed',\n);\n\nconst terminal = Terminal.fromNodeEnv();\n\nclass OKXWsClient {\n ws: WebSocket;\n connected: boolean = false;\n subscriptions: Set<string>;\n handlers: Record<string, Function>;\n pendingSub: string[];\n keepAlive: Subscription;\n\n baseURL: string = `wss://ws.okx.com:8443`;\n constructor(path: string) {\n // this.instId = instId;\n this.ws = new WebSocket(`${this.baseURL}/${path}`);\n\n MetricsWebSocketConnectionsGauge.inc({ path, terminal_id: terminal.terminal_id });\n\n this.pendingSub = [];\n this.keepAlive = interval(25000)\n .pipe(\n tap(() => {\n if (this.connected) {\n this.ws.send('ping');\n }\n }),\n )\n .subscribe();\n // this.ws.\n this.ws.addEventListener('open', () => {\n this.connected = true;\n console.info(formatTime(Date.now()), '✅ WS connected');\n while (this.pendingSub.length > 0) {\n const msg = this.pendingSub.shift();\n if (msg) {\n this.ws.send(msg);\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${msg}`);\n }\n }\n });\n\n this.ws.addEventListener('message', (raw) => this.handleMessage(raw));\n this.ws.addEventListener('error', (raw) => {\n console.error(formatTime(Date.now()), '❌ WS error', raw);\n });\n this.ws.addEventListener('close', (event) => {\n console.error(formatTime(Date.now()), '❌ WS closed', event);\n\n MetricsWebSocketConnectionsGauge.dec({ path });\n });\n this.subscriptions = new Set();\n this.handlers = {}; // key: channel, value: callback\n }\n\n // 处理消息\n handleMessage(raw: { data: string }) {\n if (raw.data === 'pong') {\n return;\n }\n const msg = JSON.parse(raw.data);\n if (msg.arg?.channel) {\n const channelId = encodePath(msg.arg.channel, msg.arg.instId);\n const data = msg.data?.[0];\n if (data && this.handlers[channelId]) {\n this.handlers[channelId](data, msg.arg);\n }\n } else if (msg.event) {\n console.info(formatTime(Date.now()), 'Event:', msg);\n }\n }\n\n // 调用订阅\n subscribe(channel: string, instId?: string, handler?: Function) {\n const channelId = encodePath(channel, instId);\n if (this.subscriptions.has(channelId)) {\n console.info(formatTime(Date.now()), `⚠️ Already subscribed: ${channelId}`);\n return;\n }\n\n const subMsg = {\n op: 'subscribe',\n args: [{ channel, instId }],\n };\n\n if (this.connected) {\n this.ws.send(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${channelId}`);\n } else {\n this.pendingSub.push(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 add subscribe for ${channelId} to pending list`);\n }\n MetricsWebSocketChannelGauge.inc({ channel, terminal_id: terminal.terminal_id });\n this.subscriptions.add(channelId);\n if (handler) {\n this.handlers[channelId] = handler;\n }\n }\n\n // 取消订阅\n unsubscribe(channel: string, instId?: string) {\n const channelId = encodePath(channel, instId);\n if (!this.subscriptions.has(channelId)) return;\n\n const unSubMsg = {\n op: 'unsubscribe',\n args: [{ channel, instId }],\n };\n\n this.ws.send(JSON.stringify(unSubMsg));\n this.subscriptions.delete(channelId);\n if (this.subscriptions.size === 0) {\n this.keepAlive.unsubscribe();\n }\n MetricsWebSocketChannelGauge.dec({ channel });\n delete this.handlers[channelId];\n console.info(formatTime(Date.now()), `📩 Sent unsubscribe for ${channelId}`);\n }\n}\n\nconst wsPool: {\n path: string;\n client: OKXWsClient;\n requests: number;\n isFull: boolean;\n}[] = [];\n\n// ISSUE: 连接限制:3 次/秒 (基于IP)\n//\n// https://www.okx.com/docs-v5/zh/#overview-websocket-connect\n//\n// 当订阅公有频道时,使用公有服务的地址;当订阅私有频道时,使用私有服务的地址\n//\n// 请求限制:\n//\n// 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时\nconst getWsClient = (path: string) => {\n const existing = wsPool.find((item) => item.path === path && !item.isFull);\n if (existing) {\n existing.requests++;\n if (existing.requests >= 480) {\n existing.isFull = true;\n }\n return existing.client;\n }\n const newClient = new OKXWsClient(path);\n wsPool.push({ path, client: newClient, requests: 1, isFull: false });\n return newClient;\n};\n\nconst fromWsChannelAndInstId = <T>(path: string, channel: string, instId: string) =>\n defer(\n () =>\n new Observable<T>((subscriber) => {\n const client = getWsClient(path);\n client.subscribe(channel, instId, (data: T) => {\n subscriber.next(data);\n });\n client.ws.addEventListener('error', (err) => {\n subscriber.error(err);\n });\n client.ws.addEventListener('close', () => {\n subscriber.error('WS Connection Closed');\n });\n subscriber.add(() => {\n client.unsubscribe(channel, instId);\n });\n }),\n ).pipe(\n // 防止单个连接断开导致数据流关闭\n timeout(60_000),\n tap({\n error: (err) => {\n console.info(formatTime(Date.now()), 'WS_SUBSCRIBE_ERROR', channel, instId, err);\n },\n }),\n // 暂时不太确定是否能支持 retry\n // retry({ delay: 1000 }),\n catchError(() => EMPTY),\n );\n\nexport const useTicker = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n last: string;\n askPx: string;\n bidPx: string;\n askSz: string;\n bidSz: string;\n }>('ws/v5/public', 'tickers', instId);\n\nexport const useOpenInterest = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n oi: string; // open interest\n }>('ws/v5/public', 'open-interest', instId);\n\nexport const useOHLC = (candleType: string, instId: string) =>\n fromWsChannelAndInstId<string[]>('ws/v5/business', candleType, instId);\n"]}
|
package/lib/account.d.ts
CHANGED
|
@@ -13,9 +13,9 @@ export declare const accountConfig$: import("rxjs").Observable<{
|
|
|
13
13
|
uid: string;
|
|
14
14
|
label: string;
|
|
15
15
|
roleType: string;
|
|
16
|
-
traderInsts:
|
|
16
|
+
traderInsts: unknown[];
|
|
17
17
|
spotRoleType: string;
|
|
18
|
-
spotTraderInsts:
|
|
18
|
+
spotTraderInsts: unknown[];
|
|
19
19
|
opAuth: string;
|
|
20
20
|
kycLv: string;
|
|
21
21
|
ip: string;
|
package/lib/account.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;EAI1B,CAAC;AAQF,eAAO,MAAM,WAAW,mCAIvB,CAAC;AAmDF,eAAO,MAAM,iBAAiB,mCAG7B,CAAC"}
|
package/lib/account.js
CHANGED
|
@@ -8,15 +8,17 @@ const utils_1 = require("@yuants/utils");
|
|
|
8
8
|
const rxjs_1 = require("rxjs");
|
|
9
9
|
const api_1 = require("./api");
|
|
10
10
|
const product_1 = require("./product");
|
|
11
|
+
const public_api_1 = require("./public-api");
|
|
11
12
|
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
const credential = (0, api_1.getDefaultCredential)();
|
|
14
|
+
exports.accountConfig$ = (0, rxjs_1.defer)(() => (0, api_1.getAccountConfig)(credential)).pipe((0, rxjs_1.repeat)({ delay: 10000 }), (0, rxjs_1.retry)({ delay: 10000 }), (0, rxjs_1.shareReplay)(1));
|
|
15
|
+
const subAccountUids$ = (0, rxjs_1.defer)(() => (0, api_1.getSubAccountList)(credential)).pipe((0, rxjs_1.repeat)({ delay: 10000 }), (0, rxjs_1.retry)({ delay: 10000 }), (0, rxjs_1.shareReplay)(1));
|
|
14
16
|
exports.accountUid$ = exports.accountConfig$.pipe((0, rxjs_1.map)((x) => x.data[0].uid), (0, rxjs_1.filter)((x) => !!x), (0, rxjs_1.shareReplay)(1));
|
|
15
17
|
(0, rxjs_1.defer)(async () => {
|
|
16
18
|
const uid = await (0, rxjs_1.firstValueFrom)(exports.accountUid$);
|
|
17
19
|
const account_id = `okx/${uid}/trading`;
|
|
18
20
|
(0, data_order_1.providePendingOrdersService)(terminal, account_id, async () => {
|
|
19
|
-
const orders = await api_1.
|
|
21
|
+
const orders = await (0, api_1.getTradeOrdersPending)(credential, {});
|
|
20
22
|
return orders.data.map((x) => {
|
|
21
23
|
const order_type = x.ordType === 'market' ? 'MARKET' : x.ordType === 'limit' ? 'LIMIT' : 'UNKNOWN';
|
|
22
24
|
const order_direction = x.side === 'buy'
|
|
@@ -42,7 +44,7 @@ exports.accountUid$ = exports.accountConfig$.pipe((0, rxjs_1.map)((x) => x.data[
|
|
|
42
44
|
});
|
|
43
45
|
}, { auto_refresh_interval: 5000 });
|
|
44
46
|
}).subscribe();
|
|
45
|
-
const marketIndexTickerUSDT$ = (0, rxjs_1.defer)(() =>
|
|
47
|
+
const marketIndexTickerUSDT$ = (0, rxjs_1.defer)(() => (0, public_api_1.getMarketIndexTicker)({ quoteCcy: 'USDT' })).pipe((0, rxjs_1.map)((x) => {
|
|
46
48
|
const mapInstIdToPrice = new Map();
|
|
47
49
|
x.data.forEach((inst) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));
|
|
48
50
|
return mapInstIdToPrice;
|
|
@@ -54,8 +56,8 @@ exports.tradingAccountId$ = exports.accountUid$.pipe((0, rxjs_1.map)((uid) => `o
|
|
|
54
56
|
(0, data_account_1.provideAccountInfoService)(terminal, tradingAccountId, async () => {
|
|
55
57
|
var _a;
|
|
56
58
|
const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([
|
|
57
|
-
api_1.
|
|
58
|
-
api_1.
|
|
59
|
+
(0, api_1.getAccountPositions)(credential, {}),
|
|
60
|
+
(0, api_1.getAccountBalance)(credential, {}),
|
|
59
61
|
(0, rxjs_1.firstValueFrom)(product_1.productService.mapProductIdToProduct$),
|
|
60
62
|
(0, rxjs_1.firstValueFrom)(marketIndexTickerUSDT$),
|
|
61
63
|
]);
|
|
@@ -130,7 +132,7 @@ exports.tradingAccountId$ = exports.accountUid$.pipe((0, rxjs_1.map)((uid) => `o
|
|
|
130
132
|
const fundingAccountId = `okx/${uid}/funding/USDT`;
|
|
131
133
|
(0, data_account_1.provideAccountInfoService)(terminal, fundingAccountId, async () => {
|
|
132
134
|
const [assetBalances, marketIndexTickerUSDT] = await Promise.all([
|
|
133
|
-
api_1.
|
|
135
|
+
(0, api_1.getAssetBalances)(credential, {}),
|
|
134
136
|
(0, rxjs_1.firstValueFrom)(marketIndexTickerUSDT$),
|
|
135
137
|
]);
|
|
136
138
|
const positions = [];
|
|
@@ -174,7 +176,7 @@ exports.tradingAccountId$ = exports.accountUid$.pipe((0, rxjs_1.map)((uid) => `o
|
|
|
174
176
|
const uid = await (0, rxjs_1.firstValueFrom)(exports.accountUid$);
|
|
175
177
|
const earningAccountId = `okx/${uid}/earning/USDT`;
|
|
176
178
|
(0, data_account_1.provideAccountInfoService)(terminal, earningAccountId, async () => {
|
|
177
|
-
const offers = await api_1.
|
|
179
|
+
const offers = await (0, api_1.getFinanceSavingsBalance)(credential, {});
|
|
178
180
|
const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 0);
|
|
179
181
|
const free = equity;
|
|
180
182
|
return {
|
package/lib/account.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { defer, filter, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';\nimport { client } from './api';\nimport { productService } from './product';\n\nconst terminal = Terminal.fromNodeEnv();\n\nexport const accountConfig$ = defer(() => client.getAccountConfig()).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nconst subAccountUids$ = defer(() => client.getSubAccountList()).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nexport const accountUid$ = accountConfig$.pipe(\n map((x) => x.data[0].uid),\n filter((x) => !!x),\n shareReplay(1),\n);\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const account_id = `okx/${uid}/trading`;\n providePendingOrdersService(\n terminal,\n account_id,\n async () => {\n const orders = await client.getTradeOrdersPending({});\n return orders.data.map((x) => {\n const order_type = x.ordType === 'market' ? 'MARKET' : x.ordType === 'limit' ? 'LIMIT' : 'UNKNOWN';\n\n const order_direction =\n x.side === 'buy'\n ? x.posSide === 'long'\n ? 'OPEN_LONG'\n : 'CLOSE_SHORT'\n : x.posSide === 'short'\n ? 'OPEN_SHORT'\n : 'CLOSE_LONG';\n return {\n order_id: x.ordId,\n account_id,\n product_id: encodePath(x.instType, x.instId),\n submit_at: +x.cTime,\n filled_at: +x.fillTime,\n order_type,\n order_direction,\n volume: +x.sz,\n traded_volume: +x.accFillSz,\n price: +x.px,\n traded_price: +x.avgPx,\n };\n });\n },\n { auto_refresh_interval: 5000 },\n );\n}).subscribe();\n\nconst marketIndexTickerUSDT$ = defer(() => client.getMarketIndexTicker({ quoteCcy: 'USDT' })).pipe(\n map((x) => {\n const mapInstIdToPrice = new Map<string, number>();\n x.data.forEach((inst) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));\n return mapInstIdToPrice;\n }),\n repeat({ delay: 1000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\nexport const tradingAccountId$ = accountUid$.pipe(\n map((uid) => `okx/${uid}/trading`),\n shareReplay(1),\n);\n\ndefer(async () => {\n const tradingAccountId = await firstValueFrom(tradingAccountId$);\n addAccountMarket(terminal, { account_id: tradingAccountId, market_id: 'OKX' });\n\n provideAccountInfoService(\n terminal,\n tradingAccountId,\n async () => {\n const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([\n client.getAccountPositions({}),\n client.getAccountBalance({}),\n firstValueFrom(productService.mapProductIdToProduct$),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n let totalEquity = 0;\n let totalFree = 0;\n const positions: IPosition[] = [];\n\n balanceApi.data[0]?.details.forEach((detail) => {\n if (detail.ccy === 'USDT') {\n const balance = +(detail.cashBal ?? 0);\n const free = Math.min(\n balance, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const equity = +(detail.eq ?? 0) - +(detail.stgyEq ?? 0);\n totalEquity += equity;\n totalFree += free;\n } else {\n const volume = +(detail.cashBal ?? 0);\n const free_volume = Math.min(\n volume, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const closable_price = marketIndexTickerUSDT.get(detail.ccy + '-USDT') || 0;\n const delta_equity = volume * closable_price || 0;\n const delta_profit = +detail.totalPnl || 0;\n\n const product_id = encodePath('SPOT', `${detail.ccy}-USDT`);\n positions.push({\n position_id: product_id,\n datasource_id: 'OKX',\n product_id: product_id,\n direction: 'LONG',\n volume: volume,\n free_volume: free_volume,\n position_price: +detail.accAvgPx,\n floating_profit: delta_profit,\n closable_price: closable_price,\n valuation: delta_equity,\n });\n\n totalEquity += delta_equity;\n }\n });\n positionsApi.data.forEach((x) => {\n const direction =\n x.posSide === 'long' ? 'LONG' : x.posSide === 'short' ? 'SHORT' : +x.pos > 0 ? 'LONG' : 'SHORT';\n const volume = Math.abs(+x.pos);\n const product_id = encodePath(x.instType, x.instId);\n const closable_price = +x.last;\n const valuation =\n (mapProductIdToProduct.get(product_id)?.value_scale ?? 1) * volume * closable_price || 0;\n\n positions.push({\n position_id: x.posId,\n datasource_id: 'OKX',\n product_id,\n direction,\n volume: volume,\n free_volume: +x.availPos,\n closable_price,\n position_price: +x.avgPx,\n floating_profit: +x.upl,\n valuation,\n });\n });\n return {\n money: {\n currency: 'USDT',\n equity: totalEquity,\n free: totalFree,\n },\n positions: positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n}).subscribe();\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n\n const fundingAccountId = `okx/${uid}/funding/USDT`;\n\n provideAccountInfoService(\n terminal,\n fundingAccountId,\n async () => {\n const [assetBalances, marketIndexTickerUSDT] = await Promise.all([\n client.getAssetBalances({}),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n const positions: IPosition[] = [];\n let equity = 0;\n let free = 0;\n\n assetBalances.data.forEach((x) => {\n if (x.ccy === 'USDT') {\n const balance = +x.bal;\n equity += balance;\n free += balance;\n return;\n }\n\n const price = marketIndexTickerUSDT.get(`${x.ccy}-USDT`) || 0;\n const valuation = price * +x.bal || 0;\n const productId = encodePath('SPOT', `${x.ccy}-USDT`);\n\n positions.push({\n datasource_id: 'OKX',\n position_id: productId,\n product_id: productId,\n direction: 'LONG',\n volume: +x.bal,\n free_volume: +x.bal,\n position_price: price,\n floating_profit: 0,\n closable_price: price,\n valuation,\n });\n\n equity += valuation;\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}).subscribe();\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const earningAccountId = `okx/${uid}/earning/USDT`;\n provideAccountInfoService(\n terminal,\n earningAccountId,\n async () => {\n const offers = await client.getFinanceSavingsBalance({});\n const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 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: 5000 },\n );\n}).subscribe();\n"]}
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { defer, filter, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';\nimport {\n getAccountConfig,\n getAccountBalance,\n getAccountPositions,\n getAssetBalances,\n getFinanceSavingsBalance,\n getSubAccountList,\n getDefaultCredential,\n getTradeOrdersPending,\n} from './api';\nimport { productService } from './product';\nimport { getMarketIndexTicker } from './public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nexport const accountConfig$ = defer(() => getAccountConfig(credential)).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nconst subAccountUids$ = defer(() => getSubAccountList(credential)).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nexport const accountUid$ = accountConfig$.pipe(\n map((x) => x.data[0].uid),\n filter((x) => !!x),\n shareReplay(1),\n);\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const account_id = `okx/${uid}/trading`;\n providePendingOrdersService(\n terminal,\n account_id,\n async () => {\n const orders = await getTradeOrdersPending(credential, {});\n return orders.data.map((x) => {\n const order_type = x.ordType === 'market' ? 'MARKET' : x.ordType === 'limit' ? 'LIMIT' : 'UNKNOWN';\n\n const order_direction =\n x.side === 'buy'\n ? x.posSide === 'long'\n ? 'OPEN_LONG'\n : 'CLOSE_SHORT'\n : x.posSide === 'short'\n ? 'OPEN_SHORT'\n : 'CLOSE_LONG';\n return {\n order_id: x.ordId,\n account_id,\n product_id: encodePath(x.instType, x.instId),\n submit_at: +x.cTime,\n filled_at: +x.fillTime,\n order_type,\n order_direction,\n volume: +x.sz,\n traded_volume: +x.accFillSz,\n price: +x.px,\n traded_price: +x.avgPx,\n };\n });\n },\n { auto_refresh_interval: 5000 },\n );\n}).subscribe();\n\nconst marketIndexTickerUSDT$ = defer(() => getMarketIndexTicker({ quoteCcy: 'USDT' })).pipe(\n map((x) => {\n const mapInstIdToPrice = new Map<string, number>();\n x.data.forEach((inst) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));\n return mapInstIdToPrice;\n }),\n repeat({ delay: 1000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\nexport const tradingAccountId$ = accountUid$.pipe(\n map((uid) => `okx/${uid}/trading`),\n shareReplay(1),\n);\n\ndefer(async () => {\n const tradingAccountId = await firstValueFrom(tradingAccountId$);\n addAccountMarket(terminal, { account_id: tradingAccountId, market_id: 'OKX' });\n\n provideAccountInfoService(\n terminal,\n tradingAccountId,\n async () => {\n const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([\n getAccountPositions(credential, {}),\n getAccountBalance(credential, {}),\n firstValueFrom(productService.mapProductIdToProduct$),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n let totalEquity = 0;\n let totalFree = 0;\n const positions: IPosition[] = [];\n\n balanceApi.data[0]?.details.forEach((detail) => {\n if (detail.ccy === 'USDT') {\n const balance = +(detail.cashBal ?? 0);\n const free = Math.min(\n balance, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const equity = +(detail.eq ?? 0) - +(detail.stgyEq ?? 0);\n totalEquity += equity;\n totalFree += free;\n } else {\n const volume = +(detail.cashBal ?? 0);\n const free_volume = Math.min(\n volume, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const closable_price = marketIndexTickerUSDT.get(detail.ccy + '-USDT') || 0;\n const delta_equity = volume * closable_price || 0;\n const delta_profit = +detail.totalPnl || 0;\n\n const product_id = encodePath('SPOT', `${detail.ccy}-USDT`);\n positions.push({\n position_id: product_id,\n datasource_id: 'OKX',\n product_id: product_id,\n direction: 'LONG',\n volume: volume,\n free_volume: free_volume,\n position_price: +detail.accAvgPx,\n floating_profit: delta_profit,\n closable_price: closable_price,\n valuation: delta_equity,\n });\n\n totalEquity += delta_equity;\n }\n });\n positionsApi.data.forEach((x) => {\n const direction =\n x.posSide === 'long' ? 'LONG' : x.posSide === 'short' ? 'SHORT' : +x.pos > 0 ? 'LONG' : 'SHORT';\n const volume = Math.abs(+x.pos);\n const product_id = encodePath(x.instType, x.instId);\n const closable_price = +x.last;\n const valuation =\n (mapProductIdToProduct.get(product_id)?.value_scale ?? 1) * volume * closable_price || 0;\n\n positions.push({\n position_id: x.posId,\n datasource_id: 'OKX',\n product_id,\n direction,\n volume: volume,\n free_volume: +x.availPos,\n closable_price,\n position_price: +x.avgPx,\n floating_profit: +x.upl,\n valuation,\n });\n });\n return {\n money: {\n currency: 'USDT',\n equity: totalEquity,\n free: totalFree,\n },\n positions: positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n}).subscribe();\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n\n const fundingAccountId = `okx/${uid}/funding/USDT`;\n\n provideAccountInfoService(\n terminal,\n fundingAccountId,\n async () => {\n const [assetBalances, marketIndexTickerUSDT] = await Promise.all([\n getAssetBalances(credential, {}),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n const positions: IPosition[] = [];\n let equity = 0;\n let free = 0;\n\n assetBalances.data.forEach((x) => {\n if (x.ccy === 'USDT') {\n const balance = +x.bal;\n equity += balance;\n free += balance;\n return;\n }\n\n const price = marketIndexTickerUSDT.get(`${x.ccy}-USDT`) || 0;\n const valuation = price * +x.bal || 0;\n const productId = encodePath('SPOT', `${x.ccy}-USDT`);\n\n positions.push({\n datasource_id: 'OKX',\n position_id: productId,\n product_id: productId,\n direction: 'LONG',\n volume: +x.bal,\n free_volume: +x.bal,\n position_price: price,\n floating_profit: 0,\n closable_price: price,\n valuation,\n });\n\n equity += valuation;\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}).subscribe();\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const earningAccountId = `okx/${uid}/earning/USDT`;\n provideAccountInfoService(\n terminal,\n earningAccountId,\n async () => {\n const offers = await getFinanceSavingsBalance(credential, {});\n const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 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: 5000 },\n );\n}).subscribe();\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-service.d.ts","sourceRoot":"","sources":["../src/api-service.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const protocol_1 = require("@yuants/protocol");
|
|
4
|
+
const public_api_1 = require("./public-api");
|
|
5
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
6
|
+
terminal.server.provideService('OKX/PositionTiers', {
|
|
7
|
+
required: ['instType', 'tdMode'],
|
|
8
|
+
properties: {
|
|
9
|
+
instType: { type: 'string' },
|
|
10
|
+
tdMode: { type: 'string' },
|
|
11
|
+
instFamily: { type: 'string' },
|
|
12
|
+
instId: { type: 'string' },
|
|
13
|
+
uly: { type: 'string' },
|
|
14
|
+
ccy: { type: 'string' },
|
|
15
|
+
tier: { type: 'string' },
|
|
16
|
+
},
|
|
17
|
+
}, async (msg) => {
|
|
18
|
+
const data = await (0, public_api_1.getPositionTiers)(msg.req);
|
|
19
|
+
return {
|
|
20
|
+
res: {
|
|
21
|
+
code: 0,
|
|
22
|
+
message: 'OK',
|
|
23
|
+
data,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}, {
|
|
27
|
+
concurrent: 1,
|
|
28
|
+
egress_token_capacity: 10,
|
|
29
|
+
egress_token_refill_interval: 2100,
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=api-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-service.js","sourceRoot":"","sources":["../src/api-service.ts"],"names":[],"mappings":";;AAAA,+CAA4C;AAC5C,6CAAgD;AAEhD,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAY5B,mBAAmB,EACnB;IACE,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAChC,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzB;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAgB,EAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI;SACL;KACF,CAAC;AACJ,CAAC,EACD;IACE,UAAU,EAAE,CAAC;IACb,qBAAqB,EAAE,EAAE;IACzB,4BAA4B,EAAE,IAAI;CACnC,CACF,CAAC","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { getPositionTiers } from './public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nterminal.server.provideService<\n {\n instType: string;\n tdMode: string;\n instFamily?: string;\n instId?: string;\n uly?: string;\n ccy?: string;\n tier?: string;\n },\n Awaited<ReturnType<typeof getPositionTiers>>\n>(\n 'OKX/PositionTiers',\n {\n required: ['instType', 'tdMode'],\n properties: {\n instType: { type: 'string' },\n tdMode: { type: 'string' },\n instFamily: { type: 'string' },\n instId: { type: 'string' },\n uly: { type: 'string' },\n ccy: { type: 'string' },\n tier: { type: 'string' },\n },\n },\n async (msg) => {\n const data = await getPositionTiers(msg.req);\n return {\n res: {\n code: 0,\n message: 'OK',\n data,\n },\n };\n },\n {\n concurrent: 1,\n egress_token_capacity: 10,\n egress_token_refill_interval: 2100,\n },\n);\n"]}
|