consequunturatque
Version:
A JavaScript / Python / PHP cryptocurrency trading library with support for 130+ exchanges
1,178 lines (1,150 loc) • 64.6 kB
JavaScript
'use strict';
// ---------------------------------------------------------------------------
const Exchange = require ('./base/Exchange');
const { ExchangeError, InvalidOrder, InsufficientFunds, AuthenticationError, BadSymbol } = require ('./base/errors');
const Precise = require ('./base/Precise');
// ---------------------------------------------------------------------------
module.exports = class qtrade extends Exchange {
describe () {
return this.deepExtend (super.describe (), {
'id': 'qtrade',
'name': 'qTrade',
'countries': [ 'US' ],
'rateLimit': 1000,
'version': 'v1',
'urls': {
'logo': 'https://user-images.githubusercontent.com/51840849/80491487-74a99c00-896b-11ea-821e-d307e832f13e.jpg',
'api': 'https://api.qtrade.io',
'www': 'https://qtrade.io',
'doc': 'https://qtrade-exchange.github.io/qtrade-docs',
'referral': 'https://qtrade.io/?ref=BKOQWVFGRH2C',
},
'has': {
'CORS': false,
'fetchTrades': true,
'fetchTicker': true,
'fetchTickers': true,
'fetchMarkets': true,
'fetchCurrencies': true,
'fetchBalance': true,
'fetchOrderBook': true,
'fetchOrder': true,
'fetchOrders': true,
'fetchMyTrades': true,
'fetchClosedOrders': true,
'fetchOpenOrders': true,
'fetchOHLCV': true,
'createOrder': true,
'cancelOrder': true,
'createMarketOrder': false,
'withdraw': true,
'fetchDepositAddress': true,
'fetchTransactions': false,
'fetchDeposits': true,
'fetchWithdrawals': true,
'fetchDeposit': true,
'fetchWithdrawal': true,
},
'timeframes': {
'5m': 'fivemin',
'15m': 'fifteenmin',
'30m': 'thirtymin',
'1h': 'onehour',
'2h': 'twohour',
'4h': 'fourhour',
'1d': 'oneday',
},
'api': {
'public': {
'get': [
'ticker/{market_string}',
'tickers',
'currency/{code}',
'currencies',
'common',
'market/{market_string}',
'markets',
'market/{market_string}/trades',
'orderbook/{market_string}',
'market/{market_string}/ohlcv/{interval}',
],
},
'private': {
'get': [
'me',
'balances',
'balances_all', // undocumented
'market/{market_string}',
'orders',
'order/{order_id}',
'trades',
'withdraw/{withdraw_id}',
'withdraws',
'deposit/{deposit_id}',
'deposits',
'transfers',
],
'post': [
'cancel_order',
'withdraw',
'deposit_address/{currency}',
'sell_limit',
'buy_limit',
],
},
},
'fees': {
'trading': {
'tierBased': true,
'percentage': true,
'taker': 0.0025,
'maker': 0.0,
},
'funding': {
'withdraw': {},
},
},
'exceptions': {
'exact': {
'invalid_auth': AuthenticationError,
'insuff_funds': InsufficientFunds,
'market_not_found': BadSymbol, // {"errors":[{"code":"market_not_found","title":"Requested market does not exist"}]}
},
},
});
}
async fetchMarkets (params = {}) {
const response = await this.publicGetMarkets (params);
//
// {
// "data":{
// "markets":[
// {
// "id":5,
// "market_currency":"BAC",
// "base_currency":"BTC",
// "maker_fee":"0.0025",
// "taker_fee":"0.0025",
// "metadata":{
// "delisting_date":"7/15/2018",
// "market_notices":[
// {
// "message":"Delisting Notice: This market has been delisted due to low volume. Please cancel your orders and withdraw your funds by 7/15/2018.",
// "type":"warning"
// }
// ]
// },
// "can_trade":false,
// "can_cancel":true,
// "can_view":false,
// "market_string":"BAC_BTC",
// "minimum_sell_amount":"0.0001",
// "minimum_buy_value":"0.0001",
// "market_precision":8,
// "base_precision":8
// },
// ],
// }
// }
//
const data = this.safeValue (response, 'data', {});
const markets = this.safeValue (data, 'markets', []);
const result = [];
for (let i = 0; i < markets.length; i++) {
const market = markets[i];
const marketId = this.safeString (market, 'market_string');
const numericId = this.safeInteger (market, 'id');
const baseId = this.safeString (market, 'market_currency');
const quoteId = this.safeString (market, 'base_currency');
const base = this.safeCurrencyCode (baseId);
const quote = this.safeCurrencyCode (quoteId);
const symbol = base + '/' + quote;
const precision = {
'amount': this.safeInteger (market, 'market_precision'),
'price': this.safeInteger (market, 'base_precision'),
};
const canView = this.safeValue (market, 'can_view', false);
const canTrade = this.safeValue (market, 'can_trade', false);
const active = canTrade && canView;
result.push ({
'symbol': symbol,
'id': marketId,
'numericId': numericId,
'baseId': baseId,
'quoteId': quoteId,
'base': base,
'quote': quote,
'active': active,
'precision': precision,
'taker': this.safeNumber (market, 'taker_fee'),
'maker': this.safeNumber (market, 'maker_fee'),
'limits': {
'amount': {
'min': this.safeNumber (market, 'minimum_buy_value'),
'max': undefined,
},
'price': {
'min': undefined,
'max': undefined,
},
'cost': {
'min': undefined,
'max': undefined,
},
},
'info': market,
});
}
return result;
}
async fetchCurrencies (params = {}) {
const response = await this.publicGetCurrencies (params);
//
// {
// "data":{
// "currencies":[
// {
// "code":"DGB",
// "long_name":"Digibyte",
// "type":"bitcoin_like",
// "precision":8,
// "config":{
// "price":0.0035,
// "withdraw_fee":"10",
// "deposit_types":[
// {
// "label":"Address",
// "lookup_mode":"address",
// "render_type":"address",
// "deposit_type":"address",
// "lookup_config":{}
// }
// ],
// "default_signer":103,
// "address_version":30,
// "satoshi_per_byte":300,
// "required_confirmations":200,
// "required_generate_confirmations":300
// },
// "metadata":{},
// "minimum_order":"0.0001",
// "status":"ok",
// "can_withdraw":true,
// "delisted":false,
// "deposit_disabled":false,
// "withdraw_disabled":false,
// "deposit_warn_codes":[],
// "withdraw_warn_codes":[]
// },
// ],
// }
// }
//
const data = this.safeValue (response, 'data', {});
const currencies = this.safeValue (data, 'currencies', []);
const result = {};
for (let i = 0; i < currencies.length; i++) {
const currency = currencies[i];
const id = this.safeString (currency, 'code');
const code = this.safeCurrencyCode (id);
const name = this.safeString (currency, 'long_name');
const type = this.safeString (currency, 'type');
const canWithdraw = this.safeValue (currency, 'can_withdraw', true);
const depositDisabled = this.safeValue (currency, 'deposit_disabled', false);
const config = this.safeValue (currency, 'config', {});
const status = this.safeString (currency, 'status');
const active = canWithdraw && (status === 'ok') && !depositDisabled;
result[code] = {
'id': id,
'code': code,
'info': currency,
'type': type,
'name': name,
'fee': this.safeNumber (config, 'withdraw_fee'),
'precision': this.safeInteger (currency, 'precision'),
'active': active,
'limits': {
'amount': {
'min': this.safeNumber (currency, 'minimum_order'),
'max': undefined,
},
'withdraw': {
'min': undefined,
'max': undefined,
},
},
};
}
return result;
}
parseOHLCV (ohlcv, market = undefined) {
//
// {
// "time":"2019-12-07T22:55:00Z",
// "open":"0.00197",
// "high":"0.00197",
// "low":"0.00197",
// "close":"0.00197",
// "volume":"0.00016676",
// "market_volume":"0.08465047"
// }
//
return [
this.parse8601 (this.safeString (ohlcv, 'time')),
this.safeNumber (ohlcv, 'open'),
this.safeNumber (ohlcv, 'high'),
this.safeNumber (ohlcv, 'low'),
this.safeNumber (ohlcv, 'close'),
this.safeNumber (ohlcv, 'market_volume'),
];
}
async fetchOHLCV (symbol, timeframe = '5m', since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'market_string': market['id'],
'interval': this.timeframes[timeframe],
};
const response = await this.publicGetMarketMarketStringOhlcvInterval (this.extend (request, params));
//
// {
// "data":{
// "slices":[
// {"time":"2019-12-07T22:55:00Z","open":"0.00197","high":"0.00197","low":"0.00197","close":"0.00197","volume":"0.00016676","market_volume":"0.08465047"},
// {"time":"2019-12-07T23:00:00Z","open":"0.00197","high":"0.00197","low":"0.00197","close":"0.00197","volume":"0","market_volume":"0"},
// {"time":"2019-12-07T23:05:00Z","open":"0.00197","high":"0.00197","low":"0.00197","close":"0.00197","volume":"0","market_volume":"0"},
// ]
// }
// }
//
const data = this.safeValue (response, 'data', {});
const ohlcvs = this.safeValue (data, 'slices', []);
return this.parseOHLCVs (ohlcvs, market, timeframe, since, limit);
}
async fetchOrderBook (symbol, limit = undefined, params = {}) {
await this.loadMarkets ();
const marketId = this.marketId (symbol);
const request = { 'market_string': marketId };
const response = await this.publicGetOrderbookMarketString (this.extend (request, params));
//
// {
// "data":{
// "buy":{
// "0.00700015":"4.76196367",
// "0.00700017":"1.89755391",
// "0.00700018":"2.13214088",
// },
// "last_change":1588539869958811,
// "sell":{
// "0.02418662":"0.19513696",
// "0.02465627":"0.2439212",
// "0.02530277":"0.663475931274359255",
// }
// }
// }
//
const data = this.safeValue (response, 'data', {});
const orderbook = {};
const sides = { 'buy': 'bids', 'sell': 'asks' };
const keys = Object.keys (sides);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const side = sides[key];
const bidasks = this.safeValue (data, key, {});
const prices = Object.keys (bidasks);
const result = [];
for (let j = 0; j < prices.length; j++) {
const priceAsString = prices[j];
const price = this.safeNumber (prices, j);
const amount = this.safeNumber (bidasks, priceAsString);
result.push ([ price, amount ]);
}
orderbook[side] = result;
}
const timestamp = this.safeIntegerProduct (data, 'last_change', 0.001);
return this.parseOrderBook (orderbook, symbol, timestamp);
}
parseTicker (ticker, market = undefined) {
//
// fetchTicker, fetchTickers
//
// {
// "ask":"0.02423119",
// "bid":"0.0230939",
// "day_avg_price":"0.0247031874349301",
// "day_change":"-0.0237543162270376",
// "day_high":"0.02470552",
// "day_low":"0.02470172",
// "day_open":"0.02530277",
// "day_volume_base":"0.00268074",
// "day_volume_market":"0.10851798",
// "id":41,
// "id_hr":"ETH_BTC",
// "last":"0.02470172",
// "last_change":1588533365354609
// }
//
const marketId = this.safeString (ticker, 'id_hr');
const symbol = this.safeSymbol (marketId, market, '_');
const timestamp = this.safeIntegerProduct (ticker, 'last_change', 0.001);
const previous = this.safeNumber (ticker, 'day_open');
const last = this.safeNumber (ticker, 'last');
const day_change = this.safeNumber (ticker, 'day_change');
let percentage = undefined;
let change = undefined;
let average = this.safeNumber (ticker, 'day_avg_price');
if (day_change !== undefined) {
percentage = day_change * 100;
if (previous !== undefined) {
change = day_change * previous;
}
}
if ((average === undefined) && (last !== undefined) && (previous !== undefined)) {
average = this.sum (last, previous) / 2;
}
const baseVolume = this.safeNumber (ticker, 'day_volume_market');
const quoteVolume = this.safeNumber (ticker, 'day_volume_base');
const vwap = this.vwap (baseVolume, quoteVolume);
return {
'symbol': symbol,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'high': this.safeNumber (ticker, 'day_high'),
'low': this.safeNumber (ticker, 'day_low'),
'bid': this.safeNumber (ticker, 'bid'),
'bidVolume': undefined,
'ask': this.safeNumber (ticker, 'ask'),
'askVolume': undefined,
'vwap': vwap,
'open': previous,
'close': last,
'last': last,
'previousClose': undefined,
'change': change,
'percentage': percentage,
'average': average,
'baseVolume': baseVolume,
'quoteVolume': quoteVolume,
'info': ticker,
};
}
async fetchTickers (symbols = undefined, params = {}) {
await this.loadMarkets ();
const response = await this.publicGetTickers (params);
//
// {
// "data":{
// "markets":[
// {
// "ask":"0.0000003",
// "bid":"0.00000029",
// "day_avg_price":"0.0000002999979728",
// "day_change":"0.0344827586206897",
// "day_high":"0.0000003",
// "day_low":"0.0000003",
// "day_open":"0.00000029",
// "day_volume_base":"0.00591958",
// "day_volume_market":"19732.06666665",
// "id":36,
// "id_hr":"DOGE_BTC",
// "last":"0.0000003",
// "last_change":1588534202130778
// },
// ]
// }
// }
//
const data = this.safeValue (response, 'data', {});
const tickers = this.safeValue (data, 'markets', []);
const result = {};
for (let i = 0; i < tickers.length; i++) {
const ticker = this.parseTicker (tickers[i]);
const symbol = ticker['symbol'];
result[symbol] = ticker;
}
return this.filterByArray (result, 'symbol', symbols);
}
async fetchTicker (symbol, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'market_string': market['id'],
};
const response = await this.publicGetTickerMarketString (this.extend (request, params));
//
// {
// "data":{
// "ask":"0.02423119",
// "bid":"0.0230939",
// "day_avg_price":"0.0247031874349301",
// "day_change":"-0.0237543162270376",
// "day_high":"0.02470552",
// "day_low":"0.02470172",
// "day_open":"0.02530277",
// "day_volume_base":"0.00268074",
// "day_volume_market":"0.10851798",
// "id":41,
// "id_hr":"ETH_BTC",
// "last":"0.02470172",
// "last_change":1588533365354609
// }
// }
//
const data = this.safeValue (response, 'data', {});
return this.parseTicker (data, market);
}
async fetchTrades (symbol, since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'market_string': market['id'],
// 'older_than': 123, // returns trades with id < older_than
// 'newer_than': 123, // returns trades with id > newer_than
};
const response = await this.publicGetMarketMarketStringTrades (this.extend (request, params));
//
// {
// "data":{
// "trades":[
// {
// "id":85507,
// "amount":"0.09390502",
// "price":"0.02556325",
// "base_volume":"0.00240051",
// "seller_taker":true,
// "side":"sell",
// "created_at":"0001-01-01T00:00:00Z",
// "created_at_ts":1581560391338718
// },
// ]
// }
// }
//
const data = this.safeValue (response, 'data', {});
const trades = this.safeValue (data, 'trades', []);
return this.parseTrades (trades, market, since, limit);
}
async fetchMyTrades (symbol = undefined, since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
const request = {
'desc': true, // Returns newest trades first when true
// 'older_than': 123, // returns trades with id < older_than
// 'newer_than': 123, // returns trades with id > newer_than
};
let market = undefined;
const numericId = this.safeValue (params, 'market_id');
if (numericId !== undefined) {
request['market_id'] = numericId; // mutually exclusive with market_string
} else if (symbol !== undefined) {
market = this.market (symbol);
request['market_string'] = market['id'];
}
const response = await this.privateGetTrades (this.extend (request, params));
//
// {
// "data":{
// "trades":[
// {
// "id":107331,
// "market_amount":"0.1082536946986",
// "price":"0.0230939",
// "base_amount":"0.00249999",
// "order_id":13790596,
// "market_id":41,
// "market_string":"ETH_BTC",
// "taker":true,
// "base_fee":"0.00001249",
// "side":"sell",
// "created_at":"2020-05-04T06:08:18.513413Z"
// }
// ]
// }
// }
//
const data = this.safeValue (response, 'data', {});
const trades = this.safeValue (data, 'trades', []);
return this.parseTrades (trades, market, since, limit);
}
parseTrade (trade, market = undefined) {
//
// fetchTrades (public)
//
// {
// "id":85507,
// "amount":"0.09390502",
// "price":"0.02556325",
// "base_volume":"0.00240051",
// "seller_taker":true,
// "side":"sell",
// "created_at":"0001-01-01T00:00:00Z",
// "created_at_ts":1581560391338718
// }
//
// fetchMyTrades (private)
//
// {
// "id":107331,
// "market_amount":"0.1082536946986",
// "price":"0.0230939",
// "base_amount":"0.00249999",
// "order_id":13790596,
// "market_id":41,
// "market_string":"ETH_BTC",
// "taker":true,
// "base_fee":"0.00001249",
// "side":"sell",
// "created_at":"2020-05-04T06:08:18.513413Z"
// }
//
// createOrder, fetchOrders, fetchOpenOrders, fetchClosedOrders
//
// {
// "base_amount": "9.58970687",
// "base_fee": "0.02397426",
// "created_at": "0001-01-01T00:00:00Z",
// "id": 0,
// "market_amount": "0.97179355",
// "price": "9.86804952",
// "taker": true
// }
//
const id = this.safeString (trade, 'id');
let timestamp = this.safeIntegerProduct (trade, 'created_at_ts', 0.001);
if (timestamp === undefined) {
timestamp = this.parse8601 (this.safeString (trade, 'created_at'));
}
const side = this.safeString (trade, 'side');
const marketId = this.safeString (trade, 'market_string');
const symbol = this.safeSymbol (marketId, market, '_');
let cost = this.safeNumber2 (trade, 'base_volume', 'base_amount');
const priceString = this.safeString (trade, 'price');
const amountString = this.safeString2 (trade, 'market_amount', 'amount');
const price = this.parseNumber (priceString);
const amount = this.parseNumber (amountString);
if (cost === undefined) {
cost = this.parseNumber (Precise.stringMul (priceString, amountString));
}
let fee = undefined;
const feeCost = this.safeNumber (trade, 'base_fee');
if (feeCost !== undefined) {
const feeCurrencyCode = (market === undefined) ? undefined : market['quote'];
fee = {
'currency': feeCurrencyCode,
'cost': feeCost,
};
}
const taker = this.safeValue (trade, 'taker', true);
const takerOrMaker = taker ? 'taker' : 'maker';
const orderId = this.safeString (trade, 'order_id');
const result = {
'id': id,
'info': trade,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'symbol': symbol,
'order': orderId,
'type': undefined,
'side': side,
'takerOrMaker': takerOrMaker,
'price': price,
'amount': amount,
'cost': cost,
'fee': fee,
};
return result;
}
async fetchBalance (params = {}) {
await this.loadMarkets ();
const response = await this.privateGetBalancesAll (params);
//
// {
// "data":{
// "balances": [
// { "balance": "100000000", "currency": "BCH" },
// { "balance": "99992435.78253015", "currency": "LTC" },
// { "balance": "99927153.76074182", "currency": "BTC" },
// ],
// "order_balances":[],
// "limit_used":0,
// "limit_remaining":4000,
// "limit":4000
// }
// }
//
const data = this.safeValue (response, 'data', {});
let balances = this.safeValue (data, 'balances', []);
const result = {
'info': response,
'timestamp': undefined,
'datetime': undefined,
};
for (let i = 0; i < balances.length; i++) {
const balance = balances[i];
const currencyId = this.safeString (balance, 'currency');
const code = this.safeCurrencyCode (currencyId);
const account = (code in result) ? result[code] : this.account ();
account['free'] = this.safeString (balance, 'balance');
account['used'] = '0';
result[code] = account;
}
balances = this.safeValue (data, 'order_balances', []);
for (let i = 0; i < balances.length; i++) {
const balance = balances[i];
const currencyId = this.safeString (balance, 'currency');
const code = this.safeCurrencyCode (currencyId);
const account = (code in result) ? result[code] : this.account ();
account['used'] = this.safeString (balance, 'balance');
result[code] = account;
}
return this.parseBalance (result, false);
}
async createOrder (symbol, type, side, amount, price = undefined, params = {}) {
if (type !== 'limit') {
throw new InvalidOrder (this.id + ' createOrder() allows limit orders only');
}
await this.loadMarkets ();
const market = this.market (symbol);
const request = {
'amount': this.amountToPrecision (symbol, amount),
'market_id': market['numericId'],
'price': this.priceToPrecision (symbol, price),
};
const method = (side === 'sell') ? 'privatePostSellLimit' : 'privatePostBuyLimit';
const response = await this[method] (this.extend (request, params));
//
// {
// "data": {
// "order": {
// "created_at": "2018-04-06T20:46:52.899248Z",
// "id": 13253,
// "market_amount": "1",
// "market_amount_remaining": "0",
// "market_id": 1,
// "open": false,
// "order_type": "sell_limit",
// "price": "0.01",
// "trades": [
// {
// "base_amount": "0.27834267",
// "base_fee": "0.00069585",
// "created_at": "0001-01-01T00:00:00Z",
// "id": 0,
// "market_amount": "0.02820645",
// "price": "9.86805058",
// "taker": true
// },
// {
// "base_amount": "9.58970687",
// "base_fee": "0.02397426",
// "created_at": "0001-01-01T00:00:00Z",
// "id": 0,
// "market_amount": "0.97179355",
// "price": "9.86804952",
// "taker": true
// }
// ]
// }
// }
// }
//
const data = this.safeValue (response, 'data', {});
const order = this.safeValue (data, 'order', {});
return this.parseOrder (order, market);
}
parseOrder (order, market = undefined) {
//
// createOrder
//
// {
// "created_at": "2018-04-06T20:46:52.899248Z",
// "id": 13253,
// "market_amount": "1",
// "market_amount_remaining": "0",
// "market_id": 1,
// "open": false,
// "order_type": "sell_limit",
// "price": "0.01",
// "trades": [
// {
// "base_amount": "0.27834267",
// "base_fee": "0.00069585",
// "created_at": "0001-01-01T00:00:00Z",
// "id": 0,
// "market_amount": "0.02820645",
// "price": "9.86805058",
// "taker": true
// },
// {
// "base_amount": "9.58970687",
// "base_fee": "0.02397426",
// "created_at": "0001-01-01T00:00:00Z",
// "id": 0,
// "market_amount": "0.97179355",
// "price": "9.86804952",
// "taker": true
// }
// ]
// }
//
// fetchOrder
//
// {
// id: 13790596,
// market_amount: "0.15",
// market_amount_remaining: "0",
// created_at: "2020-05-04T06:08:18.513413Z",
// price: "0.0230939",
// base_amount: "0",
// order_type: "sell_limit",
// market_id: 41,
// market_string: "ETH_BTC",
// open: false,
// trades: [
// {
// id: 107331,
// market_amount: "0.1082536946986",
// price: "0.0230939",
// base_amount: "0.00249999",
// taker: true,
// base_fee: "0.00001249",
// created_at: "2020-05-04T06:08:18.513413Z",
// }
// ],
// close_reason: "canceled"
// }
//
const id = this.safeString (order, 'id');
const timestamp = this.parse8601 (this.safeString (order, 'created_at'));
const sideType = this.safeString (order, 'order_type');
let orderType = undefined;
let side = undefined;
if (sideType !== undefined) {
const parts = sideType.split ('_');
side = this.safeString (parts, 0);
orderType = this.safeString (parts, 1);
}
const price = this.safeNumber (order, 'price');
const amount = this.safeNumber (order, 'market_amount');
const remaining = this.safeNumber (order, 'market_amount_remaining');
const open = this.safeValue (order, 'open', false);
const closeReason = this.safeString (order, 'close_reason');
let status = undefined;
if (open) {
status = 'open';
} else if (closeReason === 'canceled') {
status = 'canceled';
} else {
status = 'closed';
}
const marketId = this.safeString (order, 'market_string');
market = this.safeMarket (marketId, market, '_');
const symbol = market['symbol'];
const rawTrades = this.safeValue (order, 'trades', []);
const parsedTrades = this.parseTrades (rawTrades, market, undefined, undefined, {
'order': id,
'side': side,
'type': orderType,
});
return this.safeOrder ({
'info': order,
'id': id,
'clientOrderId': undefined,
'timestamp': timestamp,
'datetime': this.iso8601 (timestamp),
'lastTradeTimestamp': undefined,
'symbol': symbol,
'type': orderType,
'timeInForce': undefined,
'postOnly': undefined,
'side': side,
'price': price,
'stopPrice': undefined,
'average': undefined,
'amount': amount,
'remaining': remaining,
'filled': undefined,
'status': status,
'fee': undefined,
'fees': undefined,
'cost': undefined,
'trades': parsedTrades,
});
}
async cancelOrder (id, symbol = undefined, params = {}) {
const request = {
'id': parseInt (id),
};
// successful cancellation returns 200 with no payload
return await this.privatePostCancelOrder (this.extend (request, params));
}
async fetchOrder (id, symbol = undefined, params = {}) {
await this.loadMarkets ();
const request = { 'order_id': id };
const response = await this.privateGetOrderOrderId (this.extend (request, params));
//
// {
// "data":{
// "order":{
// "id":13790596,
// "market_amount":"0.15",
// "market_amount_remaining":"0.0417463053014",
// "created_at":"2020-05-04T06:08:18.513413Z",
// "price":"0.0230939",
// "order_type":"sell_limit",
// "market_id":41,
// "market_string":"ETH_BTC",
// "open":true,
// "trades":[
// {
// "id":107331,
// "market_amount":"0.1082536946986",
// "price":"0.0230939",
// "base_amount":"0.00249999",
// "taker":true,
// "base_fee":"0.00001249",
// "created_at":"2020-05-04T06:08:18.513413Z"
// }
// ]
// }
// }
// }
//
const data = this.safeValue (response, 'data', {});
const order = this.safeValue (data, 'order', {});
return this.parseOrder (order);
}
async fetchOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
const request = {
// 'open': true,
// 'older_than': 123, // returns orders with id < older_than
// 'newer_than': 123, // returns orders with id > newer_than
};
let market = undefined;
const numericId = this.safeValue (params, 'market_id');
if (numericId !== undefined) {
request['market_id'] = numericId; // mutually exclusive with market_string
} else if (symbol !== undefined) {
market = this.market (symbol);
request['market_string'] = market['id'];
}
const response = await this.privateGetOrders (this.extend (request, params));
//
// {
// "data":{
// "orders":[
// {
// "id":13790596,
// "market_amount":"0.15",
// "market_amount_remaining":"0.0417463053014",
// "created_at":"2020-05-04T06:08:18.513413Z",
// "price":"0.0230939",
// "order_type":"sell_limit",
// "market_id":41,
// "market_string":"ETH_BTC",
// "open":true,
// "trades":[
// {
// "id":107331,
// "market_amount":"0.1082536946986",
// "price":"0.0230939",
// "base_amount":"0.00249999",
// "taker":true,
// "base_fee":"0.00001249",
// "created_at":"2020-05-04T06:08:18.513413Z"
// }
// ]
// }
// ]
// }
// }
//
const data = this.safeValue (response, 'data', {});
const orders = this.safeValue (data, 'orders', []);
return this.parseOrders (orders, market, since, limit);
}
async fetchOpenOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
const request = { 'open': true };
return await this.fetchOrders (symbol, since, limit, this.extend (request, params));
}
async fetchClosedOrders (symbol = undefined, since = undefined, limit = undefined, params = {}) {
const request = { 'open': false };
return await this.fetchOrders (symbol, since, limit, this.extend (request, params));
}
parseDepositAddress (depositAddress, currency = undefined) {
//
// {
// "address":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// "currency_status":"ok",
// "deposit_methods":{
// "address":{
// "deposit_type":"address",
// "render_type":"address",
// "label":"Address",
// "address":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// },
// },
// }
//
const code = (currency === undefined) ? undefined : currency['code'];
let address = this.safeString (depositAddress, 'address');
let tag = undefined;
if (address !== undefined) {
const parts = address.split (':');
address = this.safeString (parts, 0);
tag = this.safeString (parts, 1);
}
this.checkAddress (address);
return {
'currency': code,
'address': address,
'tag': tag,
'info': depositAddress,
};
}
async fetchDepositAddress (code, params = {}) {
await this.loadMarkets ();
const currency = this.currency (code);
const request = {
'currency': currency['id'],
};
const response = await this.privatePostDepositAddressCurrency (this.extend (request, params));
//
// {
// "data":{
// "address":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// "currency_status":"ok",
// "deposit_methods":{
// "address":{
// "deposit_type":"address",
// "render_type":"address",
// "label":"Address",
// "address":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// },
// },
// },
// }
//
const data = this.safeValue (response, 'data', {});
return this.parseDepositAddress (data, currency);
}
async fetchDeposit (id, code = undefined, params = {}) {
await this.loadMarkets ();
const request = {
'deposit_id': id,
};
const response = await this.privateGetDepositDepositId (this.extend (request, params));
//
// {
// "data":{
// "deposit":{
// "id":"0xaa6e65ed274c4786e5dec3671de96f81021cacdbc453b1a133ab84356f3620a0",
// "amount":"0.13",
// "currency":"ETH",
// "address":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// "status":"credited",
// "relay_status":"",
// "network_data":{
// "confirms":87,
// "sweep_txid":"0xa16e65ed274d4686e5dec3671de96f81021cacdbc453b1a133ab85356f3630a0",
// "sweep_balance":"0.150000000000000000",
// "confirms_required":80,
// "unsigned_sweep_tx":{
// "chainId":1,
// "from":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// "gas":"0x5208",
// "gasPrice":"0x19b45a500",
// "nonce":"0x0",
// "to":"0x76Cd80202a2C31e9D8F595a31ed071CE7F75BB93",
// "value":"0x214646b6347d800"
// },
// "txid":"0xaa6e65ed274c4786e5dec3671de96f81021cacdbc453b1a133ab84356f3620a0",
// "tx_index":"0x6f",
// "tx_value":"0.130000000000000000",
// "key_index":311,
// "blockheight":9877869,
// "signed_sweep_tx":{
// "hash":"0xa16e65ed274d4686e5dec3671de96f81021cacdbc453b1a133ab85356f3630a0",
// "rawTransaction":"0xd86c8085019b45a1008252099476cb80202b2c31e9d7f595a31fd071ce7f75bb93880214646b6347d8008046a08c6e3bfe8b25bff2b6851c87ea17c63d7b23591210ab0779a568eaa43dc40435a030e964bb2b667072ea7cbc8ab554403e3f3ead9b554743f2fdc2b1e06e998df9"
// },
// "estimated_sweep_tx_fee":144900000000000
// },
// "created_at":"2020-05-04T05:38:42.145162Z"
// }
// }
// }
const data = this.safeValue (response, 'data', {});
const deposit = this.safeValue (data, 'deposit', {});
return this.parseTransaction (deposit);
}
async fetchDeposits (code = undefined, since = undefined, limit = undefined, params = {}) {
await this.loadMarkets ();
let currency = undefined;
if (code !== undefined) {
currency = this.currency (code);
}
const response = await this.privateGetDeposits (params);
//
// {
// "data":{
// "deposits":[
// {
// "id":"0xaa6e65ed274c4786e5dec3671de96f81021cacdbc453b1a133ab84356f3620a0",
// "amount":"0.13",
// "currency":"ETH",
// "address":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// "status":"credited",
// "relay_status":"",
// "network_data":{
// "confirms":87,
// "sweep_txid":"0xa16e65ed274d4686e5dec3671de96f81021cacdbc453b1a133ab85356f3630a0",
// "sweep_balance":"0.150000000000000000",
// "confirms_required":80,
// "unsigned_sweep_tx":{
// "chainId":1,
// "from":"0xe0cd26f9A60118555247aE6769A5d241D91f07f2",
// "gas":"0x5208",
// "gasPrice":"0x19b45a500",
// "nonce":"0x0",
// "to":"0x76Cd80202a2C31e9D8F595a31ed071CE7F75BB93",
// "value":"0x214646b6347d800"
// },
// "txid":"0xaa6e65ed274c4786e5dec3671de96f81021cacdbc453b1a133ab84356f3620a0",
// "tx_index":"0x6f",
// "tx_value":"0.130000000000000000",
// "key_index":311,
// "blockheight":9877869,
// "signed_sweep_tx":{
// "hash":"0xa16e65ed274d4686e5dec3671de96f81021cacdbc453b1a133ab85356f3630a0",
// "rawTransaction":"0xd86c8085019b45a1008252099476cb80202b2c31e9d7f595a31fd071ce7f75bb93880214646b6347d8008046a08c6e3bfe8b25bff2b6851c87ea17c63d7b23591210ab0779a568eaa43dc40435a030e964bb2b667072ea7cbc8ab554403e3f3ead9b554743f2fdc2b1e06e998df9"
// },
// "estimated_sweep_tx_fee":144900000000000
// },
// "created_at":"2020-05-04T05:38:42.145162Z"
// }
// ]
// }
// }
//
const data = this.safeValue (response, 'data', {});
const deposits = this.safeValue (data, 'deposits', []);
return this.parseTransactions (deposits, currency, since, limit);
}
async fetchWithdrawal (id, code = undefined, params = {}) {
await this.loadMarkets ();
const request = {
'withdraw_id': id,
};
const response = await this.privateGetWithdrawWithdrawId (this.extend (request, params));
//
// {
// data: {
// withdraw: {
// "id":25524,
// "amount":"0.0417463053014",
// "user_id":0,
// "currency":"ETH",
// "network_data":{
// "unsigned_tx":{
// "chainId":1,
// "from":"0x76Cd80202a2C31e9D8F595a31ed071CE7F75