ccxt
Version:
1,207 lines (1,205 loc) • 53.3 kB
JavaScript
// ----------------------------------------------------------------------------
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
// ---------------------------------------------------------------------------
import Exchange from './abstract/bitbns.js';
import { ExchangeError, ArgumentsRequired, InsufficientFunds, OrderNotFound, BadRequest, BadSymbol } from './base/errors.js';
import { Precise } from './base/Precise.js';
import { TICK_SIZE } from './base/functions/number.js';
import { sha512 } from './static_dependencies/noble-hashes/sha512.js';
// ---------------------------------------------------------------------------
/**
* @class bitbns
* @augments Exchange
*/
export default class bitbns extends Exchange {
describe() {
return this.deepExtend(super.describe(), {
'id': 'bitbns',
'name': 'Bitbns',
'countries': ['IN'],
'rateLimit': 1000,
'certified': false,
'version': 'v2',
// new metainfo interface
'has': {
'CORS': undefined,
'spot': true,
'margin': undefined,
'swap': false,
'future': false,
'option': undefined,
'cancelAllOrders': false,
'cancelOrder': true,
'createOrder': true,
'createStopOrder': true,
'createTriggerOrder': true,
'fetchBalance': true,
'fetchDepositAddress': true,
'fetchDepositAddresses': false,
'fetchDepositAddressesByNetwork': false,
'fetchDeposits': true,
'fetchFundingHistory': false,
'fetchFundingRate': false,
'fetchFundingRateHistory': false,
'fetchFundingRates': false,
'fetchIndexOHLCV': false,
'fetchMarginMode': false,
'fetchMarkets': true,
'fetchMarkOHLCV': false,
'fetchMyTrades': true,
'fetchOHLCV': false,
'fetchOpenOrders': true,
'fetchOrder': true,
'fetchOrderBook': true,
'fetchPositionMode': false,
'fetchPremiumIndexOHLCV': false,
'fetchStatus': true,
'fetchTicker': 'emulated',
'fetchTickers': true,
'fetchTrades': true,
'fetchTradingFee': false,
'fetchTradingFees': false,
'fetchTransfer': false,
'fetchTransfers': false,
'fetchWithdrawal': false,
'fetchWithdrawals': true,
'transfer': false,
'withdraw': false,
},
'hostname': 'bitbns.com',
'urls': {
'logo': 'https://github.com/user-attachments/assets/a5b9a562-cdd8-4bea-9fa7-fd24c1dad3d9',
'api': {
'www': 'https://{hostname}',
'v1': 'https://api.{hostname}/api/trade/v1',
'v2': 'https://api.{hostname}/api/trade/v2',
},
'www': 'https://bitbns.com',
'referral': 'https://ref.bitbns.com/1090961',
'doc': [
'https://bitbns.com/trade/#/api-trading/',
],
'fees': 'https://bitbns.com/fees',
},
'api': {
'www': {
'get': [
'order/fetchMarkets',
'order/fetchTickers',
'order/fetchOrderbook',
'order/getTickerWithVolume',
'exchangeData/ohlc',
'exchangeData/orderBook',
'exchangeData/tradedetails',
],
},
'v1': {
'get': [
'platform/status',
'tickers',
'orderbook/sell/{symbol}',
'orderbook/buy/{symbol}',
],
'post': [
'currentCoinBalance/EVERYTHING',
'getApiUsageStatus/USAGE',
'getOrderSocketToken/USAGE',
'currentCoinBalance/{symbol}',
'orderStatus/{symbol}',
'depositHistory/{symbol}',
'withdrawHistory/{symbol}',
'withdrawHistoryAll/{symbol}',
'depositHistoryAll/{symbol}',
'listOpenOrders/{symbol}',
'listOpenStopOrders/{symbol}',
'getCoinAddress/{symbol}',
'placeSellOrder/{symbol}',
'placeBuyOrder/{symbol}',
'buyStopLoss/{symbol}',
'sellStopLoss/{symbol}',
'cancelOrder/{symbol}',
'cancelStopLossOrder/{symbol}',
'listExecutedOrders/{symbol}',
'placeMarketOrder/{symbol}',
'placeMarketOrderQnty/{symbol}',
],
},
'v2': {
'post': [
'orders',
'cancel',
'getordersnew',
'marginOrders',
],
},
},
'fees': {
'trading': {
'feeSide': 'quote',
'tierBased': false,
'percentage': true,
'taker': this.parseNumber('0.0025'),
'maker': this.parseNumber('0.0025'),
},
},
'precisionMode': TICK_SIZE,
'features': {
'spot': {
'sandbox': false,
'createOrder': {
'marginMode': false,
'triggerPrice': true,
'triggerPriceType': undefined,
'triggerDirection': false,
'stopLossPrice': false,
'takeProfitPrice': false,
'attachedStopLossTakeProfit': undefined,
'timeInForce': {
'IOC': false,
'FOK': false,
'PO': false,
'GTD': false,
},
'hedged': false,
'trailing': false,
'leverage': false,
'marketBuyRequiresPrice': false,
'marketBuyByCost': false,
'selfTradePrevention': false,
'iceberg': false,
},
'createOrders': undefined,
'fetchMyTrades': {
'marginMode': false,
'limit': undefined,
'daysBack': undefined,
'untilDays': undefined,
'symbolRequired': true,
},
'fetchOrder': {
'marginMode': false,
'trigger': false,
'trailing': false,
'symbolRequired': true,
},
'fetchOpenOrders': {
'marginMode': false,
'limit': undefined,
'trigger': true,
'trailing': false,
'symbolRequired': true,
},
'fetchOrders': undefined,
'fetchClosedOrders': undefined,
// todo: implement fetchOHLCV
'fetchOHLCV': {
'limit': 100,
},
},
// todo: implement swap methods
'swap': {
'linear': undefined,
'inverse': undefined,
},
'future': {
'linear': undefined,
'inverse': undefined,
},
},
'exceptions': {
'exact': {
'400': BadRequest,
'409': BadSymbol,
'416': InsufficientFunds,
'417': OrderNotFound, // {"data":[],"status":0,"error":"Nothing to show","code":417}
},
'broad': {},
},
});
}
/**
* @method
* @name bitbns#fetchStatus
* @description the latest known information on the availability of the exchange API
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [status structure]{@link https://docs.ccxt.com/#/?id=exchange-status-structure}
*/
async fetchStatus(params = {}) {
const response = await this.v1GetPlatformStatus(params);
//
// {
// "data":{
// "BTC":{"status":1},
// "ETH":{"status":1},
// "XRP":{"status":1},
// },
// "status":1,
// "error":null,
// "code":200
// }
//
const statusRaw = this.safeString(response, 'status');
return {
'status': this.safeString({ '1': 'ok' }, statusRaw, statusRaw),
'updated': undefined,
'eta': undefined,
'url': undefined,
'info': response,
};
}
/**
* @method
* @name bitbns#fetchMarkets
* @description retrieves data on all markets for bitbns
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
async fetchMarkets(params = {}) {
const response = await this.wwwGetOrderFetchMarkets(params);
//
// [
// {
// "id":"BTC",
// "symbol":"BTC/INR",
// "base":"BTC",
// "quote":"INR",
// "baseId":"BTC",
// "quoteId":"",
// "active":true,
// "limits":{
// "amount":{"min":"0.00017376","max":20},
// "price":{"min":2762353.2359999996,"max":6445490.883999999},
// "cost":{"min":800,"max":128909817.67999998}
// },
// "precision":{
// "amount":8,
// "price":2
// },
// "info":{}
// },
// ]
//
const result = [];
for (let i = 0; i < response.length; i++) {
const market = response[i];
const id = this.safeString(market, 'id');
const baseId = this.safeString(market, 'base');
const quoteId = this.safeString(market, 'quote');
const base = this.safeCurrencyCode(baseId);
const quote = this.safeCurrencyCode(quoteId);
const marketPrecision = this.safeDict(market, 'precision', {});
const marketLimits = this.safeDict(market, 'limits', {});
const amountLimits = this.safeDict(marketLimits, 'amount', {});
const priceLimits = this.safeDict(marketLimits, 'price', {});
const costLimits = this.safeDict(marketLimits, 'cost', {});
const usdt = (quoteId === 'USDT');
// INR markets don't need a _INR prefix
const uppercaseId = usdt ? (baseId + '_' + quoteId) : baseId;
result.push({
'id': id,
'uppercaseId': uppercaseId,
'symbol': base + '/' + quote,
'base': base,
'quote': quote,
'settle': undefined,
'baseId': baseId,
'quoteId': quoteId,
'settleId': undefined,
'type': 'spot',
'spot': true,
'margin': false,
'swap': false,
'future': false,
'option': false,
'active': this.safeBool(market, 'active'),
'contract': false,
'linear': undefined,
'inverse': undefined,
'contractSize': undefined,
'expiry': undefined,
'expiryDatetime': undefined,
'strike': undefined,
'optionType': undefined,
'precision': {
'amount': this.parseNumber(this.parsePrecision(this.safeString(marketPrecision, 'amount'))),
'price': this.parseNumber(this.parsePrecision(this.safeString(marketPrecision, 'price'))),
},
'limits': {
'leverage': {
'min': undefined,
'max': undefined,
},
'amount': {
'min': this.safeNumber(amountLimits, 'min'),
'max': this.safeNumber(amountLimits, 'max'),
},
'price': {
'min': this.safeNumber(priceLimits, 'min'),
'max': this.safeNumber(priceLimits, 'max'),
},
'cost': {
'min': this.safeNumber(costLimits, 'min'),
'max': this.safeNumber(costLimits, 'max'),
},
},
'created': undefined,
'info': market,
});
}
return result;
}
/**
* @method
* @name bitbns#fetchOrderBook
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
* @param {string} symbol unified symbol of the market to fetch the order book for
* @param {int} [limit] the maximum amount of order book entries to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
*/
async fetchOrderBook(symbol, limit = undefined, params = {}) {
await this.loadMarkets();
const market = this.market(symbol);
const request = {
'symbol': market['id'],
};
if (limit !== undefined) {
request['limit'] = limit; // default 100, max 5000, see https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md#order-book
}
const response = await this.wwwGetOrderFetchOrderbook(this.extend(request, params));
//
// {
// "bids":[
// [49352.04,0.843948],
// [49352.03,0.742048],
// [49349.78,0.686239],
// ],
// "asks":[
// [49443.59,0.065137],
// [49444.63,0.098211],
// [49449.01,0.066309],
// ],
// "timestamp":1619172786577,
// "datetime":"2021-04-23T10:13:06.577Z",
// "nonce":""
// }
//
const timestamp = this.safeInteger(response, 'timestamp');
return this.parseOrderBook(response, market['symbol'], timestamp);
}
parseTicker(ticker, market = undefined) {
//
// {
// "symbol":"BTC/INR",
// "info":{
// "highest_buy_bid":4368494.31,
// "lowest_sell_bid":4374835.09,
// "last_traded_price":4374835.09,
// "yes_price":4531016.27,
// "volume":{"max":"4569119.23","min":"4254552.13","volume":62.17722344}
// },
// "timestamp":1619100020845,
// "datetime":1619100020845,
// "high":"4569119.23",
// "low":"4254552.13",
// "bid":4368494.31,
// "bidVolume":"",
// "ask":4374835.09,
// "askVolume":"",
// "vwap":"",
// "open":4531016.27,
// "close":4374835.09,
// "last":4374835.09,
// "baseVolume":62.17722344,
// "quoteVolume":"",
// "previousClose":"",
// "change":-156181.1799999997,
// "percentage":-3.446934874943623,
// "average":4452925.68
// }
//
const timestamp = this.safeInteger(ticker, 'timestamp');
const marketId = this.safeString(ticker, 'symbol');
const symbol = this.safeSymbol(marketId, market);
const last = this.safeString(ticker, 'last');
return this.safeTicker({
'symbol': symbol,
'timestamp': timestamp,
'datetime': this.iso8601(timestamp),
'high': this.safeString(ticker, 'high'),
'low': this.safeString(ticker, 'low'),
'bid': this.safeString(ticker, 'bid'),
'bidVolume': this.safeString(ticker, 'bidVolume'),
'ask': this.safeString(ticker, 'ask'),
'askVolume': this.safeString(ticker, 'askVolume'),
'vwap': this.safeString(ticker, 'vwap'),
'open': this.safeString(ticker, 'open'),
'close': last,
'last': last,
'previousClose': this.safeString(ticker, 'previousClose'),
'change': this.safeString(ticker, 'change'),
'percentage': this.safeString(ticker, 'percentage'),
'average': this.safeString(ticker, 'average'),
'baseVolume': this.safeString(ticker, 'baseVolume'),
'quoteVolume': this.safeString(ticker, 'quoteVolume'),
'info': ticker,
}, market);
}
/**
* @method
* @name bitbns#fetchTickers
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
async fetchTickers(symbols = undefined, params = {}) {
await this.loadMarkets();
const response = await this.wwwGetOrderFetchTickers(params);
//
// {
// "BTC/INR":{
// "symbol":"BTC/INR",
// "info":{
// "highest_buy_bid":4368494.31,
// "lowest_sell_bid":4374835.09,
// "last_traded_price":4374835.09,
// "yes_price":4531016.27,
// "volume":{"max":"4569119.23","min":"4254552.13","volume":62.17722344}
// },
// "timestamp":1619100020845,
// "datetime":1619100020845,
// "high":"4569119.23",
// "low":"4254552.13",
// "bid":4368494.31,
// "bidVolume":"",
// "ask":4374835.09,
// "askVolume":"",
// "vwap":"",
// "open":4531016.27,
// "close":4374835.09,
// "last":4374835.09,
// "baseVolume":62.17722344,
// "quoteVolume":"",
// "previousClose":"",
// "change":-156181.1799999997,
// "percentage":-3.446934874943623,
// "average":4452925.68
// }
// }
//
return this.parseTickers(response, symbols);
}
parseBalance(response) {
const timestamp = undefined;
const result = {
'info': response,
'timestamp': timestamp,
'datetime': this.iso8601(timestamp),
};
const data = this.safeDict(response, 'data', {});
const keys = Object.keys(data);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const parts = key.split('availableorder');
const numParts = parts.length;
if (numParts > 1) {
let currencyId = this.safeString(parts, 1);
// note that "Money" stands for INR - the only fiat in bitbns
const account = this.account();
account['free'] = this.safeString(data, key);
account['used'] = this.safeString(data, 'inorder' + currencyId);
if (currencyId === 'Money') {
currencyId = 'INR';
}
const code = this.safeCurrencyCode(currencyId);
result[code] = account;
}
}
return this.safeBalance(result);
}
/**
* @method
* @name bitbns#fetchBalance
* @description query for balance and get the amount of funds available for trading or funds locked in orders
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
*/
async fetchBalance(params = {}) {
await this.loadMarkets();
const response = await this.v1PostCurrentCoinBalanceEVERYTHING(params);
//
// {
// "data":{
// "availableorderMoney":12.34, // INR
// "availableorderBTC":0,
// "availableorderXRP":0,
// "inorderMoney":0, // INR
// "inorderBTC":0,
// "inorderXRP":0,
// "inorderNEO":0,
// },
// "status":1,
// "error":null,
// "code":200
// }
//
// note that "Money" stands for INR - the only fiat in bitbns
return this.parseBalance(response);
}
parseStatus(status) {
const statuses = {
'-1': 'cancelled',
'0': 'open',
'1': 'open',
'2': 'done',
// 'PARTIALLY_FILLED': 'open',
// 'FILLED': 'closed',
// 'CANCELED': 'canceled',
// 'PENDING_CANCEL': 'canceling', // currently unused
// 'REJECTED': 'rejected',
// 'EXPIRED': 'expired',
};
return this.safeString(statuses, status, status);
}
parseOrder(order, market = undefined) {
//
// createOrder
//
// {
// "data": "Successfully placed bid to purchase currency",
// "status": 1,
// "error": null,
// "id": 5424475,
// "code": 200
// }
//
// fetchOpenOrders, fetchOrder
//
// {
// "entry_id": 5424475,
// "btc": 0.01,
// "rate": 2000,
// "time": "2021-04-25T17:05:42.000Z",
// "type": 0,
// "status": 0
// "t_rate": 0.45, // only stop orders
// "trail": 0 // only stop orders
// }
//
// cancelOrder
//
// {
// "data": "Successfully cancelled the order",
// "status": 1,
// "error": null,
// "code": 200
// }
//
const id = this.safeString2(order, 'id', 'entry_id');
const datetime = this.safeString(order, 'time');
const triggerPrice = this.safeString(order, 't_rate');
let side = this.safeString(order, 'type');
if (side === '0') {
side = 'buy';
}
else if (side === '1') {
side = 'sell';
}
const data = this.safeString(order, 'data');
let status = this.safeString(order, 'status');
if (data === 'Successfully cancelled the order') {
status = 'cancelled';
}
else {
status = this.parseStatus(status);
}
return this.safeOrder({
'info': order,
'id': id,
'clientOrderId': undefined,
'timestamp': this.parse8601(datetime),
'datetime': datetime,
'lastTradeTimestamp': undefined,
'symbol': this.safeString(market, 'symbol'),
'timeInForce': undefined,
'postOnly': undefined,
'side': side,
'price': this.safeString(order, 'rate'),
'triggerPrice': triggerPrice,
'amount': this.safeString(order, 'btc'),
'cost': undefined,
'average': undefined,
'filled': undefined,
'remaining': undefined,
'status': status,
'fee': {
'cost': undefined,
'currency': undefined,
'rate': undefined,
},
'trades': undefined,
}, market);
}
/**
* @method
* @name bitbns#createOrder
* @description create a trade order
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/place-orders
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-1/market-orders-quantity // market orders
* @param {string} symbol unified symbol of the market to create an order in
* @param {string} type 'market' or 'limit'
* @param {string} side 'buy' or 'sell'
* @param {float} amount how much of currency you want to trade in units of base currency
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {float} [params.triggerPrice] the price at which a trigger order is triggered at
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {float} [params.target_rate] *requires params.trail_rate when set, type must be 'limit'* a bracket order is placed when set
* @param {float} [params.trail_rate] *requires params.target_rate when set, type must be 'limit'* a bracket order is placed when set
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
await this.loadMarkets();
const market = this.market(symbol);
const triggerPrice = this.safeStringN(params, ['triggerPrice', 'stopPrice', 't_rate']);
const targetRate = this.safeString(params, 'target_rate');
const trailRate = this.safeString(params, 'trail_rate');
params = this.omit(params, ['triggerPrice', 'stopPrice', 'trail_rate', 'target_rate', 't_rate']);
const request = {
'side': side.toUpperCase(),
'symbol': market['uppercaseId'],
'quantity': this.amountToPrecision(symbol, amount),
// 'target_rate': this.priceToPrecision (symbol, targetRate),
// 't_rate': this.priceToPrecision (symbol, stopPrice),
// 'trail_rate': this.priceToPrecision (symbol, trailRate),
};
let method = 'v2PostOrders';
if (type === 'limit') {
request['rate'] = this.priceToPrecision(symbol, price);
}
else {
method = 'v1PostPlaceMarketOrderQntySymbol';
request['market'] = market['quoteId'];
}
if (triggerPrice !== undefined) {
request['t_rate'] = this.priceToPrecision(symbol, triggerPrice);
}
if (targetRate !== undefined) {
request['target_rate'] = this.priceToPrecision(symbol, targetRate);
}
if (trailRate !== undefined) {
request['trail_rate'] = this.priceToPrecision(symbol, trailRate);
}
const response = await this[method](this.extend(request, params));
//
// {
// "data":"Successfully placed bid to purchase currency",
// "status":1,
// "error":null,
// "id":5424475,
// "code":200
// }
//
return this.parseOrder(response, market);
}
/**
* @method
* @name bitbns#cancelOrder
* @description cancels an open order
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/cancel-orders
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-1/cancel-stop-loss-orders
* @param {string} id order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {boolean} [params.trigger] true if cancelling a trigger order
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
async cancelOrder(id, symbol = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
}
await this.loadMarkets();
const market = this.market(symbol);
const isTrigger = this.safeBool2(params, 'trigger', 'stop');
params = this.omit(params, ['trigger', 'stop']);
const request = {
'entry_id': id,
'symbol': market['uppercaseId'],
};
let response = undefined;
const tail = isTrigger ? 'StopLossOrder' : 'Order';
let quoteSide = (market['quoteId'] === 'USDT') ? 'usdtcancel' : 'cancel';
quoteSide += tail;
request['side'] = quoteSide;
response = await this.v2PostCancel(this.extend(request, params));
return this.parseOrder(response, market);
}
/**
* @method
* @name bitbns#fetchOrder
* @description fetches information on an order made by the user
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-1/order-status
* @param {string} id order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
async fetchOrder(id, symbol = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
}
await this.loadMarkets();
const market = this.market(symbol);
const request = {
'symbol': market['id'],
'entry_id': id,
};
const trigger = this.safeBool2(params, 'trigger', 'stop');
if (trigger) {
throw new BadRequest(this.id + ' fetchOrder cannot fetch stop orders');
}
const response = await this.v1PostOrderStatusSymbol(this.extend(request, params));
//
// {
// "data":[
// {
// "entry_id":5424475,
// "btc":0.01,
// "rate":2000,
// "time":"2021-04-25T17:05:42.000Z",
// "type":0,
// "status":0,
// "total":0.01,
// "avg_cost":null,
// "side":"BUY",
// "amount":0.01,
// "remaining":0.01,
// "filled":0,
// "cost":null,
// "fee":0.05
// }
// ],
// "status":1,
// "error":null,
// "code":200
// }
//
const data = this.safeList(response, 'data', []);
const first = this.safeDict(data, 0);
return this.parseOrder(first, market);
}
/**
* @method
* @name bitbns#fetchOpenOrders
* @description fetch all unfilled currently open orders
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/order-status-limit
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/order-status-limit/order-status-stop-limit
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch open orders for
* @param {int} [limit] the maximum number of open orders structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {boolean} [params.trigger] true if fetching trigger orders
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument');
}
await this.loadMarkets();
const market = this.market(symbol);
const isTrigger = this.safeBool2(params, 'trigger', 'stop');
params = this.omit(params, ['trigger', 'stop']);
const quoteSide = (market['quoteId'] === 'USDT') ? 'usdtListOpen' : 'listOpen';
const request = {
'symbol': market['uppercaseId'],
'page': 0,
'side': isTrigger ? (quoteSide + 'StopOrders') : (quoteSide + 'Orders'),
};
const response = await this.v2PostGetordersnew(this.extend(request, params));
//
// {
// "data":[
// {
// "entry_id":5424475,
// "btc":0.01,
// "rate":2000,
// "time":"2021-04-25T17:05:42.000Z",
// "type":0,
// "status":0
// "t_rate":0.45, // only stop orders
// "type":1, // only stop orders
// "trail":0 // only stop orders
// }
// ],
// "status":1,
// "error":null,
// "code":200
// }
//
const data = this.safeList(response, 'data', []);
return this.parseOrders(data, market, since, limit);
}
parseTrade(trade, market = undefined) {
//
// fetchMyTrades
//
// {
// "type": "BTC Sell order executed",
// "typeI": 6,
// "crypto": 5000,
// "amount": 35.4,
// "rate": 709800,
// "date": "2020-05-22T15:05:34.000Z",
// "unit": "INR",
// "factor": 100000000,
// "fee": 0.09,
// "delh_btc": -5000,
// "delh_inr": 0,
// "del_btc": 0,
// "del_inr": 35.4,
// "id": "2938823"
// }
//
// fetchTrades
//
// {
// "tradeId":"1909151",
// "price":"61904.6300",
// "quote_volume":1618.05,
// "base_volume":0.02607254,
// "timestamp":1634548602000,
// "type":"buy"
// }
//
market = this.safeMarket(undefined, market);
const orderId = this.safeString2(trade, 'id', 'tradeId');
let timestamp = this.parse8601(this.safeString(trade, 'date'));
timestamp = this.safeInteger(trade, 'timestamp', timestamp);
const priceString = this.safeString2(trade, 'rate', 'price');
let amountString = this.safeString(trade, 'amount');
let side = this.safeStringLower(trade, 'type');
if (side !== undefined) {
if (side.indexOf('buy') >= 0) {
side = 'buy';
}
else if (side.indexOf('sell') >= 0) {
side = 'sell';
}
}
const factor = this.safeString(trade, 'factor');
let costString = undefined;
if (factor !== undefined) {
amountString = Precise.stringDiv(amountString, factor);
}
else {
amountString = this.safeString(trade, 'base_volume');
costString = this.safeString(trade, 'quote_volume');
}
const symbol = market['symbol'];
let fee = undefined;
const feeCostString = this.safeString(trade, 'fee');
if (feeCostString !== undefined) {
const feeCurrencyCode = market['quote'];
fee = {
'cost': feeCostString,
'currency': feeCurrencyCode,
};
}
return this.safeTrade({
'info': trade,
'timestamp': timestamp,
'datetime': this.iso8601(timestamp),
'symbol': symbol,
'id': orderId,
'order': orderId,
'type': undefined,
'side': side,
'takerOrMaker': undefined,
'price': priceString,
'amount': amountString,
'cost': costString,
'fee': fee,
}, market);
}
/**
* @method
* @name bitbns#fetchMyTrades
* @description fetch all trades made by the user
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch trades for
* @param {int} [limit] the maximum number of trades structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
*/
async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
}
await this.loadMarkets();
const market = this.market(symbol);
const request = {
'symbol': market['id'],
'page': 0,
};
if (since !== undefined) {
request['since'] = this.iso8601(since);
}
const response = await this.v1PostListExecutedOrdersSymbol(this.extend(request, params));
//
// {
// "data": [
// {
// "type": "BTC Sell order executed",
// "typeI": 6,
// "crypto": 5000,
// "amount": 35.4,
// "rate": 709800,
// "date": "2020-05-22T15:05:34.000Z",
// "unit": "INR",
// "factor": 100000000,
// "fee": 0.09,
// "delh_btc": -5000,
// "delh_inr": 0,
// "del_btc": 0,
// "del_inr": 35.4,
// "id": "2938823"
// },
// {
// "type": "BTC Sell order executed",
// "typeI": 6,
// "crypto": 195000,
// "amount": 1380.58,
// "rate": 709765.5,
// "date": "2020-05-22T15:05:34.000Z",
// "unit": "INR",
// "factor": 100000000,
// "fee": 3.47,
// "delh_btc": -195000,
// "delh_inr": 0,
// "del_btc": 0,
// "del_inr": 1380.58,
// "id": "2938823"
// }
// ],
// "status": 1,
// "error": null,
// "code": 200
// }
//
const data = this.safeList(response, 'data', []);
return this.parseTrades(data, market, since, limit);
}
/**
* @method
* @name bitbns#fetchTrades
* @description get the list of most recent trades for a particular symbol
* @param {string} symbol unified symbol of the market to fetch trades for
* @param {int} [since] timestamp in ms of the earliest trade to fetch
* @param {int} [limit] the maximum amount of trades to fetch
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
*/
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
if (symbol === undefined) {
throw new ArgumentsRequired(this.id + ' fetchTrades() requires a symbol argument');
}
await this.loadMarkets();
const market = this.market(symbol);
const request = {
'coin': market['baseId'],
'market': market['quoteId'],
};
const response = await this.wwwGetExchangeDataTradedetails(this.extend(request, params));
//
// [
// {"tradeId":"1909151","price":"61904.6300","quote_volume":1618.05,"base_volume":0.02607254,"timestamp":1634548602000,"type":"buy"},
// {"tradeId":"1909153","price":"61893.9000","quote_volume":16384.42,"base_volume":0.26405767,"timestamp":1634548999000,"type":"sell"},
// {"tradeId":"1909155","price":"61853.1100","quote_volume":2304.37,"base_volume":0.03716263,"timestamp":1634549670000,"type":"sell"}
// }
//
return this.parseTrades(response, market, since, limit);
}
/**
* @method
* @name bitbns#fetchDeposits
* @description fetch all deposits made to an account
* @param {string} code unified currency code
* @param {int} [since] the earliest time in ms to fetch deposits for
* @param {int} [limit] the maximum number of deposits structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
if (code === undefined) {
throw new ArgumentsRequired(this.id + ' fetchDeposits() requires a currency code argument');
}
await this.loadMarkets();
const currency = this.currency(code);
const request = {
'symbol': currency['id'],
'page': 0,
};
const response = await this.v1PostDepositHistorySymbol(this.extend(request, params));
//
// {
// "data":[
// {
// "type":"USDT deposited",
// "typeI":1,
// "amount":100,
// "date":"2021-04-24T14:56:04.000Z",
// "unit":"USDT",
// "factor":100,
// "fee":0,
// "delh_btc":0,
// "delh_inr":0,
// "rate":0,
// "del_btc":10000,
// "del_inr":0
// }
// ],
// "status":1,
// "error":null,
// "code":200
// }
//
const data = this.safeList(response, 'data', []);
return this.parseTransactions(data, currency, since, limit);
}
/**
* @method
* @name bitbns#fetchWithdrawals
* @description fetch all withdrawals made from an account
* @param {string} code unified currency code
* @param {int} [since] the earliest time in ms to fetch withdrawals for
* @param {int} [limit] the maximum number of withdrawals structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
if (code === undefined) {
throw new ArgumentsRequired(this.id + ' fetchWithdrawals() requires a currency code argument');
}
await this.loadMarkets();
const currency = this.currency(code);
const request = {
'symbol': currency['id'],
'page': 0,
};
const response = await this.v1PostWithdrawHistorySymbol(this.extend(request, params));
//
// ...
//
const data = this.safeList(response, 'data', []);
return this.parseTransactions(data, currency, since, limit);
}
parseTransactionStatusByType(status, type = undefined) {
const statusesByType = {
'deposit': {
'0': 'pending',
'1': 'ok',
},
'withdrawal': {
'0': 'pending',
'1': 'canceled',
'2': 'pending',
'3': 'failed',
'4': 'pending',
'5': 'failed',
'6': 'ok', // Completed
},
};
const statuses = this.safeDict(statusesByType, type, {});
return this.safeString(statuses, status, status);
}
parseTransaction(transaction, currency = undefined) {
//
// fetchDeposits
//
// {
// "type":"USDT deposited",
// "typeI":1,
// "amount":100,
// "date":"2021-04-24T14:56:04.000Z",
// "unit":"USDT",
// "factor":100,
// "fee":0,
// "delh_btc":0,
// "delh_inr":0,
// "rate":0,
// "del_btc":10000,
// "del_inr":0
// }
//
// fetchWithdrawals
//
// ...
//
const currencyId = this.safeString(transaction, 'unit');
const code = this.safeCurrencyCode(currencyId, currency);
const timestamp = this.parse8601(this.safeString2(transaction, 'date', 'timestamp'));
let type = this.safeString(transaction, 'type');
const expTime = this.safeString(transaction, 'expTime', '');
let status = undefined;
if (type !== undefined) {
if (type.indexOf('deposit') >= 0) {
type = 'deposit';
status = 'ok';
}
else if (type.indexOf('withdraw') >= 0 || expTime.indexOf('withdraw') >= 0) {
type = 'withdrawal';
}
}
// const status = this.parseTransactionStatusByType (this.safeString (transaction, 'status'), type);
const amount = this.safeNumber(transaction, 'amount');
const feeCost = this.safeNumber(transaction, 'fee');
let fee = undefined;
if (feeCost !== undefined) {
fee = { 'currency': code, 'cost': feeCost };
}
return {
'info': transaction,
'id': undefined,
'txid': undefined,
'timestamp': timestamp,
'datetime': this.iso8601(timestamp),
'network': undefined,
'address': undefined,
'addressTo': undefined,
'addressFrom': undefined,
'tag': undefined,
'tagTo': undefined,
'tagFrom': undefined,
'type': type,
'amount': amount,
'currency': code,
'status': status,
'updated': undefined,
'comment': undefined,
'internal': undefined,
'fee': fee,
};
}
/**
* @method
* @name bitbns#fetchDepositAddress
* @description fetch the deposit address for a currency associated with this account
* @param {string} code unified currency code
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
*/
async fetchDepositAddress(code, params = {}) {
await this.loadMarkets();
const currency = this.currency(code);
const request = {
'symbol': currency['id'],
};
const response = await this.v1PostGetCoinAddressSymbol(this.extend(request, params));
//
// {
// "data":{
// "token":"0x6