ccxt 4.2.14 → 4.2.15

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/dist/cjs/ccxt.js CHANGED
@@ -169,7 +169,7 @@ var woo$1 = require('./src/pro/woo.js');
169
169
 
170
170
  //-----------------------------------------------------------------------------
171
171
  // this is updated by vss.js when building
172
- const version = '4.2.14';
172
+ const version = '4.2.15';
173
173
  Exchange["default"].ccxtVersion = version;
174
174
  const exchanges = {
175
175
  'ace': ace,
@@ -169,7 +169,7 @@ var woo$1 = require('./src/pro/woo.js');
169
169
 
170
170
  //-----------------------------------------------------------------------------
171
171
  // this is updated by vss.js when building
172
- const version = '4.2.13';
172
+ const version = '4.2.14';
173
173
  Exchange["default"].ccxtVersion = version;
174
174
  const exchanges = {
175
175
  'ace': ace,
@@ -49,12 +49,12 @@ class binance extends binance$1 {
49
49
  'createPostOnlyOrder': true,
50
50
  'createReduceOnlyOrder': true,
51
51
  'createStopLimitOrder': true,
52
+ 'createStopLossOrder': true,
52
53
  'createStopMarketOrder': false,
53
54
  'createStopOrder': true,
55
+ 'createTakeProfitOrder': true,
54
56
  'createTrailingPercentOrder': true,
55
57
  'createTriggerOrder': true,
56
- 'createTakeProfitOrder': true,
57
- 'createStopLossOrder': true,
58
58
  'editOrder': true,
59
59
  'fetchAccounts': undefined,
60
60
  'fetchBalance': true,
@@ -36,12 +36,12 @@ class bingx extends bingx$1 {
36
36
  'createMarketSellOrderWithCost': true,
37
37
  'createOrder': true,
38
38
  'createOrders': true,
39
+ 'createOrderWithTakeProfitAndStopLoss': true,
40
+ 'createStopLossOrder': true,
41
+ 'createTakeProfitOrder': true,
39
42
  'createTrailingAmountOrder': true,
40
43
  'createTrailingPercentOrder': true,
41
44
  'createTriggerOrder': true,
42
- 'createTakeProfitOrder': true,
43
- 'createStopLossOrder': true,
44
- 'createOrderWithTakeProfitAndStopLoss': true,
45
45
  'fetchBalance': true,
46
46
  'fetchClosedOrders': true,
47
47
  'fetchCurrencies': true,
@@ -361,6 +361,7 @@ class bingx extends bingx$1 {
361
361
  '80016': errors.OrderNotFound,
362
362
  '80017': errors.OrderNotFound,
363
363
  '100414': errors.AccountSuspended,
364
+ '100419': errors.PermissionDenied,
364
365
  '100437': errors.BadRequest, // {"code":100437,"msg":"The withdrawal amount is lower than the minimum limit, please re-enter.","timestamp":1689258588845}
365
366
  },
366
367
  'broad': {},
@@ -42,12 +42,12 @@ class bitget extends bitget$1 {
42
42
  'createMarketSellOrderWithCost': false,
43
43
  'createOrder': true,
44
44
  'createOrders': true,
45
+ 'createOrderWithTakeProfitAndStopLoss': true,
45
46
  'createReduceOnlyOrder': false,
47
+ 'createStopLossOrder': true,
48
+ 'createTakeProfitOrder': true,
46
49
  'createTrailingPercentOrder': true,
47
50
  'createTriggerOrder': true,
48
- 'createTakeProfitOrder': true,
49
- 'createStopLossOrder': true,
50
- 'createOrderWithTakeProfitAndStopLoss': true,
51
51
  'editOrder': true,
52
52
  'fetchAccounts': false,
53
53
  'fetchBalance': true,
@@ -41,16 +41,16 @@ class bybit extends bybit$1 {
41
41
  'createMarketSellOrderWithCost': false,
42
42
  'createOrder': true,
43
43
  'createOrders': true,
44
+ 'createOrderWithTakeProfitAndStopLoss': true,
44
45
  'createPostOnlyOrder': true,
45
46
  'createReduceOnlyOrder': true,
46
47
  'createStopLimitOrder': true,
48
+ 'createStopLossOrder': true,
47
49
  'createStopMarketOrder': true,
48
50
  'createStopOrder': true,
51
+ 'createTakeProfitOrder': true,
49
52
  'createTrailingAmountOrder': true,
50
53
  'createTriggerOrder': true,
51
- 'createTakeProfitOrder': true,
52
- 'createStopLossOrder': true,
53
- 'createOrderWithTakeProfitAndStopLoss': true,
54
54
  'editOrder': true,
55
55
  'fetchBalance': true,
56
56
  'fetchBorrowInterest': false,
@@ -48,12 +48,12 @@ class coinex extends coinex$1 {
48
48
  'createMarketBuyOrderWithCost': true,
49
49
  'createMarketOrderWithCost': false,
50
50
  'createMarketSellOrderWithCost': false,
51
- 'createTriggerOrder': true,
52
- 'createTakeProfitOrder': true,
53
- 'createStopLossOrder': true,
54
51
  'createOrder': true,
55
52
  'createOrders': true,
56
53
  'createReduceOnlyOrder': true,
54
+ 'createStopLossOrder': true,
55
+ 'createTakeProfitOrder': true,
56
+ 'createTriggerOrder': true,
57
57
  'editOrder': true,
58
58
  'fetchBalance': true,
59
59
  'fetchBorrowInterest': true,
@@ -89,11 +89,11 @@ class gate extends gate$1 {
89
89
  'createPostOnlyOrder': true,
90
90
  'createReduceOnlyOrder': true,
91
91
  'createStopLimitOrder': true,
92
- 'createStopMarketOrder': false,
93
- 'createTriggerOrder': true,
94
- 'createTakeProfitOrder': true,
95
92
  'createStopLossOrder': true,
93
+ 'createStopMarketOrder': false,
96
94
  'createStopOrder': true,
95
+ 'createTakeProfitOrder': true,
96
+ 'createTriggerOrder': true,
97
97
  'editOrder': true,
98
98
  'fetchBalance': true,
99
99
  'fetchBorrowRateHistories': false,
@@ -45,12 +45,12 @@ class htx extends htx$1 {
45
45
  'createOrders': true,
46
46
  'createReduceOnlyOrder': false,
47
47
  'createStopLimitOrder': true,
48
+ 'createStopLossOrder': true,
48
49
  'createStopMarketOrder': true,
49
50
  'createStopOrder': true,
51
+ 'createTakeProfitOrder': true,
50
52
  'createTrailingPercentOrder': true,
51
53
  'createTriggerOrder': true,
52
- 'createTakeProfitOrder': true,
53
- 'createStopLossOrder': true,
54
54
  'fetchAccounts': true,
55
55
  'fetchBalance': true,
56
56
  'fetchBidsAsks': undefined,
@@ -1438,6 +1438,16 @@ class kraken extends kraken$1 {
1438
1438
  };
1439
1439
  return this.safeString(statuses, status, status);
1440
1440
  }
1441
+ parseOrderType(status) {
1442
+ const statuses = {
1443
+ 'take-profit': 'market',
1444
+ 'stop-loss-limit': 'limit',
1445
+ 'stop-loss': 'market',
1446
+ 'take-profit-limit': 'limit',
1447
+ 'trailing-stop-limit': 'limit',
1448
+ };
1449
+ return this.safeString(statuses, status, status);
1450
+ }
1441
1451
  parseOrder(order, market = undefined) {
1442
1452
  //
1443
1453
  // createOrder for regular orders
@@ -1580,7 +1590,17 @@ class kraken extends kraken$1 {
1580
1590
  trades.push(rawTrade);
1581
1591
  }
1582
1592
  }
1583
- stopPrice = this.safeNumber(order, 'stopprice', stopPrice);
1593
+ stopPrice = this.omitZero(this.safeString(order, 'stopprice', stopPrice));
1594
+ let stopLossPrice = undefined;
1595
+ let takeProfitPrice = undefined;
1596
+ if (type.startsWith('take-profit')) {
1597
+ takeProfitPrice = this.safeString(description, 'price');
1598
+ price = this.omitZero(this.safeString(description, 'price2'));
1599
+ }
1600
+ else if (type.startsWith('stop-loss')) {
1601
+ stopLossPrice = this.safeString(description, 'price');
1602
+ price = this.omitZero(this.safeString(description, 'price2'));
1603
+ }
1584
1604
  return this.safeOrder({
1585
1605
  'id': id,
1586
1606
  'clientOrderId': clientOrderId,
@@ -1590,13 +1610,15 @@ class kraken extends kraken$1 {
1590
1610
  'lastTradeTimestamp': undefined,
1591
1611
  'status': status,
1592
1612
  'symbol': symbol,
1593
- 'type': type,
1613
+ 'type': this.parseOrderType(type),
1594
1614
  'timeInForce': undefined,
1595
1615
  'postOnly': isPostOnly,
1596
1616
  'side': side,
1597
1617
  'price': price,
1598
1618
  'stopPrice': stopPrice,
1599
1619
  'triggerPrice': stopPrice,
1620
+ 'takeProfitPrice': takeProfitPrice,
1621
+ 'stopLossPrice': stopLossPrice,
1600
1622
  'cost': undefined,
1601
1623
  'amount': amount,
1602
1624
  'filled': filled,
@@ -46,8 +46,8 @@ class kucoin extends kucoin$1 {
46
46
  'createPostOnlyOrder': true,
47
47
  'createStopLimitOrder': true,
48
48
  'createStopMarketOrder': true,
49
- 'createTriggerOrder': true,
50
49
  'createStopOrder': true,
50
+ 'createTriggerOrder': true,
51
51
  'editOrder': true,
52
52
  'fetchAccounts': true,
53
53
  'fetchBalance': true,
@@ -36,11 +36,11 @@ class kucoinfutures extends kucoinfutures$1 {
36
36
  'createOrders': true,
37
37
  'createReduceOnlyOrder': true,
38
38
  'createStopLimitOrder': true,
39
+ 'createStopLossOrder': true,
39
40
  'createStopMarketOrder': true,
40
41
  'createStopOrder': true,
41
- 'createTriggerOrder': true,
42
42
  'createTakeProfitOrder': true,
43
- 'createStopLossOrder': true,
43
+ 'createTriggerOrder': true,
44
44
  'fetchAccounts': true,
45
45
  'fetchBalance': true,
46
46
  'fetchBorrowRateHistories': false,
@@ -43,8 +43,8 @@ class okx extends okx$1 {
43
43
  'createOrderWithTakeProfitAndStopLoss': true,
44
44
  'createPostOnlyOrder': true,
45
45
  'createReduceOnlyOrder': true,
46
- 'createStopLossOrder': true,
47
46
  'createStopLimitOrder': true,
47
+ 'createStopLossOrder': true,
48
48
  'createStopMarketOrder': true,
49
49
  'createStopOrder': true,
50
50
  'createTakeProfitOrder': true,
@@ -930,11 +930,16 @@ class htx extends htx$1 {
930
930
  // inject trade in existing order by faking an order object
931
931
  const orderId = this.safeString(parsedTrade, 'order');
932
932
  const trades = [parsedTrade];
933
+ const status = this.parseOrderStatus(this.safeString2(data, 'orderStatus', 'status', 'closed'));
934
+ const filled = this.safeString(data, 'execAmt');
935
+ const remaining = this.safeString(data, 'remainAmt');
933
936
  const order = {
934
937
  'id': orderId,
935
938
  'trades': trades,
936
- 'status': 'closed',
939
+ 'status': status,
937
940
  'symbol': market['symbol'],
941
+ 'filled': this.parseNumber(filled),
942
+ 'remaining': this.parseNumber(remaining),
938
943
  };
939
944
  parsedOrder = order;
940
945
  }
@@ -21,6 +21,7 @@ class woo extends woo$1 {
21
21
  'watchTicker': true,
22
22
  'watchTickers': true,
23
23
  'watchTrades': true,
24
+ 'watchPositions': true,
24
25
  },
25
26
  'urls': {
26
27
  'api': {
@@ -45,6 +46,10 @@ class woo extends woo$1 {
45
46
  'tradesLimit': 1000,
46
47
  'ordersLimit': 1000,
47
48
  'requestId': {},
49
+ 'watchPositions': {
50
+ 'fetchPositionsSnapshot': true,
51
+ 'awaitPositionsSnapshot': true, // whether to wait for the positions snapshot before providing updates
52
+ },
48
53
  },
49
54
  'streaming': {
50
55
  'ping': this.ping,
@@ -603,6 +608,126 @@ class woo extends woo$1 {
603
608
  client.resolve(this.orders, messageHashSymbol);
604
609
  }
605
610
  }
611
+ async watchPositions(symbols = undefined, since = undefined, limit = undefined, params = {}) {
612
+ /**
613
+ * @method
614
+ * @name woo#watchPositions
615
+ * @see https://docs.woo.org/#position-push
616
+ * @description watch all open positions
617
+ * @param {string[]|undefined} symbols list of unified market symbols
618
+ * @param {object} params extra parameters specific to the exchange API endpoint
619
+ * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/en/latest/manual.html#position-structure}
620
+ */
621
+ await this.loadMarkets();
622
+ let messageHash = '';
623
+ symbols = this.marketSymbols(symbols);
624
+ if (!this.isEmpty(symbols)) {
625
+ messageHash = '::' + symbols.join(',');
626
+ }
627
+ messageHash = 'positions' + messageHash;
628
+ const url = this.urls['api']['ws']['private'] + '/' + this.uid;
629
+ const client = this.client(url);
630
+ this.setPositionsCache(client, symbols);
631
+ const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', true);
632
+ const awaitPositionsSnapshot = this.safeValue('watchPositions', 'awaitPositionsSnapshot', true);
633
+ if (fetchPositionsSnapshot && awaitPositionsSnapshot && this.positions === undefined) {
634
+ const snapshot = await client.future('fetchPositionsSnapshot');
635
+ return this.filterBySymbolsSinceLimit(snapshot, symbols, since, limit, true);
636
+ }
637
+ const request = {
638
+ 'event': 'subscribe',
639
+ 'topic': 'position',
640
+ };
641
+ const newPositions = await this.watchPrivate(messageHash, request, params);
642
+ if (this.newUpdates) {
643
+ return newPositions;
644
+ }
645
+ return this.filterBySymbolsSinceLimit(this.positions, symbols, since, limit, true);
646
+ }
647
+ setPositionsCache(client, type, symbols = undefined) {
648
+ const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', false);
649
+ if (fetchPositionsSnapshot) {
650
+ const messageHash = 'fetchPositionsSnapshot';
651
+ if (!(messageHash in client.futures)) {
652
+ client.future(messageHash);
653
+ this.spawn(this.loadPositionsSnapshot, client, messageHash);
654
+ }
655
+ }
656
+ else {
657
+ this.positions = new Cache.ArrayCacheBySymbolBySide();
658
+ }
659
+ }
660
+ async loadPositionsSnapshot(client, messageHash) {
661
+ const positions = await this.fetchPositions();
662
+ this.positions = new Cache.ArrayCacheBySymbolBySide();
663
+ const cache = this.positions;
664
+ for (let i = 0; i < positions.length; i++) {
665
+ const position = positions[i];
666
+ const contracts = this.safeNumber(position, 'contracts', 0);
667
+ if (contracts > 0) {
668
+ cache.append(position);
669
+ }
670
+ }
671
+ // don't remove the future from the .futures cache
672
+ const future = client.futures[messageHash];
673
+ future.resolve(cache);
674
+ client.resolve(cache, 'positions');
675
+ }
676
+ handlePositions(client, message) {
677
+ //
678
+ // {
679
+ // "topic":"position",
680
+ // "ts":1705292345255,
681
+ // "data":{
682
+ // "positions":{
683
+ // "PERP_LTC_USDT":{
684
+ // "holding":1,
685
+ // "pendingLongQty":0,
686
+ // "pendingShortQty":0,
687
+ // "averageOpenPrice":71.53,
688
+ // "pnl24H":0,
689
+ // "fee24H":0.07153,
690
+ // "settlePrice":71.53,
691
+ // "markPrice":71.32098452065145,
692
+ // "version":7886,
693
+ // "openingTime":1705292304267,
694
+ // "pnl24HPercentage":0,
695
+ // "adlQuantile":1,
696
+ // "positionSide":"BOTH"
697
+ // }
698
+ // }
699
+ // }
700
+ // }
701
+ //
702
+ const data = this.safeValue(message, 'data', {});
703
+ const rawPositions = this.safeValue(data, 'positions', {});
704
+ const postitionsIds = Object.keys(rawPositions);
705
+ if (this.positions === undefined) {
706
+ this.positions = new Cache.ArrayCacheBySymbolBySide();
707
+ }
708
+ const cache = this.positions;
709
+ const newPositions = [];
710
+ for (let i = 0; i < postitionsIds.length; i++) {
711
+ const marketId = postitionsIds[i];
712
+ const market = this.safeMarket(marketId);
713
+ const rawPosition = rawPositions[marketId];
714
+ const position = this.parsePosition(rawPosition, market);
715
+ newPositions.push(position);
716
+ cache.append(position);
717
+ }
718
+ const messageHashes = this.findMessageHashes(client, 'positions::');
719
+ for (let i = 0; i < messageHashes.length; i++) {
720
+ const messageHash = messageHashes[i];
721
+ const parts = messageHash.split('::');
722
+ const symbolsString = parts[1];
723
+ const symbols = symbolsString.split(',');
724
+ const positions = this.filterByArray(newPositions, 'symbol', symbols, false);
725
+ if (!this.isEmpty(positions)) {
726
+ client.resolve(positions, messageHash);
727
+ }
728
+ }
729
+ client.resolve(newPositions, 'positions');
730
+ }
606
731
  async watchBalance(params = {}) {
607
732
  /**
608
733
  * @method
@@ -686,6 +811,7 @@ class woo extends woo$1 {
686
811
  'executionreport': this.handleOrderUpdate,
687
812
  'trade': this.handleTrade,
688
813
  'balance': this.handleBalance,
814
+ 'position': this.handlePositions,
689
815
  };
690
816
  const event = this.safeString(message, 'event');
691
817
  let method = this.safeValue(methods, event);
@@ -42,16 +42,16 @@ class woo extends woo$1 {
42
42
  'createMarketOrderWithCost': false,
43
43
  'createMarketSellOrderWithCost': false,
44
44
  'createOrder': true,
45
+ 'createOrderWithTakeProfitAndStopLoss': true,
45
46
  'createReduceOnlyOrder': true,
46
47
  'createStopLimitOrder': false,
48
+ 'createStopLossOrder': true,
47
49
  'createStopMarketOrder': false,
48
50
  'createStopOrder': false,
51
+ 'createTakeProfitOrder': true,
49
52
  'createTrailingAmountOrder': true,
50
53
  'createTrailingPercentOrder': true,
51
54
  'createTriggerOrder': true,
52
- 'createTakeProfitOrder': true,
53
- 'createStopLossOrder': true,
54
- 'createOrderWithTakeProfitAndStopLoss': true,
55
55
  'fetchAccounts': true,
56
56
  'fetchBalance': true,
57
57
  'fetchCanceledOrders': false,
package/js/ccxt.d.ts CHANGED
@@ -4,7 +4,7 @@ import * as functions from './src/base/functions.js';
4
4
  import * as errors from './src/base/errors.js';
5
5
  import type { Market, Trade, Fee, Ticker, OrderBook, Order, Transaction, Tickers, Currency, Balance, DepositAddress, WithdrawalResponse, DepositAddressResponse, OHLCV, Balances, PartialBalances, Dictionary, MinMax, Position, FundingRateHistory, Liquidation, FundingHistory, MarginMode, Greeks } from './src/base/types.js';
6
6
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
7
- declare const version = "4.2.13";
7
+ declare const version = "4.2.14";
8
8
  import ace from './src/ace.js';
9
9
  import alpaca from './src/alpaca.js';
10
10
  import ascendex from './src/ascendex.js';
package/js/ccxt.js CHANGED
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
38
38
  import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
39
39
  //-----------------------------------------------------------------------------
40
40
  // this is updated by vss.js when building
41
- const version = '4.2.14';
41
+ const version = '4.2.15';
42
42
  Exchange.ccxtVersion = version;
43
43
  //-----------------------------------------------------------------------------
44
44
  import ace from './src/ace.js';
package/js/src/binance.js CHANGED
@@ -52,12 +52,12 @@ export default class binance extends Exchange {
52
52
  'createPostOnlyOrder': true,
53
53
  'createReduceOnlyOrder': true,
54
54
  'createStopLimitOrder': true,
55
+ 'createStopLossOrder': true,
55
56
  'createStopMarketOrder': false,
56
57
  'createStopOrder': true,
58
+ 'createTakeProfitOrder': true,
57
59
  'createTrailingPercentOrder': true,
58
60
  'createTriggerOrder': true,
59
- 'createTakeProfitOrder': true,
60
- 'createStopLossOrder': true,
61
61
  'editOrder': true,
62
62
  'fetchAccounts': undefined,
63
63
  'fetchBalance': true,
package/js/src/bingx.js CHANGED
@@ -39,12 +39,12 @@ export default class bingx extends Exchange {
39
39
  'createMarketSellOrderWithCost': true,
40
40
  'createOrder': true,
41
41
  'createOrders': true,
42
+ 'createOrderWithTakeProfitAndStopLoss': true,
43
+ 'createStopLossOrder': true,
44
+ 'createTakeProfitOrder': true,
42
45
  'createTrailingAmountOrder': true,
43
46
  'createTrailingPercentOrder': true,
44
47
  'createTriggerOrder': true,
45
- 'createTakeProfitOrder': true,
46
- 'createStopLossOrder': true,
47
- 'createOrderWithTakeProfitAndStopLoss': true,
48
48
  'fetchBalance': true,
49
49
  'fetchClosedOrders': true,
50
50
  'fetchCurrencies': true,
@@ -364,6 +364,7 @@ export default class bingx extends Exchange {
364
364
  '80016': OrderNotFound,
365
365
  '80017': OrderNotFound,
366
366
  '100414': AccountSuspended,
367
+ '100419': PermissionDenied,
367
368
  '100437': BadRequest, // {"code":100437,"msg":"The withdrawal amount is lower than the minimum limit, please re-enter.","timestamp":1689258588845}
368
369
  },
369
370
  'broad': {},
package/js/src/bitget.js CHANGED
@@ -45,12 +45,12 @@ export default class bitget extends Exchange {
45
45
  'createMarketSellOrderWithCost': false,
46
46
  'createOrder': true,
47
47
  'createOrders': true,
48
+ 'createOrderWithTakeProfitAndStopLoss': true,
48
49
  'createReduceOnlyOrder': false,
50
+ 'createStopLossOrder': true,
51
+ 'createTakeProfitOrder': true,
49
52
  'createTrailingPercentOrder': true,
50
53
  'createTriggerOrder': true,
51
- 'createTakeProfitOrder': true,
52
- 'createStopLossOrder': true,
53
- 'createOrderWithTakeProfitAndStopLoss': true,
54
54
  'editOrder': true,
55
55
  'fetchAccounts': false,
56
56
  'fetchBalance': true,
package/js/src/bybit.js CHANGED
@@ -44,16 +44,16 @@ export default class bybit extends Exchange {
44
44
  'createMarketSellOrderWithCost': false,
45
45
  'createOrder': true,
46
46
  'createOrders': true,
47
+ 'createOrderWithTakeProfitAndStopLoss': true,
47
48
  'createPostOnlyOrder': true,
48
49
  'createReduceOnlyOrder': true,
49
50
  'createStopLimitOrder': true,
51
+ 'createStopLossOrder': true,
50
52
  'createStopMarketOrder': true,
51
53
  'createStopOrder': true,
54
+ 'createTakeProfitOrder': true,
52
55
  'createTrailingAmountOrder': true,
53
56
  'createTriggerOrder': true,
54
- 'createTakeProfitOrder': true,
55
- 'createStopLossOrder': true,
56
- 'createOrderWithTakeProfitAndStopLoss': true,
57
57
  'editOrder': true,
58
58
  'fetchBalance': true,
59
59
  'fetchBorrowInterest': false,
package/js/src/coinex.js CHANGED
@@ -51,12 +51,12 @@ export default class coinex extends Exchange {
51
51
  'createMarketBuyOrderWithCost': true,
52
52
  'createMarketOrderWithCost': false,
53
53
  'createMarketSellOrderWithCost': false,
54
- 'createTriggerOrder': true,
55
- 'createTakeProfitOrder': true,
56
- 'createStopLossOrder': true,
57
54
  'createOrder': true,
58
55
  'createOrders': true,
59
56
  'createReduceOnlyOrder': true,
57
+ 'createStopLossOrder': true,
58
+ 'createTakeProfitOrder': true,
59
+ 'createTriggerOrder': true,
60
60
  'editOrder': true,
61
61
  'fetchBalance': true,
62
62
  'fetchBorrowInterest': true,
package/js/src/gate.js CHANGED
@@ -92,11 +92,11 @@ export default class gate extends Exchange {
92
92
  'createPostOnlyOrder': true,
93
93
  'createReduceOnlyOrder': true,
94
94
  'createStopLimitOrder': true,
95
- 'createStopMarketOrder': false,
96
- 'createTriggerOrder': true,
97
- 'createTakeProfitOrder': true,
98
95
  'createStopLossOrder': true,
96
+ 'createStopMarketOrder': false,
99
97
  'createStopOrder': true,
98
+ 'createTakeProfitOrder': true,
99
+ 'createTriggerOrder': true,
100
100
  'editOrder': true,
101
101
  'fetchBalance': true,
102
102
  'fetchBorrowRateHistories': false,
package/js/src/htx.js CHANGED
@@ -48,12 +48,12 @@ export default class htx extends Exchange {
48
48
  'createOrders': true,
49
49
  'createReduceOnlyOrder': false,
50
50
  'createStopLimitOrder': true,
51
+ 'createStopLossOrder': true,
51
52
  'createStopMarketOrder': true,
52
53
  'createStopOrder': true,
54
+ 'createTakeProfitOrder': true,
53
55
  'createTrailingPercentOrder': true,
54
56
  'createTriggerOrder': true,
55
- 'createTakeProfitOrder': true,
56
- 'createStopLossOrder': true,
57
57
  'fetchAccounts': true,
58
58
  'fetchBalance': true,
59
59
  'fetchBidsAsks': undefined,
@@ -66,6 +66,7 @@ export default class kraken extends Exchange {
66
66
  findMarketByAltnameOrId(id: any): any;
67
67
  getDelistedMarketById(id: any): any;
68
68
  parseOrderStatus(status: any): string;
69
+ parseOrderType(status: any): string;
69
70
  parseOrder(order: any, market?: Market): Order;
70
71
  orderRequest(method: any, symbol: any, type: any, request: any, price?: any, params?: {}): any[];
71
72
  editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
package/js/src/kraken.js CHANGED
@@ -1441,6 +1441,16 @@ export default class kraken extends Exchange {
1441
1441
  };
1442
1442
  return this.safeString(statuses, status, status);
1443
1443
  }
1444
+ parseOrderType(status) {
1445
+ const statuses = {
1446
+ 'take-profit': 'market',
1447
+ 'stop-loss-limit': 'limit',
1448
+ 'stop-loss': 'market',
1449
+ 'take-profit-limit': 'limit',
1450
+ 'trailing-stop-limit': 'limit',
1451
+ };
1452
+ return this.safeString(statuses, status, status);
1453
+ }
1444
1454
  parseOrder(order, market = undefined) {
1445
1455
  //
1446
1456
  // createOrder for regular orders
@@ -1583,7 +1593,17 @@ export default class kraken extends Exchange {
1583
1593
  trades.push(rawTrade);
1584
1594
  }
1585
1595
  }
1586
- stopPrice = this.safeNumber(order, 'stopprice', stopPrice);
1596
+ stopPrice = this.omitZero(this.safeString(order, 'stopprice', stopPrice));
1597
+ let stopLossPrice = undefined;
1598
+ let takeProfitPrice = undefined;
1599
+ if (type.startsWith('take-profit')) {
1600
+ takeProfitPrice = this.safeString(description, 'price');
1601
+ price = this.omitZero(this.safeString(description, 'price2'));
1602
+ }
1603
+ else if (type.startsWith('stop-loss')) {
1604
+ stopLossPrice = this.safeString(description, 'price');
1605
+ price = this.omitZero(this.safeString(description, 'price2'));
1606
+ }
1587
1607
  return this.safeOrder({
1588
1608
  'id': id,
1589
1609
  'clientOrderId': clientOrderId,
@@ -1593,13 +1613,15 @@ export default class kraken extends Exchange {
1593
1613
  'lastTradeTimestamp': undefined,
1594
1614
  'status': status,
1595
1615
  'symbol': symbol,
1596
- 'type': type,
1616
+ 'type': this.parseOrderType(type),
1597
1617
  'timeInForce': undefined,
1598
1618
  'postOnly': isPostOnly,
1599
1619
  'side': side,
1600
1620
  'price': price,
1601
1621
  'stopPrice': stopPrice,
1602
1622
  'triggerPrice': stopPrice,
1623
+ 'takeProfitPrice': takeProfitPrice,
1624
+ 'stopLossPrice': stopLossPrice,
1603
1625
  'cost': undefined,
1604
1626
  'amount': amount,
1605
1627
  'filled': filled,