ccxt 4.4.25 → 4.4.26
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 +4 -4
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/alpaca.js +257 -11
- package/dist/cjs/src/base/Exchange.js +14 -1
- package/dist/cjs/src/binance.js +2 -3
- package/dist/cjs/src/bingx.js +7 -1
- package/dist/cjs/src/bitget.js +2 -2
- package/dist/cjs/src/bitmart.js +3 -3
- package/dist/cjs/src/bybit.js +3 -14
- package/dist/cjs/src/cex.js +40 -0
- package/dist/cjs/src/coinex.js +2 -4
- package/dist/cjs/src/digifinex.js +2 -2
- package/dist/cjs/src/exmo.js +1 -0
- package/dist/cjs/src/gate.js +3 -3
- package/dist/cjs/src/htx.js +2 -3
- package/dist/cjs/src/hyperliquid.js +14 -4
- package/dist/cjs/src/kucoin.js +2 -2
- package/dist/cjs/src/okx.js +3 -2
- package/dist/cjs/src/phemex.js +4 -2
- package/dist/cjs/src/pro/exmo.js +216 -3
- package/dist/cjs/src/whitebit.js +2 -2
- package/dist/cjs/src/xt.js +39 -27
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/alpaca.d.ts +1 -0
- package/js/src/abstract/bingx.d.ts +1 -0
- package/js/src/abstract/okx.d.ts +1 -0
- package/js/src/abstract/phemex.d.ts +1 -0
- package/js/src/alpaca.d.ts +6 -1
- package/js/src/alpaca.js +258 -12
- package/js/src/base/Exchange.d.ts +7 -6
- package/js/src/base/Exchange.js +14 -1
- package/js/src/base/types.d.ts +3 -3
- package/js/src/binance.d.ts +3 -14
- package/js/src/binance.js +2 -3
- package/js/src/bingx.js +7 -1
- package/js/src/bitget.d.ts +3 -13
- package/js/src/bitget.js +2 -2
- package/js/src/bitmart.d.ts +3 -13
- package/js/src/bitmart.js +3 -3
- package/js/src/bybit.d.ts +3 -14
- package/js/src/bybit.js +3 -14
- package/js/src/cex.d.ts +2 -0
- package/js/src/cex.js +40 -0
- package/js/src/coinex.d.ts +3 -15
- package/js/src/coinex.js +2 -4
- package/js/src/digifinex.d.ts +3 -13
- package/js/src/digifinex.js +2 -2
- package/js/src/exmo.js +1 -0
- package/js/src/gate.d.ts +3 -13
- package/js/src/gate.js +3 -3
- package/js/src/htx.d.ts +3 -14
- package/js/src/htx.js +2 -3
- package/js/src/hyperliquid.js +14 -4
- package/js/src/kucoin.d.ts +3 -13
- package/js/src/kucoin.js +2 -2
- package/js/src/okx.d.ts +3 -13
- package/js/src/okx.js +3 -2
- package/js/src/phemex.js +4 -2
- package/js/src/pro/exmo.d.ts +5 -1
- package/js/src/pro/exmo.js +216 -3
- package/js/src/whitebit.d.ts +3 -13
- package/js/src/whitebit.js +2 -2
- package/js/src/woo.d.ts +1 -1
- package/js/src/xt.js +39 -27
- package/package.json +1 -1
package/js/src/alpaca.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
import Exchange from './abstract/alpaca.js';
|
|
9
|
-
import { ExchangeError, BadRequest, PermissionDenied, BadSymbol, NotSupported, InsufficientFunds, InvalidOrder, RateLimitExceeded } from './base/errors.js';
|
|
9
|
+
import { ExchangeError, BadRequest, PermissionDenied, BadSymbol, NotSupported, InsufficientFunds, InvalidOrder, RateLimitExceeded, ArgumentsRequired } from './base/errors.js';
|
|
10
10
|
import { TICK_SIZE } from './base/functions/number.js';
|
|
11
11
|
// ---------------------------------------------------------------------------xs
|
|
12
12
|
/**
|
|
@@ -57,7 +57,7 @@ export default class alpaca extends Exchange {
|
|
|
57
57
|
'fetchBidsAsks': false,
|
|
58
58
|
'fetchClosedOrders': true,
|
|
59
59
|
'fetchCurrencies': false,
|
|
60
|
-
'fetchDepositAddress':
|
|
60
|
+
'fetchDepositAddress': true,
|
|
61
61
|
'fetchDepositAddressesByNetwork': false,
|
|
62
62
|
'fetchDeposits': false,
|
|
63
63
|
'fetchDepositsWithdrawals': false,
|
|
@@ -68,7 +68,7 @@ export default class alpaca extends Exchange {
|
|
|
68
68
|
'fetchL1OrderBook': true,
|
|
69
69
|
'fetchL2OrderBook': false,
|
|
70
70
|
'fetchMarkets': true,
|
|
71
|
-
'fetchMyTrades':
|
|
71
|
+
'fetchMyTrades': true,
|
|
72
72
|
'fetchOHLCV': true,
|
|
73
73
|
'fetchOpenOrder': false,
|
|
74
74
|
'fetchOpenOrders': true,
|
|
@@ -83,8 +83,8 @@ export default class alpaca extends Exchange {
|
|
|
83
83
|
'fetchPositionsHistory': false,
|
|
84
84
|
'fetchPositionsRisk': false,
|
|
85
85
|
'fetchStatus': false,
|
|
86
|
-
'fetchTicker':
|
|
87
|
-
'fetchTickers':
|
|
86
|
+
'fetchTicker': true,
|
|
87
|
+
'fetchTickers': true,
|
|
88
88
|
'fetchTime': true,
|
|
89
89
|
'fetchTrades': true,
|
|
90
90
|
'fetchTradingFee': false,
|
|
@@ -122,6 +122,7 @@ export default class alpaca extends Exchange {
|
|
|
122
122
|
'v2/assets/{symbol_or_asset_id}',
|
|
123
123
|
'v2/corporate_actions/announcements/{id}',
|
|
124
124
|
'v2/corporate_actions/announcements',
|
|
125
|
+
'v2/wallets',
|
|
125
126
|
],
|
|
126
127
|
'post': [
|
|
127
128
|
'v2/orders',
|
|
@@ -685,6 +686,136 @@ export default class alpaca extends Exchange {
|
|
|
685
686
|
this.safeNumber(ohlcv, 'v'), // volume
|
|
686
687
|
];
|
|
687
688
|
}
|
|
689
|
+
async fetchTicker(symbol, params = {}) {
|
|
690
|
+
/**
|
|
691
|
+
* @method
|
|
692
|
+
* @name alpaca#fetchTicker
|
|
693
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
694
|
+
* @see https://docs.alpaca.markets/reference/cryptosnapshots-1
|
|
695
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
696
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
697
|
+
* @param {string} [params.loc] crypto location, default: us
|
|
698
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
699
|
+
*/
|
|
700
|
+
await this.loadMarkets();
|
|
701
|
+
symbol = this.symbol(symbol);
|
|
702
|
+
const tickers = await this.fetchTickers([symbol], params);
|
|
703
|
+
return this.safeDict(tickers, symbol);
|
|
704
|
+
}
|
|
705
|
+
async fetchTickers(symbols = undefined, params = {}) {
|
|
706
|
+
/**
|
|
707
|
+
* @method
|
|
708
|
+
* @name alpaca#fetchTickers
|
|
709
|
+
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
710
|
+
* @see https://docs.alpaca.markets/reference/cryptosnapshots-1
|
|
711
|
+
* @param {string[]} symbols unified symbols of the markets to fetch tickers for
|
|
712
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
713
|
+
* @param {string} [params.loc] crypto location, default: us
|
|
714
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
715
|
+
*/
|
|
716
|
+
if (symbols === undefined) {
|
|
717
|
+
throw new ArgumentsRequired(this.id + ' fetchTickers() requires a symbols argument');
|
|
718
|
+
}
|
|
719
|
+
await this.loadMarkets();
|
|
720
|
+
symbols = this.marketSymbols(symbols);
|
|
721
|
+
const loc = this.safeString(params, 'loc', 'us');
|
|
722
|
+
const ids = this.marketIds(symbols);
|
|
723
|
+
const request = {
|
|
724
|
+
'symbols': ids.join(','),
|
|
725
|
+
'loc': loc,
|
|
726
|
+
};
|
|
727
|
+
params = this.omit(params, 'loc');
|
|
728
|
+
const response = await this.marketPublicGetV1beta3CryptoLocSnapshots(this.extend(request, params));
|
|
729
|
+
//
|
|
730
|
+
// {
|
|
731
|
+
// "snapshots": {
|
|
732
|
+
// "BTC/USD": {
|
|
733
|
+
// "dailyBar": {
|
|
734
|
+
// "c": 69403.554,
|
|
735
|
+
// "h": 69609.6515,
|
|
736
|
+
// "l": 69013.26,
|
|
737
|
+
// "n": 9,
|
|
738
|
+
// "o": 69536.7,
|
|
739
|
+
// "t": "2024-11-01T05:00:00Z",
|
|
740
|
+
// "v": 0.210809181,
|
|
741
|
+
// "vw": 69327.655393908
|
|
742
|
+
// },
|
|
743
|
+
// "latestQuote": {
|
|
744
|
+
// "ap": 69424.19,
|
|
745
|
+
// "as": 0.68149,
|
|
746
|
+
// "bp": 69366.086,
|
|
747
|
+
// "bs": 0.68312,
|
|
748
|
+
// "t": "2024-11-01T08:31:41.880246926Z"
|
|
749
|
+
// },
|
|
750
|
+
// "latestTrade": {
|
|
751
|
+
// "i": 5272941104897543146,
|
|
752
|
+
// "p": 69416.9,
|
|
753
|
+
// "s": 0.014017324,
|
|
754
|
+
// "t": "2024-11-01T08:14:28.245088803Z",
|
|
755
|
+
// "tks": "B"
|
|
756
|
+
// },
|
|
757
|
+
// "minuteBar": {
|
|
758
|
+
// "c": 69403.554,
|
|
759
|
+
// "h": 69403.554,
|
|
760
|
+
// "l": 69399.125,
|
|
761
|
+
// "n": 0,
|
|
762
|
+
// "o": 69399.125,
|
|
763
|
+
// "t": "2024-11-01T08:30:00Z",
|
|
764
|
+
// "v": 0,
|
|
765
|
+
// "vw": 0
|
|
766
|
+
// },
|
|
767
|
+
// "prevDailyBar": {
|
|
768
|
+
// "c": 69515.1415,
|
|
769
|
+
// "h": 72668.837,
|
|
770
|
+
// "l": 68796.85,
|
|
771
|
+
// "n": 129,
|
|
772
|
+
// "o": 72258.9,
|
|
773
|
+
// "t": "2024-10-31T05:00:00Z",
|
|
774
|
+
// "v": 2.217683307,
|
|
775
|
+
// "vw": 70782.6811608144
|
|
776
|
+
// }
|
|
777
|
+
// },
|
|
778
|
+
// }
|
|
779
|
+
// }
|
|
780
|
+
//
|
|
781
|
+
const results = [];
|
|
782
|
+
const snapshots = this.safeDict(response, 'snapshots', {});
|
|
783
|
+
const marketIds = Object.keys(snapshots);
|
|
784
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
785
|
+
const marketId = marketIds[i];
|
|
786
|
+
const market = this.safeMarket(marketId);
|
|
787
|
+
const entry = this.safeDict(snapshots, marketId);
|
|
788
|
+
const dailyBar = this.safeDict(entry, 'dailyBar', {});
|
|
789
|
+
const prevDailyBar = this.safeDict(entry, 'prevDailyBar', {});
|
|
790
|
+
const latestQuote = this.safeDict(entry, 'latestQuote', {});
|
|
791
|
+
const latestTrade = this.safeDict(entry, 'latestTrade', {});
|
|
792
|
+
const datetime = this.safeString(latestQuote, 't');
|
|
793
|
+
const ticker = this.safeTicker({
|
|
794
|
+
'info': entry,
|
|
795
|
+
'symbol': market['symbol'],
|
|
796
|
+
'timestamp': this.parse8601(datetime),
|
|
797
|
+
'datetime': datetime,
|
|
798
|
+
'high': this.safeString(dailyBar, 'h'),
|
|
799
|
+
'low': this.safeString(dailyBar, 'l'),
|
|
800
|
+
'bid': this.safeString(latestQuote, 'bp'),
|
|
801
|
+
'bidVolume': this.safeString(latestQuote, 'bs'),
|
|
802
|
+
'ask': this.safeString(latestQuote, 'ap'),
|
|
803
|
+
'askVolume': this.safeString(latestQuote, 'as'),
|
|
804
|
+
'vwap': this.safeString(dailyBar, 'vw'),
|
|
805
|
+
'open': this.safeString(dailyBar, 'o'),
|
|
806
|
+
'close': this.safeString(dailyBar, 'c'),
|
|
807
|
+
'last': this.safeString(latestTrade, 'p'),
|
|
808
|
+
'previousClose': this.safeString(prevDailyBar, 'c'),
|
|
809
|
+
'change': undefined,
|
|
810
|
+
'percentage': undefined,
|
|
811
|
+
'average': undefined,
|
|
812
|
+
'baseVolume': this.safeString(dailyBar, 'v'),
|
|
813
|
+
'quoteVolume': this.safeString(dailyBar, 'n'),
|
|
814
|
+
}, market);
|
|
815
|
+
results.push(ticker);
|
|
816
|
+
}
|
|
817
|
+
return this.filterByArray(results, 'symbol', symbols);
|
|
818
|
+
}
|
|
688
819
|
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
689
820
|
/**
|
|
690
821
|
* @method
|
|
@@ -1055,7 +1186,59 @@ export default class alpaca extends Exchange {
|
|
|
1055
1186
|
};
|
|
1056
1187
|
return this.safeString(timeInForces, timeInForce, timeInForce);
|
|
1057
1188
|
}
|
|
1189
|
+
async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1190
|
+
/**
|
|
1191
|
+
* @method
|
|
1192
|
+
* @name alpaca#fetchMyTrades
|
|
1193
|
+
* @description fetch all trades made by the user
|
|
1194
|
+
* @see https://docs.alpaca.markets/reference/getaccountactivitiesbyactivitytype-1
|
|
1195
|
+
* @param {string} [symbol] unified market symbol
|
|
1196
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
1197
|
+
* @param {int} [limit] the maximum number of trade structures to retrieve
|
|
1198
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1199
|
+
* @param {int} [params.until] the latest time in ms to fetch trades for
|
|
1200
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
1201
|
+
*/
|
|
1202
|
+
await this.loadMarkets();
|
|
1203
|
+
let market = undefined;
|
|
1204
|
+
let request = {
|
|
1205
|
+
'activity_type': 'FILL',
|
|
1206
|
+
};
|
|
1207
|
+
if (symbol !== undefined) {
|
|
1208
|
+
market = this.market(symbol);
|
|
1209
|
+
}
|
|
1210
|
+
if (since !== undefined) {
|
|
1211
|
+
request['after'] = since;
|
|
1212
|
+
}
|
|
1213
|
+
if (limit !== undefined) {
|
|
1214
|
+
request['page_size'] = limit;
|
|
1215
|
+
}
|
|
1216
|
+
[request, params] = this.handleUntilOption('until', request, params);
|
|
1217
|
+
const response = await this.traderPrivateGetV2AccountActivitiesActivityType(this.extend(request, params));
|
|
1218
|
+
//
|
|
1219
|
+
// [
|
|
1220
|
+
// {
|
|
1221
|
+
// "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
|
|
1222
|
+
// "activity_type": "FILL",
|
|
1223
|
+
// "transaction_time": "2022-12-28T12:19:29.579352Z",
|
|
1224
|
+
// "type": "fill",
|
|
1225
|
+
// "price": "67.31",
|
|
1226
|
+
// "qty": "0.07",
|
|
1227
|
+
// "side": "sell",
|
|
1228
|
+
// "symbol": "LTC/USD",
|
|
1229
|
+
// "leaves_qty": "0",
|
|
1230
|
+
// "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
|
|
1231
|
+
// "cum_qty": "0.07",
|
|
1232
|
+
// "order_status": "filled",
|
|
1233
|
+
// "swap_rate": "1"
|
|
1234
|
+
// },
|
|
1235
|
+
// ]
|
|
1236
|
+
//
|
|
1237
|
+
return this.parseTrades(response, market, since, limit);
|
|
1238
|
+
}
|
|
1058
1239
|
parseTrade(trade, market = undefined) {
|
|
1240
|
+
//
|
|
1241
|
+
// fetchTrades
|
|
1059
1242
|
//
|
|
1060
1243
|
// {
|
|
1061
1244
|
// "t":"2022-06-14T05:00:00.027869Z",
|
|
@@ -1066,27 +1249,45 @@ export default class alpaca extends Exchange {
|
|
|
1066
1249
|
// "i":"355681339"
|
|
1067
1250
|
// }
|
|
1068
1251
|
//
|
|
1069
|
-
|
|
1252
|
+
// fetchMyTrades
|
|
1253
|
+
//
|
|
1254
|
+
// {
|
|
1255
|
+
// "id": "20221228071929579::ca2aafd0-1270-4b56-b0a9-85423b4a07c8",
|
|
1256
|
+
// "activity_type": "FILL",
|
|
1257
|
+
// "transaction_time": "2022-12-28T12:19:29.579352Z",
|
|
1258
|
+
// "type": "fill",
|
|
1259
|
+
// "price": "67.31",
|
|
1260
|
+
// "qty": "0.07",
|
|
1261
|
+
// "side": "sell",
|
|
1262
|
+
// "symbol": "LTC/USD",
|
|
1263
|
+
// "leaves_qty": "0",
|
|
1264
|
+
// "order_id": "82eebcf7-6e66-4b7e-93f8-be0df0e4f12e",
|
|
1265
|
+
// "cum_qty": "0.07",
|
|
1266
|
+
// "order_status": "filled",
|
|
1267
|
+
// "swap_rate": "1"
|
|
1268
|
+
// },
|
|
1269
|
+
//
|
|
1270
|
+
const marketId = this.safeString2(trade, 'S', 'symbol');
|
|
1070
1271
|
const symbol = this.safeSymbol(marketId, market);
|
|
1071
|
-
const datetime = this.
|
|
1272
|
+
const datetime = this.safeString2(trade, 't', 'transaction_time');
|
|
1072
1273
|
const timestamp = this.parse8601(datetime);
|
|
1073
1274
|
const alpacaSide = this.safeString(trade, 'tks');
|
|
1074
|
-
let side;
|
|
1275
|
+
let side = this.safeString(trade, 'side');
|
|
1075
1276
|
if (alpacaSide === 'B') {
|
|
1076
1277
|
side = 'buy';
|
|
1077
1278
|
}
|
|
1078
1279
|
else if (alpacaSide === 'S') {
|
|
1079
1280
|
side = 'sell';
|
|
1080
1281
|
}
|
|
1081
|
-
const priceString = this.
|
|
1082
|
-
const amountString = this.
|
|
1282
|
+
const priceString = this.safeString2(trade, 'p', 'price');
|
|
1283
|
+
const amountString = this.safeString2(trade, 's', 'qty');
|
|
1083
1284
|
return this.safeTrade({
|
|
1084
1285
|
'info': trade,
|
|
1085
|
-
'id': this.
|
|
1286
|
+
'id': this.safeString2(trade, 'i', 'id'),
|
|
1086
1287
|
'timestamp': timestamp,
|
|
1087
1288
|
'datetime': this.iso8601(timestamp),
|
|
1088
1289
|
'symbol': symbol,
|
|
1089
|
-
'order':
|
|
1290
|
+
'order': this.safeString(trade, 'order_id'),
|
|
1090
1291
|
'type': undefined,
|
|
1091
1292
|
'side': side,
|
|
1092
1293
|
'takerOrMaker': 'taker',
|
|
@@ -1096,6 +1297,51 @@ export default class alpaca extends Exchange {
|
|
|
1096
1297
|
'fee': undefined,
|
|
1097
1298
|
}, market);
|
|
1098
1299
|
}
|
|
1300
|
+
async fetchDepositAddress(code, params = {}) {
|
|
1301
|
+
/**
|
|
1302
|
+
* @method
|
|
1303
|
+
* @name alpaca#fetchDepositAddress
|
|
1304
|
+
* @description fetch the deposit address for a currency associated with this account
|
|
1305
|
+
* @see https://docs.alpaca.markets/reference/listcryptofundingwallets
|
|
1306
|
+
* @param {string} code unified currency code
|
|
1307
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1308
|
+
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
|
|
1309
|
+
*/
|
|
1310
|
+
await this.loadMarkets();
|
|
1311
|
+
const currency = this.currency(code);
|
|
1312
|
+
const request = {
|
|
1313
|
+
'asset': currency['id'],
|
|
1314
|
+
};
|
|
1315
|
+
const response = await this.traderPrivateGetV2Wallets(this.extend(request, params));
|
|
1316
|
+
//
|
|
1317
|
+
// {
|
|
1318
|
+
// "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
|
|
1319
|
+
// "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
|
|
1320
|
+
// "created_at": "2024-11-03T07:30:05.609976344Z"
|
|
1321
|
+
// }
|
|
1322
|
+
//
|
|
1323
|
+
return this.parseDepositAddress(response, currency);
|
|
1324
|
+
}
|
|
1325
|
+
parseDepositAddress(depositAddress, currency = undefined) {
|
|
1326
|
+
//
|
|
1327
|
+
// {
|
|
1328
|
+
// "asset_id": "4fa30c85-77b7-4cbc-92dd-7b7513640aad",
|
|
1329
|
+
// "address": "bc1q2fpskfnwem3uq9z8660e4z6pfv7aqfamysk75r",
|
|
1330
|
+
// "created_at": "2024-11-03T07:30:05.609976344Z"
|
|
1331
|
+
// }
|
|
1332
|
+
//
|
|
1333
|
+
let parsedCurrency = undefined;
|
|
1334
|
+
if (currency !== undefined) {
|
|
1335
|
+
parsedCurrency = currency['id'];
|
|
1336
|
+
}
|
|
1337
|
+
return {
|
|
1338
|
+
'info': depositAddress,
|
|
1339
|
+
'currency': parsedCurrency,
|
|
1340
|
+
'network': undefined,
|
|
1341
|
+
'address': this.safeString(depositAddress, 'address'),
|
|
1342
|
+
'tag': undefined,
|
|
1343
|
+
};
|
|
1344
|
+
}
|
|
1099
1345
|
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
1100
1346
|
let endpoint = '/' + this.implodeParams(path, params);
|
|
1101
1347
|
let url = this.implodeHostname(this.urls['api'][api[0]]);
|
|
@@ -15,6 +15,7 @@ export default class Exchange {
|
|
|
15
15
|
options: {
|
|
16
16
|
[key: string]: any;
|
|
17
17
|
};
|
|
18
|
+
isSandboxModeEnabled: boolean;
|
|
18
19
|
throttleProp: any;
|
|
19
20
|
sleep: (ms: any) => Promise<unknown>;
|
|
20
21
|
api: any;
|
|
@@ -864,13 +865,13 @@ export default class Exchange {
|
|
|
864
865
|
invertFlatStringDictionary(dict: any): {};
|
|
865
866
|
reduceFeesByCurrency(fees: any): any[];
|
|
866
867
|
safeTicker(ticker: Dict, market?: Market): Ticker;
|
|
867
|
-
fetchBorrowRate(code: string, amount:
|
|
868
|
-
repayCrossMargin(code: string, amount:
|
|
869
|
-
repayIsolatedMargin(symbol: string, code: string, amount:
|
|
868
|
+
fetchBorrowRate(code: string, amount: number, params?: {}): Promise<{}>;
|
|
869
|
+
repayCrossMargin(code: string, amount: number, params?: {}): Promise<{}>;
|
|
870
|
+
repayIsolatedMargin(symbol: string, code: string, amount: number, params?: {}): Promise<{}>;
|
|
870
871
|
borrowCrossMargin(code: string, amount: number, params?: {}): Promise<{}>;
|
|
871
872
|
borrowIsolatedMargin(symbol: string, code: string, amount: number, params?: {}): Promise<{}>;
|
|
872
|
-
borrowMargin(code: string, amount:
|
|
873
|
-
repayMargin(code: string, amount:
|
|
873
|
+
borrowMargin(code: string, amount: number, symbol?: Str, params?: {}): Promise<{}>;
|
|
874
|
+
repayMargin(code: string, amount: number, symbol?: Str, params?: {}): Promise<{}>;
|
|
874
875
|
fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
|
|
875
876
|
fetchOHLCVWs(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
|
|
876
877
|
watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
|
|
@@ -1097,7 +1098,7 @@ export default class Exchange {
|
|
|
1097
1098
|
parseLastPrices(pricesData: any, symbols?: string[], params?: {}): LastPrices;
|
|
1098
1099
|
parseTickers(tickers: any, symbols?: Strings, params?: {}): Tickers;
|
|
1099
1100
|
parseDepositAddresses(addresses: any, codes?: Strings, indexed?: boolean, params?: {}): DepositAddress[];
|
|
1100
|
-
parseBorrowInterests(response: any, market?: Market):
|
|
1101
|
+
parseBorrowInterests(response: any, market?: Market): BorrowInterest[];
|
|
1101
1102
|
parseBorrowRate(info: any, currency?: Currency): Dict;
|
|
1102
1103
|
parseBorrowRateHistory(response: any, code: Str, since: Int, limit: Int): any;
|
|
1103
1104
|
parseIsolatedBorrowRates(info: any): IsolatedBorrowRates;
|
package/js/src/base/Exchange.js
CHANGED
|
@@ -32,6 +32,7 @@ import * as Starknet from '../static_dependencies/starknet/index.js';
|
|
|
32
32
|
*/
|
|
33
33
|
export default class Exchange {
|
|
34
34
|
constructor(userConfig = {}) {
|
|
35
|
+
this.isSandboxModeEnabled = false;
|
|
35
36
|
this.throttleProp = undefined;
|
|
36
37
|
this.sleep = sleep;
|
|
37
38
|
this.api = undefined;
|
|
@@ -792,7 +793,15 @@ export default class Exchange {
|
|
|
792
793
|
}
|
|
793
794
|
else {
|
|
794
795
|
try {
|
|
795
|
-
|
|
796
|
+
// we should handle scientific notation here
|
|
797
|
+
// so if the exchanges returns 1e-8
|
|
798
|
+
// this function will return 0.00000001
|
|
799
|
+
// check https://github.com/ccxt/ccxt/issues/24135
|
|
800
|
+
const numberNormalized = this.numberToString(value);
|
|
801
|
+
if (numberNormalized.indexOf('e-') > -1) {
|
|
802
|
+
return this.number(numberToString(parseFloat(numberNormalized)));
|
|
803
|
+
}
|
|
804
|
+
return this.number(numberNormalized);
|
|
796
805
|
}
|
|
797
806
|
catch (e) {
|
|
798
807
|
return d;
|
|
@@ -1961,6 +1970,8 @@ export default class Exchange {
|
|
|
1961
1970
|
else {
|
|
1962
1971
|
throw new NotSupported(this.id + ' does not have a sandbox URL');
|
|
1963
1972
|
}
|
|
1973
|
+
// set flag
|
|
1974
|
+
this.isSandboxModeEnabled = true;
|
|
1964
1975
|
}
|
|
1965
1976
|
else if ('apiBackup' in this.urls) {
|
|
1966
1977
|
if (typeof this.urls['api'] === 'string') {
|
|
@@ -1971,6 +1982,8 @@ export default class Exchange {
|
|
|
1971
1982
|
}
|
|
1972
1983
|
const newUrls = this.omit(this.urls, 'apiBackup');
|
|
1973
1984
|
this.urls = newUrls;
|
|
1985
|
+
// set flag
|
|
1986
|
+
this.isSandboxModeEnabled = false;
|
|
1974
1987
|
}
|
|
1975
1988
|
}
|
|
1976
1989
|
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
package/js/src/base/types.d.ts
CHANGED
|
@@ -309,15 +309,15 @@ export interface Position {
|
|
|
309
309
|
percentage?: number;
|
|
310
310
|
}
|
|
311
311
|
export interface BorrowInterest {
|
|
312
|
-
|
|
312
|
+
info: any;
|
|
313
|
+
symbol?: Str;
|
|
313
314
|
currency?: Str;
|
|
314
315
|
interest?: number;
|
|
315
316
|
interestRate?: number;
|
|
316
317
|
amountBorrowed?: number;
|
|
317
318
|
marginMode?: Str;
|
|
318
|
-
timestamp?:
|
|
319
|
+
timestamp?: Int;
|
|
319
320
|
datetime?: Str;
|
|
320
|
-
info: any;
|
|
321
321
|
}
|
|
322
322
|
export interface LeverageTier {
|
|
323
323
|
tier?: number;
|
package/js/src/binance.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Exchange from './abstract/binance.js';
|
|
2
|
-
import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes, Leverage, Leverages, Num, Option, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRates, IsolatedBorrowRate, Dict, LeverageTier, LeverageTiers, int, LedgerEntry, FundingRate, FundingRates, DepositAddress, LongShortRatio } from './base/types.js';
|
|
2
|
+
import type { TransferEntry, Int, OrderSide, Balances, OrderType, Trade, OHLCV, Order, FundingRateHistory, OpenInterest, Liquidation, OrderRequest, Str, Transaction, Ticker, OrderBook, Tickers, Market, Greeks, Strings, Currency, MarketInterface, MarginMode, MarginModes, Leverage, Leverages, Num, Option, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRates, IsolatedBorrowRate, Dict, LeverageTier, LeverageTiers, int, LedgerEntry, FundingRate, FundingRates, DepositAddress, LongShortRatio, BorrowInterest } from './base/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* @class binance
|
|
5
5
|
* @augments Exchange
|
|
@@ -247,19 +247,8 @@ export default class binance extends Exchange {
|
|
|
247
247
|
}>;
|
|
248
248
|
redeemGiftCode(giftcardCode: any, params?: {}): Promise<any>;
|
|
249
249
|
verifyGiftCode(id: string, params?: {}): Promise<any>;
|
|
250
|
-
fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<
|
|
251
|
-
parseBorrowInterest(info: Dict, market?: Market):
|
|
252
|
-
account: string;
|
|
253
|
-
symbol: string;
|
|
254
|
-
marginMode: string;
|
|
255
|
-
currency: string;
|
|
256
|
-
interest: number;
|
|
257
|
-
interestRate: number;
|
|
258
|
-
amountBorrowed: number;
|
|
259
|
-
timestamp: number;
|
|
260
|
-
datetime: string;
|
|
261
|
-
info: Dict;
|
|
262
|
-
};
|
|
250
|
+
fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
|
|
251
|
+
parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
|
|
263
252
|
repayCrossMargin(code: string, amount: any, params?: {}): Promise<{
|
|
264
253
|
id: number;
|
|
265
254
|
currency: string;
|
package/js/src/binance.js
CHANGED
|
@@ -12378,16 +12378,15 @@ export default class binance extends Exchange {
|
|
|
12378
12378
|
const timestamp = this.safeInteger(info, 'interestAccuredTime');
|
|
12379
12379
|
const marginMode = (symbol === undefined) ? 'cross' : 'isolated';
|
|
12380
12380
|
return {
|
|
12381
|
-
'
|
|
12381
|
+
'info': info,
|
|
12382
12382
|
'symbol': symbol,
|
|
12383
|
-
'marginMode': marginMode,
|
|
12384
12383
|
'currency': this.safeCurrencyCode(this.safeString(info, 'asset')),
|
|
12385
12384
|
'interest': this.safeNumber(info, 'interest'),
|
|
12386
12385
|
'interestRate': this.safeNumber(info, 'interestRate'),
|
|
12387
12386
|
'amountBorrowed': this.safeNumber(info, 'principal'),
|
|
12387
|
+
'marginMode': marginMode,
|
|
12388
12388
|
'timestamp': timestamp,
|
|
12389
12389
|
'datetime': this.iso8601(timestamp),
|
|
12390
|
-
'info': info,
|
|
12391
12390
|
};
|
|
12392
12391
|
}
|
|
12393
12392
|
async repayCrossMargin(code, amount, params = {}) {
|
package/js/src/bingx.js
CHANGED
|
@@ -207,6 +207,7 @@ export default class bingx extends Exchange {
|
|
|
207
207
|
'market/markPriceKlines': 1,
|
|
208
208
|
'trade/batchCancelReplace': 5,
|
|
209
209
|
'trade/fullOrder': 2,
|
|
210
|
+
'positionMargin/history': 2,
|
|
210
211
|
},
|
|
211
212
|
'post': {
|
|
212
213
|
'trade/cancelReplace': 2,
|
|
@@ -2857,6 +2858,7 @@ export default class bingx extends Exchange {
|
|
|
2857
2858
|
* @see https://bingx-api.github.io/docs/#/swapV2/trade-api.html#Bulk%20order
|
|
2858
2859
|
* @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
|
2859
2860
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2861
|
+
* @param {boolean} [params.sync] *spot only* if true, multiple orders are ordered serially and all orders do not require the same symbol/side/type
|
|
2860
2862
|
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2861
2863
|
*/
|
|
2862
2864
|
await this.loadMarkets();
|
|
@@ -2889,6 +2891,10 @@ export default class bingx extends Exchange {
|
|
|
2889
2891
|
response = await this.swapV2PrivatePostTradeBatchOrders(request);
|
|
2890
2892
|
}
|
|
2891
2893
|
else {
|
|
2894
|
+
const sync = this.safeBool(params, 'sync', false);
|
|
2895
|
+
if (sync) {
|
|
2896
|
+
request['sync'] = true;
|
|
2897
|
+
}
|
|
2892
2898
|
request['data'] = this.json(ordersRequests);
|
|
2893
2899
|
response = await this.spotV1PrivatePostTradeBatchOrders(request);
|
|
2894
2900
|
}
|
|
@@ -3342,7 +3348,7 @@ export default class bingx extends Exchange {
|
|
|
3342
3348
|
'cost': Precise.stringAbs(feeCost),
|
|
3343
3349
|
},
|
|
3344
3350
|
'trades': undefined,
|
|
3345
|
-
'reduceOnly': this.
|
|
3351
|
+
'reduceOnly': this.safeBool2(order, 'reduceOnly', 'ro'),
|
|
3346
3352
|
}, market);
|
|
3347
3353
|
}
|
|
3348
3354
|
parseOrderStatus(status) {
|
package/js/src/bitget.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Exchange from './abstract/bitget.js';
|
|
2
|
-
import type { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Balances, Str, Transaction, Ticker, OrderBook, Tickers, Market, Strings, Currency, Position, Liquidation, TransferEntry, Leverage, MarginMode, Num, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRate, Dict, LeverageTier, int, LedgerEntry, FundingRate, DepositAddress, LongShortRatio } from './base/types.js';
|
|
2
|
+
import type { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Balances, Str, Transaction, Ticker, OrderBook, Tickers, Market, Strings, Currency, Position, Liquidation, TransferEntry, Leverage, MarginMode, Num, MarginModification, TradingFeeInterface, Currencies, TradingFees, Conversion, CrossBorrowRate, IsolatedBorrowRate, Dict, LeverageTier, int, LedgerEntry, FundingRate, DepositAddress, LongShortRatio, BorrowInterest } from './base/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* @class bitget
|
|
5
5
|
* @augments Exchange
|
|
@@ -154,18 +154,8 @@ export default class bitget extends Exchange {
|
|
|
154
154
|
datetime: string;
|
|
155
155
|
info: any;
|
|
156
156
|
};
|
|
157
|
-
fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<
|
|
158
|
-
parseBorrowInterest(info: Dict, market?: Market):
|
|
159
|
-
symbol: string;
|
|
160
|
-
marginMode: string;
|
|
161
|
-
currency: string;
|
|
162
|
-
interest: number;
|
|
163
|
-
interestRate: number;
|
|
164
|
-
amountBorrowed: any;
|
|
165
|
-
timestamp: number;
|
|
166
|
-
datetime: string;
|
|
167
|
-
info: Dict;
|
|
168
|
-
};
|
|
157
|
+
fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
|
|
158
|
+
parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
|
|
169
159
|
closePosition(symbol: string, side?: OrderSide, params?: {}): Promise<Order>;
|
|
170
160
|
closeAllPositions(params?: {}): Promise<Position[]>;
|
|
171
161
|
fetchMarginMode(symbol: string, params?: {}): Promise<MarginMode>;
|
package/js/src/bitget.js
CHANGED
|
@@ -8352,15 +8352,15 @@ export default class bitget extends Exchange {
|
|
|
8352
8352
|
const marginMode = (marketId !== undefined) ? 'isolated' : 'cross';
|
|
8353
8353
|
const timestamp = this.safeInteger(info, 'cTime');
|
|
8354
8354
|
return {
|
|
8355
|
+
'info': info,
|
|
8355
8356
|
'symbol': this.safeString(market, 'symbol'),
|
|
8356
|
-
'marginMode': marginMode,
|
|
8357
8357
|
'currency': this.safeCurrencyCode(this.safeString(info, 'interestCoin')),
|
|
8358
8358
|
'interest': this.safeNumber(info, 'interestAmount'),
|
|
8359
8359
|
'interestRate': this.safeNumber(info, 'dailyInterestRate'),
|
|
8360
8360
|
'amountBorrowed': undefined,
|
|
8361
|
+
'marginMode': marginMode,
|
|
8361
8362
|
'timestamp': timestamp,
|
|
8362
8363
|
'datetime': this.iso8601(timestamp),
|
|
8363
|
-
'info': info,
|
|
8364
8364
|
};
|
|
8365
8365
|
}
|
|
8366
8366
|
async closePosition(symbol, side = undefined, params = {}) {
|
package/js/src/bitmart.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Exchange from './abstract/bitmart.js';
|
|
2
|
-
import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, OrderRequest, int, FundingRate, DepositAddress } from './base/types.js';
|
|
2
|
+
import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, OrderRequest, int, FundingRate, DepositAddress, BorrowInterest } from './base/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* @class bitmart
|
|
5
5
|
* @augments Exchange
|
|
@@ -97,18 +97,8 @@ export default class bitmart extends Exchange {
|
|
|
97
97
|
parseTransferFromAccount(type: any): string;
|
|
98
98
|
parseTransfer(transfer: Dict, currency?: Currency): TransferEntry;
|
|
99
99
|
fetchTransfers(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<TransferEntry[]>;
|
|
100
|
-
fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<
|
|
101
|
-
parseBorrowInterest(info: Dict, market?: Market):
|
|
102
|
-
symbol: string;
|
|
103
|
-
marginMode: string;
|
|
104
|
-
currency: string;
|
|
105
|
-
interest: number;
|
|
106
|
-
interestRate: number;
|
|
107
|
-
amountBorrowed: number;
|
|
108
|
-
timestamp: number;
|
|
109
|
-
datetime: string;
|
|
110
|
-
info: Dict;
|
|
111
|
-
};
|
|
100
|
+
fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
|
|
101
|
+
parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
|
|
112
102
|
fetchOpenInterest(symbol: string, params?: {}): Promise<import("./base/types.js").OpenInterest>;
|
|
113
103
|
parseOpenInterest(interest: any, market?: Market): import("./base/types.js").OpenInterest;
|
|
114
104
|
setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
|
package/js/src/bitmart.js
CHANGED
|
@@ -1858,7 +1858,7 @@ export default class bitmart extends Exchange {
|
|
|
1858
1858
|
}
|
|
1859
1859
|
}
|
|
1860
1860
|
else {
|
|
1861
|
-
const maxLimit =
|
|
1861
|
+
const maxLimit = 500;
|
|
1862
1862
|
if (limit === undefined) {
|
|
1863
1863
|
limit = maxLimit;
|
|
1864
1864
|
}
|
|
@@ -4339,15 +4339,15 @@ export default class bitmart extends Exchange {
|
|
|
4339
4339
|
market = this.safeMarket(marketId, market);
|
|
4340
4340
|
const timestamp = this.safeInteger(info, 'create_time');
|
|
4341
4341
|
return {
|
|
4342
|
+
'info': info,
|
|
4342
4343
|
'symbol': this.safeString(market, 'symbol'),
|
|
4343
|
-
'marginMode': 'isolated',
|
|
4344
4344
|
'currency': this.safeCurrencyCode(this.safeString(info, 'currency')),
|
|
4345
4345
|
'interest': this.safeNumber(info, 'interest_amount'),
|
|
4346
4346
|
'interestRate': this.safeNumber(info, 'hourly_interest'),
|
|
4347
4347
|
'amountBorrowed': this.safeNumber(info, 'borrow_amount'),
|
|
4348
|
+
'marginMode': 'isolated',
|
|
4348
4349
|
'timestamp': timestamp,
|
|
4349
4350
|
'datetime': this.iso8601(timestamp),
|
|
4350
|
-
'info': info,
|
|
4351
4351
|
};
|
|
4352
4352
|
}
|
|
4353
4353
|
async fetchOpenInterest(symbol, params = {}) {
|