xts-binary-marketdata-api
Version:
The official JS client library for the Symphony Fintech Binary MarketData API's
1,189 lines (1,084 loc) • 33.7 kB
JavaScript
var socketIoClient = require('socket.io-client');
var settings = require('./config/app/settings.json');
var events = require('events');
var logger = require('./logger');
var inMemoryStore = require('./inMemoryStore');
var linq = require('linq');
var socketIoClient = require('socket.io-client');
var settings = require('./config/app/settings.json');
var events = require('events');
var logger = require('./logger');
var config = require('./config/app/config.json');
var merge = require('deepmerge');
module.exports = class MDEmitter {
/**
* Constructs an XTSEmitter instance to enable data transfer via socket related events.
*
* @constructor
*
* @param {String} url
* url parameter is used to connect to the particular server.
*
*/
constructor(url) {
this.url = url === undefined ? config.url : url;
let arr = this.url.split("/");
this.url = arr[0] + '/' + arr[1] + '/' + arr[2];
this.path = '/';
for (let i = 3; i < arr.length; i++) {
if (i === 3) {
this.path = this.path + arr[i];
}
else {
this.path = this.path + '/' + arr[i];
}
}
this.path = this.path + '/' + 'socket.io';
this.socketMD = {
isConnected: false,
socketMarketData: null,
interval: null,
};
this.eventEmitter = new events.EventEmitter();
}
/**
* set the token value by providing the token in the input
*
* @param {string} token
* token parameter will be generated after successful login and will be used in other private API's
*
*/
set token(token) {
this._token = token;
}
/**
* Returns the token generated after successful logIn
*
*
* @return
* the value of token generated after successful logIn
*/
get token() {
return this._token;
}
/**
* set the userID value by providing the userID in the input
*
* @param {string} userID
* userID for the particular user
*/
set userID(userID) {
this._userID = userID;
}
/**
* Returns userID for the particular user
*
*
* @return
* the userID for the particular user
*/
get userID() {
return this._userID;
}
/**
* set the publishFormat(JSON|Binary) required for the user
*
* @param {string} publishFormat
* publishFormat (JSON|Binary) required for the user
*/
set publishFormat(publishFormat) {
this._publishFormat = publishFormat;
}
/**
* Returns publishFormat(JSON|Binary) required for the user
*
*
* @return
* the publishFormat(JSON|Binary) required for the user
*/
get publishFormat() {
return this._publishFormat;
}
/**
* set the broadcastMode (Full|partial) required for the user
*
* @param {string} broadcastMode
* broadcastMode (Full|partial) required for the user
*/
set broadcastMode(broadcastMode) {
this._broadcastMode = broadcastMode;
}
/**
* Returns broadcastMode (Full|partial) required for the user
*
*
* @return
* the broadcastMode (Full|partial) required for the user
*/
get broadcastMode() {
return this._broadcastMode;
}
/**
* set the url value by providing the url in the input
*
* @param {string} url
* url parameter is used to connect to the particular server.
*/
set url(url) {
this._url = url;
}
/**
* Returns url used to connect to the particular server.
*
*
* @return
* the url used to connect to the particular server.
*/
get url() {
return this._url;
}
/**
* Initalizes the socket by accepting userID and token as input parameters
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.userID
* userID for the particular user.
*
* @param {string} reqObject.token
* token parameter will be generated after successful login and will be used in other private API's
*
* @param {string} reqObject.publishFormat
* publishFormat(JSON|Binary) required for the user
*
* @param {string} reqObject.broadcastMode
* broadcastMode (Full|partial) required for the user
*
*/
init(reqObject) {
this.userID = reqObject.userID;
this.token = reqObject.token;
this.publishFormat = reqObject.publishFormat;
this.broadcastMode = reqObject.broadcastMode;
if (this.socketMD.socketMarketData) {
this.socketMD.socketMarketData.destroy();
delete this.socketMD.socketMarketData;
this.socketMD.socketMarketData = null;
}
console.log('socket is initialized with the following parameters url ' +
this.url + this.path +
' token ' +
this.token +
' userID ' +
this.userID)
// path: "/interactive/socket.io",
this.socketMD.socketMarketData = socketIoClient(this.url, {
path: this.path,
reconnection: false,
query: {
token: this.token,
userID: this.userID,
publishFormat: this.publishFormat,
broadcastMode: this.broadcastMode,
},
});
logger.logFile(
'socket is initialized with the following parameters url ' +
this.url +
' token ' +
this.token +
' userID ' +
this.userID
);
/**
* Listener of the connect event via socket and emit the connect event via event Emitter
*
*
* @event connect
*/
this.socketMD.socketMarketData.on(settings.socket.connect, (data) => {
this.socketMD.isConnected = true;
console.info('socket connected successfully');
this.eventEmitter.emit(settings.socket.connect, data);
});
/**
* Listener of the joined event via socket and emit the joined event via event Emitter
*
*
* @event joined
*/
this.socketMD.socketMarketData.on(settings.socket.joined, (data) => {
console.info('socket joined successfully');
this.eventEmitter.emit(settings.socket.joined, data);
});
/**
* Listener of the error event via socket and emit the error event via event Emitter
*
*
* @event error
*/
this.socketMD.socketMarketData.on(settings.socket.error, (data) => {
console.info('socket error occurred');
this.eventEmitter.emit(settings.socket.error, data);
});
/**
* Listener of the disconnect event via socket and emit the disconnect event via event Emitter
*
*
* @event disconnect
*/
this.socketMD.socketMarketData.on(settings.socket.disconnect, (data) => {
console.info('socket got disconnected');
this.socketMD.isConnected = false;
this.socketMD.interval = setInterval(() => {
if (this.socketMD.isConnected) {
clearInterval(this.socketMD.interval);
this.socketMD.interval = null;
return;
}
let reqObject = {
userID: this.userID,
token: this.token,
publishFormat: this.publishFormat,
broadcastMode: this.broadcastMode,
};
this.init(reqObject);
}, 5000);
this.eventEmitter.emit(settings.socket.disconnect, data);
});
/**
* Listener of the 1502-binary-full event via socket and emit the marketDepthEvent via event Emitter
*
*
* @event 1502-binary-full
*/
this.socketMD.socketMarketData.on('1502-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.marketDepthEvent, data);
});
this.socketMD.socketMarketData.on('1512-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.ltpEvent, data);
});
this.socketMD.socketMarketData.on('1512-json-partial', (data) => {
this.eventEmitter.emit(settings.socket.ltpEvent, data);
});
this.socketMD.socketMarketData.on('1512-json-full', (data) => {
this.eventEmitter.emit(settings.socket.ltpEvent, data);
});
this.socketMD.socketMarketData.on('1507-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.exchangeTradingStatus, data);
});
this.socketMD.socketMarketData.on('1507-json-partial', (data) => {
this.eventEmitter.emit(settings.socket.exchangeTradingStatus, data);
});
this.socketMD.socketMarketData.on('1507-json-full', (data) => {
this.eventEmitter.emit(settings.socket.exchangeTradingStatus, data);
});
/**
* Listener of the 1502-json-full event via socket and emit the marketDepthEvent via event Emitter
*
*
* @event 1502-json-full
*/
this.socketMD.socketMarketData.on('1502-json-full', async (data) => {
let marketDataObject = await this.constructFullMarketDepthObject(
settings.enums.marketDataPorts.marketDepthEvent,
data
);
this.eventEmitter.emit(
settings.socket.marketDepthEvent,
marketDataObject
);
});
this.socketMD.socketMarketData.on('xts-binary-packet', async (data) => {
this.eventEmitter.emit(settings.socket.xts_binary_packet, data);
});
/**
* Listener of the 1502-json-partial event via socket and emit the marketDepthEvent via event Emitter
*
*
* @event 1502-json-partial
*/
this.socketMD.socketMarketData.on('1502-json-partial', async (data) => {
let marketDataObject = await this.constructPartialMarketDepthObject(
settings.enums.marketDataPorts.marketDepthEvent,
data
);
this.eventEmitter.emit(
settings.socket.marketDepthEvent,
marketDataObject
);
});
/**
* Listener of the 1504-binary-full event via socket and emit the indexDataEvent via event Emitter
*
*
* @event 1504-binary-full
*/
this.socketMD.socketMarketData.on('1504-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.indexDataEvent, data);
});
/**
* Listener of the 1504-json-full event via socket and emit the indexDataEvent via event Emitter
*
*
* @event 1504-json-full
*/
this.socketMD.socketMarketData.on('1504-json-full', async (data) => {
let marketDataObject = await this.constructFullIndexDataObject(
settings.enums.marketDataPorts.indexDataEvent,
data
);
this.eventEmitter.emit(settings.socket.indexDataEvent, marketDataObject);
});
/**
* Listener of the 1504-json-partial event via socket and emit the indexDataEvent via event Emitter
*
*
* @event 1504-json-partial
*/
this.socketMD.socketMarketData.on('1504-json-partial', async (data) => {
let marketDataObject = await this.constructPartialIndexDataObject(
settings.enums.marketDataPorts.indexDataEvent,
data
);
this.eventEmitter.emit(settings.socket.indexDataEvent, marketDataObject);
});
/**
* Listener of the 1510-binary-full event via socket and emit the openInterestEvent via event Emitter
*
*
* @event 1510-binary-full
*/
this.socketMD.socketMarketData.on('1510-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.openInterestEvent, data);
});
/**
* Listener of the 1510-json-full event via socket and emit the openInterestEvent via event Emitter
*
*
* @event 1510-json-full
*/
this.socketMD.socketMarketData.on('1510-json-full', async (data) => {
let marketDataObject = await this.constructFullOpenIntrestObject(
settings.enums.marketDataPorts.openInterestEvent,
data
);
this.eventEmitter.emit(
settings.socket.openInterestEvent,
marketDataObject
);
});
/**
* Listener of the 1510-json-partial event via socket and emit the openInterestEvent via event Emitter
*
*
* @event 1510-json-partial
*/
this.socketMD.socketMarketData.on('1510-json-partial', async (data) => {
let marketDataObject = await this.constructPartialOpenIntrestObject(
settings.enums.marketDataPorts.openInterestEvent,
data
);
this.eventEmitter.emit(
settings.socket.openInterestEvent,
marketDataObject
);
});
/**
* Listener of the 5018-binary-full event via socket and emit the marketDepth100Event via event Emitter
*
*
* @event 5018-binary-full
*/
this.socketMD.socketMarketData.on('5018-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.marketDepth100Event, data);
});
/**
* Listener of the 5018-json-full event via socket and emit the marketDepth100Event via event Emitter
*
*
* @event 5018-json-full
*/
this.socketMD.socketMarketData.on('5018-json-full', async (data) => {
let marketDataObject = await this.constructFullMarketDepth100Object(
settings.enums.marketDataPorts.marketDepthEvent100,
data
);
this.eventEmitter.emit(
settings.socket.marketDepth100Event,
marketDataObject
);
});
/**
* Listener of the 5018-json-partial event via socket and emit the marketDepth100Event via event Emitter
*
*
* @event 5018-json-partial
*/
this.socketMD.socketMarketData.on('5018-json-partial', async (data) => {
let marketDataObject = await this.constructPartialMarketDepth100Object(
settings.enums.marketDataPorts.marketDepthEvent100,
data
);
this.eventEmitter.emit(
settings.socket.marketDepth100Event,
marketDataObject
);
});
/**
* Listener of the 1505-binary-full event via socket and emit the candleDataEvent via event Emitter
*
*
* @event 1505-binary-full
*/
this.socketMD.socketMarketData.on('1505-binary-full', (data) => {
this.eventEmitter.emit(settings.socket.candleDataEvent, data);
});
/**
* Listener of the 1505-json-full event via socket and emit the candleDataEvent via event Emitter
*
*
* @event 1505-json-full
*/
this.socketMD.socketMarketData.on('1505-json-full', async (data) => {
let marketDataObject = await this.constructFullCandleDataObject(
settings.enums.marketDataPorts.candleDataEvent,
data
);
this.eventEmitter.emit(settings.socket.candleDataEvent, marketDataObject);
});
/**
* Listener of the 1505-json-partial event via socket and emit the candleDataEvent via event Emitter
*
*
* @event 1505-json-partial
*/
this.socketMD.socketMarketData.on('1505-json-partial', async (data) => {
let marketDataObject = await this.constructPartialCandleDataObject(
settings.enums.marketDataPorts.candleDataEvent,
data
);
this.eventEmitter.emit(settings.socket.candleDataEvent, marketDataObject);
});
/**
* Listener of the 1105-json-partial event via socket and emit the instrumentPropertyChangeEvent via event Emitter
*
*
* @event 1105-json-partial
*/
this.socketMD.socketMarketData.on('1105-json-partial', async (data) => {
let marketDataObject = await this.constructPartialOpenIntrestObject(
settings.enums.marketDataPorts.instrumentPropertyChangeEvent,
data
);
this.eventEmitter.emit(
settings.socket.instrumentPropertyChangeEvent,
marketDataObject
);
});
/**
* Listener of the logout event via socket and emit the logout event via event Emitter
*
*
* @event logout
*/
this.socketMD.socketMarketData.on(settings.socket.logout, (data) => {
console.info('socket logout successfully');
this.eventEmitter.emit(settings.socket.logout, data);
});
}
/**
* connect listener for event emitter
*
*/
onConnect(fn) {
this.eventEmitter.on(settings.socket.connect, (data) => {
fn(data);
});
}
/**
* joined listener for event emitter
*
*/
onJoined(fn) {
this.eventEmitter.on(settings.socket.joined, (data) => {
fn(data);
});
}
/**
* error listener for event emitter
*
*/
onError(fn) {
this.eventEmitter.on(settings.socket.error, (data) => {
fn(data);
});
}
/**
* disconnect listener for event emitter
*
*/
onDisconnect(fn) {
this.eventEmitter.on(settings.socket.disconnect, (data) => {
fn(data);
});
}
/**
* MarketDepthEvent listener for event emitter
*
*/
onMarketDepthEvent(fn) {
this.eventEmitter.on(settings.socket.marketDepthEvent, (data) => {
fn(data);
});
}
/**
* InstrumentPropertyChangeEvent listener for event emitter
*
*/
onInstrumentPropertyChangeEvent(fn) {
this.eventEmitter.on(
settings.socket.instrumentPropertyChangeEvent,
(data) => {
fn(data);
}
);
}
/**
* OpenInterestEvent listener for event emitter
*
*/
onOpenInterestEvent(fn) {
this.eventEmitter.on(settings.socket.openInterestEvent, (data) => {
fn(data);
});
}
/**
* indexDataEvent listener for event emitter
*
*/
onIndexDataEvent(fn) {
this.eventEmitter.on(settings.socket.indexDataEvent, (data) => {
fn(data);
});
}
/**
* marketDepth100Event listener for event emitter
*
*/
onMarketDepth100Event(fn) {
this.eventEmitter.on(settings.socket.marketDepth100Event, (data) => {
fn(data);
});
}
onLTPEvent(fn) {
this.eventEmitter.on(settings.socket.ltpEvent, (data) => {
fn(data);
});
}
onExchangeTradingStatus(fn) {
this.eventEmitter.on(settings.socket.exchangeTradingStatus, (data) => {
fn(data);
});
}
/**
* candleDataEvent listener for event emitter
*
*/
onCandleDataEvent(fn) {
this.eventEmitter.on(settings.socket.candleDataEvent, (data) => {
fn(data);
});
}
on_xts_binary_packet(fn) {
this.eventEmitter.on(settings.socket.xts_binary_packet, (data) => {
fn(data);
});
}
/**
* logout listener for event emitter
*
*/
onLogout(fn) {
this.eventEmitter.on(settings.socket.logout, (data) => {
fn(data);
});
}
async constructFullMarketDepthObject(messageCode, data) {
var marketData = JSON.parse(data);
if (marketData.Touchline.LastTradedTime)
marketData.Touchline.LastTradedTime = this.getBarTimeFromTouchLineInfo(
parseInt(marketData.Touchline.LastTradedTime),
parseInt(marketData.ExchangeSegment)
);
if (marketData.Touchline.LastUpdateTime)
marketData.Touchline.LastUpdateTime = this.getBarTimeFromTouchLineInfo(
parseInt(marketData.Touchline.LastUpdateTime),
parseInt(marketData.ExchangeSegment)
);
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
async constructPartialMarketDepthObject(messageCode, data) {
var marketData = {};
marketData.Touchline = {};
var depthLength = 5;
linq
.from(data.split(','))
.select(function (keyValuePair) {
var key = keyValuePair.split(':')[0];
var value = keyValuePair.split(':')[1];
switch (key) {
case 't':
marketData.ExchangeSegment = value.split('_')[0];
marketData.ExchangeInstrumentID = value.split('_')[1];
break;
case 'bi':
marketData.Bids = [];
var bids = value.split('|');
var index = 0;
for (var i = 0; i < depthLength; i++) {
var bidInfo = linq.from(bids).skip(index).take(4).toArray();
if (bidInfo.length > 0) {
marketData.Bids.push({
Index: bidInfo[0],
Size: bidInfo[1],
Price: bidInfo[2],
TotalOrders: bidInfo[3],
});
}
index = index + 4;
}
break;
case 'ai':
marketData.Asks = [];
var asks = value.split('|');
var index = 0;
for (var i = 0; i < depthLength; i++) {
var askInfo = linq.from(asks).skip(index).take(4).toArray();
if (askInfo.length > 0) {
marketData.Asks.push({
Index: askInfo[0],
Size: askInfo[1],
Price: askInfo[2],
TotalOrders: askInfo[3],
});
}
index = index + 4;
}
break;
case 'ltp':
marketData.Touchline.LastTradedPrice = value;
break;
case 'ltq':
marketData.Touchline.LastTradedQunatity = value;
break;
case 'tb':
marketData.Touchline.TotalBuyQuantity = value;
break;
case 'ts':
marketData.Touchline.TotalSellQuantity = value;
break;
case 'v':
marketData.Touchline.TotalTradedQuantity = value;
break;
case 'ap':
marketData.Touchline.AverageTradedPrice = value;
break;
case 'ltt':
marketData.Touchline.LastTradedTime = value;
break;
case 'lut':
marketData.Touchline.LastUpdateTime = value;
break;
case 'pc':
marketData.Touchline.PercentChange = value;
break;
case 'o':
marketData.Touchline.Open = value;
break;
case 'h':
marketData.Touchline.High = value;
break;
case 'l':
marketData.Touchline.Low = value;
break;
case 'c':
marketData.Touchline.Close = value;
break;
case 'vp':
marketData.Touchline.TotalValueTraded = value;
break;
}
return keyValuePair;
})
.toArray();
if (marketData.Touchline.LastTradedTime)
marketData.Touchline.LastTradedTime = this.getBarTimeFromTouchLineInfo(
parseInt(marketData.Touchline.LastTradedTime),
parseInt(marketData.ExchangeSegment)
);
if (marketData.Touchline.LastUpdateTime)
marketData.Touchline.LastUpdateTime = this.getBarTimeFromTouchLineInfo(
parseInt(marketData.Touchline.LastUpdateTime),
parseInt(marketData.ExchangeSegment)
);
var subscribedStock = inMemoryStore.getFromInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID
);
if (subscribedStock) {
if (subscribedStock.Touchline)
subscribedStock.Touchline = Object.assign(
subscribedStock.Touchline,
marketData.Touchline
);
if (marketData.Bids) {
linq
.from(marketData.Bids)
.select(function (bid, index) {
if (bid.Index == 0) {
if (marketData.Bids[bid.Index].Size != '')
subscribedStock.Touchline.BidInfo.Size =
marketData.Bids[bid.Index].Size;
if (marketData.Bids[bid.Index].Price != '')
subscribedStock.Touchline.BidInfo.Price =
marketData.Bids[bid.Index].Price;
if (marketData.Bids[bid.Index].TotalOrders != '')
subscribedStock.Touchline.BidInfo.TotalOrders =
marketData.Bids[bid.Index].TotalOrders;
}
if (bid.Size != '') subscribedStock.Bids[bid.Index].Size = bid.Size;
if (bid.Price != '')
subscribedStock.Bids[bid.Index].Price = bid.Price;
if (bid.TotalOrders != '')
subscribedStock.Bids[bid.Index].TotalOrders = bid.TotalOrders;
})
.toArray();
}
if (marketData.Asks) {
linq
.from(marketData.Asks)
.select(function (ask, index) {
if (ask.Index == 0) {
if (marketData.Asks[ask.Index].Size != '')
subscribedStock.Touchline.AskInfo.Size =
marketData.Asks[ask.Index].Size;
if (marketData.Asks[ask.Index].Price != '')
subscribedStock.Touchline.AskInfo.Price =
marketData.Asks[ask.Index].Price;
if (marketData.Asks[ask.Index].TotalOrders != '')
subscribedStock.Touchline.AskInfo.TotalOrders =
marketData.Asks[ask.Index].TotalOrders;
}
if (ask.Size != '') subscribedStock.Asks[ask.Index].Size = ask.Size;
if (ask.Price != '')
subscribedStock.Asks[ask.Index].Price = ask.Price;
if (ask.TotalOrders != '')
subscribedStock.Asks[ask.Index].TotalOrders = ask.TotalOrders;
})
.toArray();
}
var finalSubscribedStock = Object.assign({}, subscribedStock);
if (
finalSubscribedStock.Touchline.LastTradedPrice &&
finalSubscribedStock.Touchline.PercentChange
) {
finalSubscribedStock.Touchline.PercentChange =
parseFloat(finalSubscribedStock.Touchline.LastTradedPrice) == 0
? '0.00'
: parseFloat(finalSubscribedStock.Touchline.PercentChange).toFixed(
2
);
}
inMemoryStore.loadInMemory(
finalSubscribedStock.messageCode,
finalSubscribedStock.ExchangeSegment,
finalSubscribedStock.ExchangeInstrumentID,
finalSubscribedStock
);
return finalSubscribedStock;
} else {
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
}
getBarTimeFromTouchLineInfo(lastTradedTime, exchangeSegment) {
var date = this.getBaseReferenceDate(exchangeSegment);
return new Date(date.setSeconds(date.getSeconds() + lastTradedTime));
}
async constructFullIndexDataObject(messageCode, data) {
var marketData = JSON.parse(data);
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
async constructPartialIndexDataObject(messageCode, data) {
var marketData = {};
linq
.from(data.split(','))
.select(function (keyValuePair) {
var key = keyValuePair.split(':')[0];
var value = keyValuePair.split(':')[1];
switch (key) {
case 't':
marketData.ExchangeSegment = value.split('_')[0];
marketData.IndexName = value.split('_')[1];
break;
case 'ltp':
marketData.IndexValue = value;
break;
case 'ltq':
marketData.LastTradedQunatity = value;
break;
case 'lut':
marketData.ExchangeTimeStamp = value;
break;
case 'yh':
marketData.YearlyHigh = value;
break;
case 'yl':
marketData.YearlyLow = value;
break;
case 'pc':
marketData.PercentChange = value;
break;
case 'o':
marketData.OpeningIndex = value;
break;
case 'h':
marketData.HighIndexValue = value;
break;
case 'l':
marketData.LowIndexValue = value;
break;
case 'c':
marketData.ClosingIndex = value;
break;
}
return keyValuePair;
})
.toArray();
var subscribedStock = inMemoryStore.getFromInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID
);
if (subscribedStock) {
var finalSubscribedStock = merge(subscribedStock, marketData);
inMemoryStore.loadInMemory(
finalSubscribedStock.messageCode,
finalSubscribedStock.ExchangeSegment,
finalSubscribedStock.ExchangeInstrumentID,
finalSubscribedStock
);
return finalSubscribedStock;
} else {
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
}
async constructPartialOpenIntrestObject(messageCode, data) {
var marketData = {};
linq
.from(data.split(','))
.select(function (keyValuePair) {
var key = keyValuePair.split(':')[0];
var value = keyValuePair.split(':')[1];
switch (key) {
case 't':
marketData.ExchangeSegment = value.split('_')[0];
marketData.ExchangeInstrumentID = value.split('_')[1];
break;
case 'o':
marketData.OpenInterest = value;
break;
}
})
.toArray();
var subscribedStock = inMemoryStore.getFromInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID
);
if (subscribedStock) {
var finalSubscribedStock = merge(subscribedStock, marketData);
inMemoryStore.loadInMemory(
finalSubscribedStock.messageCode,
finalSubscribedStock.ExchangeSegment,
finalSubscribedStock.ExchangeInstrumentID,
finalSubscribedStock
);
return finalSubscribedStock;
} else {
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
}
async constructPartialPropertyChangeEventObject(messageCode, data) {
var marketData = {};
linq
.from(data.split(','))
.select(function (keyValuePair) {
var key = keyValuePair.split(':')[0];
var value = keyValuePair.split(':')[1];
switch (key) {
case 't':
marketData.ExchangeSegment = value.split('_')[0];
marketData.ExchangeInstrumentID = value.split('_')[1];
break;
case settings.enums.InstrumentPropName.LowPriceRange.toString():
marketData.LowPriceRange = value;
break;
case settings.enums.InstrumentPropName.HighPriceRange.toString():
marketData.HighPriceRange = value;
break;
}
})
.toArray();
var subscribedStock = inMemoryStore.getFromInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID
);
if (subscribedStock) {
var finalSubscribedStock = merge(subscribedStock, marketData);
inMemoryStore.loadInMemory(
finalSubscribedStock.messageCode,
finalSubscribedStock.ExchangeSegment,
finalSubscribedStock.ExchangeInstrumentID,
finalSubscribedStock
);
return finalSubscribedStock;
} else {
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
}
async constructPartialCandleDataObject(messageCode, data) {
var marketData = {};
linq
.from(data.split(','))
.select(function (keyValuePair) {
var key = keyValuePair.split(':')[0];
var value = keyValuePair.split(':')[1];
switch (key) {
case 't':
marketData.ExchangeSegment = value.split('_')[0];
marketData.ExchangeInstrumentID = value.split('_')[1];
break;
case 'o':
marketData.Open = value;
break;
case 'h':
marketData.High = value;
break;
case 'l':
marketData.Low = value;
break;
case 'c':
marketData.Close = value;
break;
case 'bt':
marketData.BarTime = value;
break;
case 'bv':
marketData.BarVolume = value;
break;
case 'pv':
marketData.SumOfQtyInToPrice = value;
break;
}
})
.toArray();
var subscribedStock = inMemoryStore.getFromInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID
);
if (subscribedStock) {
var finalSubscribedStock = merge(subscribedStock, marketData);
inMemoryStore.loadInMemory(
finalSubscribedStock.messageCode,
finalSubscribedStock.ExchangeSegment,
finalSubscribedStock.ExchangeInstrumentID,
finalSubscribedStock
);
return finalSubscribedStock;
} else {
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
}
async constructFullCandleDataObject(messageCode, data) {
var marketData = JSON.parse(data);
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
async constructFullOpenIntrestObject(messageCode, data) {
var marketData = JSON.parse(data);
inMemoryStore.loadInMemory(
messageCode,
marketData.ExchangeSegment,
marketData.ExchangeInstrumentID,
marketData
);
return marketData;
}
async constructFullMarketDepth100Object(messageCode, data) {
return data;
}
async constructPartialMarketDepth100Object(messageCode, data) {
return data;
}
getBaseReferenceDate(exchangeSegment) {
switch (exchangeSegment) {
case settings.enums.segments.NSECM:
case settings.enums.segments.NSEFO:
case settings.enums.segments.NSECD:
return new Date(1980, 0, 1);
default:
return new Date(1970, 0, 1);
}
}
};