ccxt 4.4.92 → 4.4.94
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 +3 -3
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/ascendex.js +9 -8
- package/dist/cjs/src/base/Exchange.js +118 -33
- package/dist/cjs/src/binance.js +44 -1
- package/dist/cjs/src/bitmex.js +3 -3
- package/dist/cjs/src/bybit.js +85 -10
- package/dist/cjs/src/coinbase.js +3 -1
- package/dist/cjs/src/coinbaseexchange.js +53 -0
- package/dist/cjs/src/coincheck.js +47 -4
- package/dist/cjs/src/coinex.js +19 -14
- package/dist/cjs/src/coinmetro.js +16 -3
- package/dist/cjs/src/cryptomus.js +30 -53
- package/dist/cjs/src/deribit.js +6 -6
- package/dist/cjs/src/exmo.js +66 -61
- package/dist/cjs/src/htx.js +7 -1
- package/dist/cjs/src/hyperliquid.js +134 -33
- package/dist/cjs/src/kucoin.js +13 -15
- package/dist/cjs/src/latoken.js +19 -74
- package/dist/cjs/src/lbank.js +2 -2
- package/dist/cjs/src/okx.js +169 -4
- package/dist/cjs/src/paradex.js +54 -0
- package/dist/cjs/src/phemex.js +3 -3
- package/dist/cjs/src/pro/bitstamp.js +55 -16
- package/dist/cjs/src/pro/bybit.js +2 -1
- package/dist/cjs/src/wavesexchange.js +15 -2
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/ascendex.js +9 -8
- package/js/src/base/Exchange.d.ts +3 -1
- package/js/src/base/Exchange.js +118 -33
- package/js/src/binance.d.ts +10 -0
- package/js/src/binance.js +44 -1
- package/js/src/bitmex.d.ts +1 -1
- package/js/src/bitmex.js +3 -3
- package/js/src/bybit.d.ts +12 -1
- package/js/src/bybit.js +85 -10
- package/js/src/coinbase.js +4 -2
- package/js/src/coinbaseexchange.js +53 -0
- package/js/src/coincheck.js +48 -5
- package/js/src/coinex.js +16 -13
- package/js/src/coinmetro.js +16 -3
- package/js/src/cryptomus.js +30 -53
- package/js/src/deribit.js +6 -6
- package/js/src/exmo.js +66 -61
- package/js/src/htx.js +7 -1
- package/js/src/hyperliquid.d.ts +31 -0
- package/js/src/hyperliquid.js +134 -33
- package/js/src/kucoin.js +13 -15
- package/js/src/latoken.d.ts +0 -1
- package/js/src/latoken.js +19 -74
- package/js/src/lbank.js +2 -2
- package/js/src/okx.d.ts +12 -0
- package/js/src/okx.js +169 -4
- package/js/src/paradex.d.ts +10 -0
- package/js/src/paradex.js +54 -0
- package/js/src/phemex.js +3 -3
- package/js/src/pro/bitstamp.js +55 -16
- package/js/src/pro/bybit.js +2 -1
- package/js/src/wavesexchange.js +15 -2
- package/package.json +1 -1
package/js/src/bybit.js
CHANGED
|
@@ -60,6 +60,7 @@ export default class bybit extends Exchange {
|
|
|
60
60
|
'createTriggerOrder': true,
|
|
61
61
|
'editOrder': true,
|
|
62
62
|
'editOrders': true,
|
|
63
|
+
'fetchAllGreeks': true,
|
|
63
64
|
'fetchBalance': true,
|
|
64
65
|
'fetchBidsAsks': 'emulated',
|
|
65
66
|
'fetchBorrowInterest': false,
|
|
@@ -1158,6 +1159,7 @@ export default class bybit extends Exchange {
|
|
|
1158
1159
|
'4h': '4h',
|
|
1159
1160
|
'1d': '1d',
|
|
1160
1161
|
},
|
|
1162
|
+
'useMarkPriceForPositionCollateral': false, // use mark price for position collateral
|
|
1161
1163
|
},
|
|
1162
1164
|
'features': {
|
|
1163
1165
|
'default': {
|
|
@@ -3887,7 +3889,7 @@ export default class bybit extends Exchange {
|
|
|
3887
3889
|
* @param {int} [params.isLeverage] *unified spot only* false then spot trading true then margin trading
|
|
3888
3890
|
* @param {string} [params.tpslMode] *contract only* 'full' or 'partial'
|
|
3889
3891
|
* @param {string} [params.mmp] *option only* market maker protection
|
|
3890
|
-
* @param {string} [params.triggerDirection] *contract only* the direction for trigger orders, '
|
|
3892
|
+
* @param {string} [params.triggerDirection] *contract only* the direction for trigger orders, 'ascending' or 'descending'
|
|
3891
3893
|
* @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
|
|
3892
3894
|
* @param {float} [params.stopLossPrice] The price at which a stop loss order is triggered at
|
|
3893
3895
|
* @param {float} [params.takeProfitPrice] The price at which a take profit order is triggered at
|
|
@@ -3912,7 +3914,7 @@ export default class bybit extends Exchange {
|
|
|
3912
3914
|
const isTakeProfit = takeProfitPrice !== undefined;
|
|
3913
3915
|
const orderRequest = this.createOrderRequest(symbol, type, side, amount, price, params, enableUnifiedAccount);
|
|
3914
3916
|
let defaultMethod = undefined;
|
|
3915
|
-
if (isTrailingAmountOrder || isStopLoss || isTakeProfit) {
|
|
3917
|
+
if ((isTrailingAmountOrder || isStopLoss || isTakeProfit) && !market['spot']) {
|
|
3916
3918
|
defaultMethod = 'privatePostV5PositionTradingStop';
|
|
3917
3919
|
}
|
|
3918
3920
|
else {
|
|
@@ -3993,7 +3995,7 @@ export default class bybit extends Exchange {
|
|
|
3993
3995
|
const isLimit = lowerCaseType === 'limit';
|
|
3994
3996
|
const isBuy = side === 'buy';
|
|
3995
3997
|
let defaultMethod = undefined;
|
|
3996
|
-
if (isTrailingAmountOrder || isStopLossTriggerOrder || isTakeProfitTriggerOrder) {
|
|
3998
|
+
if ((isTrailingAmountOrder || isStopLossTriggerOrder || isTakeProfitTriggerOrder) && !market['spot']) {
|
|
3997
3999
|
defaultMethod = 'privatePostV5PositionTradingStop';
|
|
3998
4000
|
}
|
|
3999
4001
|
else {
|
|
@@ -4142,9 +4144,9 @@ export default class bybit extends Exchange {
|
|
|
4142
4144
|
}
|
|
4143
4145
|
else {
|
|
4144
4146
|
if (triggerDirection === undefined) {
|
|
4145
|
-
throw new ArgumentsRequired(this.id + ' stop/trigger orders require a triggerDirection parameter, either "
|
|
4147
|
+
throw new ArgumentsRequired(this.id + ' stop/trigger orders require a triggerDirection parameter, either "ascending" or "descending" to determine the direction of the trigger.');
|
|
4146
4148
|
}
|
|
4147
|
-
const isAsending = ((triggerDirection === 'above') || (triggerDirection === '1'));
|
|
4149
|
+
const isAsending = ((triggerDirection === 'ascending') || (triggerDirection === 'above') || (triggerDirection === '1'));
|
|
4148
4150
|
request['triggerDirection'] = isAsending ? 1 : 2;
|
|
4149
4151
|
}
|
|
4150
4152
|
request['triggerPrice'] = this.getPrice(symbol, triggerPrice);
|
|
@@ -6556,12 +6558,14 @@ export default class bybit extends Exchange {
|
|
|
6556
6558
|
}
|
|
6557
6559
|
let collateralString = this.safeString(position, 'positionBalance');
|
|
6558
6560
|
const entryPrice = this.omitZero(this.safeStringN(position, ['entryPrice', 'avgPrice', 'avgEntryPrice']));
|
|
6561
|
+
const markPrice = this.safeString(position, 'markPrice');
|
|
6559
6562
|
const liquidationPrice = this.omitZero(this.safeString(position, 'liqPrice'));
|
|
6560
6563
|
const leverage = this.safeString(position, 'leverage');
|
|
6561
6564
|
if (liquidationPrice !== undefined) {
|
|
6562
6565
|
if (market['settle'] === 'USDC') {
|
|
6563
6566
|
// (Entry price - Liq price) * Contracts + Maintenance Margin + (unrealised pnl) = Collateral
|
|
6564
|
-
const
|
|
6567
|
+
const price = this.safeBool(this.options, 'useMarkPriceForPositionCollateral', false) ? markPrice : entryPrice;
|
|
6568
|
+
const difference = Precise.stringAbs(Precise.stringSub(price, liquidationPrice));
|
|
6565
6569
|
collateralString = Precise.stringAdd(Precise.stringAdd(Precise.stringMul(difference, size), maintenanceMarginString), unrealisedPnl);
|
|
6566
6570
|
}
|
|
6567
6571
|
else {
|
|
@@ -6617,7 +6621,7 @@ export default class bybit extends Exchange {
|
|
|
6617
6621
|
'contractSize': this.safeNumber(market, 'contractSize'),
|
|
6618
6622
|
'marginRatio': this.parseNumber(marginRatio),
|
|
6619
6623
|
'liquidationPrice': this.parseNumber(liquidationPrice),
|
|
6620
|
-
'markPrice': this.
|
|
6624
|
+
'markPrice': this.parseNumber(markPrice),
|
|
6621
6625
|
'lastPrice': this.safeNumber(position, 'avgExitPrice'),
|
|
6622
6626
|
'collateral': this.parseNumber(collateralString),
|
|
6623
6627
|
'marginMode': marginMode,
|
|
@@ -8037,6 +8041,77 @@ export default class bybit extends Exchange {
|
|
|
8037
8041
|
'datetime': this.iso8601(timestamp),
|
|
8038
8042
|
});
|
|
8039
8043
|
}
|
|
8044
|
+
/**
|
|
8045
|
+
* @method
|
|
8046
|
+
* @name bybit#fetchAllGreeks
|
|
8047
|
+
* @description fetches all option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
|
|
8048
|
+
* @see https://bybit-exchange.github.io/docs/api-explorer/v5/market/tickers
|
|
8049
|
+
* @param {string[]} [symbols] unified symbols of the markets to fetch greeks for, all markets are returned if not assigned
|
|
8050
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
8051
|
+
* @param {string} [params.baseCoin] the baseCoin of the symbol, default is BTC
|
|
8052
|
+
* @returns {object} a [greeks structure]{@link https://docs.ccxt.com/#/?id=greeks-structure}
|
|
8053
|
+
*/
|
|
8054
|
+
async fetchAllGreeks(symbols = undefined, params = {}) {
|
|
8055
|
+
await this.loadMarkets();
|
|
8056
|
+
symbols = this.marketSymbols(symbols, undefined, true, true, true);
|
|
8057
|
+
const baseCoin = this.safeString(params, 'baseCoin', 'BTC');
|
|
8058
|
+
const request = {
|
|
8059
|
+
'category': 'option',
|
|
8060
|
+
'baseCoin': baseCoin,
|
|
8061
|
+
};
|
|
8062
|
+
let market = undefined;
|
|
8063
|
+
if (symbols !== undefined) {
|
|
8064
|
+
const symbolsLength = symbols.length;
|
|
8065
|
+
if (symbolsLength === 1) {
|
|
8066
|
+
market = this.market(symbols[0]);
|
|
8067
|
+
request['symbol'] = market['id'];
|
|
8068
|
+
}
|
|
8069
|
+
}
|
|
8070
|
+
const response = await this.publicGetV5MarketTickers(this.extend(request, params));
|
|
8071
|
+
//
|
|
8072
|
+
// {
|
|
8073
|
+
// "retCode": 0,
|
|
8074
|
+
// "retMsg": "SUCCESS",
|
|
8075
|
+
// "result": {
|
|
8076
|
+
// "category": "option",
|
|
8077
|
+
// "list": [
|
|
8078
|
+
// {
|
|
8079
|
+
// "symbol": "BTC-26JAN24-39000-C",
|
|
8080
|
+
// "bid1Price": "3205",
|
|
8081
|
+
// "bid1Size": "7.1",
|
|
8082
|
+
// "bid1Iv": "0.5478",
|
|
8083
|
+
// "ask1Price": "3315",
|
|
8084
|
+
// "ask1Size": "1.98",
|
|
8085
|
+
// "ask1Iv": "0.5638",
|
|
8086
|
+
// "lastPrice": "3230",
|
|
8087
|
+
// "highPrice24h": "3255",
|
|
8088
|
+
// "lowPrice24h": "3200",
|
|
8089
|
+
// "markPrice": "3273.02263032",
|
|
8090
|
+
// "indexPrice": "36790.96",
|
|
8091
|
+
// "markIv": "0.5577",
|
|
8092
|
+
// "underlyingPrice": "37649.67254894",
|
|
8093
|
+
// "openInterest": "19.67",
|
|
8094
|
+
// "turnover24h": "170140.33875912",
|
|
8095
|
+
// "volume24h": "4.56",
|
|
8096
|
+
// "totalVolume": "22",
|
|
8097
|
+
// "totalTurnover": "789305",
|
|
8098
|
+
// "delta": "0.49640971",
|
|
8099
|
+
// "gamma": "0.00004131",
|
|
8100
|
+
// "vega": "69.08651675",
|
|
8101
|
+
// "theta": "-24.9443226",
|
|
8102
|
+
// "predictedDeliveryPrice": "0",
|
|
8103
|
+
// "change24h": "0.18532111"
|
|
8104
|
+
// }
|
|
8105
|
+
// ]
|
|
8106
|
+
// },
|
|
8107
|
+
// "retExtInfo": {},
|
|
8108
|
+
// "time": 1699584008326
|
|
8109
|
+
// }
|
|
8110
|
+
//
|
|
8111
|
+
const result = this.safeDict(response, 'result', {});
|
|
8112
|
+
const data = this.safeList(result, 'list', []);
|
|
8113
|
+
return this.parseAllGreeks(data, symbols);
|
|
8114
|
+
}
|
|
8040
8115
|
parseGreeks(greeks, market = undefined) {
|
|
8041
8116
|
//
|
|
8042
8117
|
// {
|
|
@@ -9182,7 +9257,7 @@ export default class bybit extends Exchange {
|
|
|
9182
9257
|
}
|
|
9183
9258
|
else {
|
|
9184
9259
|
authFull = auth_base + queryEncoded;
|
|
9185
|
-
url += '?' +
|
|
9260
|
+
url += '?' + queryEncoded;
|
|
9186
9261
|
}
|
|
9187
9262
|
let signature = undefined;
|
|
9188
9263
|
if (this.secret.indexOf('PRIVATE KEY') > -1) {
|
|
@@ -9200,7 +9275,7 @@ export default class bybit extends Exchange {
|
|
|
9200
9275
|
'timestamp': timestamp,
|
|
9201
9276
|
});
|
|
9202
9277
|
const sortedQuery = this.keysort(query);
|
|
9203
|
-
const auth = this.rawencode(sortedQuery);
|
|
9278
|
+
const auth = this.rawencode(sortedQuery, true);
|
|
9204
9279
|
let signature = undefined;
|
|
9205
9280
|
if (this.secret.indexOf('PRIVATE KEY') > -1) {
|
|
9206
9281
|
signature = rsa(auth, this.secret, sha256);
|
|
@@ -9227,7 +9302,7 @@ export default class bybit extends Exchange {
|
|
|
9227
9302
|
}
|
|
9228
9303
|
}
|
|
9229
9304
|
else {
|
|
9230
|
-
url += '?' + this.rawencode(sortedQuery);
|
|
9305
|
+
url += '?' + this.rawencode(sortedQuery, true);
|
|
9231
9306
|
url += '&sign=' + signature;
|
|
9232
9307
|
}
|
|
9233
9308
|
}
|
package/js/src/coinbase.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ----------------------------------------------------------------------------
|
|
8
8
|
import Exchange from './abstract/coinbase.js';
|
|
9
|
-
import { ExchangeError, ArgumentsRequired, AuthenticationError, BadRequest, InvalidOrder, NotSupported, OrderNotFound, RateLimitExceeded, InvalidNonce, PermissionDenied } from './base/errors.js';
|
|
9
|
+
import { ExchangeError, ArgumentsRequired, AuthenticationError, BadRequest, InvalidOrder, NotSupported, OrderNotFound, RateLimitExceeded, InvalidNonce, PermissionDenied, InsufficientFunds } from './base/errors.js';
|
|
10
10
|
import { Precise } from './base/Precise.js';
|
|
11
11
|
import { TICK_SIZE } from './base/functions/number.js';
|
|
12
12
|
import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
|
|
@@ -325,12 +325,14 @@ export default class coinbase extends Exchange {
|
|
|
325
325
|
'rate_limit_exceeded': RateLimitExceeded,
|
|
326
326
|
'internal_server_error': ExchangeError,
|
|
327
327
|
'UNSUPPORTED_ORDER_CONFIGURATION': BadRequest,
|
|
328
|
-
'INSUFFICIENT_FUND':
|
|
328
|
+
'INSUFFICIENT_FUND': InsufficientFunds,
|
|
329
329
|
'PERMISSION_DENIED': PermissionDenied,
|
|
330
330
|
'INVALID_ARGUMENT': BadRequest,
|
|
331
331
|
'PREVIEW_STOP_PRICE_ABOVE_LAST_TRADE_PRICE': InvalidOrder,
|
|
332
|
+
'PREVIEW_INSUFFICIENT_FUND': InsufficientFunds,
|
|
332
333
|
},
|
|
333
334
|
'broad': {
|
|
335
|
+
'Insufficient balance in source account': InsufficientFunds,
|
|
334
336
|
'request timestamp expired': InvalidNonce,
|
|
335
337
|
'order with this orderID was not found': OrderNotFound, // {"error":"unknown","error_details":"order with this orderID was not found","message":"order with this orderID was not found"}
|
|
336
338
|
},
|
|
@@ -31,31 +31,73 @@ export default class coinbaseexchange extends Exchange {
|
|
|
31
31
|
'swap': false,
|
|
32
32
|
'future': false,
|
|
33
33
|
'option': false,
|
|
34
|
+
'addMargin': false,
|
|
35
|
+
'borrowCrossMargin': false,
|
|
36
|
+
'borrowIsolatedMargin': false,
|
|
37
|
+
'borrowMargin': false,
|
|
34
38
|
'cancelAllOrders': true,
|
|
35
39
|
'cancelOrder': true,
|
|
40
|
+
'closeAllPositions': false,
|
|
41
|
+
'closePosition': false,
|
|
36
42
|
'createDepositAddress': true,
|
|
37
43
|
'createOrder': true,
|
|
44
|
+
'createOrderWithTakeProfitAndStopLoss': false,
|
|
45
|
+
'createOrderWithTakeProfitAndStopLossWs': false,
|
|
46
|
+
'createPostOnlyOrder': false,
|
|
38
47
|
'createReduceOnlyOrder': false,
|
|
39
48
|
'createStopLimitOrder': true,
|
|
40
49
|
'createStopMarketOrder': true,
|
|
41
50
|
'createStopOrder': true,
|
|
42
51
|
'fetchAccounts': true,
|
|
43
52
|
'fetchBalance': true,
|
|
53
|
+
'fetchBorrowInterest': false,
|
|
54
|
+
'fetchBorrowRate': false,
|
|
55
|
+
'fetchBorrowRateHistories': false,
|
|
56
|
+
'fetchBorrowRateHistory': false,
|
|
57
|
+
'fetchBorrowRates': false,
|
|
58
|
+
'fetchBorrowRatesPerSymbol': false,
|
|
44
59
|
'fetchClosedOrders': true,
|
|
60
|
+
'fetchCrossBorrowRate': false,
|
|
61
|
+
'fetchCrossBorrowRates': false,
|
|
45
62
|
'fetchCurrencies': true,
|
|
46
63
|
'fetchDepositAddress': false,
|
|
47
64
|
'fetchDeposits': true,
|
|
48
65
|
'fetchDepositsWithdrawals': true,
|
|
49
66
|
'fetchFundingHistory': false,
|
|
67
|
+
'fetchFundingInterval': false,
|
|
68
|
+
'fetchFundingIntervals': false,
|
|
50
69
|
'fetchFundingRate': false,
|
|
51
70
|
'fetchFundingRateHistory': false,
|
|
52
71
|
'fetchFundingRates': false,
|
|
72
|
+
'fetchGreeks': false,
|
|
73
|
+
'fetchIndexOHLCV': false,
|
|
74
|
+
'fetchIsolatedBorrowRate': false,
|
|
75
|
+
'fetchIsolatedBorrowRates': false,
|
|
76
|
+
'fetchIsolatedPositions': false,
|
|
53
77
|
'fetchLedger': true,
|
|
78
|
+
'fetchLeverage': false,
|
|
79
|
+
'fetchLeverages': false,
|
|
80
|
+
'fetchLeverageTiers': false,
|
|
81
|
+
'fetchLiquidations': false,
|
|
82
|
+
'fetchLongShortRatio': false,
|
|
83
|
+
'fetchLongShortRatioHistory': false,
|
|
84
|
+
'fetchMarginAdjustmentHistory': false,
|
|
54
85
|
'fetchMarginMode': false,
|
|
86
|
+
'fetchMarginModes': false,
|
|
87
|
+
'fetchMarketLeverageTiers': false,
|
|
55
88
|
'fetchMarkets': true,
|
|
89
|
+
'fetchMarkOHLCV': false,
|
|
90
|
+
'fetchMarkPrices': false,
|
|
91
|
+
'fetchMyLiquidations': false,
|
|
92
|
+
'fetchMySettlementHistory': false,
|
|
56
93
|
'fetchMyTrades': true,
|
|
57
94
|
'fetchOHLCV': true,
|
|
95
|
+
'fetchOpenInterest': false,
|
|
96
|
+
'fetchOpenInterestHistory': false,
|
|
97
|
+
'fetchOpenInterests': false,
|
|
58
98
|
'fetchOpenOrders': true,
|
|
99
|
+
'fetchOption': false,
|
|
100
|
+
'fetchOptionChain': false,
|
|
59
101
|
'fetchOrder': true,
|
|
60
102
|
'fetchOrderBook': true,
|
|
61
103
|
'fetchOrders': true,
|
|
@@ -67,6 +109,8 @@ export default class coinbaseexchange extends Exchange {
|
|
|
67
109
|
'fetchPositionsForSymbol': false,
|
|
68
110
|
'fetchPositionsHistory': false,
|
|
69
111
|
'fetchPositionsRisk': false,
|
|
112
|
+
'fetchPremiumIndexOHLCV': false,
|
|
113
|
+
'fetchSettlementHistory': false,
|
|
70
114
|
'fetchTicker': true,
|
|
71
115
|
'fetchTickers': true,
|
|
72
116
|
'fetchTime': true,
|
|
@@ -74,7 +118,16 @@ export default class coinbaseexchange extends Exchange {
|
|
|
74
118
|
'fetchTradingFee': false,
|
|
75
119
|
'fetchTradingFees': true,
|
|
76
120
|
'fetchTransactions': 'emulated',
|
|
121
|
+
'fetchVolatilityHistory': false,
|
|
77
122
|
'fetchWithdrawals': true,
|
|
123
|
+
'reduceMargin': false,
|
|
124
|
+
'repayCrossMargin': false,
|
|
125
|
+
'repayIsolatedMargin': false,
|
|
126
|
+
'repayMargin': false,
|
|
127
|
+
'setLeverage': false,
|
|
128
|
+
'setMargin': false,
|
|
129
|
+
'setMarginMode': false,
|
|
130
|
+
'setPositionMode': false,
|
|
78
131
|
'withdraw': true,
|
|
79
132
|
},
|
|
80
133
|
'timeframes': {
|
package/js/src/coincheck.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
import Exchange from './abstract/coincheck.js';
|
|
9
|
-
import { BadSymbol, ExchangeError, AuthenticationError } from './base/errors.js';
|
|
9
|
+
import { BadSymbol, ExchangeError, AuthenticationError, ArgumentsRequired } from './base/errors.js';
|
|
10
10
|
import { TICK_SIZE } from './base/functions/number.js';
|
|
11
11
|
import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
@@ -29,30 +29,59 @@ export default class coincheck extends Exchange {
|
|
|
29
29
|
'future': false,
|
|
30
30
|
'option': false,
|
|
31
31
|
'addMargin': false,
|
|
32
|
+
'borrowCrossMargin': false,
|
|
33
|
+
'borrowIsolatedMargin': false,
|
|
34
|
+
'borrowMargin': false,
|
|
32
35
|
'cancelOrder': true,
|
|
33
36
|
'closeAllPositions': false,
|
|
34
37
|
'closePosition': false,
|
|
35
38
|
'createOrder': true,
|
|
39
|
+
'createOrderWithTakeProfitAndStopLoss': false,
|
|
40
|
+
'createOrderWithTakeProfitAndStopLossWs': false,
|
|
41
|
+
'createPostOnlyOrder': false,
|
|
36
42
|
'createReduceOnlyOrder': false,
|
|
37
43
|
'fetchBalance': true,
|
|
44
|
+
'fetchBorrowInterest': false,
|
|
45
|
+
'fetchBorrowRate': false,
|
|
38
46
|
'fetchBorrowRateHistories': false,
|
|
39
47
|
'fetchBorrowRateHistory': false,
|
|
48
|
+
'fetchBorrowRates': false,
|
|
49
|
+
'fetchBorrowRatesPerSymbol': false,
|
|
40
50
|
'fetchCrossBorrowRate': false,
|
|
41
51
|
'fetchCrossBorrowRates': false,
|
|
42
52
|
'fetchDeposits': true,
|
|
43
53
|
'fetchFundingHistory': false,
|
|
54
|
+
'fetchFundingInterval': false,
|
|
55
|
+
'fetchFundingIntervals': false,
|
|
44
56
|
'fetchFundingRate': false,
|
|
45
57
|
'fetchFundingRateHistory': false,
|
|
46
58
|
'fetchFundingRates': false,
|
|
59
|
+
'fetchGreeks': false,
|
|
47
60
|
'fetchIndexOHLCV': false,
|
|
48
61
|
'fetchIsolatedBorrowRate': false,
|
|
49
62
|
'fetchIsolatedBorrowRates': false,
|
|
63
|
+
'fetchIsolatedPositions': false,
|
|
50
64
|
'fetchLeverage': false,
|
|
65
|
+
'fetchLeverages': false,
|
|
66
|
+
'fetchLeverageTiers': false,
|
|
67
|
+
'fetchLiquidations': false,
|
|
68
|
+
'fetchLongShortRatio': false,
|
|
69
|
+
'fetchLongShortRatioHistory': false,
|
|
70
|
+
'fetchMarginAdjustmentHistory': false,
|
|
51
71
|
'fetchMarginMode': false,
|
|
72
|
+
'fetchMarginModes': false,
|
|
73
|
+
'fetchMarketLeverageTiers': false,
|
|
52
74
|
'fetchMarkOHLCV': false,
|
|
75
|
+
'fetchMarkPrices': false,
|
|
76
|
+
'fetchMyLiquidations': false,
|
|
77
|
+
'fetchMySettlementHistory': false,
|
|
53
78
|
'fetchMyTrades': true,
|
|
79
|
+
'fetchOpenInterest': false,
|
|
54
80
|
'fetchOpenInterestHistory': false,
|
|
81
|
+
'fetchOpenInterests': false,
|
|
55
82
|
'fetchOpenOrders': true,
|
|
83
|
+
'fetchOption': false,
|
|
84
|
+
'fetchOptionChain': false,
|
|
56
85
|
'fetchOrderBook': true,
|
|
57
86
|
'fetchPosition': false,
|
|
58
87
|
'fetchPositionHistory': false,
|
|
@@ -62,13 +91,19 @@ export default class coincheck extends Exchange {
|
|
|
62
91
|
'fetchPositionsHistory': false,
|
|
63
92
|
'fetchPositionsRisk': false,
|
|
64
93
|
'fetchPremiumIndexOHLCV': false,
|
|
94
|
+
'fetchSettlementHistory': false,
|
|
65
95
|
'fetchTicker': true,
|
|
66
96
|
'fetchTrades': true,
|
|
67
97
|
'fetchTradingFee': false,
|
|
68
98
|
'fetchTradingFees': true,
|
|
99
|
+
'fetchVolatilityHistory': false,
|
|
69
100
|
'fetchWithdrawals': true,
|
|
70
101
|
'reduceMargin': false,
|
|
102
|
+
'repayCrossMargin': false,
|
|
103
|
+
'repayIsolatedMargin': false,
|
|
104
|
+
'repayMargin': false,
|
|
71
105
|
'setLeverage': false,
|
|
106
|
+
'setMargin': false,
|
|
72
107
|
'setMarginMode': false,
|
|
73
108
|
'setPositionMode': false,
|
|
74
109
|
'ws': true,
|
|
@@ -648,10 +683,18 @@ export default class coincheck extends Exchange {
|
|
|
648
683
|
'pair': market['id'],
|
|
649
684
|
};
|
|
650
685
|
if (type === 'market') {
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
686
|
+
request['order_type'] = type + '_' + side;
|
|
687
|
+
if (side === 'sell') {
|
|
688
|
+
request['amount'] = amount;
|
|
689
|
+
}
|
|
690
|
+
else {
|
|
691
|
+
const cost = this.safeNumber(params, 'cost');
|
|
692
|
+
params = this.omit(params, 'cost');
|
|
693
|
+
if (cost !== undefined) {
|
|
694
|
+
throw new ArgumentsRequired(this.id + ' createOrder() : you should use "cost" parameter instead of "amount" argument to create market buy orders');
|
|
695
|
+
}
|
|
696
|
+
request['market_buy_amount'] = cost;
|
|
697
|
+
}
|
|
655
698
|
}
|
|
656
699
|
else {
|
|
657
700
|
request['order_type'] = side;
|
package/js/src/coinex.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
import Exchange from './abstract/coinex.js';
|
|
9
|
-
import { ExchangeError, ArgumentsRequired, BadSymbol, InsufficientFunds, OrderNotFound, InvalidOrder, AuthenticationError, PermissionDenied, ExchangeNotAvailable, RequestTimeout, BadRequest, RateLimitExceeded, NotSupported, AccountSuspended } from './base/errors.js';
|
|
9
|
+
import { ExchangeError, ArgumentsRequired, BadSymbol, InsufficientFunds, OrderNotFound, InvalidOrder, AuthenticationError, PermissionDenied, ExchangeNotAvailable, RequestTimeout, BadRequest, RateLimitExceeded, NotSupported, AccountSuspended, OperationFailed } from './base/errors.js';
|
|
10
10
|
import { Precise } from './base/Precise.js';
|
|
11
11
|
import { TICK_SIZE } from './base/functions/number.js';
|
|
12
12
|
import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
|
|
@@ -660,6 +660,7 @@ export default class coinex extends Exchange {
|
|
|
660
660
|
'broad': {
|
|
661
661
|
'ip not allow visit': PermissionDenied,
|
|
662
662
|
'service too busy': ExchangeNotAvailable,
|
|
663
|
+
'Service is not available during funding fee settlement': OperationFailed,
|
|
663
664
|
},
|
|
664
665
|
},
|
|
665
666
|
});
|
|
@@ -787,7 +788,7 @@ export default class coinex extends Exchange {
|
|
|
787
788
|
'max': undefined,
|
|
788
789
|
},
|
|
789
790
|
},
|
|
790
|
-
'networks':
|
|
791
|
+
'networks': networks,
|
|
791
792
|
'type': 'crypto',
|
|
792
793
|
'info': coin,
|
|
793
794
|
});
|
|
@@ -820,17 +821,19 @@ export default class coinex extends Exchange {
|
|
|
820
821
|
// "code": 0,
|
|
821
822
|
// "data": [
|
|
822
823
|
// {
|
|
823
|
-
// "
|
|
824
|
+
// "market": "BTCUSDT",
|
|
825
|
+
// "taker_fee_rate": "0.002",
|
|
826
|
+
// "maker_fee_rate": "0.002",
|
|
827
|
+
// "min_amount": "0.0005",
|
|
828
|
+
// "base_ccy": "BTC",
|
|
829
|
+
// "quote_ccy": "USDT",
|
|
824
830
|
// "base_ccy_precision": 8,
|
|
831
|
+
// "quote_ccy_precision": 2,
|
|
825
832
|
// "is_amm_available": true,
|
|
826
|
-
// "is_margin_available":
|
|
827
|
-
// "
|
|
828
|
-
// "
|
|
829
|
-
//
|
|
830
|
-
// "quote_ccy": "USDT",
|
|
831
|
-
// "quote_ccy_precision": 6,
|
|
832
|
-
// "taker_fee_rate": "0.003"
|
|
833
|
-
// },
|
|
833
|
+
// "is_margin_available": true,
|
|
834
|
+
// "is_pre_trading_available": true,
|
|
835
|
+
// "is_api_trading_available": true
|
|
836
|
+
// }
|
|
834
837
|
// ],
|
|
835
838
|
// "message": "OK"
|
|
836
839
|
// }
|
|
@@ -856,11 +859,11 @@ export default class coinex extends Exchange {
|
|
|
856
859
|
'settleId': undefined,
|
|
857
860
|
'type': 'spot',
|
|
858
861
|
'spot': true,
|
|
859
|
-
'margin':
|
|
862
|
+
'margin': this.safeBool(market, 'is_margin_available'),
|
|
860
863
|
'swap': false,
|
|
861
864
|
'future': false,
|
|
862
865
|
'option': false,
|
|
863
|
-
'active':
|
|
866
|
+
'active': this.safeBool(market, 'is_api_trading_available'),
|
|
864
867
|
'contract': false,
|
|
865
868
|
'linear': undefined,
|
|
866
869
|
'inverse': undefined,
|
package/js/src/coinmetro.js
CHANGED
|
@@ -213,6 +213,7 @@ export default class coinmetro extends Exchange {
|
|
|
213
213
|
'options': {
|
|
214
214
|
'currenciesByIdForParseMarket': undefined,
|
|
215
215
|
'currencyIdsListForParseMarket': ['QRDO'],
|
|
216
|
+
'skippedMarkets': ['VXVUSDT'], // broken markets which do not have enough info in API
|
|
216
217
|
},
|
|
217
218
|
'features': {
|
|
218
219
|
'spot': {
|
|
@@ -438,10 +439,13 @@ export default class coinmetro extends Exchange {
|
|
|
438
439
|
* @returns {object[]} an array of objects representing market data
|
|
439
440
|
*/
|
|
440
441
|
async fetchMarkets(params = {}) {
|
|
441
|
-
const
|
|
442
|
+
const promises = [];
|
|
443
|
+
promises.push(this.publicGetMarkets(params));
|
|
442
444
|
if (this.safeValue(this.options, 'currenciesByIdForParseMarket') === undefined) {
|
|
443
|
-
|
|
445
|
+
promises.push(this.fetchCurrencies());
|
|
444
446
|
}
|
|
447
|
+
const responses = await Promise.all(promises);
|
|
448
|
+
const response = responses[0];
|
|
445
449
|
//
|
|
446
450
|
// [
|
|
447
451
|
// {
|
|
@@ -457,7 +461,16 @@ export default class coinmetro extends Exchange {
|
|
|
457
461
|
// ...
|
|
458
462
|
// ]
|
|
459
463
|
//
|
|
460
|
-
|
|
464
|
+
const skippedMarkets = this.safeList(this.options, 'skippedMarkets', []);
|
|
465
|
+
const result = [];
|
|
466
|
+
for (let i = 0; i < response.length; i++) {
|
|
467
|
+
const market = this.parseMarket(response[i]);
|
|
468
|
+
if (this.inArray(market['id'], skippedMarkets)) {
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
result.push(market);
|
|
472
|
+
}
|
|
473
|
+
return result;
|
|
461
474
|
}
|
|
462
475
|
parseMarket(market) {
|
|
463
476
|
const id = this.safeString(market, 'pair');
|
package/js/src/cryptomus.js
CHANGED
|
@@ -366,68 +366,45 @@ export default class cryptomus extends Exchange {
|
|
|
366
366
|
// }
|
|
367
367
|
//
|
|
368
368
|
const coins = this.safeList(response, 'result');
|
|
369
|
+
const groupedById = this.groupBy(coins, 'currency_code');
|
|
370
|
+
const keys = Object.keys(groupedById);
|
|
369
371
|
const result = {};
|
|
370
|
-
for (let i = 0; i <
|
|
371
|
-
const
|
|
372
|
-
const
|
|
373
|
-
const
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
'
|
|
381
|
-
'
|
|
382
|
-
'deposit': undefined,
|
|
383
|
-
'withdraw': undefined,
|
|
384
|
-
'fee': undefined,
|
|
372
|
+
for (let i = 0; i < keys.length; i++) {
|
|
373
|
+
const id = keys[i];
|
|
374
|
+
const code = this.safeCurrencyCode(id);
|
|
375
|
+
const networks = {};
|
|
376
|
+
const networkEntries = groupedById[id];
|
|
377
|
+
for (let j = 0; j < networkEntries.length; j++) {
|
|
378
|
+
const networkEntry = networkEntries[j];
|
|
379
|
+
const networkId = this.safeString(networkEntry, 'network_code');
|
|
380
|
+
const networkCode = this.networkIdToCode(networkId);
|
|
381
|
+
networks[networkCode] = {
|
|
382
|
+
'id': networkId,
|
|
383
|
+
'network': networkCode,
|
|
385
384
|
'limits': {
|
|
386
385
|
'withdraw': {
|
|
387
|
-
'min':
|
|
388
|
-
'max':
|
|
386
|
+
'min': this.safeNumber(networkEntry, 'min_withdraw'),
|
|
387
|
+
'max': this.safeNumber(networkEntry, 'max_withdraw'),
|
|
389
388
|
},
|
|
390
389
|
'deposit': {
|
|
391
|
-
'min':
|
|
392
|
-
'max':
|
|
390
|
+
'min': this.safeNumber(networkEntry, 'min_deposit'),
|
|
391
|
+
'max': this.safeNumber(networkEntry, 'max_deposit'),
|
|
393
392
|
},
|
|
394
393
|
},
|
|
395
|
-
'
|
|
396
|
-
'
|
|
394
|
+
'active': undefined,
|
|
395
|
+
'deposit': this.safeBool(networkEntry, 'can_withdraw'),
|
|
396
|
+
'withdraw': this.safeBool(networkEntry, 'can_deposit'),
|
|
397
|
+
'fee': undefined,
|
|
398
|
+
'precision': undefined,
|
|
399
|
+
'info': networkEntry,
|
|
397
400
|
};
|
|
398
401
|
}
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
'
|
|
403
|
-
'
|
|
404
|
-
|
|
405
|
-
'withdraw': {
|
|
406
|
-
'min': this.safeNumber(networkEntry, 'min_withdraw'),
|
|
407
|
-
'max': this.safeNumber(networkEntry, 'max_withdraw'),
|
|
408
|
-
},
|
|
409
|
-
'deposit': {
|
|
410
|
-
'min': this.safeNumber(networkEntry, 'min_deposit'),
|
|
411
|
-
'max': this.safeNumber(networkEntry, 'max_deposit'),
|
|
412
|
-
},
|
|
413
|
-
},
|
|
414
|
-
'active': undefined,
|
|
415
|
-
'deposit': this.safeBool(networkEntry, 'can_withdraw'),
|
|
416
|
-
'withdraw': this.safeBool(networkEntry, 'can_deposit'),
|
|
417
|
-
'fee': undefined,
|
|
418
|
-
'precision': undefined,
|
|
419
|
-
'info': networkEntry,
|
|
420
|
-
};
|
|
421
|
-
// add entry in info
|
|
422
|
-
const info = this.safeList(result[code], 'info', []);
|
|
423
|
-
info.push(networkEntry);
|
|
424
|
-
result[code]['info'] = info;
|
|
425
|
-
}
|
|
426
|
-
// only after all entries are formed in currencies, restructure each entry
|
|
427
|
-
const allKeys = Object.keys(result);
|
|
428
|
-
for (let i = 0; i < allKeys.length; i++) {
|
|
429
|
-
const code = allKeys[i];
|
|
430
|
-
result[code] = this.safeCurrencyStructure(result[code]); // this is needed after adding network entry
|
|
402
|
+
result[code] = this.safeCurrencyStructure({
|
|
403
|
+
'id': id,
|
|
404
|
+
'code': code,
|
|
405
|
+
'networks': networks,
|
|
406
|
+
'info': networkEntries,
|
|
407
|
+
});
|
|
431
408
|
}
|
|
432
409
|
return result;
|
|
433
410
|
}
|