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.
- package/README.md +7 -5
- package/dist/cjs/ccxt.js +6 -1
- package/dist/cjs/src/abstract/woofipro.js +9 -0
- package/dist/cjs/src/ascendex.js +3 -4
- package/dist/cjs/src/base/Exchange.js +42 -2
- package/dist/cjs/src/base/functions/crypto.js +10 -3
- package/dist/cjs/src/base/functions/encode.js +6 -3
- package/dist/cjs/src/base/functions/number.js +8 -5
- package/dist/cjs/src/base/functions/rsa.js +5 -5
- package/dist/cjs/src/bigone.js +1 -1
- package/dist/cjs/src/bitfinex.js +25 -1
- package/dist/cjs/src/bitfinex2.js +59 -51
- package/dist/cjs/src/bitget.js +1 -5
- package/dist/cjs/src/bitmart.js +3 -3
- package/dist/cjs/src/bitstamp.js +1 -3
- package/dist/cjs/src/bybit.js +1 -0
- package/dist/cjs/src/coinex.js +321 -537
- package/dist/cjs/src/coinlist.js +1 -2
- package/dist/cjs/src/deribit.js +1 -1
- package/dist/cjs/src/hollaex.js +3 -3
- package/dist/cjs/src/indodax.js +1 -1
- package/dist/cjs/src/latoken.js +1 -1
- package/dist/cjs/src/mexc.js +1 -1
- package/dist/cjs/src/novadax.js +0 -1
- package/dist/cjs/src/okx.js +17 -0
- package/dist/cjs/src/poloniex.js +1 -2
- package/dist/cjs/src/pro/bitget.js +136 -192
- package/dist/cjs/src/pro/coinbaseinternational.js +9 -1
- package/dist/cjs/src/pro/okx.js +85 -0
- package/dist/cjs/src/pro/woofipro.js +1263 -0
- package/dist/cjs/src/wavesexchange.js +2 -2
- package/dist/cjs/src/woo.js +17 -3
- package/dist/cjs/src/woofipro.js +2698 -0
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/bybit.d.ts +1 -0
- package/js/src/abstract/okx.d.ts +1 -0
- package/js/src/abstract/woofipro.d.ts +122 -0
- package/js/src/abstract/woofipro.js +11 -0
- package/js/src/ace.d.ts +2 -2
- package/js/src/ascendex.d.ts +5 -15
- package/js/src/ascendex.js +3 -4
- package/js/src/base/Exchange.d.ts +26 -17
- package/js/src/base/Exchange.js +42 -2
- package/js/src/base/functions/crypto.d.ts +1 -1
- package/js/src/base/functions/crypto.js +10 -3
- package/js/src/base/functions/encode.d.ts +1 -1
- package/js/src/base/functions/encode.js +6 -3
- package/js/src/base/functions/number.d.ts +1 -1
- package/js/src/base/functions/number.js +8 -5
- package/js/src/base/functions/rsa.js +6 -6
- package/js/src/base/types.d.ts +4 -0
- package/js/src/bigone.d.ts +4 -14
- package/js/src/bigone.js +1 -1
- package/js/src/binance.d.ts +13 -71
- package/js/src/binancecoinm.d.ts +2 -22
- package/js/src/binanceusdm.d.ts +2 -22
- package/js/src/bingx.d.ts +4 -14
- package/js/src/bit2c.d.ts +2 -2
- package/js/src/bitbank.d.ts +2 -2
- package/js/src/bitbns.d.ts +2 -2
- package/js/src/bitfinex.d.ts +6 -16
- package/js/src/bitfinex.js +25 -1
- package/js/src/bitfinex2.d.ts +6 -16
- package/js/src/bitfinex2.js +59 -51
- package/js/src/bitflyer.d.ts +2 -2
- package/js/src/bitget.d.ts +7 -17
- package/js/src/bitget.js +1 -5
- package/js/src/bithumb.d.ts +3 -3
- package/js/src/bitmart.d.ts +5 -14
- package/js/src/bitmart.js +3 -3
- package/js/src/bitmex.d.ts +4 -4
- package/js/src/bitopro.d.ts +2 -2
- package/js/src/bitrue.d.ts +5 -5
- package/js/src/bitso.d.ts +2 -2
- package/js/src/bitstamp.d.ts +3 -3
- package/js/src/bitstamp.js +1 -3
- package/js/src/bitteam.d.ts +2 -2
- package/js/src/bitvavo.d.ts +5 -5
- package/js/src/bl3p.d.ts +2 -2
- package/js/src/blockchaincom.d.ts +2 -2
- package/js/src/blofin.d.ts +4 -14
- package/js/src/btcalpha.d.ts +2 -2
- package/js/src/btcbox.d.ts +2 -2
- package/js/src/btcmarkets.d.ts +2 -2
- package/js/src/btcturk.d.ts +2 -2
- package/js/src/bybit.d.ts +8 -56
- package/js/src/bybit.js +1 -0
- package/js/src/cex.d.ts +2 -2
- package/js/src/coinbase.d.ts +4 -4
- package/js/src/coinbasepro.d.ts +3 -3
- package/js/src/coincheck.d.ts +2 -2
- package/js/src/coinex.d.ts +6 -16
- package/js/src/coinex.js +321 -537
- package/js/src/coinlist.d.ts +5 -15
- package/js/src/coinlist.js +1 -2
- package/js/src/coinmate.d.ts +2 -2
- package/js/src/coinmetro.d.ts +3 -3
- package/js/src/coinone.d.ts +2 -2
- package/js/src/coinsph.d.ts +2 -2
- package/js/src/coinspot.d.ts +2 -2
- package/js/src/cryptocom.d.ts +2 -2
- package/js/src/currencycom.d.ts +3 -3
- package/js/src/delta.d.ts +5 -43
- package/js/src/deribit.d.ts +7 -55
- package/js/src/deribit.js +1 -1
- package/js/src/digifinex.d.ts +5 -15
- package/js/src/exmo.d.ts +2 -2
- package/js/src/gate.d.ts +6 -54
- package/js/src/gemini.d.ts +2 -2
- package/js/src/hitbtc.d.ts +4 -14
- package/js/src/hollaex.d.ts +3 -3
- package/js/src/hollaex.js +3 -3
- package/js/src/htx.d.ts +4 -14
- package/js/src/huobijp.d.ts +4 -4
- package/js/src/hyperliquid.d.ts +1 -1
- package/js/src/idex.d.ts +3 -3
- package/js/src/independentreserve.d.ts +2 -2
- package/js/src/indodax.d.ts +2 -2
- package/js/src/indodax.js +1 -1
- package/js/src/kraken.d.ts +4 -14
- package/js/src/krakenfutures.d.ts +4 -14
- package/js/src/kucoin.d.ts +5 -15
- package/js/src/kucoinfutures.d.ts +4 -14
- package/js/src/kuna.d.ts +2 -2
- package/js/src/latoken.d.ts +5 -15
- package/js/src/latoken.js +1 -1
- package/js/src/lbank.d.ts +2 -2
- package/js/src/luno.d.ts +2 -2
- package/js/src/lykke.d.ts +2 -2
- package/js/src/mercado.d.ts +2 -2
- package/js/src/mexc.d.ts +8 -28
- package/js/src/mexc.js +1 -1
- package/js/src/ndax.d.ts +2 -2
- package/js/src/novadax.d.ts +4 -15
- package/js/src/novadax.js +0 -1
- package/js/src/okcoin.d.ts +4 -14
- package/js/src/okx.d.ts +10 -68
- package/js/src/okx.js +17 -0
- package/js/src/onetrading.d.ts +2 -2
- package/js/src/paymium.d.ts +4 -14
- package/js/src/phemex.d.ts +5 -15
- package/js/src/poloniex.d.ts +3 -13
- package/js/src/poloniex.js +1 -2
- package/js/src/poloniexfutures.d.ts +2 -2
- package/js/src/pro/bitget.js +137 -193
- package/js/src/pro/coinbaseinternational.d.ts +3 -3
- package/js/src/pro/coinbaseinternational.js +9 -1
- package/js/src/pro/okx.d.ts +4 -1
- package/js/src/pro/okx.js +85 -0
- package/js/src/pro/woofipro.d.ts +47 -0
- package/js/src/pro/woofipro.js +1264 -0
- package/js/src/probit.d.ts +3 -3
- package/js/src/timex.d.ts +2 -2
- package/js/src/tokocrypto.d.ts +3 -3
- package/js/src/upbit.d.ts +2 -2
- package/js/src/wavesexchange.d.ts +3 -3
- package/js/src/wavesexchange.js +2 -2
- package/js/src/wazirx.d.ts +2 -2
- package/js/src/whitebit.d.ts +3 -13
- package/js/src/woo.d.ts +7 -17
- package/js/src/woo.js +17 -3
- package/js/src/woofipro.d.ts +131 -0
- package/js/src/woofipro.js +2699 -0
- package/js/src/yobit.d.ts +2 -2
- package/js/src/zaif.d.ts +2 -2
- package/js/src/zonda.d.ts +4 -14
- package/package.json +1 -1
package/js/src/pro/bitget.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
import bitgetRest from '../bitget.js';
|
|
9
|
-
import { AuthenticationError, BadRequest, ArgumentsRequired,
|
|
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
|
-
|
|
979
|
-
params = this.
|
|
980
|
-
let messageHash = (
|
|
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 (
|
|
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 =
|
|
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
|
|
1181
|
-
const
|
|
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
|
-
//
|
|
1206
|
-
//
|
|
1207
|
-
//
|
|
1208
|
-
//
|
|
1209
|
-
//
|
|
1210
|
-
//
|
|
1211
|
-
//
|
|
1212
|
-
//
|
|
1213
|
-
//
|
|
1214
|
-
//
|
|
1215
|
-
//
|
|
1216
|
-
//
|
|
1217
|
-
//
|
|
1218
|
-
//
|
|
1219
|
-
//
|
|
1220
|
-
//
|
|
1221
|
-
//
|
|
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
|
-
//
|
|
1228
|
-
//
|
|
1229
|
-
//
|
|
1230
|
-
//
|
|
1231
|
-
//
|
|
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
|
-
//
|
|
1236
|
-
//
|
|
1237
|
-
//
|
|
1238
|
-
//
|
|
1239
|
-
//
|
|
1240
|
-
//
|
|
1241
|
-
//
|
|
1242
|
-
//
|
|
1243
|
-
//
|
|
1244
|
-
//
|
|
1245
|
-
//
|
|
1246
|
-
//
|
|
1247
|
-
//
|
|
1248
|
-
//
|
|
1249
|
-
//
|
|
1250
|
-
//
|
|
1251
|
-
//
|
|
1252
|
-
//
|
|
1253
|
-
//
|
|
1254
|
-
//
|
|
1255
|
-
//
|
|
1256
|
-
//
|
|
1257
|
-
//
|
|
1258
|
-
//
|
|
1259
|
-
//
|
|
1260
|
-
//
|
|
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": "
|
|
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
|
|
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
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
const
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
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
|
-
|
|
1335
|
-
amount
|
|
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':
|
|
1293
|
+
'amount': totalAmount,
|
|
1353
1294
|
'cost': cost,
|
|
1354
1295
|
'average': avgPrice,
|
|
1355
|
-
'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
|
-
|
|
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) {
|
package/js/src/pro/okx.d.ts
CHANGED
|
@@ -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,
|