UNPKG

rofex

Version:

Primary REST API. Websocket API

384 lines (353 loc) 10.7 kB
const request = require('request'); const RofexAuth = require('./auth.js'); const qs = require('querystring'); /** * */ class RestConnection { /** * * @param {*} user * @param {*} pass * @param {*} timeout * @param {*} test */ constructor(user, pass, timeout = 15000, test = false) { this.Auth = new RofexAuth(user, pass, timeout, test); this._baseUrl = 'https://api.primary.com.ar/'; if (test) { this._baseUrl = 'http://demo-api.primary.com.ar/'; } } /** * * @param {*} method * @param {*} path * @param {*} query * @param {*} attempt * @param {*} cb */ request(method, path, query = '', attempt = 0, cb = () => { }) { return new Promise((resolve, reject) => { this.Auth.getToken() .then(token => { let queryString; const options = { url: `${this._baseUrl}${path}`, timeout: this.timeout }; queryString = qs.stringify(query); if (queryString) { options.url += '?' + queryString; } options.headers = { 'X-Auth-Token': token }; if (method) { options.method = method; } request(options, (err, response, body) => { let payload; try { payload = JSON.parse(body); } catch (e) { payload = body; } if (err) { reject(error) cb(err, payload); } else { if (response.statusCode != 200) { reject(`Response code ${response.statusCode}`); cb(`Response code ${response.statusCode}`, payload); } else { if (payload.status == 'ERROR') { var errorMessage = payload.description if (payload.message) { errorMessage += ' ' + payload.message; } reject(payload); cb(errorMessage, payload); } else { resolve(payload) cb(err, payload); } } } }); } ) .catch(console.error); }); } } /** * */ class RestApiModule { /** * * @param {*} connection */ constructor(connection) { this.connection = connection; } } /** * */ class Marketdata extends RestApiModule { /** * * @param {*} marketId * @param {*} symbol * @param {*} entries * @param {*} depth * @param {*} cb */ get(marketId, symbol, entries, depth, cb = () => { }) { var path = 'rest/marketdata/get'; var query = { marketId: marketId, symbol: symbol, entries: entries, depth: depth } return this.connection.request('GET', path, query, 0, cb); } } /** * */ class Segment extends RestApiModule { all() { var path = 'rest/segment/all'; return this.connection.request('GET', path, null, 0, cb); } } /** * */ class Instruments extends RestApiModule { /** * * @param {*} cb */ all(cb = () => { }) { var path = 'rest/instruments/all'; return this.connection.request('GET', path, null, 0, cb); } /** * * @param {*} cb */ details(cb = () => { }) { var path = 'rest/instruments/details'; return this.connection.request('GET', path, null, 0, cb); } /** * * @param {*} marketId * @param {*} symbol * @param {*} cb */ detail(marketId, symbol, cb = () => { }) { var path = 'rest/instruments/detail'; var query = { marketId: marketId, symbol: symbol }; return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} CFICode * @param {*} cb */ byCFICode(CFICode, cb = () => { }) { var path = 'rest/instruments/byCFICode'; var query = { CFICode: CFICode }; return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} MarketSegmentID * @param {*} MarketID * @param {*} cb */ bySegment(MarketSegmentID, MarketID, cb = () => { }) { var path = 'rest/instruments/bySegment'; var query = { MarketSegmentID: MarketSegmentID, MarketID: MarketID }; return this.connection.request('GET', path, query, 0, cb); } } class Order extends RestApiModule { /** * * @param {*} marketId * @param {*} Symbol * @param {*} Price * @param {*} orderQty * @param {*} ordType * @param {*} side * @param {*} timeInForce * @param {*} account * @param {*} cancelPrevious * @param {*} iceberg * @param {*} expireDate * @param {*} displayQty * @param {*} cb */ newSingleOrder(marketId, Symbol, Price, orderQty, ordType, side, timeInForce, account, cancelPrevious = null, iceberg = null, expireDate = null, displayQty = null, cb = () => { }) { var path = 'rest/order/newSingleOrder'; var query = { marketId:marketId, symbol:Symbol, price:Price, orderQty:orderQty, ordType:ordType, side:side, timeInForce:timeInForce, account:account } if (cancelPrevious !== null) { query.cancelPrevious = cancelPrevious; } if (iceberg !== null) { query.iceberg = iceberg; } if (displayQty !== null) { query.displayQty = displayQty; } if (expireDate !== null) { query.expireDate = expireDate; } return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} clOrdId * @param {*} proprietary * @param {*} Price * @param {*} orderQty * @param {*} cb */ replaceById(clOrdId, proprietary, Price, orderQty, cb = () => { }) { var path = 'rest/order/replaceById'; var query = { clOrdId: clOrdId, proprietary: proprietary, orderQty: orderQty, Price: Price }; return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} clOrdId * @param {*} proprietary * @param {*} cb */ cancelById(clOrdId, proprietary, cb = () => { }) { var path = 'rest/order/cancelById'; var query = { clOrdId: clOrdId, proprietary: proprietary }; return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} clOrdId * @param {*} proprietary * @param {*} cb */ id(clOrdId, proprietary, cb = () => { }) { var path = 'rest/order/id'; var query = { clOrdId: clOrdId, proprietary: proprietary } return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} clOrdId * @param {*} proprietary * @param {*} cb */ allById(clOrdId, proprietary, cb = () => { }) { var path = 'rest/order/allById'; var query = { clOrdId: clOrdId, proprietary: proprietary } } /** * * @param {*} orderId * @param {*} cb */ byOrderId(orderId, cb = () => { }) { var path = 'rest/order/byOrderId'; var query = { orderId: orderId } return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} accountId * @param {*} cb */ actives(accountId, cb = () => { }) { var path = 'rest/order/actives'; var query = { accountId: accountId } return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} accountId * @param {*} cb */ filleds(accountId, cb = () => { }) { var path = 'rest/order/filleds'; var query = { accountId: accountId } return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} accountId * @param {*} cb */ all(accountId, cb = () => { }) { var path = 'rest/order/all'; var query = { accountId: accountId } return this.connection.request('GET', path, query, 0, cb); } /** * * @param {*} execId * @param {*} cb */ byExecId(execId, cb = () => { }) { var path = 'rest/order/byExecId'; var query = { execId: execId } return this.connection.request('GET', path, query, 0, cb); } } class Data extends RestApiModule { /** * * @param {*} marketId String Identificador del Mercado a consultar, valores posibles:ROFX = ROFEX * @param {*} symbol String Simbolo del contrato a consultar. * @param {*} date String Fecha a consultar (o desde), formato: YYYY-MM-DD. Ejemplo: 2017-05-20 * @param {*} dateTo String Fecha hasta, formato: YYYY-MM-DD * @param {*} cb Function */ getTrades(marketId, symbol, date = null, dateFrom = null, dateTo = null, cb = () => { }) { var path = 'rest/data/getTrades'; var query = { marketId: marketId, symbol: symbol }; if (date !== null) { query.date = date; } if (dateFrom !== null) { query.dateFrom = dateFrom; } if (dateTo !== null) { query.dateTo = dateTo; } return this.connection.request('GET', path, query, 0, cb); } } class Rest { /** * * @param {*} user * @param {*} pass * @param {*} timeout * @param {*} test */ constructor(user, pass, timeout = 15000, test = false) { var connectin = new RestConnection(user, pass, timeout, test) this.order = new Order(connectin); this.data = new Data(connectin); this.marketdata = new Marketdata(connectin); this.segment = new Segment(connectin); this.instruments = new Instruments(connectin); } } module.exports = Rest;