rofex
Version:
Primary REST API. Websocket API
137 lines (118 loc) • 4.22 kB
JavaScript
var RofexAuth = require('./auth.js');
var WebSocketClient = require('websocket').client;
const EventEmitter = require('events');
class WebSocket extends EventEmitter {
constructor(
user,
pass,
timeout = 15000,
test = false
) {
super();
this.waitFor = [];
this._baseUrl = 'wss://api.primary.com.ar';
if (test) {
this._baseUrl = 'ws://demo-api.primary.com.ar';
}
this.WSclient = new WebSocketClient();
this.WSclient.on('connectFailed', function (error) {
console.log('Connect Error: ' + error.toString());
});
this.WSclient.on('connect', (connection) => {
console.log('WebSocket Client Connected');
connection.on('error', function (error) {
console.log("Connection Error: " + error.toString());
});
connection.on('close', function () {
console.log('echo-protocol Connection Closed');
});
connection.on('message', (message) => {
if (message.type === 'utf8') {
//console.log("Received: '" + message.utf8Data + "'");
var data = JSON.parse(message.utf8Data);
var event = '';
switch (data.type) {
case 'or':
event = 'orderReport';
break;
case 'Md':
event = 'marketData';
break;;
}
this.emit(event, data);
}
});
});
this.WSclient.on('close', function () {
console.log('echo-protocol Client Closed');
});
this.Auth = new RofexAuth(user, pass, timeout, test);
this.Auth.getToken()
.then(token => {
var Headers = { 'X-Auth-Token': token };
console.log(Headers, this._baseUrl);
this.WSclient.connect(this._baseUrl, null, null, Headers);
})
.catch(console.error);
}
marketData(marketId, symbol, entries = ['BI', 'OF', 'LA'], level = 1, depth = 2) {
var request = {
"type": "smd",
"level": level,
"entries": entries,
"products": [{ "symbol": symbol, "marketId": marketId }],
"depth": depth
};
this.WSclient.on('connect', function (connection) {
if (connection.connected) {
connection.sendUTF(JSON.stringify(request));
}
});
}
executionReport(){
var request = { type:"os"};
this.WSclient.on('connect', function (connection) {
if (connection.connected) {
console.log(request);
connection.sendUTF(JSON.stringify(request));
}
});
}
/**
*
* @param {*} marketId
* @param {*} symbol
* @param {*} side [Sell|Buy]
*/
order(marketId, symbol, price, quantity, side, timeInForce = 'Day', account, wsClOrdId = null, iceberg = null, expireDate = null, displayQuantity = null ) {
var request = {
type: "no",
product: { symbol: symbol, marketId: marketId },
price: price,
quantity: quantity,
side: side,
account: account,
timeInForce : timeInForce
};
//Mensaje para el envío de una orden para un contrato Mayorista:
if(allOrNone!=null){
request.allOrNone = allOrNone
}
//Mensaje para el envío de una orden con identificador (wsClOrdId):
if (wsClOrdId) {
request.wsClOrdId = wsClOrdId;
}
//Mensaje para el envío de una orden Iceberg:
if (iceberg!==null) {
request.iceberg = iceberg
}
if(displayQty!==null){
request.displayQuantity = displayQuantity;
}
//Mensaje para el envío de una orden GTD:
if (expireDate !==null) {
request.expireDate = expireDate;
}
}
}
module.exports = WebSocket;