@yuants/vendor-huobi 0.14.6 → 0.15.1

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.
Files changed (163) hide show
  1. package/dist/__archived/account-info.js +45 -0
  2. package/dist/__archived/account-info.js.map +1 -0
  3. package/dist/__archived/api.js +51 -0
  4. package/dist/__archived/api.js.map +1 -0
  5. package/dist/__archived/transfer.js +285 -0
  6. package/dist/__archived/transfer.js.map +1 -0
  7. package/dist/index.js +3 -51
  8. package/dist/index.js.map +1 -1
  9. package/dist/{accounts → services/accounts}/spot.js +7 -4
  10. package/dist/services/accounts/spot.js.map +1 -0
  11. package/dist/{accounts → services/accounts}/super-margin.js +2 -2
  12. package/dist/services/accounts/super-margin.js.map +1 -0
  13. package/dist/services/accounts/swap.js +37 -0
  14. package/dist/services/accounts/swap.js.map +1 -0
  15. package/dist/services/exchange.js +75 -0
  16. package/dist/services/exchange.js.map +1 -0
  17. package/dist/services/market-data/interest_rate.js +63 -0
  18. package/dist/services/market-data/interest_rate.js.map +1 -0
  19. package/dist/{quote.js → services/market-data/quote.js} +9 -9
  20. package/dist/services/market-data/quote.js.map +1 -0
  21. package/dist/services/orders/listOrders.js +44 -0
  22. package/dist/services/orders/listOrders.js.map +1 -0
  23. package/dist/{orders → services/orders}/submitOrder.js +9 -8
  24. package/dist/services/orders/submitOrder.js.map +1 -0
  25. package/dist/{product.js → services/product.js} +16 -12
  26. package/dist/services/product.js.map +1 -0
  27. package/dist/{uid.js → services/uid.js} +1 -15
  28. package/dist/services/uid.js.map +1 -0
  29. package/lib/__archived/account-info.d.ts +1 -0
  30. package/lib/__archived/account-info.d.ts.map +1 -0
  31. package/lib/__archived/account-info.js +45 -0
  32. package/lib/__archived/account-info.js.map +1 -0
  33. package/lib/__archived/api.d.ts +1 -0
  34. package/lib/__archived/api.d.ts.map +1 -0
  35. package/lib/__archived/api.js +51 -0
  36. package/lib/__archived/api.js.map +1 -0
  37. package/lib/__archived/transfer.d.ts +1 -0
  38. package/lib/__archived/transfer.d.ts.map +1 -0
  39. package/lib/__archived/transfer.js +285 -0
  40. package/lib/__archived/transfer.js.map +1 -0
  41. package/lib/index.d.ts +3 -4
  42. package/lib/index.d.ts.map +1 -1
  43. package/lib/index.js +3 -51
  44. package/lib/index.js.map +1 -1
  45. package/lib/{accounts → services/accounts}/spot.d.ts +1 -1
  46. package/lib/services/accounts/spot.d.ts.map +1 -0
  47. package/lib/{accounts → services/accounts}/spot.js +7 -4
  48. package/lib/services/accounts/spot.js.map +1 -0
  49. package/lib/{accounts → services/accounts}/super-margin.d.ts +1 -1
  50. package/lib/services/accounts/super-margin.d.ts.map +1 -0
  51. package/lib/{accounts → services/accounts}/super-margin.js +2 -2
  52. package/lib/services/accounts/super-margin.js.map +1 -0
  53. package/lib/services/accounts/swap.d.ts +4 -0
  54. package/lib/services/accounts/swap.d.ts.map +1 -0
  55. package/lib/services/accounts/swap.js +41 -0
  56. package/lib/services/accounts/swap.js.map +1 -0
  57. package/lib/services/exchange.d.ts +2 -0
  58. package/lib/services/exchange.d.ts.map +1 -0
  59. package/lib/services/exchange.js +77 -0
  60. package/lib/services/exchange.js.map +1 -0
  61. package/lib/services/market-data/interest_rate.d.ts.map +1 -0
  62. package/lib/{interest_rate.js → services/market-data/interest_rate.js} +34 -30
  63. package/lib/services/market-data/interest_rate.js.map +1 -0
  64. package/lib/services/market-data/quote.d.ts.map +1 -0
  65. package/lib/{quote.js → services/market-data/quote.js} +9 -9
  66. package/lib/services/market-data/quote.js.map +1 -0
  67. package/lib/services/orders/listOrders.d.ts +4 -0
  68. package/lib/services/orders/listOrders.d.ts.map +1 -0
  69. package/lib/services/orders/listOrders.js +48 -0
  70. package/lib/services/orders/listOrders.js.map +1 -0
  71. package/lib/{orders → services/orders}/submitOrder.d.ts +1 -1
  72. package/lib/services/orders/submitOrder.d.ts.map +1 -0
  73. package/lib/{orders → services/orders}/submitOrder.js +7 -6
  74. package/lib/services/orders/submitOrder.js.map +1 -0
  75. package/lib/services/product.d.ts +4 -0
  76. package/lib/services/product.d.ts.map +1 -0
  77. package/lib/{product.js → services/product.js} +18 -13
  78. package/lib/services/product.js.map +1 -0
  79. package/lib/{uid.d.ts → services/uid.d.ts} +0 -5
  80. package/lib/services/uid.d.ts.map +1 -0
  81. package/lib/{uid.js → services/uid.js} +2 -17
  82. package/lib/services/uid.js.map +1 -0
  83. package/package.json +15 -15
  84. package/temp/package-deps.json +31 -33
  85. package/dist/account-actions-with-credentials.js +0 -30
  86. package/dist/account-actions-with-credentials.js.map +0 -1
  87. package/dist/account-info.js +0 -75
  88. package/dist/account-info.js.map +0 -1
  89. package/dist/accounts/list.js +0 -8
  90. package/dist/accounts/list.js.map +0 -1
  91. package/dist/accounts/spot.js.map +0 -1
  92. package/dist/accounts/super-margin.js.map +0 -1
  93. package/dist/accounts/swap.js +0 -80
  94. package/dist/accounts/swap.js.map +0 -1
  95. package/dist/api.js +0 -34
  96. package/dist/api.js.map +0 -1
  97. package/dist/cli.js +0 -3
  98. package/dist/cli.js.map +0 -1
  99. package/dist/interest_rate.js +0 -59
  100. package/dist/interest_rate.js.map +0 -1
  101. package/dist/order-actions-with-credentials.js +0 -15
  102. package/dist/order-actions-with-credentials.js.map +0 -1
  103. package/dist/order-actions.js +0 -17
  104. package/dist/order-actions.js.map +0 -1
  105. package/dist/orders/submitOrder.js.map +0 -1
  106. package/dist/product.js.map +0 -1
  107. package/dist/quote.js.map +0 -1
  108. package/dist/transfer.js +0 -248
  109. package/dist/transfer.js.map +0 -1
  110. package/dist/uid.js.map +0 -1
  111. package/lib/account-actions-with-credentials.d.ts +0 -2
  112. package/lib/account-actions-with-credentials.d.ts.map +0 -1
  113. package/lib/account-actions-with-credentials.js +0 -32
  114. package/lib/account-actions-with-credentials.js.map +0 -1
  115. package/lib/account-info.d.ts +0 -35
  116. package/lib/account-info.d.ts.map +0 -1
  117. package/lib/account-info.js +0 -83
  118. package/lib/account-info.js.map +0 -1
  119. package/lib/accounts/list.d.ts +0 -4
  120. package/lib/accounts/list.d.ts.map +0 -1
  121. package/lib/accounts/list.js +0 -12
  122. package/lib/accounts/list.js.map +0 -1
  123. package/lib/accounts/spot.d.ts.map +0 -1
  124. package/lib/accounts/spot.js.map +0 -1
  125. package/lib/accounts/super-margin.d.ts.map +0 -1
  126. package/lib/accounts/super-margin.js.map +0 -1
  127. package/lib/accounts/swap.d.ts +0 -4
  128. package/lib/accounts/swap.d.ts.map +0 -1
  129. package/lib/accounts/swap.js +0 -84
  130. package/lib/accounts/swap.js.map +0 -1
  131. package/lib/api.d.ts +0 -15
  132. package/lib/api.d.ts.map +0 -1
  133. package/lib/api.js +0 -41
  134. package/lib/api.js.map +0 -1
  135. package/lib/cli.d.ts +0 -3
  136. package/lib/cli.d.ts.map +0 -1
  137. package/lib/cli.js +0 -5
  138. package/lib/cli.js.map +0 -1
  139. package/lib/interest_rate.d.ts.map +0 -1
  140. package/lib/interest_rate.js.map +0 -1
  141. package/lib/order-actions-with-credentials.d.ts +0 -2
  142. package/lib/order-actions-with-credentials.d.ts.map +0 -1
  143. package/lib/order-actions-with-credentials.js +0 -17
  144. package/lib/order-actions-with-credentials.js.map +0 -1
  145. package/lib/order-actions.d.ts +0 -7
  146. package/lib/order-actions.d.ts.map +0 -1
  147. package/lib/order-actions.js +0 -21
  148. package/lib/order-actions.js.map +0 -1
  149. package/lib/orders/submitOrder.d.ts.map +0 -1
  150. package/lib/orders/submitOrder.js.map +0 -1
  151. package/lib/product.d.ts +0 -3
  152. package/lib/product.d.ts.map +0 -1
  153. package/lib/product.js.map +0 -1
  154. package/lib/quote.d.ts.map +0 -1
  155. package/lib/quote.js.map +0 -1
  156. package/lib/transfer.d.ts +0 -19
  157. package/lib/transfer.d.ts.map +0 -1
  158. package/lib/transfer.js +0 -255
  159. package/lib/transfer.js.map +0 -1
  160. package/lib/uid.d.ts.map +0 -1
  161. package/lib/uid.js.map +0 -1
  162. /package/lib/{interest_rate.d.ts → services/market-data/interest_rate.d.ts} +0 -0
  163. /package/lib/{quote.d.ts → services/market-data/quote.d.ts} +0 -0
@@ -1,45 +1,43 @@
1
1
  {
2
- "apps/vendor-huobi/CHANGELOG.json": "7984ce5f70e9e350e77b23d1d6f7780f719f81c8",
3
- "apps/vendor-huobi/CHANGELOG.md": "0b55f47b5328af406851ae9ae4c73444b96674e3",
2
+ "apps/vendor-huobi/CHANGELOG.json": "3daec0cf0fd40c844762016b64d25d5928c46867",
3
+ "apps/vendor-huobi/CHANGELOG.md": "82c02c887f6b04c96fb4557d7babddd1c9890f43",
4
4
  "apps/vendor-huobi/README.md": "d7bf0149513114eab5500a6b5c9e7cba10565572",
5
5
  "apps/vendor-huobi/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
6
6
  "apps/vendor-huobi/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
7
7
  "apps/vendor-huobi/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
8
8
  "apps/vendor-huobi/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
9
9
  "apps/vendor-huobi/etc/vendor-huobi.api.md": "dc8cbf2a044a227b30a4ee9701b0c97328244724",
10
- "apps/vendor-huobi/package.json": "205eeb7a49b7b5fe7071839e1361ee62c734f436",
11
- "apps/vendor-huobi/src/account-actions-with-credentials.ts": "406799578e60a57d78b90dfb67e3360a53640571",
12
- "apps/vendor-huobi/src/account-info.ts": "fc2189e31000dd05855e659c2f0cf14fc12ffbdd",
13
- "apps/vendor-huobi/src/accounts/list.ts": "25e82ca0e49850afba3a1c7c23d67528b20e6ee1",
14
- "apps/vendor-huobi/src/accounts/spot.ts": "8615b7b36c0d5c529f8183f41d1ef2fe6fc22562",
15
- "apps/vendor-huobi/src/accounts/super-margin.ts": "1d3ea2cdd39fa0d75ae7cda7cd0e5690fecc9a0d",
16
- "apps/vendor-huobi/src/accounts/swap.ts": "dd9e364f26684ecb08d439ee3ff12ed969bc0a81",
17
- "apps/vendor-huobi/src/api.ts": "061c8644a01c6e0b4964e4be6f4588e16abd8869",
10
+ "apps/vendor-huobi/package.json": "9786f8a1de6f113a25250ebd95e20738d0c67796",
11
+ "apps/vendor-huobi/src/__archived/account-info.ts": "5c325d3bb8839476c11f25693326ce05f3321ebd",
12
+ "apps/vendor-huobi/src/__archived/api.ts": "8366151dc881b177d0478fb328a601a11e33cd35",
13
+ "apps/vendor-huobi/src/__archived/transfer.ts": "fd299ad82ff31344460967f2a938b8f36c879259",
18
14
  "apps/vendor-huobi/src/api/private-api.ts": "644260e6709841ade74d43b6df6dd3eda42d36d9",
19
15
  "apps/vendor-huobi/src/api/public-api.ts": "03a1468bea318d5fcb8c0c9d45666ffbee4346f0",
20
- "apps/vendor-huobi/src/cli.ts": "9bf6b5559a6c6f33da20e74cc6c5d702c60ec891",
21
- "apps/vendor-huobi/src/index.ts": "57062c6faf9ad60f6b93970d2d7f315439641be5",
22
- "apps/vendor-huobi/src/interest_rate.ts": "2ba38d2c97b91f1b2f9979647dab5d516f6bfa4f",
23
- "apps/vendor-huobi/src/order-actions-with-credentials.ts": "32322c28a4c52b936c98ee51d09905178815cb5e",
24
- "apps/vendor-huobi/src/order-actions.ts": "93a5d294f6674ba433d892d6be2ae6aa5d059420",
25
- "apps/vendor-huobi/src/orders/submitOrder.ts": "f9700de8bbaf97a662313155cb5499c7c92e378a",
26
- "apps/vendor-huobi/src/product.ts": "973c81048708f265ce86fad37d06e4a4044a11b9",
27
- "apps/vendor-huobi/src/quote.ts": "52922569315ce9f72aef8ed5d65157c8800e943d",
28
- "apps/vendor-huobi/src/transfer.ts": "0da0957b0acf820bbc26bfd74776305167f28d35",
29
- "apps/vendor-huobi/src/uid.ts": "a6e778eb401659decc6eaadb8e6390b60a1f7238",
16
+ "apps/vendor-huobi/src/index.ts": "b0fa28ef4e008320564a0ddc789104f398160a0a",
17
+ "apps/vendor-huobi/src/services/accounts/spot.ts": "a1b9e94547112561fa8f8389c03dbf73c51ba21e",
18
+ "apps/vendor-huobi/src/services/accounts/super-margin.ts": "b4fbe80f4d1419a211a03461bbe7c96ad52aa594",
19
+ "apps/vendor-huobi/src/services/accounts/swap.ts": "4da1dbf2cc3554a9943df419c5a11330130a5f3d",
20
+ "apps/vendor-huobi/src/services/exchange.ts": "6fed94206a22c43d3c6890cf52ff054a24d98d82",
21
+ "apps/vendor-huobi/src/services/market-data/interest_rate.ts": "8c737154003cc55568cdc3288004b720082be258",
22
+ "apps/vendor-huobi/src/services/market-data/quote.ts": "d11620707dd195403df11320cccff7f481b4ae9c",
23
+ "apps/vendor-huobi/src/services/orders/listOrders.ts": "1cf4621727fb290f8e5fd1439765fd73387bda7a",
24
+ "apps/vendor-huobi/src/services/orders/submitOrder.ts": "e79925ede5f4a7dc856f5662ebe9dfb3b9dc8a01",
25
+ "apps/vendor-huobi/src/services/product.ts": "32ee8940524fa250664a05693b373daba4d6fd08",
26
+ "apps/vendor-huobi/src/services/uid.ts": "b71c27a6a0debdd9365dea35306f4763327aca2f",
30
27
  "apps/vendor-huobi/tsconfig.json": "81da8f78196974b5d15da0edb6b2d9f48641063c",
31
- "apps/vendor-huobi/.rush/temp/shrinkwrap-deps.json": "9cfeff02d2b4838478ed6afd825f89806d4c2b57",
32
- "libraries/protocol/temp/package-deps.json": "00d9a96a90bfc0e57ef3b9547151f2970a600402",
33
- "libraries/data-account/temp/package-deps.json": "bf8b41c4d878dab0f39ea684fffaf6bc3c74c988",
34
- "libraries/data-order/temp/package-deps.json": "4a0272551da88c9eb52150775640b12c31786de8",
35
- "libraries/transfer/temp/package-deps.json": "93c56bf224a26133b0ef6bb8efa294fec3efbc55",
36
- "libraries/utils/temp/package-deps.json": "4a683c07df7c75079b700111b9f6beb36c74ff7d",
37
- "libraries/cache/temp/package-deps.json": "70044bb56d863988aa90d8dcea9e3919bf65d38f",
38
- "libraries/sql/temp/package-deps.json": "d227fb17cbb9f6e3b445a3b88e0d9978f5c1c823",
39
- "libraries/data-product/temp/package-deps.json": "c9a00b88e1570374aeb333756f59975d7dcc7400",
40
- "libraries/data-series/temp/package-deps.json": "28ff94f0aeb81e62c78b686e6da9ec2a4a327855",
41
- "libraries/data-interest-rate/temp/package-deps.json": "ea6718a7984f99121aeb4b5613d304fd2243787e",
42
- "libraries/data-quote/temp/package-deps.json": "2e78640ce117ae07bba4895ac82ea35501a60501",
43
- "libraries/extension/temp/package-deps.json": "96f8e94be2cbcfe210f7324dfc45b04a4f93d80b",
28
+ "apps/vendor-huobi/.rush/temp/shrinkwrap-deps.json": "3099afcf246e8bc9ff02db11dd7b34b8bd1e72d9",
29
+ "libraries/protocol/temp/package-deps.json": "14095036ed251977cb3fb362a7e23d8786aaa4c9",
30
+ "libraries/data-account/temp/package-deps.json": "eb3d9ccad211a998fef9e0230e164407bf1b95fc",
31
+ "libraries/data-order/temp/package-deps.json": "cf5b85fc4c5160f51023f7fbdc68a7ed9db5573a",
32
+ "libraries/transfer/temp/package-deps.json": "0be7967706065779def1ef1e7f68a9794690599a",
33
+ "libraries/utils/temp/package-deps.json": "6d58e9b325e8d16de8a878c32010f626b12a01da",
34
+ "libraries/cache/temp/package-deps.json": "a4afa15e6462983f9d3735d31dc1ed8a683fb4dc",
35
+ "libraries/sql/temp/package-deps.json": "95cd7209bf6002d530eb37960bac77c793afadd0",
36
+ "libraries/data-product/temp/package-deps.json": "60b8abf6f95edc29268f10f0d64331e2f034a3e5",
37
+ "libraries/data-series/temp/package-deps.json": "d70ec6d1ca7342204a35a1c3619481e226239e73",
38
+ "libraries/data-interest-rate/temp/package-deps.json": "92396227ed3aab2f407bf93c515cf340ac796932",
39
+ "libraries/data-quote/temp/package-deps.json": "5a46a556f6eb8f2c682b092ee4703207e226ea8a",
40
+ "libraries/exchange/temp/package-deps.json": "68091305dec4ea0dc245f4314f1d474a2c3247d8",
41
+ "libraries/extension/temp/package-deps.json": "9569c553c2f9a7d50b70d8f101fc2d3825aaccb9",
44
42
  "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
45
43
  }
@@ -1,30 +0,0 @@
1
- import { provideAccountActionsWithCredential } from '@yuants/data-account';
2
- import { Terminal } from '@yuants/protocol';
3
- import { listAccounts } from './accounts/list';
4
- import { getSpotAccountInfo } from './accounts/spot';
5
- import { getSuperMarginAccountInfo } from './accounts/super-margin';
6
- import { getSwapAccountInfo } from './accounts/swap';
7
- import { getAccountIds } from './uid';
8
- provideAccountActionsWithCredential(Terminal.fromNodeEnv(), 'HTX', {
9
- type: 'object',
10
- required: ['access_key', 'secret_key'],
11
- properties: {
12
- access_key: { type: 'string' },
13
- secret_key: { type: 'string' },
14
- },
15
- }, {
16
- listAccounts: listAccounts,
17
- getAccountInfo: async (credential, account_id) => {
18
- const accounts = await getAccountIds(JSON.stringify(credential));
19
- switch (account_id) {
20
- case accounts.spot:
21
- return getSpotAccountInfo(credential, account_id);
22
- case accounts.superMargin:
23
- return getSuperMarginAccountInfo(credential, account_id);
24
- case accounts.swap:
25
- return getSwapAccountInfo(credential, account_id);
26
- }
27
- throw new Error(`Unsupported account_id: ${account_id}`);
28
- },
29
- });
30
- //# sourceMappingURL=account-actions-with-credentials.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"account-actions-with-credentials.js","sourceRoot":"","sources":["../src/account-actions-with-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,mCAAmC,CACjC,QAAQ,CAAC,WAAW,EAAE,EACtB,KAAK,EACL;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACtC,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD;IACE,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACjE,QAAQ,UAAU,EAAE;YAClB,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACpD,KAAK,QAAQ,CAAC,WAAW;gBACvB,OAAO,yBAAyB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC3D,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SACrD;QACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;CACF,CACF,CAAC","sourcesContent":["import { provideAccountActionsWithCredential } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { listAccounts } from './accounts/list';\nimport { getSpotAccountInfo } from './accounts/spot';\nimport { getSuperMarginAccountInfo } from './accounts/super-margin';\nimport { getSwapAccountInfo } from './accounts/swap';\nimport { getAccountIds } from './uid';\n\nprovideAccountActionsWithCredential(\n Terminal.fromNodeEnv(),\n 'HTX',\n {\n type: 'object',\n required: ['access_key', 'secret_key'],\n properties: {\n access_key: { type: 'string' },\n secret_key: { type: 'string' },\n },\n },\n {\n listAccounts: listAccounts,\n getAccountInfo: async (credential, account_id) => {\n const accounts = await getAccountIds(JSON.stringify(credential));\n switch (account_id) {\n case accounts.spot:\n return getSpotAccountInfo(credential, account_id);\n case accounts.superMargin:\n return getSuperMarginAccountInfo(credential, account_id);\n case accounts.swap:\n return getSwapAccountInfo(credential, account_id);\n }\n throw new Error(`Unsupported account_id: ${account_id}`);\n },\n },\n);\n"]}
@@ -1,75 +0,0 @@
1
- import { provideAccountInfoService } from '@yuants/data-account';
2
- import { formatTime } from '@yuants/utils';
3
- import { defer, distinct, filter, from, map, mergeMap, repeat, retry, shareReplay, tap, toArray } from 'rxjs';
4
- import { getSpotAccountInfo } from './accounts/spot';
5
- import { getSuperMarginAccountInfo } from './accounts/super-margin';
6
- import { getSwapAccountInfo } from './accounts/swap';
7
- import { client } from './api';
8
- import { getSpotAccountBalance } from './api/private-api';
9
- /**
10
- * 提供 SWAP 账户信息服务
11
- */
12
- export const provideSwapAccountInfoService = (terminal, accountId, credential) => {
13
- provideAccountInfoService(terminal, accountId, async () => getSwapAccountInfo(credential, accountId), {
14
- auto_refresh_interval: 1000,
15
- });
16
- };
17
- /**
18
- * 获取超级保证金账户余额流
19
- */
20
- export const getSuperMarginAccountBalance$ = (credential, superMarginAccountUid) => {
21
- return defer(() => getSpotAccountBalance(credential, superMarginAccountUid)).pipe(
22
- //
23
- map((res) => res.data), repeat({ delay: 1000 }), tap({
24
- error: (e) => {
25
- console.error(formatTime(Date.now()), 'unifiedRaw', e);
26
- },
27
- }), retry({ delay: 5000 }), shareReplay(1));
28
- };
29
- /**
30
- * 设置超级保证金账户的 WebSocket 订阅
31
- */
32
- export const setupSuperMarginWebSocketSubscriptions = (superMarginAccountBalance$, subscriptions) => {
33
- from(client.spot_ws.connection$).subscribe(() => {
34
- subscriptions.clear();
35
- });
36
- // subscribe the symbols of positions we held
37
- superMarginAccountBalance$
38
- .pipe(
39
- //
40
- 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)))))
41
- .subscribe((v) => {
42
- const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));
43
- const toSubscribe = [...v].filter((x) => !subscriptions.has(x));
44
- for (const symbol of toUnsubscribe) {
45
- client.spot_ws.output$.next({
46
- unsub: `market.${symbol}usdt.ticker`,
47
- });
48
- subscriptions.delete(symbol);
49
- }
50
- for (const symbol of toSubscribe) {
51
- client.spot_ws.output$.next({
52
- sub: `market.${symbol}usdt.ticker`,
53
- });
54
- subscriptions.add(symbol);
55
- }
56
- });
57
- };
58
- /**
59
- * 提供超级保证金账户信息服务
60
- */
61
- export const provideSuperMarginAccountInfoService = (terminal, accountId, credential, superMarginAccountUid, subscriptions) => {
62
- const superMarginAccountBalance$ = getSuperMarginAccountBalance$(credential, superMarginAccountUid);
63
- setupSuperMarginWebSocketSubscriptions(superMarginAccountBalance$, subscriptions);
64
- provideAccountInfoService(terminal, accountId, async () => getSuperMarginAccountInfo(credential, accountId), { auto_refresh_interval: 1000 });
65
- return superMarginAccountBalance$;
66
- };
67
- /**
68
- * 提供 SPOT 账户信息服务
69
- */
70
- export const provideSpotAccountInfoService = (terminal, accountId, credential) => {
71
- provideAccountInfoService(terminal, accountId, async () => getSpotAccountInfo(credential, accountId), {
72
- auto_refresh_interval: 1000,
73
- });
74
- };
75
- //# sourceMappingURL=account-info.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"account-info.js","sourceRoot":"","sources":["../src/account-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport { defer, distinct, filter, from, map, mergeMap, repeat, retry, shareReplay, tap, toArray } from 'rxjs';\nimport { getSpotAccountInfo } from './accounts/spot';\nimport { getSuperMarginAccountInfo } from './accounts/super-margin';\nimport { getSwapAccountInfo } from './accounts/swap';\nimport { client } from './api';\nimport { getSpotAccountBalance, ICredential } from './api/private-api';\n\n/**\n * 提供 SWAP 账户信息服务\n */\nexport const provideSwapAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n) => {\n provideAccountInfoService(terminal, accountId, async () => getSwapAccountInfo(credential, accountId), {\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 () => getSuperMarginAccountInfo(credential, accountId),\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) => {\n provideAccountInfoService(terminal, accountId, async () => getSpotAccountInfo(credential, accountId), {\n auto_refresh_interval: 1000,\n });\n};\n"]}
@@ -1,8 +0,0 @@
1
- import { getAccountIds } from '../uid';
2
- export const listAccounts = async (credential) => {
3
- const accounts = await getAccountIds(JSON.stringify(credential));
4
- if (!accounts)
5
- throw new Error('Failed to get Account IDs');
6
- return [{ account_id: accounts.spot }, { account_id: accounts.superMargin }, { account_id: accounts.swap }];
7
- };
8
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/accounts/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,CAAC,MAAM,YAAY,GAA8C,KAAK,EAAE,UAAU,EAAE,EAAE;IAC1F,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE5D,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9G,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfListAccounts } from '@yuants/data-account';\nimport { ICredential } from '../api/private-api';\nimport { getAccountIds } from '../uid';\n\nexport const listAccounts: IActionHandlerOfListAccounts<ICredential> = async (credential) => {\n const accounts = await getAccountIds(JSON.stringify(credential));\n if (!accounts) throw new Error('Failed to get Account IDs');\n\n return [{ account_id: accounts.spot }, { account_id: accounts.superMargin }, { account_id: accounts.swap }];\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spot.js","sourceRoot":"","sources":["../../src/accounts/spot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAe,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;IAClG,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE5E,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;;QACrC,OAAO,gBAAgB,CAAC;YACtB,WAAW,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE;YAC5B,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,OAAO;YACrC,MAAM,EAAE,CAAC,CAAC,MAAA,CAAC,CAAC,OAAO,mCAAI,CAAC,CAAC;YACzB,WAAW,EAAE,CAAC,CAAC,MAAA,CAAC,CAAC,OAAO,mCAAI,CAAC,CAAC;YAC9B,cAAc,EAAE,CAAC,EAAE,iBAAiB;SACrC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, makeSpotPosition } from '@yuants/data-account';\nimport { getSpotAccountBalance, ICredential } from '../api/private-api';\nimport { spotAccountUidCache } from '../uid';\n\nexport const getSpotAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const spotAccountUid = await spotAccountUidCache.query(JSON.stringify(credential));\n if (!spotAccountUid) throw new Error('Failed to get Spot Account UID');\n const spotBalance = await getSpotAccountBalance(credential, spotAccountUid);\n\n return spotBalance.data.list.map((v) => {\n return makeSpotPosition({\n position_id: `${v.currency}`,\n datasource_id: 'HTX',\n product_id: `SPOT/${v.currency}-USDT`,\n volume: +(v.balance ?? 0),\n free_volume: +(v.balance ?? 0),\n closable_price: 1, // TODO: 获取现货币对价格\n });\n });\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"super-margin.js","sourceRoot":"","sources":["../../src/accounts/super-margin.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IActionHandlerOfGetAccountInfo, IPosition } from '@yuants/data-account';\nimport { formatTime } from '@yuants/utils';\nimport { getSpotAccountBalance, ICredential } from '../api/private-api';\nimport { getSpotTick } from '../api/public-api';\nimport { superMarginAccountUidCache } from '../uid';\n\nconst spotTickCache = createCache((currency) => getSpotTick({ symbol: `${currency}usdt` }), {\n expire: 300_000, // 5 minutes\n swrAfter: 10_000, // 10 seconds\n});\n\n/**\n * 全仓杠杆账户 (Super Margin Account)\n */\nexport const getSuperMarginAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n // get account balance\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Failed to get Super Margin Account UID');\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\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 const tickerRes = await spotTickCache.query(currencyData.currency);\n const price = tickerRes?.tick.close || 0;\n try {\n // get current price from websocket or fallback to REST API\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 return positions;\n};\n"]}
@@ -1,80 +0,0 @@
1
- import { firstValueFrom } from 'rxjs';
2
- import { getSwapCrossPositionInfo, getUnifiedAccountInfo } from '../api/private-api';
3
- import { swapProductService } from '../product';
4
- export const getSwapAccountInfo = async (credential) => {
5
- // balance
6
- const balance = await getUnifiedAccountInfo(credential);
7
- if (!balance.data) {
8
- throw new Error('Failed to get unified account info');
9
- }
10
- const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');
11
- if (!balanceData) {
12
- throw new Error('No USDT balance found in unified account');
13
- }
14
- const equity = balanceData.margin_balance;
15
- const free = balanceData.withdraw_available;
16
- // positions
17
- const positionsRes = await getSwapCrossPositionInfo(credential);
18
- const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);
19
- const positions = (positionsRes.data || []).map((v) => {
20
- const product_id = v.contract_code;
21
- const theProduct = mapProductIdToPerpetualProduct === null || mapProductIdToPerpetualProduct === void 0 ? void 0 : mapProductIdToPerpetualProduct.get(product_id);
22
- const valuation = v.volume * v.last_price * ((theProduct === null || theProduct === void 0 ? void 0 : theProduct.value_scale) || 1);
23
- return {
24
- position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,
25
- datasource_id: 'HUOBI-SWAP',
26
- product_id,
27
- direction: v.direction === 'buy' ? 'LONG' : 'SHORT',
28
- volume: v.volume,
29
- free_volume: v.available,
30
- position_price: v.cost_hold,
31
- closable_price: v.last_price,
32
- floating_profit: v.profit_unreal,
33
- valuation,
34
- };
35
- });
36
- // orders
37
- // const orders: IOrder[] = [];
38
- // let page_index = 1;
39
- // const page_size = 50;
40
- // while (true) {
41
- // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });
42
- // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {
43
- // break;
44
- // }
45
- // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {
46
- // return {
47
- // order_id: v.order_id_str,
48
- // account_id: SWAP_ACCOUNT_ID,
49
- // product_id: v.contract_code,
50
- // order_type: ['lightning'].includes(v.order_price_type)
51
- // ? 'MARKET'
52
- // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(
53
- // v.order_price_type,
54
- // )
55
- // ? 'LIMIT'
56
- // : ['fok'].includes(v.order_price_type)
57
- // ? 'FOK'
58
- // : v.order_price_type.includes('ioc')
59
- // ? 'IOC'
60
- // : 'STOP', // unreachable code
61
- // order_direction:
62
- // v.direction === 'open'
63
- // ? v.offset === 'buy'
64
- // ? 'OPEN_LONG'
65
- // : 'OPEN_SHORT'
66
- // : v.offset === 'buy'
67
- // ? 'CLOSE_SHORT'
68
- // : 'CLOSE_LONG',
69
- // volume: v.volume,
70
- // submit_at: v.created_at,
71
- // price: v.price,
72
- // traded_volume: v.trade_volume,
73
- // };
74
- // });
75
- // orders.push(...pageOrders);
76
- // page_index++;
77
- // }
78
- return positions;
79
- };
80
- //# sourceMappingURL=swap.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/accounts/swap.ts"],"names":[],"mappings":"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","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition } from '@yuants/data-account';\nimport { firstValueFrom } from 'rxjs';\nimport { getSwapCrossPositionInfo, getUnifiedAccountInfo, ICredential } from '../api/private-api';\nimport { swapProductService } from '../product';\n\nexport const getSwapAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\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 positions;\n};\n"]}
package/dist/api.js DELETED
@@ -1,34 +0,0 @@
1
- import { createConnectionWs } from '@yuants/protocol';
2
- import { Subject, filter, from, map, share, tap } from 'rxjs';
3
- import zlib from 'zlib';
4
- const createConnectionGzipWS = (URL) => {
5
- const conn = createConnectionWs(URL);
6
- const input$ = from(conn.input$).pipe(map((msg) => zlib.gunzipSync(msg)), map((msg) => msg.toString()), map((msg) => JSON.parse(msg)), share());
7
- const output$ = new Subject();
8
- output$.pipe(map((msg) => JSON.stringify(msg))).subscribe(conn.output$);
9
- return Object.assign(Object.assign({}, conn), { input$: input$, output$: output$ });
10
- };
11
- export class HuobiClient {
12
- constructor(params) {
13
- this.params = params;
14
- // https://www.htx.com/zh-cn/opend/newApiPages/?id=510
15
- this.swap_api_root = 'api.hbdm.com';
16
- // https://www.htx.com/zh-cn/opend/newApiPages/?id=404
17
- this.spot_api_root = 'api.huobi.pro';
18
- this.spot_ws = createConnectionGzipWS(`wss://${this.spot_api_root}/ws`);
19
- from(this.spot_ws.input$)
20
- .pipe(
21
- //
22
- filter((v) => v.ping), tap((v) => {
23
- this.spot_ws.output$.next({ pong: v.ping });
24
- }))
25
- .subscribe();
26
- }
27
- }
28
- export const client = new HuobiClient({
29
- auth: {
30
- access_key: process.env.ACCESS_KEY,
31
- secret_key: process.env.SECRET_KEY,
32
- },
33
- });
34
- //# sourceMappingURL=api.js.map
package/dist/api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC9D,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,sBAAsB,GAAG,CAAU,GAAW,EAAkB,EAAE;IACtE,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACnC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAClC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAC5B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAC7B,KAAK,EAAE,CACR,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAO,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,uCACK,IAAI,KACP,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,IAChB;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,WAAW;IAQtB,YAAmB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;QAPvC,sDAAsD;QACtD,kBAAa,GAAG,cAAc,CAAC;QAC/B,sDAAsD;QACtD,kBAAa,GAAG,eAAe,CAAC;QAK9B,IAAI,CAAC,OAAO,GAAG,sBAAsB,CAAC,SAAS,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;aACtB,IAAI;QACH,EAAE;QACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACR,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CACH;aACA,SAAS,EAAE,CAAC;IACjB,CAAC;CAGF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;IACpC,IAAI,EAAE;QACJ,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAW;QACnC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAW;KACpC;CACF,CAAC,CAAC","sourcesContent":["import { IConnection, createConnectionWs } from '@yuants/protocol';\nimport { Subject, filter, from, map, share, tap } from 'rxjs';\nimport zlib from 'zlib';\nimport { ICredential } from './api/private-api';\n\ninterface IHuobiParams {\n auth: ICredential;\n}\n\nconst createConnectionGzipWS = <T = any>(URL: string): IConnection<T> => {\n const conn = createConnectionWs(URL);\n const input$ = from(conn.input$).pipe(\n map((msg) => zlib.gunzipSync(msg)),\n map((msg) => msg.toString()),\n map((msg) => JSON.parse(msg)),\n share(),\n );\n\n const output$ = new Subject<any>();\n output$.pipe(map((msg) => JSON.stringify(msg))).subscribe(conn.output$);\n return {\n ...conn,\n input$: input$,\n output$: output$,\n };\n};\n\nexport class HuobiClient {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=510\n swap_api_root = 'api.hbdm.com';\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=404\n spot_api_root = 'api.huobi.pro';\n\n spot_ws: IConnection<any>;\n\n constructor(public params: IHuobiParams) {\n this.spot_ws = createConnectionGzipWS(`wss://${this.spot_api_root}/ws`);\n from(this.spot_ws.input$)\n .pipe(\n //\n filter((v) => v.ping),\n tap((v) => {\n this.spot_ws.output$.next({ pong: v.ping });\n }),\n )\n .subscribe();\n }\n\n // swap_ws = new WebSocket(new URL(`wss://${this.swap_api_root}/linear-swap-ws`));\n}\n\nexport const client = new HuobiClient({\n auth: {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n },\n});\n"]}
package/dist/cli.js DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import './index';
3
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,CAAC","sourcesContent":["#!/usr/bin/env node\nimport './index';\n"]}
@@ -1,59 +0,0 @@
1
- var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
2
- var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
3
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
4
- var g = generator.apply(thisArg, _arguments || []), i, q = [];
5
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
6
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
7
- function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
8
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
9
- function fulfill(value) { resume("next", value); }
10
- function reject(value) { resume("throw", value); }
11
- function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
12
- };
13
- import { createSeriesProvider } from '@yuants/data-series';
14
- import { Terminal } from '@yuants/protocol';
15
- import { decodePath, formatTime } from '@yuants/utils';
16
- import { firstValueFrom, timer } from 'rxjs';
17
- import { getSwapHistoricalFundingRate } from './api/public-api';
18
- createSeriesProvider(Terminal.fromNodeEnv(), {
19
- tableName: 'interest_rate',
20
- series_id_prefix_parts: ['HUOBI-SWAP'],
21
- reversed: true,
22
- serviceOptions: { concurrent: 10 },
23
- queryFn: function ({ series_id, started_at }) {
24
- return __asyncGenerator(this, arguments, function* () {
25
- const [datasource_id, product_id] = decodePath(series_id);
26
- let current_page = 0;
27
- let total_page = 1;
28
- while (true) {
29
- // 向前翻页,时间降序
30
- const res = yield __await(getSwapHistoricalFundingRate({
31
- contract_code: product_id,
32
- page_index: current_page,
33
- }));
34
- if (res.status !== 'ok') {
35
- throw `API failed: ${res.status}`;
36
- }
37
- if (res.data.data.length === 0)
38
- break;
39
- yield yield __await(res.data.data.map((v) => ({
40
- series_id,
41
- datasource_id,
42
- product_id,
43
- created_at: formatTime(+v.funding_time),
44
- long_rate: `${-v.funding_rate}`,
45
- short_rate: `${v.funding_rate}`,
46
- settlement_price: '',
47
- })));
48
- total_page = res.data.total_page;
49
- current_page++;
50
- if (current_page >= total_page)
51
- break;
52
- if (+res.data.data[res.data.data.length - 1].funding_time <= started_at)
53
- break;
54
- yield __await(firstValueFrom(timer(1000)));
55
- }
56
- });
57
- },
58
- });
59
- //# sourceMappingURL=interest_rate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../src/interest_rate.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE,oBAAoB,CAAgB,QAAQ,CAAC,WAAW,EAAE,EAAE;IAC1D,SAAS,EAAE,eAAe;IAC1B,sBAAsB,EAAE,CAAC,YAAY,CAAC;IACtC,QAAQ,EAAE,IAAI;IACd,cAAc,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IAClC,OAAO,EAAE,UAAiB,EAAE,SAAS,EAAE,UAAU,EAAE;;YACjD,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAE1D,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,OAAO,IAAI,EAAE;gBACX,YAAY;gBACZ,MAAM,GAAG,GAAG,cAAM,4BAA4B,CAAC;oBAC7C,aAAa,EAAE,UAAU;oBACzB,UAAU,EAAE,YAAY;iBACzB,CAAC,CAAA,CAAC;gBACH,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE;oBACvB,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,CAAC;iBACnC;gBACD,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM;gBACtC,oBAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACrB,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC;oBACrB,SAAS;oBACT,aAAa;oBACb,UAAU;oBACV,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;oBACvC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE;oBAC/B,UAAU,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE;oBAC/B,gBAAgB,EAAE,EAAE;iBACrB,CAAC,CACH,CAAA,CAAC;gBACF,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;gBACjC,YAAY,EAAE,CAAC;gBACf,IAAI,YAAY,IAAI,UAAU;oBAAE,MAAM;gBACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,UAAU;oBAAE,MAAM;gBAC/E,cAAM,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA,CAAC;aACnC;QACH,CAAC;KAAA;CACF,CAAC,CAAC","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, timer } from 'rxjs';\nimport { getSwapHistoricalFundingRate } from './api/public-api';\n\ncreateSeriesProvider<IInterestRate>(Terminal.fromNodeEnv(), {\n tableName: 'interest_rate',\n series_id_prefix_parts: ['HUOBI-SWAP'],\n reversed: true,\n serviceOptions: { concurrent: 10 },\n queryFn: async function* ({ series_id, started_at }) {\n const [datasource_id, product_id] = decodePath(series_id);\n\n let current_page = 0;\n let total_page = 1;\n while (true) {\n // 向前翻页,时间降序\n const res = await getSwapHistoricalFundingRate({\n contract_code: product_id,\n page_index: current_page,\n });\n if (res.status !== 'ok') {\n throw `API failed: ${res.status}`;\n }\n if (res.data.data.length === 0) break;\n yield res.data.data.map(\n (v): IInterestRate => ({\n series_id,\n datasource_id,\n product_id,\n created_at: formatTime(+v.funding_time),\n long_rate: `${-v.funding_rate}`,\n short_rate: `${v.funding_rate}`,\n settlement_price: '',\n }),\n );\n total_page = res.data.total_page;\n current_page++;\n if (current_page >= total_page) break;\n if (+res.data.data[res.data.data.length - 1].funding_time <= started_at) break;\n await firstValueFrom(timer(1000));\n }\n },\n});\n"]}
@@ -1,15 +0,0 @@
1
- import { provideOrderActionsWithCredential } from '@yuants/data-order';
2
- import { Terminal } from '@yuants/protocol';
3
- import { submitOrder } from './orders/submitOrder';
4
- const terminal = Terminal.fromNodeEnv();
5
- provideOrderActionsWithCredential(terminal, 'HTX', {
6
- type: 'object',
7
- required: ['access_key', 'secret_key'],
8
- properties: {
9
- access_key: { type: 'string' },
10
- secret_key: { type: 'string' },
11
- },
12
- }, {
13
- submitOrder,
14
- });
15
- //# sourceMappingURL=order-actions-with-credentials.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"order-actions-with-credentials.js","sourceRoot":"","sources":["../src/order-actions-with-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,iCAAiC,CAC/B,QAAQ,EACR,KAAK,EACL;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACtC,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD;IACE,WAAW;CACZ,CACF,CAAC","sourcesContent":["import { provideOrderActionsWithCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { submitOrder } from './orders/submitOrder';\n\nconst terminal = Terminal.fromNodeEnv();\n\nprovideOrderActionsWithCredential(\n terminal,\n 'HTX',\n {\n type: 'object',\n required: ['access_key', 'secret_key'],\n properties: {\n access_key: { type: 'string' },\n secret_key: { type: 'string' },\n },\n },\n {\n submitOrder,\n },\n);\n"]}
@@ -1,17 +0,0 @@
1
- import { submitOrder } from './orders/submitOrder';
2
- /**
3
- * 提供订单提交服务
4
- */
5
- export const provideOrderSubmitService = (terminal, swapAccountId, superMarginAccountId, credential) => {
6
- terminal.server.provideService('SubmitOrder', {
7
- required: ['account_id'],
8
- properties: {
9
- account_id: {
10
- enum: [superMarginAccountId, swapAccountId],
11
- },
12
- },
13
- }, async (msg) => {
14
- return { res: { code: 0, message: 'OK', data: await submitOrder(credential, msg.req) } };
15
- });
16
- };
17
- //# sourceMappingURL=order-actions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"order-actions.js","sourceRoot":"","sources":["../src/order-actions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAAkB,EAClB,aAAqB,EACrB,oBAA4B,EAC5B,UAAuB,EACvB,EAAE;IACF,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,aAAa,EACb;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,CAAC,oBAAoB,EAAE,aAAa,CAAC;aAC5C;SACF;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC3F,CAAC,CACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { ICredential } from './api/private-api';\nimport { submitOrder } from './orders/submitOrder';\n\n/**\n * 提供订单提交服务\n */\nexport const provideOrderSubmitService = (\n terminal: Terminal,\n swapAccountId: string,\n superMarginAccountId: string,\n credential: ICredential,\n) => {\n terminal.server.provideService<IOrder, { order_id: string }>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: {\n enum: [superMarginAccountId, swapAccountId],\n },\n },\n },\n async (msg) => {\n return { res: { code: 0, message: 'OK', data: await submitOrder(credential, msg.req) } };\n },\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"submitOrder.js","sourceRoot":"","sources":["../../src/orders/submitOrder.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ICredential,\n getCrossMarginLoanInfo,\n getSpotAccountBalance,\n getSwapCrossPositionInfo,\n postSpotOrder,\n postSwapOrder,\n} from '../api/private-api';\nimport { getSpotTick } from '../api/public-api';\nimport { spotProductService } from '../product';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 处理 swap 账户订单提交\n */\nasync function handleSwapOrder(order: IOrder, credential: ICredential): Promise<{ order_id: string }> {\n // 获取仓位信息\n const positionInfo = await getSwapCrossPositionInfo(credential);\n const mapContractCodeToRate = Object.fromEntries(\n positionInfo.data.map((v) => [v.contract_code, v.lever_rate]),\n );\n\n const lever_rate = mapContractCodeToRate[order.product_id] ?? 20;\n const params = {\n contract_code: order.product_id,\n contract_type: 'swap',\n price: order.price,\n volume: order.volume,\n offset:\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'OPEN_SHORT' ? 'open' : 'close',\n direction:\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT' ? 'buy' : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: order.order_type === 'MARKET' ? 'market' : 'limit',\n };\n\n const result = await postSwapOrder(credential, params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(result), JSON.stringify(params));\n\n if (result.status !== 'ok') {\n throw new Error(`Failed to submit swap order: status=${result.status}`);\n }\n return { order_id: result.data.order_id_str };\n}\n\n/**\n * 处理 super-margin 账户订单提交\n */\nasync function handleSuperMarginOrder(order: IOrder, credential: ICredential): Promise<{ order_id: string }> {\n // 获取可贷款金额\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Super margin account UID not found');\n const loanInfo = await getCrossMarginLoanInfo(credential);\n const usdtLoanable = loanInfo.data.find((v) => v.currency === 'usdt');\n if (!usdtLoanable) throw new Error('USDT loanable amount not found');\n const loanable = +usdtLoanable['loanable-amt'];\n\n // 获取账户余额, 产品信息和价格\n const [balanceRes, mapProductIdToProduct, priceRes] = await Promise.all([\n getSpotAccountBalance(credential, superMarginAccountUid),\n firstValueFrom(spotProductService.mapProductIdToProduct$),\n getSpotTick({ symbol: order.product_id }),\n ]);\n\n const balance = balanceRes.data.list\n .filter((v) => v.currency === 'usdt' && v.type === 'trade')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n if (!mapProductIdToProduct) throw new Error('Product map not found');\n\n const theProduct = mapProductIdToProduct.get(order.product_id);\n const price = priceRes.tick.close;\n const borrow_amount =\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, order.volume * price - balance), 0)\n : undefined;\n\n const params = {\n symbol: order.product_id,\n 'account-id': '' + superMarginAccountUid,\n amount:\n '' +\n (order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? roundToStep(order.volume * price, theProduct?.volume_step!)\n : order.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT' ? 'buy' : 'sell'\n }-${'LIMIT' === order.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: order.order_type === 'MARKET' ? undefined : '' + order.price,\n source: 'super-margin-api',\n };\n\n const result = await postSpotOrder(credential, params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(result), JSON.stringify(params));\n\n if (result.success === false) {\n throw new Error(`Failed to submit super margin order: code=${result.code} message=${result.message}`);\n }\n\n return { order_id: result.data.orderId.toString() };\n}\n\nexport const submitOrder = (credential: ICredential, order: IOrder): Promise<{ order_id: string }> => {\n if (order.account_id.includes('swap')) {\n return handleSwapOrder(order, credential);\n }\n if (order.account_id.includes('super-margin')) {\n return handleSuperMarginOrder(order, credential);\n }\n throw new Error(`Unsupported account_id for order submission: ${order.account_id}`);\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct, IQueryProductsRequest, provideQueryProductsService } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { getPerpetualContractSymbols, getSwapCrossLadderMargin, getSpotSymbols } from './api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n// Provide QueryProducts service for swap products\nexport const swapProductService = provideQueryProductsService(\n terminal,\n 'HUOBI-SWAP',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n const products: IProduct[] = [];\n\n // Get perpetual contract products and cross leverage data in parallel\n const [swapSymbols, crossLeverage] = await Promise.all([\n getPerpetualContractSymbols(),\n getSwapCrossLadderMargin(),\n ]);\n\n for (const symbol of swapSymbols?.data || []) {\n if (symbol.contract_status !== 1) continue; // Only include active contracts\n\n const maxLeverage = crossLeverage?.data\n .find((x) => x.contract_code === symbol.contract_code)\n ?.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);\n\n products.push({\n datasource_id: 'HUOBI-SWAP',\n product_id: symbol.contract_code,\n base_currency: symbol.symbol,\n quote_currency: 'USDT',\n value_scale: symbol.contract_size,\n price_step: symbol.price_tick,\n volume_step: 1,\n name: '',\n value_scale_unit: '',\n margin_rate: 1 / (maxLeverage || 1),\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: true,\n market_id: 'HUOBI/SWAP',\n no_interest_rate: false,\n });\n }\n\n return products;\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n\n// Provide QueryProducts service for spot products\nexport const spotProductService = provideQueryProductsService(\n terminal,\n 'HUOBI-SPOT',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n const products: IProduct[] = [];\n\n // Get spot products\n const spotSymbols = await getSpotSymbols();\n\n for (const symbol of spotSymbols?.data || []) {\n if (symbol.state !== 'online') continue; // Only include online symbols\n\n products.push({\n datasource_id: 'HUOBI-SPOT',\n product_id: symbol.sc,\n base_currency: symbol.bc,\n quote_currency: symbol.qc,\n value_scale: 1,\n price_step: 1 / 10 ** symbol.tpp,\n volume_step: 1 / 10 ** symbol.tap,\n name: '',\n value_scale_unit: '',\n margin_rate: 1,\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: false,\n market_id: 'HUOBI/SPOT',\n no_interest_rate: true,\n });\n }\n\n return products;\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n"]}
package/dist/quote.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, from, groupBy, map, merge, mergeMap, repeat, retry, scan, shareReplay, toArray } from 'rxjs';\nimport {\n getSwapBatchFundingRate,\n getSwapMarketBbo,\n getSwapMarketTrade,\n getSwapOpenInterest,\n} from './api/public-api';\n\nconst swapBboTick$ = defer(() => getSwapMarketBbo({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote1$ = swapBboTick$.pipe(\n mergeMap((res) => res.ticks || []),\n map((tick): Partial<IQuote> => {\n const [ask_price = '', ask_volume = ''] = tick.ask || [];\n const [bid_price = '', bid_volume = ''] = tick.bid || [];\n return {\n datasource_id: 'HUOBI-SWAP',\n product_id: tick.contract_code,\n ask_price: `${ask_price}`,\n bid_price: `${bid_price}`,\n ask_volume: `${ask_volume}`,\n bid_volume: `${bid_volume}`,\n };\n }),\n);\n\nconst mapSwapContractCodeToBboTick$ = defer(() => swapBboTick$).pipe(\n mergeMap((res) =>\n from(res.ticks).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapTradeTick$ = defer(() => getSwapMarketTrade({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote2$ = swapTradeTick$.pipe(\n mergeMap((res) => res.tick?.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HUOBI-SWAP',\n product_id: tick.contract_code,\n last_price: `${tick.price}`,\n }),\n ),\n);\n\nconst mapSwapContractCodeToTradeTick$ = defer(() => swapTradeTick$).pipe(\n mergeMap((res) =>\n from(res.tick.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\nconst swapFundingRateTick$ = defer(() => getSwapBatchFundingRate({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote3$ = swapFundingRateTick$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HUOBI-SWAP',\n product_id: tick.contract_code,\n interest_rate_long: `${-tick.funding_rate}`,\n interest_rate_short: `${tick.funding_rate}`,\n interest_rate_next_settled_at: formatTime(+tick.funding_time),\n }),\n ),\n);\n\nconst mapSwapContractCodeToFundingRateTick$ = defer(() => swapFundingRateTick$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapOpenInterest$ = defer(() => getSwapOpenInterest({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote4$ = swapOpenInterest$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HUOBI-SWAP',\n product_id: tick.contract_code,\n open_interest: `${tick.volume}`,\n }),\n ),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n // 合并不同来源的数据并进行合并,避免死锁\n merge(quote1$, quote2$, quote3$, quote4$)\n .pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>));\n }),\n )\n .pipe(\n writeToSQL({\n terminal: Terminal.fromNodeEnv(),\n tableName: 'quote',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nconst mapSwapContractCodeToOpenInterest$ = defer(() => swapOpenInterest$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\n// provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {\n// return defer(async () => {\n// const products = await firstValueFrom(perpetualContractProducts$);\n// const theProduct = products.find((x) => x.product_id === product_id);\n// if (!theProduct) throw `No Found ProductID ${product_id}`;\n\n// return [\n// of(theProduct),\n// mapSwapContractCodeToBboTick$,\n// mapSwapContractCodeToTradeTick$,\n// mapSwapContractCodeToFundingRateTick$,\n// mapSwapContractCodeToOpenInterest$,\n// ] as const;\n// }).pipe(\n// catchError(() => EMPTY),\n// mergeMap((x) =>\n// combineLatest(x).pipe(\n// map(([theProduct, bboTick, tradeTick, fundingRateTick, openInterest]): ITick => {\n// return {\n// datasource_id: 'HUOBI-SWAP',\n// product_id,\n// updated_at: Date.now(),\n// settlement_scheduled_at: +fundingRateTick[product_id].funding_time,\n// price: +tradeTick[product_id].price,\n// ask: bboTick[product_id].ask?.[0] ?? undefined,\n// bid: bboTick[product_id].bid?.[0] ?? undefined,\n// volume: +tradeTick[product_id].amount,\n// interest_rate_for_long: -+fundingRateTick[product_id].funding_rate,\n// interest_rate_for_short: +fundingRateTick[product_id].funding_rate,\n// open_interest: +openInterest[product_id]?.volume,\n// };\n// }),\n// ),\n// ),\n// );\n// });\n"]}