UNPKG

exchanges

Version:
219 lines (216 loc) 7.21 kB
// const Utils = require('./utils'); // const Base = require('./../base'); // const request = require('./../../utils/request'); // const crypto = require('crypto'); const _ = require('lodash'); const kUtils = require('./utils'); const Utils = require('./../../utils'); // const md5 = require('md5'); // const error = require('./errors'); const { checkKey } = Utils; const Spot = require('./spot'); const FUTURE_PAIRS = require('./meta/future_pairs.json'); // class Exchange extends Spot { constructor(o, options) { super(o, options); this.unfinishFutureOrders = {}; } // 市场类 async futureTick(o = {}) { const ds = await this.get('future_ticker', o); return kUtils.formatTick(ds); } async futureDepth(o = {}) { const defaultO = { size: 50 }; checkKey(o, ['contract_type', 'pair']); const opt = { ...defaultO, ...o }; const ds = await this.get('future_depth', opt); return kUtils.formatDepth(ds); } async futureOrderBook(o = {}) { const ds = await this.get('future_trades', o, true, true); return kUtils.formatOrderBook(ds); } async futureKlines(o = {}) { if (o.pair) { const ds = await this.futureKline(o); return ds; } const tasks = _.map(FUTURE_PAIRS, (pair) => { return this.futureKline({ ...o, pair }); }); const dss = await Promise.all(tasks); // return kUtils.formatKline(ds); } async futureKline(o = {}) { checkKey(o, ['pair']); let { pair } = o; const defaultFutureKlineO = { contract_type: 'quarter', interval: '1m' }; o = { ...defaultFutureKlineO, ...o }; const opt = kUtils.formatFutureKlineO(o); const ds = await this.get('future_kline', opt, true, true); if (o.isUSDT) { pair += 'T'; } return kUtils.formatFutureKline(ds, { ...o, pair }); } wsFutureTicks(o = {}, cb) { const { contract_type = 'quarter' } = o; const chanelString = kUtils.createWsChanelFutureTick(FUTURE_PAIRS, { contract_type }); this.createWs({ timeInterval: 300, chanelString })(kUtils.formatWsFutureTick, cb); } wsFutureKlines(o = {}, cb) { const symbols = o.pair ? [kUtils.formatPair(o.pair, true)] : FUTURE_PAIRS; const { contract_type = 'quarter', interval = '1m' } = o; const options = { contract_type, interval }; const chanelString = kUtils.createWsChanelFutureKline(symbols, { contract_type, interval }); this.createWs({ timeInterval: 300, chanelString, options })(kUtils.formatWsFutureKline, cb); } wsFutureKline(o = {}, cb) { checkKey(o, ['pair']); this.wsFutureKlines(o, cb); } async futureBalances(o = {}) { let ds = await this.post('future_userinfo', o, true); ds = kUtils.formatFutureBalances(ds); return ds; } async moveBalance(o = {}) { checkKey(o, ['source', 'target', 'amount', 'coin']); const opt = kUtils.formatMoveBalanceO(o); const ds = await this.post('future_devolve', opt, true); return { success: ds.result }; } // 市场上的交易历史 // async futureOrderHistory(o = {}) { // console.log('to do'); // process.exit(); // checkKey(o, ['pair', 'date']); // const opt = kUtils.formatFutureOrderHistoryO(o); // } _updateUnfinishFutureOrders(d) { const { status } = d; if (!status) { // this.unfinishFutureOrders[d.order_id] = d; } else if (status === 'FINISH') { delete this.unfinishFutureOrders[d.order_id]; } } async futureOrder(o = {}) { checkKey(o, ['pair', 'contract_type', 'lever_rate', 'side', 'direction', 'type']); const opt = kUtils.formatFutureOrderO(o); const ds = await this.post('future_trade', opt, true); const res = { success: ds.result, order_id: ds.order_id, ...o }; this._updateUnfinishFutureOrders(res); return res; } async batchFutureOrder(o = {}) { checkKey(o, ['pair', 'orders', 'lever_rate', 'contract_type']); const opt = kUtils.formatBatchFutureOrderO(o); const ds = await this.post('future_batch_trade', opt, true); return _.map(ds.order_info, (order) => { if (order.error_code) return null; const line = { ...o, success: true, order_id: order.order_id }; delete line.orders; this._updateUnfinishFutureOrders(line); return line; }).filter(d => d); } async cancelFutureOrder(o = {}) { const reqs = ['pair', 'order_id', 'contract_type']; checkKey(o, reqs); const opt = _.pick(o, reqs); const ds = await this.post('future_cancel', opt, true); const res = { success: ds.result, order_id: ds.order_id }; if (res.success) delete this.unfinishFutureOrders[res.order_id]; return res; } async cancelAllFutureOrders() { let unfinishs = this.unfinishFutureOrders; if (!_.values(unfinishs).length) return { success: true, message: 'no order to cancel' }; const reqs = ['pair', 'order_id', 'contract_type']; unfinishs = _.map(unfinishs, d => _.pick(d, reqs)); unfinishs = _.groupBy(unfinishs, 'pair'); unfinishs = _.mapValues(unfinishs, d => _.groupBy(d, 'contract_type')); let tasks = _.map(unfinishs, (info, pair) => { return _.map(info, (ds, contract_type) => { const o = { pair, contract_type, order_id: _.map(ds, d => d.order_id) }; return this._cancelAllFutureOrders(o); }); }); tasks = _.flatten(tasks); const ds = await Promise.all(tasks); const res = { success: [], error: [] }; _.forEach(ds, (d) => { res.success = { ...res.success, ...d.success }; res.error = { ...res.error, ...d.error }; }); return { success: _.keys(res.success), error: _.keys(res.error) }; } async _cancelAllFutureOrders(o = {}) { const reqs = ['pair', 'contract_type', 'order_id']; checkKey(o, reqs); const opt = _.pick(o, reqs); if (Array.isArray(opt.order_id)) opt.order_id = opt.order_id.join(','); const ds = await this.post('future_cancel', opt, true); let success; let error; if (ds.result === true) { success = { [ds.order_id]: ds.order_id }; } else if (ds.result === false) { error = { [ds.order_id]: ds.order_id }; } else { error = _.keyBy(ds.error.split(','), d => d); success = _.keyBy(ds.success.split(','), d => d); } _.forEach(success, (suc_id) => { delete this.unfinishFutureOrders[suc_id]; }); return { success, error }; } async futureOrderInfo(o = {}) { const reqs = ['pair', 'order_id', 'contract_type']; checkKey(o, reqs); const opt = _.pick(o, reqs); const ds = await this.post('future_order_info', opt, true); const res = kUtils.formatFutureOrderInfo(ds, o); this._updateUnfinishFutureOrders(res); return res; } async futureAllOrders(o = {}) { const defaultO = { page_length: 2000, current_page: 0, status: 'UNFINISH' }; o = { ...defaultO, ...o }; checkKey(o, ['pair']); const opt = kUtils.formatFutureAllOrdersO(o); const ds = await this.post('future_trades_history', opt, true); return kUtils.formatFutureAllOrders(ds); // future_trades_history } } module.exports = Exchange;