ccxt 4.1.49 → 4.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.js +1040 -153
  3. package/dist/ccxt.browser.min.js +6 -6
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/base/Exchange.js +6 -0
  6. package/dist/cjs/src/binance.js +76 -0
  7. package/dist/cjs/src/bybit.js +121 -0
  8. package/dist/cjs/src/cryptocom.js +1 -0
  9. package/dist/cjs/src/delta.js +149 -0
  10. package/dist/cjs/src/deribit.js +132 -0
  11. package/dist/cjs/src/gate.js +102 -4
  12. package/dist/cjs/src/htx.js +313 -135
  13. package/dist/cjs/src/kraken.js +7 -10
  14. package/dist/cjs/src/okx.js +108 -0
  15. package/dist/cjs/src/pro/krakenfutures.js +24 -3
  16. package/js/ccxt.d.ts +3 -3
  17. package/js/ccxt.js +1 -1
  18. package/js/src/abstract/htx.d.ts +1 -1
  19. package/js/src/abstract/huobi.d.ts +1 -1
  20. package/js/src/abstract/huobipro.d.ts +1 -1
  21. package/js/src/abstract/kraken.d.ts +0 -5
  22. package/js/src/base/Exchange.d.ts +4 -2
  23. package/js/src/base/Exchange.js +6 -0
  24. package/js/src/base/types.d.ts +21 -0
  25. package/js/src/binance.d.ts +23 -1
  26. package/js/src/binance.js +76 -0
  27. package/js/src/bybit.d.ts +23 -1
  28. package/js/src/bybit.js +121 -0
  29. package/js/src/cryptocom.js +1 -0
  30. package/js/src/delta.d.ts +23 -1
  31. package/js/src/delta.js +149 -0
  32. package/js/src/deribit.d.ts +23 -1
  33. package/js/src/deribit.js +132 -0
  34. package/js/src/gate.d.ts +23 -1
  35. package/js/src/gate.js +102 -4
  36. package/js/src/htx.d.ts +4 -3
  37. package/js/src/htx.js +313 -135
  38. package/js/src/kraken.js +7 -10
  39. package/js/src/okx.d.ts +23 -1
  40. package/js/src/okx.js +108 -0
  41. package/js/src/pro/krakenfutures.js +24 -3
  42. package/package.json +1 -1
  43. package/skip-tests.json +2 -0
package/js/src/okx.js CHANGED
@@ -71,6 +71,7 @@ export default class okx extends Exchange {
71
71
  'fetchFundingRate': true,
72
72
  'fetchFundingRateHistory': true,
73
73
  'fetchFundingRates': false,
74
+ 'fetchGreeks': true,
74
75
  'fetchIndexOHLCV': true,
75
76
  'fetchL3OrderBook': false,
76
77
  'fetchLedger': true,
@@ -6948,6 +6949,113 @@ export default class okx extends Exchange {
6948
6949
  const underlyings = this.safeValue(response, 'data', []);
6949
6950
  return underlyings[0];
6950
6951
  }
6952
+ async fetchGreeks(symbol, params = {}) {
6953
+ /**
6954
+ * @method
6955
+ * @name okx#fetchGreeks
6956
+ * @description fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
6957
+ * @see https://www.okx.com/docs-v5/en/#public-data-rest-api-get-option-market-data
6958
+ * @param {string} symbol unified symbol of the market to fetch greeks for
6959
+ * @param {object} [params] extra parameters specific to the okx api endpoint
6960
+ * @returns {object} a [greeks structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#greeks-structure}
6961
+ */
6962
+ await this.loadMarkets();
6963
+ const market = this.market(symbol);
6964
+ const marketId = market['id'];
6965
+ const optionParts = marketId.split('-');
6966
+ const request = {
6967
+ 'uly': market['info']['uly'],
6968
+ 'instFamily': market['info']['instFamily'],
6969
+ 'expTime': this.safeString(optionParts, 2),
6970
+ };
6971
+ const response = await this.publicGetPublicOptSummary(this.extend(request, params));
6972
+ //
6973
+ // {
6974
+ // "code": "0",
6975
+ // "data": [
6976
+ // {
6977
+ // "askVol": "0",
6978
+ // "bidVol": "0",
6979
+ // "delta": "0.5105464486882039",
6980
+ // "deltaBS": "0.7325502184143025",
6981
+ // "fwdPx": "37675.80158694987186",
6982
+ // "gamma": "-0.13183515090501083",
6983
+ // "gammaBS": "0.000024139685826358558",
6984
+ // "instId": "BTC-USD-240329-32000-C",
6985
+ // "instType": "OPTION",
6986
+ // "lever": "4.504428015946619",
6987
+ // "markVol": "0.5916253554539876",
6988
+ // "realVol": "0",
6989
+ // "theta": "-0.0004202992014012855",
6990
+ // "thetaBS": "-18.52354631567909",
6991
+ // "ts": "1699586421976",
6992
+ // "uly": "BTC-USD",
6993
+ // "vega": "0.0020207455080045846",
6994
+ // "vegaBS": "74.44022302387287",
6995
+ // "volLv": "0.5948549730405797"
6996
+ // },
6997
+ // ],
6998
+ // "msg": ""
6999
+ // }
7000
+ //
7001
+ const data = this.safeValue(response, 'data', []);
7002
+ for (let i = 0; i < data.length; i++) {
7003
+ const entry = data[i];
7004
+ const entryMarketId = this.safeString(entry, 'instId');
7005
+ if (entryMarketId === marketId) {
7006
+ return this.parseGreeks(entry, market);
7007
+ }
7008
+ }
7009
+ }
7010
+ parseGreeks(greeks, market = undefined) {
7011
+ //
7012
+ // {
7013
+ // "askVol": "0",
7014
+ // "bidVol": "0",
7015
+ // "delta": "0.5105464486882039",
7016
+ // "deltaBS": "0.7325502184143025",
7017
+ // "fwdPx": "37675.80158694987186",
7018
+ // "gamma": "-0.13183515090501083",
7019
+ // "gammaBS": "0.000024139685826358558",
7020
+ // "instId": "BTC-USD-240329-32000-C",
7021
+ // "instType": "OPTION",
7022
+ // "lever": "4.504428015946619",
7023
+ // "markVol": "0.5916253554539876",
7024
+ // "realVol": "0",
7025
+ // "theta": "-0.0004202992014012855",
7026
+ // "thetaBS": "-18.52354631567909",
7027
+ // "ts": "1699586421976",
7028
+ // "uly": "BTC-USD",
7029
+ // "vega": "0.0020207455080045846",
7030
+ // "vegaBS": "74.44022302387287",
7031
+ // "volLv": "0.5948549730405797"
7032
+ // }
7033
+ //
7034
+ const timestamp = this.safeInteger(greeks, 'ts');
7035
+ const marketId = this.safeString(greeks, 'instId');
7036
+ const symbol = this.safeSymbol(marketId, market);
7037
+ return {
7038
+ 'symbol': symbol,
7039
+ 'timestamp': timestamp,
7040
+ 'datetime': this.iso8601(timestamp),
7041
+ 'delta': this.safeNumber(greeks, 'delta'),
7042
+ 'gamma': this.safeNumber(greeks, 'gamma'),
7043
+ 'theta': this.safeNumber(greeks, 'theta'),
7044
+ 'vega': this.safeNumber(greeks, 'vega'),
7045
+ 'rho': undefined,
7046
+ 'bidSize': undefined,
7047
+ 'askSize': undefined,
7048
+ 'bidImpliedVolatility': this.safeNumber(greeks, 'bidVol'),
7049
+ 'askImpliedVolatility': this.safeNumber(greeks, 'askVol'),
7050
+ 'markImpliedVolatility': this.safeNumber(greeks, 'markVol'),
7051
+ 'bidPrice': undefined,
7052
+ 'askPrice': undefined,
7053
+ 'markPrice': undefined,
7054
+ 'lastPrice': undefined,
7055
+ 'underlyingPrice': undefined,
7056
+ 'info': greeks,
7057
+ };
7058
+ }
6951
7059
  handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
6952
7060
  if (!response) {
6953
7061
  return undefined; // fallback to default error handler
@@ -615,6 +615,25 @@ export default class krakenfutures extends krakenfuturesRest {
615
615
  // "reason": "cancelled_by_user"
616
616
  // }
617
617
  //
618
+ // {
619
+ // feed: 'open_orders',
620
+ // order: {
621
+ // instrument: 'PF_XBTUSD',
622
+ // time: 1698159920097,
623
+ // last_update_time: 1699835622988,
624
+ // qty: 1.1,
625
+ // filled: 0,
626
+ // limit_price: 20000,
627
+ // stop_price: 0,
628
+ // type: 'limit',
629
+ // order_id: '0eaf02b0-855d-4451-a3b7-e2b3070c1fa4',
630
+ // direction: 0,
631
+ // reduce_only: false
632
+ // },
633
+ // is_cancel: false,
634
+ // reason: 'edited_by_user'
635
+ // }
636
+ //
618
637
  let orders = this.orders;
619
638
  if (orders === undefined) {
620
639
  const limit = this.safeInteger(this.options, 'ordersLimit');
@@ -629,7 +648,8 @@ export default class krakenfutures extends krakenfuturesRest {
629
648
  const orderId = this.safeString(order, 'order_id');
630
649
  const previousOrders = this.safeValue(orders.hashmap, symbol, {});
631
650
  const previousOrder = this.safeValue(previousOrders, orderId);
632
- if (previousOrder === undefined) {
651
+ const reason = this.safeString(message, 'reason');
652
+ if ((previousOrder === undefined) || (reason === 'edited_by_user')) {
633
653
  const parsed = this.parseWsOrder(order);
634
654
  orders.append(parsed);
635
655
  client.resolve(orders, messageHash);
@@ -655,9 +675,10 @@ export default class krakenfutures extends krakenfuturesRest {
655
675
  }
656
676
  previousOrder['cost'] = totalCost;
657
677
  if (previousOrder['filled'] !== undefined) {
658
- previousOrder['filled'] = Precise.stringAdd(previousOrder['filled'], this.numberToString(trade['amount']));
678
+ const stringOrderFilled = this.numberToString(previousOrder['filled']);
679
+ previousOrder['filled'] = Precise.stringAdd(stringOrderFilled, this.numberToString(trade['amount']));
659
680
  if (previousOrder['amount'] !== undefined) {
660
- previousOrder['remaining'] = Precise.stringSub(previousOrder['amount'], previousOrder['filled']);
681
+ previousOrder['remaining'] = Precise.stringSub(this.numberToString(previousOrder['amount']), stringOrderFilled);
661
682
  }
662
683
  }
663
684
  if (previousOrder['fee'] === undefined) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.1.49",
3
+ "version": "4.1.51",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 130+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.js",
6
6
  "type": "module",
package/skip-tests.json CHANGED
@@ -124,6 +124,8 @@
124
124
  }
125
125
  },
126
126
  "bit2c": {
127
+ "skip": "temporary certificate issues",
128
+ "until": "2023-11-25",
127
129
  "skipMethods": {
128
130
  "loadMarkets": {
129
131
  "precision": "not provided",