fyers-api-v2
Version:
Fyers data.
267 lines (248 loc) • 16.7 kB
JavaScript
const helper = require("./helper");
class Udp {
static unPackUDP(resp, symbol, token) {
let fyersDict = helper.getGlobalFiresDict
var _globalData=[]
var FY_P_VAL_KEY = 'v';
var FY_P_DATA_KEY = 'd';
var FY_P_MIN_KEY = 'cmd';
var FY_P_STATUS = 's';
var that = this;
try{
var data_array_buffer = resp.data;
var count = data_array_buffer.byteLength;
var dictInfo = {};
dictInfo[FY_P_STATUS] = 'ok';
dictInfo[FY_P_DATA_KEY] = {};
dictInfo[FY_P_DATA_KEY]['7202'] = [];
dictInfo[FY_P_DATA_KEY]['7208'] = [];
dictInfo[FY_P_DATA_KEY]['31038'] = [];
var a = 0;
var dataCount = 0;
while(count>0){
if(a >= 50){
// console.log("break");
break;
}
a+=1;
var header = new DataView(data_array_buffer , 0 , 24);
var cmn_data = '';
var dataDict = {};
// console.log("unPackUDP 3");
var token = parseInt(header.getBigUint64(0));
var fyCode = parseInt(header.getInt16(12));
if(fyCode == 7202){
if(token in fyersDict){
cmn_data = new DataView(data_array_buffer , 24 , 32);
var oi = parseInt(cmn_data.getInt32(0));
var pdoi = parseInt(cmn_data.getInt32(4));
var changeInOI = Number(oi-pdoi);
var percentChangeInOI = 0.0;
if (pdoi == 0.0)
{
percentChangeInOI = 0.0;
}
else
{
percentChangeInOI = (changeInOI / pdoi) * 100;
}
dataDict[FY_P_STATUS] = 'ok';
dataDict[FY_P_VAL_KEY] = {};
dataDict[FY_P_VAL_KEY].oi = oi;
dataDict[FY_P_VAL_KEY].pdoi = changeInOI;
dataDict[FY_P_VAL_KEY].percentoi = percentChangeInOI.toFixed(2) + '%' ;
dataDict.n = fyersDict[token];
dataDict.fy = token;
dataDict.fycode = fyCode;
dictInfo[FY_P_DATA_KEY]['7202'].push(dataDict);
dataCount = 32;
count = count - dataCount;
data_array_buffer = data_array_buffer.slice(dataCount);
}
else {
throw "Token "+token+" mapping not found";
}
}
else if(fyCode == 31038){
cmn_data = new DataView(data_array_buffer , 24 , 88);
var price_conv = parseFloat(cmn_data.getInt32(0));
var ltp = parseFloat(parseInt(cmn_data.getInt32(4)) / price_conv);
var symbol_ticker = '';
if(token in fyersDict){
symbol_ticker = fyersDict[token].split(':');
dataDict[FY_P_STATUS] = 'ok';
dataDict[FY_P_VAL_KEY] = {};
dataDict[FY_P_VAL_KEY].high_price = (parseInt(cmn_data.getInt32(12))/ price_conv).toString();
dataDict[FY_P_VAL_KEY].prev_close_price = parseFloat(parseInt(cmn_data.getInt32(20))/ price_conv);
dataDict[FY_P_VAL_KEY].ch = Number(parseFloat(ltp - dataDict[FY_P_VAL_KEY].prev_close_price).toFixed(2));
dataDict[FY_P_VAL_KEY].tt = parseInt(header.getInt32(8)); // Timestamp sent by exchange
dataDict[FY_P_VAL_KEY].description = fyersDict[token];
dataDict[FY_P_VAL_KEY].short_name = symbol_ticker[1]; //temp_value
dataDict[FY_P_VAL_KEY].exchange = symbol_ticker[0];
dataDict[FY_P_VAL_KEY].low_price = parseFloat(parseInt(cmn_data.getInt32(16)) / price_conv);
// dataDict[FY_P_VAL_KEY].trans_code = fyCode;
dataDict[FY_P_VAL_KEY].oi = parseInt(cmn_data.getBigUint64(48));
var pdoi = parseInt(cmn_data.getBigUint64(56));
var changeOI = Number(dataDict[FY_P_VAL_KEY].oi - pdoi);
dataDict[FY_P_VAL_KEY].diffoi = changeOI;
var percentChangeInOI = 0.0;
if (pdoi == 0) {
percentChangeInOI = 0.0;
} else {
percentChangeInOI = (changeOI / pdoi) * 100;
}
dataDict[FY_P_VAL_KEY].percentoi = percentChangeInOI.toFixed(2) + '%' ;
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY] = {};
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].c = parseFloat(parseInt(cmn_data.getInt32(36))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].h = parseFloat(parseInt(cmn_data.getInt32(28))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].l = parseFloat(parseInt(cmn_data.getInt32(32))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].o = parseFloat(parseInt(cmn_data.getInt32(24))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].t = parseInt(header.getInt32(8)) - (parseInt(header.getInt32(8)) % 60); // LTT
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].v = parseInt(cmn_data.getBigUint64(40));
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].tf = '';
dataDict[FY_P_VAL_KEY].original_name = fyersDict[token];
dataDict[FY_P_VAL_KEY].chp = Number(parseFloat(((ltp - dataDict[FY_P_VAL_KEY].prev_close_price) / dataDict[FY_P_VAL_KEY].prev_close_price) * 100).toFixed(2)); // Percent change
dataDict[FY_P_VAL_KEY].open_price = parseFloat(parseInt(cmn_data.getInt32(8))/ price_conv);
dataDict[FY_P_VAL_KEY].lp = ltp; // LTP
dataDict[FY_P_VAL_KEY].symbol = fyersDict[token];
dataCount = 88;
var L2 = header.getInt8(18);
var additional = new DataView(data_array_buffer , 88 , 120-88);
dataCount = 120;
dataDict[FY_P_VAL_KEY].LTQ = parseFloat(additional.getInt32(0));
dataDict[FY_P_VAL_KEY].L2_LTT = parseInt(additional.getInt32(4));
dataDict[FY_P_VAL_KEY].ATP = parseFloat(parseInt(additional.getInt32(8))/ price_conv);
dataDict[FY_P_VAL_KEY].volume = parseInt(additional.getInt32(12));
dataDict[FY_P_VAL_KEY].tot_buy = parseFloat(additional.getBigUint64(16));
dataDict[FY_P_VAL_KEY].tot_sell = parseFloat(additional.getBigUint64(24));
if (L2 == '1') {
// console.log("unPackUDP 7");
var bid = new DataView(data_array_buffer , 120 , 60);
var ask = new DataView(data_array_buffer , 180 , 60);
var bidList = [];
var askList = [];
var totBuy = dataDict[FY_P_VAL_KEY].tot_buy;
var totSell = dataDict[FY_P_VAL_KEY].tot_sell;
//New change 2019-0709 Palash
for (var i = 0; i < 5; i++) {
bidList.push({'volume':parseInt(bid.getInt32(i*12+4)), 'price':parseFloat(parseInt(bid.getInt32(i*12))/ price_conv), 'ord':parseInt(bid.getInt32(i*12 + 8))});
askList.push({'volume':parseInt(ask.getInt32(i*12+4)), 'price':parseFloat(parseInt(ask.getInt32(i*12))/ price_conv), 'ord':parseInt(ask.getInt32(i*12 + 8))});
}
dataCount = 240;
dataDict[FY_P_VAL_KEY].bid = bidList[0].price;
dataDict[FY_P_VAL_KEY].ask = askList[0].price;
var bidList_asc = bidList.reverse();
var depth = {bids:bidList_asc,asks:askList,snapshot:true,totSell:totSell,totBuy:totBuy};
// console.log(depth);
} else {
var bid_ask = new DataView(data_array_buffer , 120 , 8);
dataDict[FY_P_VAL_KEY].bid = parseFloat(parseInt(bid_ask.getInt32(0)) / price_conv);
dataDict[FY_P_VAL_KEY].ask = parseFloat(parseInt(bid_ask.getInt32(4)) / price_conv);
dataCount = 128;
}
dataDict[FY_P_VAL_KEY].spread = parseFloat(dataDict[FY_P_VAL_KEY].ask) - parseFloat(dataDict[FY_P_VAL_KEY].bid);
dataDict[FY_P_VAL_KEY].marketStat = parseInt(header.getInt16(14));
dataDict.n = fyersDict[token];
dataDict.fy = token;
dataDict.fycode = fyCode;
dictInfo[FY_P_DATA_KEY]['31038'].push(dataDict);
count = count - dataCount;
data_array_buffer = data_array_buffer.slice(dataCount);
} else {
throw "Token "+token+" mapping not found";
}
}
else if(fyCode != 7202 && fyCode != 31038){
cmn_data = new DataView(data_array_buffer , 24 , 72-24);
var price_conv = parseFloat(cmn_data.getInt32(0)); // 4bytes
var ltp = parseFloat(parseInt(cmn_data.getInt32(4)) / price_conv);
var symbol_ticker = '';
if(token in fyersDict) {
symbol_ticker = fyersDict[token].split(':');
dataDict[FY_P_STATUS] = 'ok';
dataDict[FY_P_VAL_KEY] = {};
dataDict[FY_P_VAL_KEY].high_price = (parseInt(cmn_data.getInt32(12))/ price_conv).toString();
dataDict[FY_P_VAL_KEY].prev_close_price = parseFloat(parseInt(cmn_data.getInt32(20))/ price_conv);
dataDict[FY_P_VAL_KEY].ch = Number(parseFloat(ltp - dataDict[FY_P_VAL_KEY].prev_close_price).toFixed(2));// Previous change
dataDict[FY_P_VAL_KEY].tt = parseInt(header.getInt32(8)); // Timestamp sent by exchange
dataDict[FY_P_VAL_KEY].description = fyersDict[token];
dataDict[FY_P_VAL_KEY].short_name = symbol_ticker[1]; //temp_value
dataDict[FY_P_VAL_KEY].exchange = symbol_ticker[0];
dataDict[FY_P_VAL_KEY].low_price = parseFloat(parseInt(cmn_data.getInt32(16)) / price_conv);
// dataDict[FY_P_VAL_KEY].trans_code = fyCode;
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY] = {};
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].c = parseFloat(parseInt(cmn_data.getInt32(36))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].h = parseFloat(parseInt(cmn_data.getInt32(28))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].l = parseFloat(parseInt(cmn_data.getInt32(32))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].o = parseFloat(parseInt(cmn_data.getInt32(24))/ price_conv);
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].t = parseInt(header.getInt32(8)) - (parseInt(header.getInt32(8)) % 60); // LTT
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].v = parseInt(cmn_data.getBigUint64(40));
dataDict[FY_P_VAL_KEY][FY_P_MIN_KEY].tf = '';
dataDict[FY_P_VAL_KEY].original_name = fyersDict[token];
dataDict[FY_P_VAL_KEY].chp = Number(parseFloat(((ltp - dataDict[FY_P_VAL_KEY].prev_close_price) / dataDict[FY_P_VAL_KEY].prev_close_price) * 100).toFixed(2)); // Percent change
dataDict[FY_P_VAL_KEY].open_price = parseFloat(parseInt(cmn_data.getInt32(8))/ price_conv);
dataDict[FY_P_VAL_KEY].lp = ltp; // LTP
dataDict[FY_P_VAL_KEY].symbol = fyersDict[token];
dataCount = 72;
if (fyCode == 7208) {
var L2 = header.getInt8(18);
var additional = new DataView(data_array_buffer , 72 , 104-72);
dataCount = 104;
dataDict[FY_P_VAL_KEY].LTQ = parseFloat(additional.getInt32(0));
dataDict[FY_P_VAL_KEY].L2_LTT = parseInt(additional.getInt32(4));
dataDict[FY_P_VAL_KEY].ATP = parseFloat(parseInt(additional.getInt32(8))/ price_conv);
dataDict[FY_P_VAL_KEY].volume = parseInt(additional.getInt32(12));
dataDict[FY_P_VAL_KEY].tot_buy = parseFloat(additional.getBigUint64(16));
dataDict[FY_P_VAL_KEY].tot_sell = parseFloat(additional.getBigUint64(24));
if (L2 == 1) {
// console.log("unPackUDP 7");
var bid = new DataView(data_array_buffer , 104 , 164-104);
var ask = new DataView(data_array_buffer , 164 , 224-164);
var bidList = [];
var askList = [];
var totBuy = dataDict[FY_P_VAL_KEY].tot_buy;
var totSell = dataDict[FY_P_VAL_KEY].tot_sell;
//New change 2019-0709 Palash
for (var i = 0; i < 5; i++) {
bidList.push({'volume':parseInt(bid.getInt32(i*12 + 4)), 'price':parseFloat(parseInt(bid.getInt32(i*12))/ price_conv), 'ord':parseInt(bid.getInt32(i*12 + 8))});
askList.push({'volume':parseInt(ask.getInt32(i*12 + 4)), 'price':parseFloat(parseInt(ask.getInt32(i*12))/ price_conv), 'ord':parseInt(ask.getInt32(i*12 + 8))});
}
dataCount = 224;
dataDict[FY_P_VAL_KEY].bid = bidList[0].price;
dataDict[FY_P_VAL_KEY].ask = askList[0].price;
var bidList_asc = bidList.reverse();
var depth = {bids:bidList_asc,asks:askList,snapshot:true,totSell:totSell,totBuy:totBuy};
} else {
var bid_ask = new DataView(data_array_buffer , 104 , 8);
dataDict[FY_P_VAL_KEY].bid = parseFloat(parseInt(bid_ask.getInt32(0)) / price_conv);
dataDict[FY_P_VAL_KEY].ask = parseFloat(parseInt(bid_ask.getInt32(4)) / price_conv);
dataCount = 112;
}
} else {
dataDict[FY_P_VAL_KEY].bid = ltp;
dataDict[FY_P_VAL_KEY].ask = ltp;
}
dataDict[FY_P_VAL_KEY].spread = parseFloat(dataDict[FY_P_VAL_KEY].ask) - parseFloat(dataDict[FY_P_VAL_KEY].bid);
dataDict[FY_P_VAL_KEY].marketStat = parseInt(header.getInt16(14));
dataDict.n = fyersDict[token];
dataDict.fy = token;
dataDict.fycode = fyCode;
dictInfo[FY_P_DATA_KEY]['7208'].push(dataDict);
count = count - dataCount;
data_array_buffer = data_array_buffer.slice(dataCount);
} else {
throw "Token "+token+" mapping not found";
}
}
} // within while loop (end of while loop)
// console.log(dictInfo);
return dictInfo; // return statement
} catch(err){
var dictInfo = {};
dictInfo[FY_P_STATUS] = 'err';
dictInfo[FY_P_DATA_KEY] = [err];
return dictInfo;
}
};
}
module.exports = Udp