UNPKG

consequunturatque

Version:

A JavaScript / Python / PHP cryptocurrency trading library with support for 130+ exchanges

1,195 lines (1,162 loc) 54.5 kB
'use strict'; // --------------------------------------------------------------------------- const Exchange = require ('./base/Exchange'); const { ExchangeError, ArgumentsRequired, ExchangeNotAvailable, PermissionDenied, InvalidOrder, AuthenticationError, InsufficientFunds, OrderNotFound, DDoSProtection, OnMaintenance, RateLimitExceeded } = require ('./base/errors'); const Precise = require ('./base/Precise'); // --------------------------------------------------------------------------- module.exports = class bitz extends Exchange { describe () { return this.deepExtend (super.describe (), { 'id': 'bitz', 'name': 'Bit-Z', 'countries': [ 'HK' ], 'rateLimit': 2000, 'version': 'v2', 'userAgent': this.userAgents['chrome'], 'has': { 'cancelOrder': true, 'cancelOrders': true, 'createOrder': true, 'createMarketOrder': false, 'fetchBalance': true, 'fetchDeposits': true, 'fetchClosedOrders': true, 'fetchMarkets': true, 'fetchOHLCV': true, 'fetchOpenOrders': true, 'fetchOrder': true, 'fetchOrderBook': true, 'fetchOrders': true, 'fetchTicker': true, 'fetchTickers': true, 'fetchTime': true, 'fetchTrades': true, 'fetchTransactions': false, 'fetchWithdrawals': true, 'withdraw': true, }, 'timeframes': { '1m': '1min', '5m': '5min', '15m': '15min', '30m': '30min', '1h': '60min', '4h': '4hour', '1d': '1day', '5d': '5day', '1w': '1week', '1M': '1mon', }, 'hostname': 'apiv2.bitz.com', 'urls': { 'logo': 'https://user-images.githubusercontent.com/51840849/87443304-fec5e000-c5fd-11ea-98f8-ba8e67f7eaff.jpg', 'api': { 'market': 'https://{hostname}', 'trade': 'https://{hostname}', 'assets': 'https://{hostname}', }, 'www': 'https://www.bitz.com', 'doc': 'https://apidocv2.bitz.plus/en/', 'fees': 'https://www.bitz.com/fee?type=1', 'referral': 'https://u.bitz.com/register?invite_code=1429193', }, 'api': { 'market': { 'get': [ 'ticker', 'depth', 'order', // trades 'tickerall', 'kline', 'symbolList', 'getServerTime', 'currencyRate', 'currencyCoinRate', 'coinRate', 'getContractCoin', 'getContractKline', 'getContractOrderBook', 'getContractTradesHistory', 'getContractTickers', ], }, 'trade': { 'post': [ 'addEntrustSheet', 'cancelEntrustSheet', 'cancelAllEntrustSheet', 'coinOut', // withdraw 'getUserHistoryEntrustSheet', // closed orders 'getUserNowEntrustSheet', // open orders 'getEntrustSheetInfo', // order 'depositOrWithdraw', // transactions 'getCoinAddress', 'getCoinAddressList', 'marketTrade', 'addEntrustSheetBatch', ], }, 'assets': { 'post': [ 'getUserAssets', ], }, 'contract': { 'post': [ 'addContractTrade', 'cancelContractTrade', 'getContractActivePositions', 'getContractAccountInfo', 'getContractMyPositions', 'getContractOrderResult', 'getContractTradeResult', 'getContractOrder', 'getContractMyHistoryTrade', 'getContractMyTrades', ], }, }, 'fees': { 'trading': { 'maker': 0.002, 'taker': 0.002, }, 'funding': { 'withdraw': { 'BTC': '0.5%', 'DKKT': '0.5%', 'ETH': 0.01, 'USDT': '0.5%', 'LTC': '0.5%', 'FCT': '0.5%', 'LSK': '0.5%', 'HXI': '0.8%', 'ZEC': '0.5%', 'DOGE': '0.5%', 'MZC': '0.5%', 'ETC': '0.5%', 'GXS': '0.5%', 'XPM': '0.5%', 'PPC': '0.5%', 'BLK': '0.5%', 'XAS': '0.5%', 'HSR': '0.5%', 'NULS': 5.0, 'VOISE': 350.0, 'PAY': 1.5, 'EOS': 0.6, 'YBCT': 35.0, 'OMG': 0.3, 'OTN': 0.4, 'BTX': '0.5%', 'QTUM': '0.5%', 'DASH': '0.5%', 'GAME': '0.5%', 'BCH': '0.5%', 'GNT': 9.0, 'SSS': 1500.0, 'ARK': '0.5%', 'PART': '0.5%', 'LEO': '0.5%', 'DGB': '0.5%', 'ZSC': 130.0, 'VIU': 350.0, 'BTG': '0.5%', 'ARN': 10.0, 'VTC': '0.5%', 'BCD': '0.5%', 'TRX': 200.0, 'HWC': '0.5%', 'UNIT': '0.5%', 'OXY': '0.5%', 'MCO': 0.3500, 'SBTC': '0.5%', 'BCX': '0.5%', 'ETF': '0.5%', 'PYLNT': 0.4000, 'XRB': '0.5%', 'ETP': '0.5%', }, }, }, 'precision': { 'amount': 8, 'price': 8, }, 'options': { 'fetchOHLCVVolume': true, 'fetchOHLCVWarning': true, 'lastNonceTimestamp': 0, }, 'commonCurrencies': { // https://github.com/ccxt/ccxt/issues/3881 // https://support.bit-z.pro/hc/en-us/articles/360007500654-BOX-BOX-Token- 'BOX': 'BOX Token', 'LEO': 'LeoCoin', 'XRB': 'NANO', 'PXC': 'Pixiecoin', 'VTC': 'VoteCoin', 'TTC': 'TimesChain', }, 'exceptions': { // '200': Success '-102': ExchangeError, // Invalid parameter '-103': AuthenticationError, // Verification failed '-104': ExchangeNotAvailable, // Network Error-1 '-105': AuthenticationError, // Invalid api signature '-106': ExchangeNotAvailable, // Network Error-2 '-109': AuthenticationError, // Invalid scretKey '-110': DDoSProtection, // The number of access requests exceeded '-111': PermissionDenied, // Current IP is not in the range of trusted IP '-112': OnMaintenance, // Service is under maintenance '-114': RateLimitExceeded, // The number of daily requests has reached the limit '-117': AuthenticationError, // The apikey expires '-100015': AuthenticationError, // Trade password error '-100044': ExchangeError, // Fail to request data '-100101': ExchangeError, // Invalid symbol '-100201': ExchangeError, // Invalid symbol '-100301': ExchangeError, // Invalid symbol '-100401': ExchangeError, // Invalid symbol '-100302': ExchangeError, // Type of K-line error '-100303': ExchangeError, // Size of K-line error '-200003': AuthenticationError, // Please set trade password '-200005': PermissionDenied, // This account can not trade '-200025': ExchangeNotAvailable, // Temporary trading halt '-200027': InvalidOrder, // Price Error '-200028': InvalidOrder, // Amount must be greater than 0 '-200029': InvalidOrder, // Number must be between %s and %d '-200030': InvalidOrder, // Over price range '-200031': InsufficientFunds, // Insufficient assets '-200032': ExchangeError, // System error. Please contact customer service '-200033': ExchangeError, // Fail to trade '-200034': OrderNotFound, // The order does not exist '-200035': OrderNotFound, // Cancellation error, order filled '-200037': InvalidOrder, // Trade direction error '-200038': ExchangeError, // Trading Market Error '-200055': OrderNotFound, // Order record does not exist '-300069': AuthenticationError, // api_key is illegal '-300101': ExchangeError, // Transaction type error '-300102': InvalidOrder, // Price or number cannot be less than 0 '-300103': AuthenticationError, // Trade password error '-301001': ExchangeNotAvailable, // Network Error-3 }, }); } async fetchMarkets (params = {}) { const response = await this.marketGetSymbolList (params); // // { status: 200, // msg: "", // data: { ltc_btc: { id: "1", // name: "ltc_btc", // coinFrom: "ltc", // coinTo: "btc", // numberFloat: "4", // priceFloat: "8", // status: "1", // minTrade: "0.010", // maxTrade: "500000000.000" }, // qtum_usdt: { id: "196", // name: "qtum_usdt", // coinFrom: "qtum", // coinTo: "usdt", // numberFloat: "4", // priceFloat: "2", // status: "1", // minTrade: "0.100", // maxTrade: "500000000.000" }, }, // time: 1535969146, // microtime: "0.66955600 1535969146", // source: "api" } // const markets = this.safeValue (response, 'data'); const ids = Object.keys (markets); const result = []; for (let i = 0; i < ids.length; i++) { const id = ids[i]; const market = markets[id]; const numericId = this.safeString (market, 'id'); const baseId = this.safeString (market, 'coinFrom'); const quoteId = this.safeString (market, 'coinTo'); let base = baseId.toUpperCase (); let quote = quoteId.toUpperCase (); base = this.safeCurrencyCode (base); quote = this.safeCurrencyCode (quote); const symbol = base + '/' + quote; const precision = { 'amount': this.safeInteger (market, 'numberFloat'), 'price': this.safeInteger (market, 'priceFloat'), }; result.push ({ 'info': market, 'id': id, 'numericId': numericId, 'symbol': symbol, 'base': base, 'quote': quote, 'baseId': baseId, 'quoteId': quoteId, 'active': true, 'precision': precision, 'limits': { 'amount': { 'min': this.safeNumber (market, 'minTrade'), 'max': this.safeNumber (market, 'maxTrade'), }, 'price': { 'min': Math.pow (10, -precision['price']), 'max': undefined, }, 'cost': { 'min': undefined, 'max': undefined, }, }, }); } return result; } async fetchBalance (params = {}) { await this.loadMarkets (); const response = await this.assetsPostGetUserAssets (params); // // { // status: 200, // msg: "", // data: { // cny: 0, // usd: 0, // btc_total: 0, // info: [{ // "name": "zpr", // "num": "37.49067275", // "over": "37.49067275", // "lock": "0.00000000", // "btc": "0.00000000", // "usd": "0.00000000", // "cny": "0.00000000", // }], // }, // time: 1535983966, // microtime: "0.70400500 1535983966", // source: "api", // } // const balances = this.safeValue (response['data'], 'info'); const timestamp = this.parseMicrotime (this.safeString (response, 'microtime')); const result = { 'info': response, 'timestamp': timestamp, 'datetime': this.iso8601 (timestamp), }; for (let i = 0; i < balances.length; i++) { const balance = balances[i]; const currencyId = this.safeString (balance, 'name'); const code = this.safeCurrencyCode (currencyId); const account = this.account (); account['used'] = this.safeString (balance, 'lock'); account['total'] = this.safeString (balance, 'num'); account['free'] = this.safeString (balance, 'over'); result[code] = account; } return this.parseBalance (result, false); } parseTicker (ticker, market = undefined) { // // { symbol: "eth_btc", // quoteVolume: "3905.72", // volume: "97058.21", // priceChange: "-1.72", // priceChange24h: "-1.65", // askPrice: "0.03971272", // askQty: "0.0663", // bidPrice: "0.03961469", // bidQty: "19.5451", // open: "0.04036769", // high: "0.04062988", // low: "0.03956123", // now: "0.03970100", // firstId: 115567767, // lastId: 115795316, // dealCount: 14078, // numberPrecision: 4, // pricePrecision: 8, // cny: "1959.05", // usd: "287.10", // krw: "318655.82" } // const timestamp = undefined; const marketId = this.safeString (ticker, 'symbol'); const symbol = this.safeSymbol (marketId, market, '_'); const last = this.safeNumber (ticker, 'now'); const open = this.safeNumber (ticker, 'open'); let change = undefined; let average = undefined; if (last !== undefined && open !== undefined) { change = last - open; average = this.sum (last, open) / 2; } return { 'symbol': symbol, 'timestamp': timestamp, 'datetime': this.iso8601 (timestamp), 'high': this.safeNumber (ticker, 'high'), 'low': this.safeNumber (ticker, 'low'), 'bid': this.safeNumber (ticker, 'bidPrice'), 'bidVolume': this.safeNumber (ticker, 'bidQty'), 'ask': this.safeNumber (ticker, 'askPrice'), 'askVolume': this.safeNumber (ticker, 'askQty'), 'vwap': undefined, 'open': open, 'close': last, 'last': last, 'previousClose': undefined, 'change': change, 'percentage': this.safeNumber (ticker, 'priceChange24h'), 'average': average, 'baseVolume': this.safeNumber (ticker, 'volume'), 'quoteVolume': this.safeNumber (ticker, 'quoteVolume'), 'info': ticker, }; } parseMicrotime (microtime) { if (microtime === undefined) { return microtime; } const parts = microtime.split (' '); const milliseconds = parseFloat (parts[0]); const seconds = parseInt (parts[1]); const total = this.sum (seconds, milliseconds); return parseInt (total * 1000); } async fetchTicker (symbol, params = {}) { await this.loadMarkets (); const market = this.market (symbol); const request = { 'symbol': market['id'], }; const response = await this.marketGetTicker (this.extend (request, params)); // // { status: 200, // msg: "", // data: { symbol: "eth_btc", // quoteVolume: "3905.72", // volume: "97058.21", // priceChange: "-1.72", // priceChange24h: "-1.65", // askPrice: "0.03971272", // askQty: "0.0663", // bidPrice: "0.03961469", // bidQty: "19.5451", // open: "0.04036769", // high: "0.04062988", // low: "0.03956123", // now: "0.03970100", // firstId: 115567767, // lastId: 115795316, // dealCount: 14078, // numberPrecision: 4, // pricePrecision: 8, // cny: "1959.05", // usd: "287.10", // krw: "318655.82" }, // time: 1535970397, // microtime: "0.76341900 1535970397", // source: "api" } // const ticker = this.parseTicker (response['data'], market); const timestamp = this.parseMicrotime (this.safeString (response, 'microtime')); return this.extend (ticker, { 'timestamp': timestamp, 'datetime': this.iso8601 (timestamp), }); } async fetchTickers (symbols = undefined, params = {}) { await this.loadMarkets (); const request = {}; if (symbols !== undefined) { const ids = this.marketIds (symbols); request['symbols'] = ids.join (','); } const response = await this.marketGetTickerall (this.extend (request, params)); // // { status: 200, // msg: "", // data: { ela_btc: { symbol: "ela_btc", // quoteVolume: "0.00", // volume: "3.28", // priceChange: "0.00", // priceChange24h: "0.00", // askPrice: "0.00147984", // askQty: "5.4580", // bidPrice: "0.00120230", // bidQty: "12.5384", // open: "0.00149078", // high: "0.00149078", // low: "0.00149078", // now: "0.00149078", // firstId: 115581219, // lastId: 115581219, // dealCount: 1, // numberPrecision: 4, // pricePrecision: 8, // cny: "73.66", // usd: "10.79", // krw: "11995.03" } }, // time: 1535971578, // microtime: "0.39854200 1535971578", // source: "api" } // const tickers = this.safeValue (response, 'data'); const timestamp = this.parseMicrotime (this.safeString (response, 'microtime')); const result = {}; const ids = Object.keys (tickers); for (let i = 0; i < ids.length; i++) { const id = ids[i]; let ticker = tickers[id]; let market = undefined; if (id in this.markets_by_id) { market = this.markets_by_id[id]; } ticker = this.parseTicker (tickers[id], market); let symbol = ticker['symbol']; if (symbol === undefined) { if (market !== undefined) { symbol = market['symbol']; } else { const [ baseId, quoteId ] = id.split ('_'); const base = this.safeCurrencyCode (baseId); const quote = this.safeCurrencyCode (quoteId); symbol = base + '/' + quote; } } if (symbol !== undefined) { result[symbol] = this.extend (ticker, { 'timestamp': timestamp, 'datetime': this.iso8601 (timestamp), }); } } return this.filterByArray (result, 'symbol', symbols); } async fetchTime (params = {}) { const response = await this.marketGetGetServerTime (params); // // { // "status":200, // "msg":"", // "data":[], // "time":1555490875, // "microtime":"0.35994200 1555490875", // "source":"api" // } // return this.safeTimestamp (response, 'time'); } async fetchOrderBook (symbol, limit = undefined, params = {}) { await this.loadMarkets (); const request = { 'symbol': this.marketId (symbol), }; const response = await this.marketGetDepth (this.extend (request, params)); // // { status: 200, // msg: "", // data: { asks: [ ["10.00000000", "0.4426", "4.4260"], // ["1.00000000", "0.8339", "0.8339"], // ["0.91700000", "0.0500", "0.0458"], // ["0.20000000", "0.1000", "0.0200"], // ["0.03987120", "16.1262", "0.6429"], // ["0.03986120", "9.7523", "0.3887"] ], // bids: [ ["0.03976145", "0.0359", "0.0014"], // ["0.03973401", "20.9493", "0.8323"], // ["0.03967970", "0.0328", "0.0013"], // ["0.00000002", "10000.0000", "0.0002"], // ["0.00000001", "231840.7500", "0.0023"] ], // coinPair: "eth_btc" }, // time: 1535974778, // microtime: "0.04017400 1535974778", // source: "api" } // const orderbook = this.safeValue (response, 'data'); const timestamp = this.parseMicrotime (this.safeString (response, 'microtime')); return this.parseOrderBook (orderbook, symbol, timestamp); } parseTrade (trade, market = undefined) { // // fetchTrades (public) // // { id: 115807453, // t: "19:36:24", // T: 1535974584, // p: "0.03983296", // n: "0.1000", // s: "buy" }, // const id = this.safeString (trade, 'id'); const timestamp = this.safeTimestamp (trade, 'T'); let symbol = undefined; if (market !== undefined) { symbol = market['symbol']; } const priceString = this.safeString (trade, 'p'); const amountString = this.safeString (trade, 'n'); const price = this.parseNumber (priceString); const amount = this.parseNumber (amountString); const cost = this.parseNumber (Precise.stringMul (priceString, amountString)); const side = this.safeString (trade, 's'); return { 'timestamp': timestamp, 'datetime': this.iso8601 (timestamp), 'symbol': symbol, 'id': id, 'order': undefined, 'type': 'limit', 'side': side, 'takerOrMaker': undefined, 'price': price, 'amount': amount, 'cost': cost, 'fee': undefined, 'info': trade, }; } async fetchTrades (symbol, since = undefined, limit = undefined, params = {}) { await this.loadMarkets (); const market = this.market (symbol); const request = { 'symbol': market['id'], }; const response = await this.marketGetOrder (this.extend (request, params)); // // { status: 200, // msg: "", // data: [ { id: 115807453, // t: "19:36:24", // T: 1535974584, // p: "0.03983296", // n: "0.1000", // s: "buy" }, // { id: 115806811, // t: "19:33:19", // T: 1535974399, // p: "0.03981135", // n: "9.4612", // s: "sell" } ], // time: 1535974583, // microtime: "0.57118100 1535974583", // source: "api" } // return this.parseTrades (response['data'], market, since, limit); } parseOHLCV (ohlcv, market = undefined) { // // { // time: "1535973420000", // open: "0.03975084", // high: "0.03975084", // low: "0.03967700", // close: "0.03967700", // volume: "12.4733", // datetime: "2018-09-03 19:17:00" // } // return [ this.safeInteger (ohlcv, 'time'), this.safeNumber (ohlcv, 'open'), this.safeNumber (ohlcv, 'high'), this.safeNumber (ohlcv, 'low'), this.safeNumber (ohlcv, 'close'), this.safeNumber (ohlcv, 'volume'), ]; } async fetchOHLCV (symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) { await this.loadMarkets (); const duration = this.parseTimeframe (timeframe) * 1000; const market = this.market (symbol); const request = { 'symbol': market['id'], 'resolution': this.timeframes[timeframe], }; if (limit !== undefined) { request['size'] = Math.min (limit, 300); // 1-300 if (since !== undefined) { request['to'] = this.sum (since, limit * duration * 1000); } } else { if (since !== undefined) { throw new ArgumentsRequired (this.id + ' fetchOHLCV() requires a limit argument if the since argument is specified'); } } const response = await this.marketGetKline (this.extend (request, params)); // // { // status: 200, // msg: "", // data: { // bars: [ // { time: "1535973420000", open: "0.03975084", high: "0.03975084", low: "0.03967700", close: "0.03967700", volume: "12.4733", datetime: "2018-09-03 19:17:00" }, // { time: "1535955480000", open: "0.04009900", high: "0.04016745", low: "0.04009900", close: "0.04012074", volume: "74.4803", datetime: "2018-09-03 14:18:00" }, // ], // resolution: "1min", // symbol: "eth_btc", // from: "1535973420000", // to: "1535955480000", // size: 300 // }, // time: 1535973435, // microtime: "0.56462100 1535973435", // source: "api" // } // const data = this.safeValue (response, 'data', {}); const bars = this.safeValue (data, 'bars', []); return this.parseOHLCVs (bars, market, timeframe, since, limit); } parseOrderStatus (status) { const statuses = { '0': 'open', '1': 'open', // partially filled '2': 'closed', // filled '3': 'canceled', }; return this.safeString (statuses, status, status); } parseOrder (order, market = undefined) { // // createOrder // // { // "id": "693248739", // order id // "uId": "2074056", // uid // "price": "100", // price // "number": "10", // number // "numberOver": "10", // undealed // "flag": "sale", // flag // "status": "0", // unfilled // "coinFrom": "vtc", // "coinTo": "dkkt", // "numberDeal": "0" // dealed // } // const id = this.safeString (order, 'id'); let symbol = undefined; if (market === undefined) { const baseId = this.safeString (order, 'coinFrom'); const quoteId = this.safeString (order, 'coinTo'); if ((baseId !== undefined) && (quoteId !== undefined)) { const marketId = baseId + '_' + quoteId; if (marketId in this.markets_by_id) { market = this.safeValue (this.markets_by_id, marketId); } else { const base = this.safeCurrencyCode (baseId); const quote = this.safeCurrencyCode (quoteId); symbol = base + '/' + quote; } } } if (market !== undefined) { symbol = market['symbol']; } let side = this.safeString (order, 'flag'); if (side !== undefined) { side = (side === 'sale') ? 'sell' : 'buy'; } const price = this.safeNumber (order, 'price'); const amount = this.safeNumber (order, 'number'); const remaining = this.safeNumber (order, 'numberOver'); const filled = this.safeNumber (order, 'numberDeal'); let timestamp = this.safeInteger (order, 'timestamp'); if (timestamp === undefined) { timestamp = this.safeTimestamp (order, 'created'); } const cost = this.safeNumber (order, 'orderTotalPrice'); const status = this.parseOrderStatus (this.safeString (order, 'status')); return this.safeOrder ({ 'id': id, 'clientOrderId': undefined, 'datetime': this.iso8601 (timestamp), 'timestamp': timestamp, 'lastTradeTimestamp': undefined, 'status': status, 'symbol': symbol, 'type': 'limit', 'timeInForce': undefined, 'postOnly': undefined, 'side': side, 'price': price, 'stopPrice': undefined, 'cost': cost, 'amount': amount, 'filled': filled, 'remaining': remaining, 'trades': undefined, 'fee': undefined, 'info': order, 'average': undefined, }); } async createOrder (symbol, type, side, amount, price = undefined, params = {}) { await this.loadMarkets (); if (type !== 'limit') { throw new ExchangeError (this.id + ' createOrder allows limit orders only'); } const market = this.market (symbol); const orderType = (side === 'buy') ? '1' : '2'; if (!this.password) { throw new ExchangeError (this.id + ' createOrder() requires you to set exchange.password = "YOUR_TRADING_PASSWORD" (a trade password is NOT THE SAME as your login password)'); } const request = { 'symbol': market['id'], 'type': orderType, 'price': this.priceToPrecision (symbol, price), 'number': this.amountToPrecision (symbol, amount), 'tradePwd': this.password, }; const response = await this.tradePostAddEntrustSheet (this.extend (request, params)); // // { // "status": 200, // "msg": "", // "data": { // "id": "693248739", // order id // "uId": "2074056", // uid // "price": "100", // price // "number": "10", // number // "numberOver": "10", // undealed // "flag": "sale", // flag // "status": "0", // unfilled // "coinFrom": "vtc", // "coinTo": "dkkt", // "numberDeal": "0" // dealed // }, // "time": "1533035297", // "microtime": "0.41892000 1533035297", // "source": "api", // } // const timestamp = this.parseMicrotime (this.safeString (response, 'microtime')); const order = this.extend ({ 'timestamp': timestamp, }, response['data']); return this.parseOrder (order, market); } async cancelOrder (id, symbol = undefined, params = {}) { await this.loadMarkets (); const request = { 'entrustSheetId': id, }; const response = await this.tradePostCancelEntrustSheet (this.extend (request, params)); // // { // "status":200, // "msg":"", // "data":{ // "updateAssetsData":{ // "coin":"bz", // "over":"1000.00000000", // "lock":"-1000.00000000" // }, // "assetsInfo":{ // "coin":"bz", // "over":"9999.99999999", // "lock":"9999.99999999" // } // }, // "time":"1535464383", // "microtime":"0.91558000 1535464383", // "source":"api" // } // return response; } async cancelOrders (ids, symbol = undefined, params = {}) { await this.loadMarkets (); const request = { 'ids': ids.join (','), }; const response = await this.tradePostCancelEntrustSheet (this.extend (request, params)); // // { // "status":200, // "msg":"", // "data":{ // "744173808":{ // "updateAssetsData":{ // "coin":"bz", // "over":"100.00000000", // "lock":"-100.00000000" // }, // "assetsInfo":{ // "coin":"bz", // "over":"899.99999999", // "lock":"19099.99999999" // } // }, // "744173809":{ // "updateAssetsData":{ // "coin":"bz", // "over":"100.00000000", // "lock":"-100.00000000" // }, // "assetsInfo":{ // "coin":"bz", // "over":"999.99999999", // "lock":"18999.99999999" // } // } // }, // "time":"1535525649", // "microtime":"0.05009400 1535525649", // "source":"api" // } // return response; } async fetchOrder (id, symbol = undefined, params = {}) { await this.loadMarkets (); const request = { 'entrustSheetId': id, }; const response = await this.tradePostGetEntrustSheetInfo (this.extend (request, params)); // // { // "status":200, // "msg":"", // "data":{ // "id":"708279852", // "uId":"2074056", // "price":"100.00000000", // "number":"10.0000", // "total":"0.00000000", // "numberOver":"10.0000", // "numberDeal":"0.0000", // "flag":"sale", // "status":"0", //0:unfilled, 1:partial deal, 2:all transactions, 3:already cancelled // "coinFrom":"bz", // "coinTo":"usdt", // "orderTotalPrice":"0", // "created":"1533279876" // }, // "time":"1533280294", // "microtime":"0.36859200 1533280294", // "source":"api" // } // return this.parseOrder (response['data']); } async fetchOrdersWithMethod (method, 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 request = { 'coinFrom': market['baseId'], 'coinTo': market['quoteId'], // 'type': 1, // optional integer, 1 = buy, 2 = sell // 'page': 1, // optional integer // 'pageSize': 100, // optional integer, max 100 // 'startTime': 1510235730, // optional integer timestamp in seconds // 'endTime': 1510235730, // optional integer timestamp in seconds }; if (limit !== undefined) { request['page'] = 1; request['pageSize'] = limit; } if (since !== undefined) { request['startTime'] = parseInt (since / 1000); // request['endTime'] = parseInt (since / 1000); } const response = await this[method] (this.extend (request, params)); // // { // "status": 200, // "msg": "", // "data": { // "data": [ // { // "id": "693248739", // "uid": "2074056", // "price": "100.00000000", // "number": "10.0000", // "total": "0.00000000", // "numberOver": "0.0000", // "numberDeal": "0.0000", // "flag": "sale", // "status": "3", // 0:unfilled, 1:partial deal, 2:all transactions, 3:already cancelled // "isNew": "N", // "coinFrom": "vtc", // "coinTo": "dkkt", // "created": "1533035300", // }, // { // "id": "723086996", // "uid": "2074056", // "price": "100.00000000", // "number": "10.0000", // "total": "0.00000000", // "numberOver": "0.0000", // "numberDeal": "0.0000", // "flag": "sale", // "status": "3", // "isNew": "N", // "coinFrom": "bz", // "coinTo": "usdt", // "created": "1533523568", // }, // ], // "pageInfo": { // "limit": "10", // "offest": "0", // "current_page": "1", // "page_size": "10", // "total_count": "17", // "page_count": "2", // } // }, // "time": "1533279329", // "microtime": "0.15305300 1533279329", // "source": "api" // } // const orders = this.safeValue (response['data'], 'data', []); return this.parseOrders (orders, undefined, since, limit); } async fetchOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) { return await this.fetchOrdersWithMethod ('tradePostGetUserHistoryEntrustSheet', symbol, since, limit, params); } async fetchOpenOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) { return await this.fetchOrdersWithMethod ('tradePostGetUserNowEntrustSheet', symbol, since, limit, params); } async fetchClosedOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) { return await this.fetchOrdersWithMethod ('tradePostGetUserHistoryEntrustSheet', symbol, since, limit, params); } parseTransactionStatus (status) { const statuses = { '1': 'pending', '2': 'pending', '3': 'pending', '4': 'ok', '5': 'canceled', }; return this.safeString (statuses, status, status); } parseTransaction (transaction, currency = undefined) { // // { // "id": '96275', // "uid": '2109073', // "wallet": '0xf4c4141c0127bc37b1d0c409a091920eba13ada7', // "txid": '0xb7adfa52aa566f9ac112e3c01f77bd91179b19eab12092a9a5a8b33d5086e31d', // "confirm": '12', // "number": '0.50000000', // "status": 4, // "updated": '1534944168605', // "addressUrl": 'https://etherscan.io/address/', // "txidUrl": 'https://etherscan.io/tx/', // "description": 'Ethereum', // "coin": 'eth', // "memo": '' // } // // { // "id":"397574", // "uid":"2033056", // "wallet":"1AG1gZvQAYu3WBvgg7p4BMMghQD2gE693k", // "txid":"", // "confirm":"0", // "number":"1000.00000000", // "status":1, // "updated":"0", // "addressUrl":"http://omniexplorer.info/lookupadd.aspx?address=", // "txidUrl":"http://omniexplorer.info/lookuptx.aspx?txid=", // "description":"Tether", // "coin":"usdt", // "memo":"" // } // // { // "id":"153606", // "uid":"2033056", // "wallet":"1AG1gZvQAYu3WBvgg7p4BMMghQD2gE693k", // "txid":"aa2b179f84cd6dedafd41845e0fbf7f01e14c0d71ea3140d03d6f5a9ccd93199", // "confirm":"0", // "number":"761.11110000", // "status":4, // "updated":"1536726133579", // "addressUrl":"http://omniexplorer.info/lookupadd.aspx?address=", // "txidUrl":"http://omniexplorer.info/lookuptx.aspx?txid=", // "description":"Tether", // "coin":"usdt", // "memo":"" // } // // withdraw // // { // "id":397574, // "email":"***@email.com", // "coin":"usdt", // "network_fee":"", // "eid":23112 // } // let timestamp = this.safeInteger (transaction, 'updated'); if (timestamp === 0) { timestamp = undefined; } const currencyId = this.safeString (transaction, 'coin'); const code = this.safeCurrencyCode (currencyId, currency); const type = this.safeStringLower (transaction, 'type'); const status = this.parseTransactionStatus (this.safeString (transaction, 'status')); let fee = undefined; const feeCost = this.safeNumber (transaction, 'network_fee'); if (feeCost !== undefined) { fee = { 'cost': feeCost, 'code': code, }; } return { 'id': this.safeString (transaction, 'id'), 'txid': this.safeString (transaction, 'txid'), 'timestamp': timestamp, 'datetime': this.iso8601 (timestamp), 'address': this.safeString (transaction, 'wallet'), 'tag': this.safeString (transaction, 'memo'), 'type': type, 'amount': this.safeNumber (transaction, 'number'), 'currency': code, 'status': status, 'updated': timestamp, 'fee': fee, 'info': transaction, }; } parseTransactionsByType (type, transactions, code = undefined, since = undefined, limit = undefined) { const result = []; for (let i = 0; i < transactions.length; i++) { const transaction = this.parseTransaction (this.extend ({ 'type': type, }, transactions[i])); result.push (transaction); } return this.filterByCurrencySinceLimit (result, code, since, limit); } parseTransactionType (type) { const types = { 'deposit': 1, 'withdrawal': 2, }; return this.safeInteger (types, type, type); } async fetchDeposits (code = undefined, since = undefined, limit = undefined, params = {}) { return await this.fetchTransactionsForType ('deposit', code, since, limit, params); } async fetchWithdrawals (code = undefined, since = undefined, limit = undefined, params = {}) { return await this.fetchTransactionsForType ('withdrawal', code, since, limit, params); } async fetchTransactionsForType (type, code = undefined, since = undefined, limit = undefined, params = {}) { if (code === undefined) { throw new ArgumentsRequired (this.id + ' fetchTransactions() requires a currency `code