ccxt 4.3.18 → 4.3.19

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 (168) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/ccxt.js +6 -1
  3. package/dist/cjs/src/abstract/woofipro.js +9 -0
  4. package/dist/cjs/src/ascendex.js +3 -4
  5. package/dist/cjs/src/base/Exchange.js +42 -2
  6. package/dist/cjs/src/base/functions/crypto.js +10 -3
  7. package/dist/cjs/src/base/functions/encode.js +6 -3
  8. package/dist/cjs/src/base/functions/number.js +8 -5
  9. package/dist/cjs/src/base/functions/rsa.js +5 -5
  10. package/dist/cjs/src/bigone.js +1 -1
  11. package/dist/cjs/src/bitfinex.js +25 -1
  12. package/dist/cjs/src/bitfinex2.js +59 -51
  13. package/dist/cjs/src/bitget.js +1 -5
  14. package/dist/cjs/src/bitmart.js +3 -3
  15. package/dist/cjs/src/bitstamp.js +1 -3
  16. package/dist/cjs/src/bybit.js +1 -0
  17. package/dist/cjs/src/coinex.js +321 -537
  18. package/dist/cjs/src/coinlist.js +1 -2
  19. package/dist/cjs/src/deribit.js +1 -1
  20. package/dist/cjs/src/hollaex.js +3 -3
  21. package/dist/cjs/src/indodax.js +1 -1
  22. package/dist/cjs/src/latoken.js +1 -1
  23. package/dist/cjs/src/mexc.js +1 -1
  24. package/dist/cjs/src/novadax.js +0 -1
  25. package/dist/cjs/src/okx.js +17 -0
  26. package/dist/cjs/src/poloniex.js +1 -2
  27. package/dist/cjs/src/pro/bitget.js +136 -192
  28. package/dist/cjs/src/pro/coinbaseinternational.js +9 -1
  29. package/dist/cjs/src/pro/okx.js +85 -0
  30. package/dist/cjs/src/pro/woofipro.js +1263 -0
  31. package/dist/cjs/src/wavesexchange.js +2 -2
  32. package/dist/cjs/src/woo.js +17 -3
  33. package/dist/cjs/src/woofipro.js +2698 -0
  34. package/js/ccxt.d.ts +8 -2
  35. package/js/ccxt.js +6 -2
  36. package/js/src/abstract/bybit.d.ts +1 -0
  37. package/js/src/abstract/okx.d.ts +1 -0
  38. package/js/src/abstract/woofipro.d.ts +122 -0
  39. package/js/src/abstract/woofipro.js +11 -0
  40. package/js/src/ace.d.ts +2 -2
  41. package/js/src/ascendex.d.ts +5 -15
  42. package/js/src/ascendex.js +3 -4
  43. package/js/src/base/Exchange.d.ts +26 -17
  44. package/js/src/base/Exchange.js +42 -2
  45. package/js/src/base/functions/crypto.d.ts +1 -1
  46. package/js/src/base/functions/crypto.js +10 -3
  47. package/js/src/base/functions/encode.d.ts +1 -1
  48. package/js/src/base/functions/encode.js +6 -3
  49. package/js/src/base/functions/number.d.ts +1 -1
  50. package/js/src/base/functions/number.js +8 -5
  51. package/js/src/base/functions/rsa.js +6 -6
  52. package/js/src/base/types.d.ts +4 -0
  53. package/js/src/bigone.d.ts +4 -14
  54. package/js/src/bigone.js +1 -1
  55. package/js/src/binance.d.ts +13 -71
  56. package/js/src/binancecoinm.d.ts +2 -22
  57. package/js/src/binanceusdm.d.ts +2 -22
  58. package/js/src/bingx.d.ts +4 -14
  59. package/js/src/bit2c.d.ts +2 -2
  60. package/js/src/bitbank.d.ts +2 -2
  61. package/js/src/bitbns.d.ts +2 -2
  62. package/js/src/bitfinex.d.ts +6 -16
  63. package/js/src/bitfinex.js +25 -1
  64. package/js/src/bitfinex2.d.ts +6 -16
  65. package/js/src/bitfinex2.js +59 -51
  66. package/js/src/bitflyer.d.ts +2 -2
  67. package/js/src/bitget.d.ts +7 -17
  68. package/js/src/bitget.js +1 -5
  69. package/js/src/bithumb.d.ts +3 -3
  70. package/js/src/bitmart.d.ts +5 -14
  71. package/js/src/bitmart.js +3 -3
  72. package/js/src/bitmex.d.ts +4 -4
  73. package/js/src/bitopro.d.ts +2 -2
  74. package/js/src/bitrue.d.ts +5 -5
  75. package/js/src/bitso.d.ts +2 -2
  76. package/js/src/bitstamp.d.ts +3 -3
  77. package/js/src/bitstamp.js +1 -3
  78. package/js/src/bitteam.d.ts +2 -2
  79. package/js/src/bitvavo.d.ts +5 -5
  80. package/js/src/bl3p.d.ts +2 -2
  81. package/js/src/blockchaincom.d.ts +2 -2
  82. package/js/src/blofin.d.ts +4 -14
  83. package/js/src/btcalpha.d.ts +2 -2
  84. package/js/src/btcbox.d.ts +2 -2
  85. package/js/src/btcmarkets.d.ts +2 -2
  86. package/js/src/btcturk.d.ts +2 -2
  87. package/js/src/bybit.d.ts +8 -56
  88. package/js/src/bybit.js +1 -0
  89. package/js/src/cex.d.ts +2 -2
  90. package/js/src/coinbase.d.ts +4 -4
  91. package/js/src/coinbasepro.d.ts +3 -3
  92. package/js/src/coincheck.d.ts +2 -2
  93. package/js/src/coinex.d.ts +6 -16
  94. package/js/src/coinex.js +321 -537
  95. package/js/src/coinlist.d.ts +5 -15
  96. package/js/src/coinlist.js +1 -2
  97. package/js/src/coinmate.d.ts +2 -2
  98. package/js/src/coinmetro.d.ts +3 -3
  99. package/js/src/coinone.d.ts +2 -2
  100. package/js/src/coinsph.d.ts +2 -2
  101. package/js/src/coinspot.d.ts +2 -2
  102. package/js/src/cryptocom.d.ts +2 -2
  103. package/js/src/currencycom.d.ts +3 -3
  104. package/js/src/delta.d.ts +5 -43
  105. package/js/src/deribit.d.ts +7 -55
  106. package/js/src/deribit.js +1 -1
  107. package/js/src/digifinex.d.ts +5 -15
  108. package/js/src/exmo.d.ts +2 -2
  109. package/js/src/gate.d.ts +6 -54
  110. package/js/src/gemini.d.ts +2 -2
  111. package/js/src/hitbtc.d.ts +4 -14
  112. package/js/src/hollaex.d.ts +3 -3
  113. package/js/src/hollaex.js +3 -3
  114. package/js/src/htx.d.ts +4 -14
  115. package/js/src/huobijp.d.ts +4 -4
  116. package/js/src/hyperliquid.d.ts +1 -1
  117. package/js/src/idex.d.ts +3 -3
  118. package/js/src/independentreserve.d.ts +2 -2
  119. package/js/src/indodax.d.ts +2 -2
  120. package/js/src/indodax.js +1 -1
  121. package/js/src/kraken.d.ts +4 -14
  122. package/js/src/krakenfutures.d.ts +4 -14
  123. package/js/src/kucoin.d.ts +5 -15
  124. package/js/src/kucoinfutures.d.ts +4 -14
  125. package/js/src/kuna.d.ts +2 -2
  126. package/js/src/latoken.d.ts +5 -15
  127. package/js/src/latoken.js +1 -1
  128. package/js/src/lbank.d.ts +2 -2
  129. package/js/src/luno.d.ts +2 -2
  130. package/js/src/lykke.d.ts +2 -2
  131. package/js/src/mercado.d.ts +2 -2
  132. package/js/src/mexc.d.ts +8 -28
  133. package/js/src/mexc.js +1 -1
  134. package/js/src/ndax.d.ts +2 -2
  135. package/js/src/novadax.d.ts +4 -15
  136. package/js/src/novadax.js +0 -1
  137. package/js/src/okcoin.d.ts +4 -14
  138. package/js/src/okx.d.ts +10 -68
  139. package/js/src/okx.js +17 -0
  140. package/js/src/onetrading.d.ts +2 -2
  141. package/js/src/paymium.d.ts +4 -14
  142. package/js/src/phemex.d.ts +5 -15
  143. package/js/src/poloniex.d.ts +3 -13
  144. package/js/src/poloniex.js +1 -2
  145. package/js/src/poloniexfutures.d.ts +2 -2
  146. package/js/src/pro/bitget.js +137 -193
  147. package/js/src/pro/coinbaseinternational.d.ts +3 -3
  148. package/js/src/pro/coinbaseinternational.js +9 -1
  149. package/js/src/pro/okx.d.ts +4 -1
  150. package/js/src/pro/okx.js +85 -0
  151. package/js/src/pro/woofipro.d.ts +47 -0
  152. package/js/src/pro/woofipro.js +1264 -0
  153. package/js/src/probit.d.ts +3 -3
  154. package/js/src/timex.d.ts +2 -2
  155. package/js/src/tokocrypto.d.ts +3 -3
  156. package/js/src/upbit.d.ts +2 -2
  157. package/js/src/wavesexchange.d.ts +3 -3
  158. package/js/src/wavesexchange.js +2 -2
  159. package/js/src/wazirx.d.ts +2 -2
  160. package/js/src/whitebit.d.ts +3 -13
  161. package/js/src/woo.d.ts +7 -17
  162. package/js/src/woo.js +17 -3
  163. package/js/src/woofipro.d.ts +131 -0
  164. package/js/src/woofipro.js +2699 -0
  165. package/js/src/yobit.d.ts +2 -2
  166. package/js/src/zaif.d.ts +2 -2
  167. package/js/src/zonda.d.ts +4 -14
  168. package/package.json +1 -1
@@ -6,7 +6,7 @@
6
6
 
7
7
  // ---------------------------------------------------------------------------
8
8
  import bitgetRest from '../bitget.js';
9
- import { AuthenticationError, BadRequest, ArgumentsRequired, NotSupported, InvalidNonce, ExchangeError, RateLimitExceeded } from '../base/errors.js';
9
+ import { AuthenticationError, BadRequest, ArgumentsRequired, InvalidNonce, ExchangeError, RateLimitExceeded } from '../base/errors.js';
10
10
  import { Precise } from '../base/Precise.js';
11
11
  import { ArrayCache, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp } from '../base/ws/Cache.js';
12
12
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
@@ -975,9 +975,9 @@ export default class bitget extends bitgetRest {
975
975
  await this.loadMarkets();
976
976
  let market = undefined;
977
977
  let marketId = undefined;
978
- const isStop = this.safeBool(params, 'stop', false);
979
- params = this.omit(params, 'stop');
980
- let messageHash = (isStop) ? 'triggerOrder' : 'order';
978
+ let isTrigger = undefined;
979
+ [isTrigger, params] = this.isTriggerOrder(params);
980
+ let messageHash = (isTrigger) ? 'triggerOrder' : 'order';
981
981
  let subscriptionHash = 'order:trades';
982
982
  if (symbol !== undefined) {
983
983
  market = this.market(symbol);
@@ -990,19 +990,16 @@ export default class bitget extends bitgetRest {
990
990
  if ((type === 'spot') && (symbol === undefined)) {
991
991
  throw new ArgumentsRequired(this.id + ' watchOrders requires a symbol argument for ' + type + ' markets.');
992
992
  }
993
- if (isStop && type === 'spot') {
994
- throw new NotSupported(this.id + ' watchOrders does not support stop orders for ' + type + ' markets.');
995
- }
996
993
  let instType = undefined;
997
994
  [instType, params] = this.getInstType(market, params);
998
995
  if (type === 'spot') {
999
996
  subscriptionHash = subscriptionHash + ':' + symbol;
1000
997
  }
1001
- if (isStop) {
998
+ if (isTrigger) {
1002
999
  subscriptionHash = subscriptionHash + ':stop'; // we don't want to re-use the same subscription hash for stop orders
1003
1000
  }
1004
1001
  const instId = (type === 'spot') ? marketId : 'default'; // different from other streams here the 'rest' id is required for spot markets, contract markets require default here
1005
- let channel = isStop ? 'orders-algo' : 'orders';
1002
+ let channel = isTrigger ? 'orders-algo' : 'orders';
1006
1003
  let marginMode = undefined;
1007
1004
  [marginMode, params] = this.handleMarginModeAndParams('watchOrders', params);
1008
1005
  if (marginMode !== undefined) {
@@ -1033,25 +1030,7 @@ export default class bitget extends bitgetRest {
1033
1030
  // "action": "snapshot",
1034
1031
  // "arg": { "instType": "SPOT", "channel": "orders", "instId": "BTCUSDT" },
1035
1032
  // "data": [
1036
- // {
1037
- // "instId": "BTCUSDT",
1038
- // "orderId": "1116512721422422017",
1039
- // "clientOid": "798d1425-d31d-4ada-a51b-ec701e00a1d9",
1040
- // "price": "35000.00",
1041
- // "size": "7.0000",
1042
- // "newSize": "500.0000",
1043
- // "notional": "7.000000",
1044
- // "orderType": "limit",
1045
- // "force": "gtc",
1046
- // "side": "buy",
1047
- // "accBaseVolume": "0.0000",
1048
- // "priceAvg": "0.00",
1049
- // "status": "live",
1050
- // "cTime": "1701923297267",
1051
- // "uTime": "1701923297267",
1052
- // "feeDetail": [],
1053
- // "enterPointSource": "WEB"
1054
- // }
1033
+ // // see all examples in parseWsOrder
1055
1034
  // ],
1056
1035
  // "ts": 1701923297285
1057
1036
  // }
@@ -1062,98 +1041,18 @@ export default class bitget extends bitgetRest {
1062
1041
  // "action": "snapshot",
1063
1042
  // "arg": { "instType": "USDT-FUTURES", "channel": "orders", "instId": "default" },
1064
1043
  // "data": [
1065
- // {
1066
- // "accBaseVolume": "0",
1067
- // "cTime": "1701920553759",
1068
- // "clientOid": "1116501214318198793",
1069
- // "enterPointSource": "WEB",
1070
- // "feeDetail": [{
1071
- // "feeCoin": "USDT",
1072
- // "fee": "-0.162003"
1073
- // }],
1074
- // "force": "gtc",
1075
- // "instId": "BTCUSDT",
1076
- // "leverage": "20",
1077
- // "marginCoin": "USDT",
1078
- // "marginMode": "isolated",
1079
- // "notionalUsd": "105",
1080
- // "orderId": "1116501214293032964",
1081
- // "orderType": "limit",
1082
- // "posMode": "hedge_mode",
1083
- // "posSide": "long",
1084
- // "price": "35000",
1085
- // "reduceOnly": "no",
1086
- // "side": "buy",
1087
- // "size": "0.003",
1088
- // "status": "canceled",
1089
- // "tradeSide": "open",
1090
- // "uTime": "1701920595866"
1091
- // }
1044
+ // // see all examples in parseWsOrder
1092
1045
  // ],
1093
1046
  // "ts": 1701920595879
1094
1047
  // }
1095
1048
  //
1096
- // trigger
1097
- //
1098
- // {
1099
- // "action": "snapshot",
1100
- // "arg": {
1101
- // "instType": "USDT-FUTURES",
1102
- // "channel": "orders-algo",
1103
- // "instId": "default"
1104
- // },
1105
- // "data": [
1106
- // {
1107
- // "instId": "BTCUSDT",
1108
- // "orderId": "1116508960750899201",
1109
- // "clientOid": "1116508960750899200",
1110
- // "triggerPrice": "35000.000000000",
1111
- // "triggerType": "mark_price",
1112
- // "triggerTime": "1701922464373",
1113
- // "planType": "pl",
1114
- // "price": "35000.000000000",
1115
- // "size": "0.001000000",
1116
- // "actualSize": "0.000000000",
1117
- // "orderType": "limit",
1118
- // "side": "buy",
1119
- // "tradeSide": "open",
1120
- // "posSide": "long",
1121
- // "marginCoin": "USDT",
1122
- // "status": "cancelled",
1123
- // "posMode": "hedge_mode",
1124
- // "enterPointSource": "api",
1125
- // "stopSurplusTriggerType": "fill_price",
1126
- // "stopLossTriggerType": "fill_price",
1127
- // "cTime": "1701922400653",
1128
- // "uTime": "1701922464373"
1129
- // }
1130
- // ],
1131
- // "ts": 1701922464417
1132
- // }
1133
- //
1134
1049
  // isolated and cross margin
1135
1050
  //
1136
1051
  // {
1137
1052
  // "action": "snapshot",
1138
1053
  // "arg": { "instType": "MARGIN", "channel": "orders-crossed", "instId": "BTCUSDT" },
1139
1054
  // "data": [
1140
- // {
1141
- // "enterPointSource": "web",
1142
- // "force": "gtc",
1143
- // "orderType": "limit",
1144
- // "price": "35000.000000000",
1145
- // "quoteSize": "10.500000000",
1146
- // "side": "buy",
1147
- // "status": "live",
1148
- // "baseSize": "0.000300000",
1149
- // "cTime": "1701923982427",
1150
- // "clientOid": "4902047879864dc980c4840e9906db4e",
1151
- // "fillPrice": "0.000000000",
1152
- // "baseVolume": "0.000000000",
1153
- // "fillTotalAmount": "0.000000000",
1154
- // "loanType": "auto-loan-and-repay",
1155
- // "orderId": "1116515595178356737"
1156
- // }
1055
+ // // see examples in parseWsOrder
1157
1056
  // ],
1158
1057
  // "ts": 1701923982497
1159
1058
  // }
@@ -1177,8 +1076,9 @@ export default class bitget extends bitgetRest {
1177
1076
  this.orders = new ArrayCacheBySymbolById(limit);
1178
1077
  this.triggerOrders = new ArrayCacheBySymbolById(limit);
1179
1078
  }
1180
- const stored = (channel === 'ordersAlgo') ? this.triggerOrders : this.orders;
1181
- const messageHash = (channel === 'ordersAlgo') ? 'triggerOrder' : 'order';
1079
+ const isTrigger = (channel === 'orders-algo') || (channel === 'ordersAlgo');
1080
+ const stored = isTrigger ? this.triggerOrders : this.orders;
1081
+ const messageHash = isTrigger ? 'triggerOrder' : 'order';
1182
1082
  const marketSymbols = {};
1183
1083
  for (let i = 0; i < data.length; i++) {
1184
1084
  const order = data[i];
@@ -1201,81 +1101,90 @@ export default class bitget extends bitgetRest {
1201
1101
  //
1202
1102
  // spot
1203
1103
  //
1204
- // {
1205
- // "instId": "BTCUSDT",
1206
- // "orderId": "1116512721422422017",
1207
- // "clientOid": "798d1425-d31d-4ada-a51b-ec701e00a1d9",
1208
- // "price": "35000.00",
1209
- // "size": "7.0000",
1210
- // "newSize": "500.0000",
1211
- // "notional": "7.000000",
1212
- // "orderType": "limit",
1213
- // "force": "gtc",
1214
- // "side": "buy",
1215
- // "accBaseVolume": "0.0000",
1216
- // "priceAvg": "0.00",
1217
- // "status": "live",
1218
- // "cTime": "1701923297267",
1219
- // "uTime": "1701923297267",
1220
- // "feeDetail": [],
1221
- // "enterPointSource": "WEB"
1222
- // }
1104
+ // {
1105
+ // instId: 'EOSUSDT',
1106
+ // orderId: '1171779081105780739',
1107
+ // price: '0.81075', // limit price, field not present for market orders
1108
+ // clientOid: 'a2330139-1d04-4d78-98be-07de3cfd1055',
1109
+ // notional: '5.675250', // this is not cost! but notional
1110
+ // newSize: '7.0000', // this is not cost! quanity (for limit order or market sell) or cost (for market buy order)
1111
+ // size: '5.6752', // this is not cost, neither quanity, but notional! this field for "spot" can be ignored at all
1112
+ // // Note: for limit order (even filled) we don't have cost value in response, only in market order
1113
+ // orderType: 'limit', // limit, market
1114
+ // force: 'gtc',
1115
+ // side: 'buy',
1116
+ // accBaseVolume: '0.0000', // in case of 'filled', this would be set (for limit orders, this is the only indicator of the amount filled)
1117
+ // priceAvg: '0.00000', // in case of 'filled', this would be set
1118
+ // status: 'live', // live, filled, partially_filled
1119
+ // cTime: '1715099824215',
1120
+ // uTime: '1715099824215',
1121
+ // feeDetail: [],
1122
+ // enterPointSource: 'API'
1123
+ // #### trigger order has these additional fields: ####
1124
+ // "triggerPrice": "35100",
1125
+ // "price": "35100", // this is same as trigger price
1126
+ // "executePrice": "35123", // this is limit price
1127
+ // "triggerType": "fill_price",
1128
+ // "planType": "amount",
1129
+ // #### in case order had fill: ####
1130
+ // fillPrice: '35123',
1131
+ // tradeId: '1171775539946528779',
1132
+ // baseVolume: '7', // field present in market order
1133
+ // fillTime: '1715098979937',
1134
+ // fillFee: '-0.0069987',
1135
+ // fillFeeCoin: 'BTC',
1136
+ // tradeScope: 'T',
1137
+ // }
1223
1138
  //
1224
1139
  // contract
1225
1140
  //
1226
1141
  // {
1227
- // "accBaseVolume": "0",
1228
- // "cTime": "1701920553759",
1229
- // "clientOid": "1116501214318198793",
1230
- // "enterPointSource": "WEB",
1231
- // "feeDetail": [{
1142
+ // accBaseVolume: '0', // total amount filled during lifetime for order
1143
+ // cTime: '1715065875539',
1144
+ // clientOid: '1171636690041344003',
1145
+ // enterPointSource: 'API',
1146
+ // feeDetail: [ {
1232
1147
  // "feeCoin": "USDT",
1233
1148
  // "fee": "-0.162003"
1234
- // }],
1235
- // "force": "gtc",
1236
- // "instId": "BTCUSDT",
1237
- // "leverage": "20",
1238
- // "marginCoin": "USDT",
1239
- // "marginMode": "isolated",
1240
- // "notionalUsd": "105",
1241
- // "orderId": "1116501214293032964",
1242
- // "orderType": "limit",
1243
- // "posMode": "hedge_mode",
1244
- // "posSide": "long",
1245
- // "price": "35000",
1246
- // "reduceOnly": "no",
1247
- // "side": "buy",
1248
- // "size": "0.003",
1249
- // "status": "canceled",
1250
- // "tradeSide": "open",
1251
- // "uTime": "1701920595866"
1252
- // }
1253
- //
1254
- // trigger
1255
- //
1256
- // {
1257
- // "instId": "BTCUSDT",
1258
- // "orderId": "1116508960750899201",
1259
- // "clientOid": "1116508960750899200",
1260
- // "triggerPrice": "35000.000000000",
1149
+ // } ],
1150
+ // force: 'gtc',
1151
+ // instId: 'SEOSSUSDT',
1152
+ // leverage: '10',
1153
+ // marginCoin: 'USDT',
1154
+ // marginMode: 'crossed',
1155
+ // notionalUsd: '10.4468',
1156
+ // orderId: '1171636690028761089',
1157
+ // orderType: 'market',
1158
+ // posMode: 'hedge_mode', // one_way_mode, hedge_mode
1159
+ // posSide: 'short', // short, long, net
1160
+ // price: '0', // zero for market order
1161
+ // reduceOnly: 'no',
1162
+ // side: 'sell',
1163
+ // size: '13', // this is contracts amount
1164
+ // status: 'live', // live, filled, cancelled
1165
+ // tradeSide: 'open',
1166
+ // uTime: '1715065875539'
1167
+ // #### when filled order is incoming, these additional fields are present too: ###
1168
+ // baseVolume: '9', // amount filled for the incoming update/trade
1169
+ // accBaseVolume: '13', // i.e. 9 has been filled from 13 amount (this value is same as 'size')
1170
+ // fillFee: '-0.0062712',
1171
+ // fillFeeCoin: 'SUSDT',
1172
+ // fillNotionalUsd: '10.452',
1173
+ // fillPrice: '0.804',
1174
+ // fillTime: '1715065875605',
1175
+ // pnl: '0',
1176
+ // priceAvg: '0.804',
1177
+ // tradeId: '1171636690314407937',
1178
+ // tradeScope: 'T',
1179
+ // #### trigger order has these additional fields:
1180
+ // "triggerPrice": "0.800000000",
1181
+ // "price": "0.800000000", // <-- this is same as trigger price, actual limit-price is not present in initial response
1261
1182
  // "triggerType": "mark_price",
1262
- // "triggerTime": "1701922464373",
1183
+ // "triggerTime": "1715082796679",
1263
1184
  // "planType": "pl",
1264
- // "price": "35000.000000000",
1265
- // "size": "0.001000000",
1266
1185
  // "actualSize": "0.000000000",
1267
- // "orderType": "limit",
1268
- // "side": "buy",
1269
- // "tradeSide": "open",
1270
- // "posSide": "long",
1271
- // "marginCoin": "USDT",
1272
- // "status": "cancelled",
1273
- // "posMode": "hedge_mode",
1274
- // "enterPointSource": "api",
1275
1186
  // "stopSurplusTriggerType": "fill_price",
1276
1187
  // "stopLossTriggerType": "fill_price",
1277
- // "cTime": "1701922400653",
1278
- // "uTime": "1701922464373"
1279
1188
  // }
1280
1189
  //
1281
1190
  // isolated and cross margin
@@ -1283,6 +1192,7 @@ export default class bitget extends bitgetRest {
1283
1192
  // {
1284
1193
  // "enterPointSource": "web",
1285
1194
  // "force": "gtc",
1195
+ // "feeDetail": [],
1286
1196
  // "orderType": "limit",
1287
1197
  // "price": "35000.000000000",
1288
1198
  // "quoteSize": "10.500000000",
@@ -1298,6 +1208,8 @@ export default class bitget extends bitgetRest {
1298
1208
  // "orderId": "1116515595178356737"
1299
1209
  // }
1300
1210
  //
1211
+ const isSpot = !('posMode' in order);
1212
+ const isMargin = ('loanType' in order);
1301
1213
  const marketId = this.safeString(order, 'instId');
1302
1214
  market = this.safeMarket(marketId, market);
1303
1215
  const timestamp = this.safeInteger(order, 'cTime');
@@ -1315,24 +1227,54 @@ export default class bitget extends bitgetRest {
1315
1227
  };
1316
1228
  }
1317
1229
  const triggerPrice = this.safeNumber(order, 'triggerPrice');
1318
- const price = this.safeString(order, 'price');
1230
+ const isTriggerOrder = (triggerPrice !== undefined);
1231
+ let price = undefined;
1232
+ if (!isTriggerOrder) {
1233
+ price = this.safeNumber(order, 'price');
1234
+ }
1235
+ else if (isSpot && isTriggerOrder) {
1236
+ // for spot trigger order, limit price is this
1237
+ price = this.safeNumber(order, 'executePrice');
1238
+ }
1319
1239
  const avgPrice = this.omitZero(this.safeString2(order, 'priceAvg', 'fillPrice'));
1320
- let cost = this.safeStringN(order, ['notional', 'notionalUsd', 'quoteSize']);
1321
1240
  const side = this.safeString(order, 'side');
1322
1241
  const type = this.safeString(order, 'orderType');
1323
- if (side === 'buy' && market['spot'] && (type === 'market')) {
1324
- cost = this.safeString(order, 'newSize', cost);
1325
- }
1326
- const filled = this.safeString2(order, 'accBaseVolume', 'baseVolume');
1327
- // if (market['spot'] && (rawStatus !== 'live')) {
1328
- // filled = Precise.stringDiv (cost, avgPrice);
1329
- // }
1330
- let amount = this.safeString(order, 'baseVolume');
1331
- if (!market['spot'] || !(side === 'buy' && type === 'market')) {
1332
- amount = this.safeString(order, 'newSize', amount);
1242
+ const accBaseVolume = this.omitZero(this.safeString(order, 'accBaseVolume'));
1243
+ const newSizeValue = this.omitZero(this.safeString(order, 'newSize'));
1244
+ const isMarketOrder = (type === 'market');
1245
+ const isBuy = (side === 'buy');
1246
+ let totalAmount = undefined;
1247
+ let filledAmount = undefined;
1248
+ let cost = undefined;
1249
+ if (isSpot) {
1250
+ if (isMargin) {
1251
+ filledAmount = this.omitZero(this.safeString(order, 'fillTotalAmount'));
1252
+ totalAmount = this.omitZero(this.safeString(order, 'baseSize')); // for margin trading
1253
+ cost = this.safeString(order, 'quoteSize');
1254
+ }
1255
+ else {
1256
+ filledAmount = this.omitZero(this.safeString2(order, 'accBaseVolume', 'baseVolume'));
1257
+ if (isMarketOrder) {
1258
+ if (isBuy) {
1259
+ totalAmount = accBaseVolume;
1260
+ cost = newSizeValue;
1261
+ }
1262
+ else {
1263
+ totalAmount = newSizeValue;
1264
+ // we don't have cost for market-sell order
1265
+ }
1266
+ }
1267
+ else {
1268
+ totalAmount = this.safeString(order, 'newSize');
1269
+ // we don't have cost for limit order
1270
+ }
1271
+ }
1333
1272
  }
1334
- if (market['swap'] && (amount === undefined)) {
1335
- amount = this.safeString(order, 'size');
1273
+ else {
1274
+ // baseVolume should not be used for "amount" for contracts !
1275
+ filledAmount = this.safeString(order, 'baseVolume');
1276
+ totalAmount = this.safeString(order, 'size');
1277
+ cost = this.safeString(order, 'fillNotionalUsd');
1336
1278
  }
1337
1279
  return this.safeOrder({
1338
1280
  'info': order,
@@ -1347,12 +1289,11 @@ export default class bitget extends bitgetRest {
1347
1289
  'postOnly': undefined,
1348
1290
  'side': side,
1349
1291
  'price': price,
1350
- 'stopPrice': triggerPrice,
1351
1292
  'triggerPrice': triggerPrice,
1352
- 'amount': amount,
1293
+ 'amount': totalAmount,
1353
1294
  'cost': cost,
1354
1295
  'average': avgPrice,
1355
- 'filled': filled,
1296
+ 'filled': filledAmount,
1356
1297
  'remaining': undefined,
1357
1298
  'status': this.parseWsOrderStatus(rawStatus),
1358
1299
  'fee': feeObject,
@@ -1777,6 +1718,9 @@ export default class bitget extends bitgetRest {
1777
1718
  'fill': this.handleMyTrades,
1778
1719
  'orders': this.handleOrder,
1779
1720
  'ordersAlgo': this.handleOrder,
1721
+ 'orders-algo': this.handleOrder,
1722
+ 'orders-crossed': this.handleOrder,
1723
+ 'orders-isolated': this.handleOrder,
1780
1724
  'account': this.handleBalance,
1781
1725
  'positions': this.handlePositions,
1782
1726
  'account-isolated': this.handleBalance,
@@ -1,12 +1,12 @@
1
1
  import coinbaseinternationalRest from '../coinbaseinternational.js';
2
- import { Ticker, Int, Trade, OrderBook, Market, Dict, Strings } from '../base/types.js';
2
+ import { Ticker, Int, Trade, OrderBook, Market, Dict, Strings, FundingRate, FundingRates } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class coinbaseinternational extends coinbaseinternationalRest {
5
5
  describe(): any;
6
6
  subscribe(name: string, symbols?: Strings, params?: {}): Promise<any>;
7
7
  subscribeMultiple(name: string, symbols?: Strings, params?: {}): Promise<any>;
8
- watchFundingRate(symbol: string, params?: {}): Promise<{}>;
9
- watchFundingRates(symbols: string[], params?: {}): Promise<{}>;
8
+ watchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
9
+ watchFundingRates(symbols: string[], params?: {}): Promise<FundingRates>;
10
10
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
11
11
  handleInstrument(client: Client, message: any): void;
12
12
  parseWsInstrument(ticker: Dict, market?: any): Ticker;
@@ -175,7 +175,14 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
175
175
  * @param {object} [params] extra parameters specific to the exchange API endpoint
176
176
  * @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexe by market symbols
177
177
  */
178
- return await this.subscribeMultiple('RISK', symbols, params);
178
+ const fundingRate = await this.subscribeMultiple('RISK', symbols, params);
179
+ const symbol = this.safeString(fundingRate, 'symbol');
180
+ if (this.newUpdates) {
181
+ const result = {};
182
+ result[symbol] = fundingRate;
183
+ return result;
184
+ }
185
+ return this.filterByArray(this.fundingRates, 'symbol', symbols);
179
186
  }
180
187
  async watchTicker(symbol, params = {}) {
181
188
  /**
@@ -591,6 +598,7 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
591
598
  //
592
599
  const channel = this.safeString(message, 'channel');
593
600
  const fundingRate = this.parseFundingRate(message);
601
+ this.fundingRates[fundingRate['symbol']] = fundingRate;
594
602
  client.resolve(fundingRate, channel + '::' + fundingRate['symbol']);
595
603
  }
596
604
  handleErrorMessage(client, message) {
@@ -1,5 +1,5 @@
1
1
  import okxRest from '../okx.js';
2
- import type { Int, OrderSide, OrderType, Str, Strings, OrderBook, Order, Trade, Ticker, Tickers, OHLCV, Position, Balances, Num } from '../base/types.js';
2
+ import type { Int, OrderSide, OrderType, Str, Strings, OrderBook, Order, Trade, Ticker, Tickers, OHLCV, Position, Balances, Num, FundingRate, FundingRates } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class okx extends okxRest {
5
5
  describe(): any;
@@ -9,6 +9,9 @@ export default class okx extends okxRest {
9
9
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
10
10
  watchTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
11
11
  handleTrades(client: Client, message: any): void;
12
+ watchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
13
+ watchFundingRates(symbols: string[], params?: {}): Promise<FundingRates>;
14
+ handleFundingRate(client: Client, message: any): void;
12
15
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
13
16
  watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
14
17
  handleTicker(client: Client, message: any): any;
package/js/src/pro/okx.js CHANGED
@@ -27,6 +27,8 @@ export default class okx extends okxRest {
27
27
  'watchOrders': true,
28
28
  'watchMyTrades': true,
29
29
  'watchPositions': true,
30
+ 'watchFundingRate': true,
31
+ 'watchFundingRates': true,
30
32
  'createOrderWs': true,
31
33
  'editOrderWs': true,
32
34
  'cancelOrderWs': true,
@@ -248,6 +250,88 @@ export default class okx extends okxRest {
248
250
  client.resolve(stored, messageHash);
249
251
  }
250
252
  }
253
+ async watchFundingRate(symbol, params = {}) {
254
+ /**
255
+ * @method
256
+ * @name okx#watchFundingRate
257
+ * @description watch the current funding rate
258
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
259
+ * @param {string} symbol unified market symbol
260
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
261
+ * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
262
+ */
263
+ symbol = this.symbol(symbol);
264
+ const fr = await this.watchFundingRates([symbol], params);
265
+ return fr[symbol];
266
+ }
267
+ async watchFundingRates(symbols, params = {}) {
268
+ /**
269
+ * @method
270
+ * @name coinbaseinternational#watchFundingRates
271
+ * @description watch the funding rate for multiple markets
272
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
273
+ * @param {string[]} symbols list of unified market symbols
274
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
275
+ * @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexe by market symbols
276
+ */
277
+ await this.loadMarkets();
278
+ symbols = this.marketSymbols(symbols);
279
+ const channel = 'funding-rate';
280
+ const topics = [];
281
+ const messageHashes = [];
282
+ for (let i = 0; i < symbols.length; i++) {
283
+ const symbol = symbols[i];
284
+ messageHashes.push(channel + ':' + symbol);
285
+ const marketId = this.marketId(symbol);
286
+ const topic = {
287
+ 'channel': channel,
288
+ 'instId': marketId,
289
+ };
290
+ topics.push(topic);
291
+ }
292
+ const request = {
293
+ 'op': 'subscribe',
294
+ 'args': topics,
295
+ };
296
+ const url = this.getUrl(channel, 'public');
297
+ const fundingRate = await this.watchMultiple(url, messageHashes, request, messageHashes);
298
+ if (this.newUpdates) {
299
+ const symbol = this.safeString(fundingRate, 'symbol');
300
+ const result = {};
301
+ result[symbol] = fundingRate;
302
+ return result;
303
+ }
304
+ return this.filterByArray(this.fundingRates, 'symbol', symbols);
305
+ }
306
+ handleFundingRate(client, message) {
307
+ //
308
+ // "data":[
309
+ // {
310
+ // "fundingRate":"0.0001875391284828",
311
+ // "fundingTime":"1700726400000",
312
+ // "instId":"BTC-USD-SWAP",
313
+ // "instType":"SWAP",
314
+ // "method": "next_period",
315
+ // "maxFundingRate":"0.00375",
316
+ // "minFundingRate":"-0.00375",
317
+ // "nextFundingRate":"0.0002608059239328",
318
+ // "nextFundingTime":"1700755200000",
319
+ // "premium": "0.0001233824646391",
320
+ // "settFundingRate":"0.0001699799259033",
321
+ // "settState":"settled",
322
+ // "ts":"1700724675402"
323
+ // }
324
+ // ]
325
+ //
326
+ const data = this.safeList(message, 'data', []);
327
+ for (let i = 0; i < data.length; i++) {
328
+ const rawfr = data[i];
329
+ const fundingRate = this.parseFundingRate(rawfr);
330
+ const symbol = fundingRate['symbol'];
331
+ this.fundingRates[symbol] = fundingRate;
332
+ client.resolve(fundingRate, 'funding-rate' + ':' + fundingRate['symbol']);
333
+ }
334
+ }
251
335
  async watchTicker(symbol, params = {}) {
252
336
  /**
253
337
  * @method
@@ -1636,6 +1720,7 @@ export default class okx extends okxRest {
1636
1720
  'block-tickers': this.handleTicker,
1637
1721
  'trades': this.handleTrades,
1638
1722
  'account': this.handleBalance,
1723
+ 'funding-rate': this.handleFundingRate,
1639
1724
  // 'margin_account': this.handleBalance,
1640
1725
  'orders': this.handleOrders,
1641
1726
  'orders-algo': this.handleOrders,