rofex
Version:
Primary REST API. Websocket API
384 lines (353 loc) • 10.7 kB
JavaScript
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;