uatbreezeconnect
Version:
UAT version of Breeze Connect API
997 lines (947 loc) • 68.4 kB
JavaScript
var sha256 = require("crypto-js/sha256");
const io = require("socket.io-client");
const axios = require('axios');
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
var BreezeConnect = function(params) {
var self = this;
self.version = "0.1";
self.websocketUrl = 'https://uatstreams.icicidirect.com'; //ws
self.appKey = params.appKey || "";
self.userId = "";
self.secretKey = "";
self.socket = null;
self.apiHostname = "https://uatapi.icicidirect.com/iciciDirectWebApi_core/api/v1/"; //AllAPI
self.sessionToken = ""; //ws
self.base64SessionToken = ""; //AllAPI
self.onTicks = null;
self.stockScriptDictList = [];
self.tokenScriptDictList = [];
self.tuxToUserValue = {
"orderFlow": {
"B": "Buy",
"S": "Sell",
"N": "NA"
},
"limitMarketFlag": {
"L": "Limit",
"M": "Market",
"S": "StopLoss"
},
"orderType": {
"T": "Day",
"I": "IoC",
"V": "VTC"
},
"productType": {
"F": "Futures",
"O": "Options",
"P": "FuturePlus",
"U": "FuturePlus_sltp",
"I": "OptionPlus",
"C": "Cash",
"Y": "eATM",
"B": "BTST",
"M": "Margin",
"T": "MarginPlus"
},
"orderStatus": {
"A": "All",
"R": "Requested",
"Q": "Queued",
"O": "Ordered",
"P": "Partially Executed",
"E": "Executed",
"J": "Rejected",
"X": "Expired",
"B": "Partially Executed And Expired",
"D": "Partially Executed And Cancelled",
"F": "Freezed",
"C": "Cancelled"
},
"optionType": {
"C": "Call",
"P": "Put",
"*": "Others"
},
}
self.connect = function () {
self.socket = io.connect(self.websocketUrl, {
auth: {
user: self.userId,
token: self.sessionToken
},
transports: ["websocket"],
});
};
self.onDisconnect = function() {
socket.on("disconnect", () => {
console.log("Your watchlist has been disconnected.");
});
};
self.generateSession = async function ({secretKey="",sessionToken=""}) {
self.secretKey = secretKey;
await self.apiUtil(sessionToken);
await self.getStockScriptList();
};
self.apiUtil = async function(sessionToken){
try {
let response = {"Success":"","Status":500,"Error":""};
headers = {
"Content-Type": "application/json"
}
body = {
"SessionToken": sessionToken,
"AppKey": self.appKey,
}
response = await self.makeRequest("GET", "customerdetails", body, headers);
if(response.data['Status']==500){
throw "Could not authenticate credentials. Please check token and keys.";
}
else{
self.base64SessionToken = response.data['Success']['session_token'];
decodedKey = Buffer.from(self.base64SessionToken.toString('utf-8'),'base64').toString('ascii');
self.userId = decodedKey.split(':')[0];
self.sessionToken = decodedKey.split(':')[1];
}
} catch (error) {
throw "Could not authenticate credentials. Please check token and keys.";
}
}
self.watch = function (symbols) {
if (!self.socket) {
return;
}
console.log("watching "+symbols);
self.socket.emit("join", symbols);
self.socket.on('stock', self.onMessage)
};
self.on = function (callback) {
self.socket.on("stock", callback);
};
self.onMessage = function(data){
data = self.parseData(data);
self.onTicks(data);
}
self.notify = function(){
self.socket.on('order', self.onMessage)
}
self.unwatch = function (symbol) {
console.log("unwatched " + symbol);
self.socket.emit("leave", symbol);
};
self.wsConnect = function(){
if (!self.socket){
self.connect();
}
}
self.wsDisconnect = function(){
if(self.socket)
self.onDisconnect()
}
self.getDataFromStockTokenValue = function(inputStockToken){
var outputData = {};
var stockToken = inputStockToken.split(".");
var exchangeType = stockToken[0];
var stockToken = stockToken[1].split("!")[1];
var exchangeCodeList={
"1":"BSE",
"4":"NSE",
"13":"NDX",
"6":"MCX",
};
var exchangeCodeName = exchangeCodeList[exchangeType] || false;
if(exchangeCodeName == false)
throw "Stock-Token cannot be found due to wrong exchange-code.";
else if(exchangeCodeName.toLowerCase() == "bse"){
stockData = self.tokenScriptDictList[0][stockToken] || false;
if(stockData == false)
throw "Stock-Data does not exist in exchange-code BSE for Stock-Token "+inputStockToken+".";
}
else if(exchangeCodeName.toLowerCase() == "nse"){
stockData = self.tokenScriptDictList[1][stockToken] || false;
if(stockData == false){
stockData = self.tokenScriptDictList[4][stockToken] || false;
if(stockData == false)
throw "Stock-Token does not exist in both exchange-code i.e. NSE or NFO.";
else
exchangeCodeName = "NFO";
}
}
else if(exchangeCodeName.toLowerCase() == "ndx"){
stockData = self.tokenScriptDictList[2][stockToken] || false;
if(stockData == false)
throw "Stock-Data does not exist in exchange-code NDX for Stock-Token "+inputStockToken+".";
}
else if(exchangeCodeName.toLowerCase() == "mcx"){
stockData = self.tokenScriptDictList[3][stockToken] || false;
if(stockData == false)
throw "Stock-Data does not exist in exchange-code MCX for Stock-Token "+inputStockToken+".";
}
outputData["stock_name"] = stockData[1];
var equityExchangeCodeList = ["nse","bse"]
if (!Boolean(equityExchangeCodeList.includes(exchangeCodeName.toLowerCase()))){
var productType = stockData[0].split("-")[0]
if(productType.toLowerCase()=="fut")
outputData["product_type"] = "Futures"
if(productType.toLowerCase()=="opt")
outputData["product_type"] = "Options"
var dateString = ""
for(let date of stockData[0].split("-").slice(2,5))
dateString += date + "-"
outputData["strike_date"] = dateString.slice(0,-1)
if(stockData[0].split("-")>5){
outputData["strike_price"] = stockData[0].split("-")[5]
var right = stockData[0].split("-")[6]
if(right.toUpperCase()=="PE")
outputData["right"] = "Put"
if(righttoUpperCase()=="CE")
outputData["right"] = "Call"
}
}
return outputData;
}
self.getStockTokenValue = function (exchangeCode="", stockCode="", productType="", expiryDate="", strikePrice="", right="", getExchangeQuotes=true, getMarketDepth=true) {
if (getExchangeQuotes === false && getMarketDepth === false) {
throw "Either getExchangeQuotes must be true or getMarketDepth must be true";
} else {
var exchangeCodeName = "";
var exchangeCodeList={
"BSE":"1.",
"NSE":"4.",
"NDX":"13.",
"MCX":"6.",
"NFO":"4.",
};
var exchangeCodeName = exchangeCodeList[exchangeCode] || false;
if(exchangeCodeName === false) {
throw "Exchange Code allowed are 'BSE', 'NSE', 'NDX', 'MCX' or 'NFO'.";
}
else if(stockCode === "") {
throw "Stock-Code cannot be empty.";
}
else {
var tokenValue = false;
if(exchangeCode.toLowerCase() === "bse") {
var tokenValue = self.stockScriptDictList[0][stockCode] || false;
}
else if(exchangeCode.toLowerCase() === "nse"){
tokenValue = self.stockScriptDictList[1][stockCode] || false;
}
else {
if(expiryDate === "") {
throw "Expiry-Date cannot be empty for given Exchange-Code.";
}
if(productType.toLowerCase() === "futures") {
var contractDetailValue = "FUT"
}
else if(productType.toLowerCase() === "options") {
contractDetailValue = "OPT"
}
else {
throw "Product-Type should either be Futures or Options for given Exchange-Code.";
}
contractDetailValue = contractDetailValue + "-" + stockCode + "-" + expiryDate
if(productType.toLowerCase() === "options") {
if(strikePrice !== "") {
contractDetailValue = contractDetailValue + "-" + strikePrice;
}
else if(strikePrice === "" && productType.toLowerCase() === "options") {
throw "Strike Price cannot be empty for Product-Type 'Options'.";
}
if(right.toLowerCase() === "put") {
contractDetailValue = contractDetailValue + "-" + "PE";
}
else if(right.toLowerCase() === "call") {
contractDetailValue = contractDetailValue + "-" + "CE"
}
else if(productType.toLowerCase() === "options") {
throw "Rights should either be Put or Call for Product-Type 'Options'.";
}
}
if(exchangeCode.toLowerCase() === "ndx") {
tokenValue = self.stockScriptDictList[2][contractDetailValue] || false;
}
else if(exchangeCode.toLowerCase() === "mcx") {
tokenValue = self.stockScriptDictList[3][contractDetailValue] || false;
}
else if(exchangeCode.toLowerCase() === "nfo") {
tokenValue = self.stockScriptDictList[4][contractDetailValue] || false;
}
}
if(tokenValue === false) {
throw "Stock-Code not found.";
}
var exchangeQuotesTokenValue = false;
if(getExchangeQuotes !== false) {
exchangeQuotesTokenValue = exchangeCodeName + "1!" + tokenValue;
}
var marketDepthTokenValue = false;
if(getMarketDepth !== false) {
marketDepthTokenValue = exchangeCodeName + "2!" + tokenValue;
}
return {"exchange_quotes_token":exchangeQuotesTokenValue,"market_depth_token": marketDepthTokenValue};
}
}
}
self.parseMarketDepth = function(data, exchange){
var marketDepthList = []
var counter = 0;
for(let lis of data){
counter += 1;
marketDepthObject = {};
if(exchange == '1'){
marketDepthObject["BestBuyRate-"+counter.toString()] = lis[0];
marketDepthObject["BestBuyQty-"+counter.toString()] = lis[1];
marketDepthObject["BestSellRate-"+counter.toString()] = lis[2];
marketDepthObject["BestSellQty-"+counter.toString()] = lis[3];
marketDepthList.push(marketDepthObject);
}
else{
marketDepthObject["BestBuyRate-"+counter.toString()] = lis[0];
marketDepthObject["BestBuyQty-"+counter.toString()] = lis[1];
marketDepthObject["BuyNoOfOrders-"+counter.toString()] = lis[2];
marketDepthObject["BuyFlag-"+counter.toString()] = lis[3];
marketDepthObject["BestSellRate-"+counter.toString()] = lis[4];
marketDepthObject["BestSellQty-"+counter.toString()] = lis[5];
marketDepthObject["SellNoOfOrders-"+counter.toString()] = lis[6];
marketDepthObject["SellFlag-"+counter.toString()] = lis[7];
marketDepthList.push(marketDepthObject);
}
}
return marketDepthList;
}
self.parseData = function(data){
if(data !== null && data !== undefined && typeof(data[0]) !== String && data[0].indexOf('!') < 0){
var orderObject = {}
orderObject["sourceNumber"] = data[0] //Source Number
orderObject["group"] = data[1] //Group
orderObject["userId"] = data[2] //User_id
orderObject["key"] = data[3] //Key
orderObject["messageLength"] = data[4] //Message Length
orderObject["requestType"] = data[5] //Request Type
orderObject["messageSequence"] = data[6] //Message Sequence
orderObject["messageDate"] = data[7] //Date
orderObject["messageTime"] = data[8] //Time
orderObject["messageCategory"] = data[9] //Message Category
orderObject["messagePriority"] = data[10] //Priority
orderObject["messageType"] = data[11] //Message Type
orderObject["orderMatchAccount"] = data[12] //Order Match Account
orderObject["orderExchangeCode"] = data[13] //Exchange Code
if(data[11] == '4' && data[11] == '5'){
orderObject["stockCode"] = data[14] //Stock Code
orderObject["orderFlow"] = self.tuxToUserValue['orderFlow'][data[15].toString().toUpperCase()] || data[15].toString() // Order Flow
orderObject["limitMarketFlag"] = self.tuxToUserValue['limitMarketFlag'][data[16].toString().toUpperCase()] || data[16].toString() //Limit Market Flag
orderObject["orderType"] = self.tuxToUserValue['orderType'][data[17].toString().toUpperCase()] || data[17].toString() //OrderType
orderObject["orderLimitRate"] = data[18] //Limit Rate
orderObject["productType"] = self.tuxToUserValue['productType'][data[19].toString().toUpperCase()] || data[19].toString() //Product Type
orderObject["orderStatus"] = self.tuxToUserValue['orderStatus'][data[20].toString().toUpperCase()] || data[20].toString() // Order Status
orderObject["orderDate"] = data[21] //Order Date
orderObject["orderTradeDate"] = data[22] //Trade Date
orderObject["orderReference"] = data[23] //Order Reference
orderObject["orderQuantity"] = data[24] //Order Quantity
orderObject["openQuantity"] = data[25] //Open Quantity
orderObject["orderExecutedQuantity"] = data[26] //Order Executed Quantity
orderObject["cancelledQuantity"] = data[27] //Cancelled Quantity
orderObject["expiredQuantity"] = data[28] //Expired Quantity
orderObject["orderDisclosedQuantity"] = data[29] // Order Disclosed Quantity
orderObject["orderStopLossTrigger"] = data[30] //Order Stop Loss Triger
orderObject["orderSquareFlag"] = data[31] //Order Square Flag
orderObject["orderAmountBlocked"] = data[32] // Order Amount Blocked
orderObject["orderPipeId"] = data[33] //Order PipeId
orderObject["channel"] = data[34] //Channel
orderObject["exchangeSegmentCode"] = data[35] //Exchange Segment Code
orderObject["exchangeSegmentSettlement"] = data[36] //Exchange Segment Settlement
orderObject["segmentDescription"] = data[37] //Segment Description
orderObject["marginSquareOffMode"] = data[38] //Margin Square Off Mode
orderObject["orderValidDate"] = data[40] //Order Valid Date
orderObject["orderMessageCharacter"] = data[41] //Order Message Character
orderObject["averageExecutedRate"] = data[42] //Average Exited Rate
orderObject["orderPriceImprovementFlag"] = data[43] //Order Price Flag
orderObject["orderMBCFlag"] = data[44] //Order MBC Flag
orderObject["orderLimitOffset"] = data[45] //Order Limit Offset
orderObject["systemPartnerCode"] = data[46] //System Partner Code
}
else if(data[11] == '6' || data[11] == '7'){
orderObject["stockCode"] = data[14] //stock code
orderObject["productType"] = self.tuxToUserValue['productType'][data[15].toString().toUpperCase()] || data[15].toString() //Product Type
orderObject["optionType"] = self.tuxToUserValue['optionType'][data[16].toString().toUpperCase()] || data[16].toString() //Option T
orderObject["exerciseType"] = data[17] //Exercise Type
orderObject["strikePrice"] = data[18] //Strike Price
orderObject["expiryDate"] = data[19] //Expiry Date
orderObject["orderValidDate"] = data[20] //Order Valid Date
orderObject["orderFlow"] = self.tuxToUserValue['orderFlow'][data[21].toString().toUpperCase()] || data[21].toString() //Order Flow
orderObject["limitMarketFlag"] = self.tuxToUserValue['limitMarketFlag'][data[22].toString().toUpperCase()] || data[22].toString() //Limit Market Flag
orderObject["orderType"] = self.tuxToUserValue['orderType'][data[23].toString().toUpperCase()] || data[23].toString() //Order Type
orderObject["limitRate"] = data[24] //Limit Rate
orderObject["orderStatus"] = self.tuxToUserValue['orderStatus'][data[25].toString().toUpperCase()] || data[25].toString() //Order Status
orderObject["orderReference"] = data[26] //Order Reference
orderObject["orderTotalQuantity"] = data[27] //Order Total Quantity
orderObject["executedQuantity"] = data[28] //Executed Quantity
orderObject["cancelledQuantity"] = data[29] //Cancelled Quantity
orderObject["expiredQuantity"] = data[30] //Expired Quantity
orderObject["stopLossTrigger"] = data[31] //Stop Loss Trigger
orderObject["specialFlag"] = data[32] //Special Flag
orderObject["pipeId"] = data[33] //PipeId
orderObject["channel"] = data[34] //Channel
orderObject["modificationOrCancelFlag"] = data[35] //Modification or Cancel Flag
orderObject["tradeDate"] = data[36] //Trade Date
orderObject["acknowledgeNumber"] = data[37] //Acknowledgement Number
orderObject["stopLossOrderReference"] = data[37] //Stop Loss Order Reference
orderObject["totalAmountBlocked"] = data[38] // Total Amount Blocked
orderObject["averageExecutedRate"] = data[39] //Average Executed Rate
orderObject["cancelFlag"] = data[40] //Cancel Flag
orderObject["squareOffMarket"] = data[41] //SquareOff Market
orderObject["quickExitFlag"] = data[42] //Quick Exit Flag
orderObject["stopValidTillDateFlag"] = data[43] //Stop Valid till Date Flag
orderObject["priceImprovementFlag"] = data[44] //Price Improvement Flag
orderObject["conversionImprovementFlag"] = data[45] //Conversion Improvement Flag
orderObject["trailUpdateCondition"] = data[45] //Trail Update Condition
orderObject["systemPartnerCode"] = data[46] //System Partner Code
}
return orderObject;
}
var exchange = data[0].split('!')[0].split('.')[0]
var dataType = data[0].split('!')[0].split('.')[1];
if(exchange == '6'){
var feedObject = {};
feedObject["symbol"] = data[0];
feedObject["AndiOPVolume"] = data[1];
feedObject["Reserved"] = data[2];
feedObject["IndexFlag"] = data[3];
feedObject["ttq"] = data[4];
feedObject["last"] = data[5];
feedObject["ltq"] = data[6];
feedObject["ltt"] = (new Date(data[7]*1000)).toString().replace(" GMT+0530 (India Standard Time)",'');
feedObject["AvgTradedPrice"] = data[8];
feedObject["TotalBuyQnt"] = data[9];
feedObject["TotalSellQnt"] = data[10];
feedObject["ReservedStr"] = data[11];
feedObject["ClosePrice"] = data[12];
feedObject["OpenPrice"] = data[13];
feedObject["HighPrice"] = data[14];
feedObject["LowPrice"] = data[15];
feedObject["ReservedShort"] = data[16];
feedObject["CurrOpenInterest"] = data[17];
feedObject["TotalTrades"] = data[18];
feedObject["HightestPriceEver"] = data[19];
feedObject["LowestPriceEver"] = data[20];
feedObject["TotalTradedValue"] = data[21];
marketDepthIndex = 0
let i=0;
for(i=22;i<data.length;i++){
feedObject["Quantity-"+marketDepthIndex.toString()] = data[i][0]
feedObject["OrderPrice-"+marketDepthIndex.toString()] = data[i][1]
feedObject["TotalOrders-"+marketDepthIndex.toString()] = data[i][2]
feedObject["Reserved-"+marketDepthIndex.toString()] = data[i][3]
feedObject["SellQuantity-"+marketDepthIndex.toString()] = data[i][4]
feedObject["SellOrderPrice-"+marketDepthIndex.toString()] = data[i][5]
feedObject["SellTotalOrders-"+marketDepthIndex.toString()] = data[i][6]
feedObject["SellReserved-"+marketDepthIndex.toString()] = data[i][7]
marketDepthIndex += 1
}
}
else if(dataType == '1'){
var feedObject = {
"symbol": data[0],
"open": data[1],
"last": data[2],
"high": data[3],
"low": data[4],
"change": data[5],
"bPrice": data[6],
"bQty": data[7],
"sPrice": data[8],
"sQty": data[9],
"ltq": data[10],
"avgPrice": data[11],
"quotes": "Quotes Data"
}
// For NSE & BSE conversion
if(data.length == 21){
feedObject["ttq"] = data[12]
feedObject["totalBuyQt"] = data[13]
feedObject["totalSellQ"] = data[14]
feedObject["ttv"] = data[15]
feedObject["trend"] = data[16]
feedObject["lowerCktLm"] = data[17]
feedObject["upperCktLm"] = data[18]
feedObject["ltt"] = (new Date(data[19]*1000)).toString().replace(" GMT+0530 (India Standard Time)",'')
feedObject["close"] = data[20]
}
// For FONSE & CDNSE conversion
else if(data.length == 23){
feedObject["OI"] = data[12]
feedObject["CHNGOI"] = data[13]
feedObject["ttq"] = data[14]
feedObject["totalBuyQt"] = data[15]
feedObject["totalSellQ"] = data[16]
feedObject["ttv"] = data[17]
feedObject["trend"] = data[18]
feedObject["lowerCktLm"] = data[19]
feedObject["upperCktLm"] = data[20]
feedObject["ltt"] = (new Date(data[21]*1000)).toString().replace(" GMT+0530 (India Standard Time)",'')
feedObject["close"] = data[22]
}
}
else{
var feedObject = {
"symbol": data[0],
"time": (new Date(data[1]*1000)).toString().replace(" GMT+0530 (India Standard Time)",''),
"depth": self.parseMarketDepth(data[2], exchange),
"quotes": "Market Depth"
}
}
if(exchange == '4' && data.length == 21)
feedObject['exchange'] = 'NSE Equity'
else if(exchange == '1')
feedObject['exchange'] = 'BSE'
else if(exchange == '13')
feedObject['exchange'] = 'NSE Currency'
else if(exchange == '4' && data.length == 23)
feedObject['exchange'] = 'NSE Futures & Options'
else if(exchange == '6')
feedObject['exchange'] = 'Commodity'
if(feedObject['symbol']!=undefined && feedObject['symbol']!=null && feedObject['symbol'].length>0){
feedObject= {...feedObject,...self.getDataFromStockTokenValue(feedObject['symbol'])}
}
return feedObject
}
self.getStockScriptList = async function(){
try{
self.stockScriptDictList = [{},{},{},{},{}]
self.tokenScriptDictList = [{},{},{},{},{}]
var download = await axios.get(url="https://traderweb.icicidirect.com/Content/File/txtFile/ScripFile/StockScriptNew.csv")
.then(function(resp){return resp});
var stockDataList = download.data.replaceAll('\r','').split('\n');
for (let rowString of stockDataList){
var row = rowString.split(',')
if(row[2] == "BSE"){
self.stockScriptDictList[0][row[3]]=row[5]
self.tokenScriptDictList[0][row[5]]=[row[3],row[1]]
}
else if(row[2] == "NSE"){
self.stockScriptDictList[1][row[3]]=row[5]
self.tokenScriptDictList[1][row[5]]=[row[3],row[1]]
}
else if(row[2] == "NDX"){
self.stockScriptDictList[2][row[7]]=row[5]
self.tokenScriptDictList[2][row[5]]=[row[7],row[1]]
}
else if(row[2] == "MCX"){
self.stockScriptDictList[3][row[7]]=row[5]
self.tokenScriptDictList[3][row[5]]=[row[7],row[1]]
}
else if(row[2] == "NFO"){
self.stockScriptDictList[4][row[7]]=row[5]
self.tokenScriptDictList[4][row[5]]=[row[7],row[1]]
}
}
}catch(error){
throw error.toString();
}
}
self.subscribeFeeds = async function({stockToken="", exchangeCode="", stockCode="", productType="", expiryDate="", strikePrice="", right="", getExchangeQuotes=true, getMarketDepth=true, getOrderNotification=false}){
if(self.socket){
var returnObject = {}
if(getOrderNotification == true){
self.notify()
returnObject = {"message":"Order Notification subscribed successfully"}
}
if(stockToken != ""){
self.watch(stockToken)
returnObject = {"message":"Stock "+stockToken+" subscribed successfully"}
}
else if(getOrderNotification == true && exchangeCode == ""){
return returnObject
}
else{
var tokenObject = self.getStockTokenValue(exchangeCode=exchangeCode, stockCode=stockCode, productType=productType, expiryDate=expiryDate, strikePrice=strikePrice, right=right, getExchangeQuotes=getExchangeQuotes, getMarketDepth=getMarketDepth);
if(tokenObject["exchange_quotes_token"] != false)
self.watch(tokenObject["exchange_quotes_token"])
if( tokenObject["market_depth_token"] != false)
self.watch(tokenObject["market_depth_token"])
returnObject = {"message":"Stock "+stockCode+" subscribed successfully"}
}
return returnObject
}
}
self.unsubscribeFeeds = async function({stockToken="", exchangeCode="", stockCode="", productType="", expiryDate="", strikePrice="", right="", getExchangeQuotes=true, getMarketDepth=true}){
if(self.socket){
if(stockToken!=""){
self.unwatch(stockToken)
return {"message":"Stock "+stockToken+" unsubscribed successfully"}
}
else{
var tokenObject = self.getStockTokenValue(exchangeCode=exchangeCode, stockCode=stockCode, productType=productType, expiryDate=expiryDate, strikePrice=strikePrice, right=right, getExchangeQuotes=getExchangeQuotes, getMarketDepth=getMarketDepth)
if(tokenObject["exchange_quotes_token"] != false)
self.unwatch(tokenObject["exchange_quotes_token"])
if( tokenObject["market_depth_token"] != false)
self.unwatch(tokenObject["market_depth_token"])
return {"message":"Stock "+stockCode+" unsubscribed successfully"}
}
}
}
self.generateHeaders = function(body) {
try {
var currentDate = new Date().toISOString().split(".")[0] + '.000Z';
let checksum = sha256(currentDate+JSON.stringify(body)+self.secretKey);
headers = {
"Content-Type": "application/json",
'X-Checksum': "token "+checksum,
'X-Timestamp': currentDate,
'X-AppKey': self.appKey,
'X-SessionToken': self.base64SessionToken
}
return headers;
} catch (error) {
console.log("generateHeaders() Error - ", error);
}
};
self.makeRequest = async function(method, endpoint, body, header) {
try {
let url = self.apiHostname + endpoint;
let res = null;
if(method === "GET") {
res = await axios(
{
method:'get',
url:url,
data:body,
headers:header
}
).then((resp)=>{return resp})
return res;
}
else if(method === "POST") {
res = await axios.post(url=url, data=body, {headers:header})
.then((resp)=>{return resp});
return res;
}
else if(method === "PUT") {
res = axios.put(url=url, data=body, {headers:header})
.then((resp)=>{return resp});
return res;
}
else if(method === "DELETE") {
res = axios.delete(url=url, data=body, {headers:header})
.then((resp)=>{return resp});
return res;
}
else {
console.log("Invalid Request Method - Must be GET, POST, PUT or DELETE");
}
} catch (error) {
console.log("Error while trying to make request "+method+" - ", error);
}
};
self.getCustomerDetails = async function({apiSession=""}) {
try {
let response = {"Success":"","Status":500,"Error":""};
if(apiSession === "" || apiSession === null) {
response = {"Success":"","Status":500,"Error":"ApiSession cannot be empty"}
return response;
}
headers = {
"Content-Type": "application/json"
}
body = {
"SessionToken": apiSession,
"AppKey": self.appKey,
}
response = await self.makeRequest("GET", "customerdetails", body, headers);
delete response.data['Success']['session_token'];
return response.data;
} catch (error) {
console.log("getCustomerDetails() Error - ", error)
}
};
self.getDematHoldings = async function() {
try {
let body = {}
let headers = self.generateHeaders(body);
let response = await self.makeRequest("GET", "dematholdings", body, headers);
return response.data;
} catch (error) {
console.log("getDematHoldings() Error- ", error);
}
};
self.getFunds = async function() {
try {
let body = {}
let headers = self.generateHeaders(body);
let response = await self.makeRequest("GET", "funds", body, headers);
return response.data;
} catch (error) {
console.log("getFunds() Error- ", error);
}
};
self.setFunds = async function({transactionType="", amount="", segment=""}) {
try {
let response = {"Success":"","Status":500,"Error":""}
if(transactionType === "" || transactionType === null || amount === "" || amount === null || segment === "" || segment === null) {
if(transactionType === "" || transactionType === null) {
response["Error"]="Transaction-Type cannot be empty"
}
else if(amount === "" || amount === null) {
response["Error"]="Amount cannot be empty";
}
else if(segment === "" || segment === null) {
response["Error"]="Segment cannot be empty";
}
}
else if(transactionType.toLowerCase() !=="debit" && transactionType.toLowerCase() !== "credit") {
response = {"Success":"","Status":500,"Error":"Transaction-Type should be either 'debit' or 'credit'"}
return response;
}
else if(parseInt(amount) <= 0) {
response = {"Success":"","Status":500,"Error":"Amount should be more than 0"}
return response;
}
body = {
"transaction_type": transactionType,
"amount": amount,
"segment": segment
}
let headers = self.generateHeaders(body);
response = await self.makeRequest("POST", "funds", body, headers);
return response.data;
} catch (error) {
console.log("setFunds() Error - ", error);
}
};
self.getHistoricalData = async function({interval="", fromDate="", toDate="", stockCode="", exchangeCode="", productType="", expiryDate="", right="", strikePrice=""}) {
try {
let response = {"Success":"","Status":"","Error":""};
let ints = ["1minute","5minute","30minute","1day"];
if(interval === "" || interval === null) {
response = {"Success":"","Status":500,"Error":"Interval cannot be empty"}
return response;
}
else if(!Boolean(ints.includes(interval.toLowerCase()))) {
response = {"Success":"","Status":500,"Error":"Interval should be either '1minute', '5minute', '30minute', or '1day'"}
return response;
}
else if(exchangeCode === "" || exchangeCode === null) {
response = {"Success":"","Status":500,"Error":"Exchange-Code cannot be empty"}
return response;
}
else if(exchangeCode.toLowerCase() !== "nse" && exchangeCode.toLowerCase() !== "nfo" && exchangeCode.toLowerCase() !== "bse") {
response = {"Success":"","Status":500,"Error":"Exchange-Code should be either 'nse', 'bse' or 'nfo'"}
return response;
}
else if(fromDate === "" || fromDate === null) {
response = {"Success":"","Status":500,"Error":"From-Date cannot be empty"}
return response;
}
else if(toDate === "" || toDate === null) {
response = {"Success":"","Status":500,"Error":"To-Date cannot be empty"}
return response;
}
else if(stockCode === "" || stockCode === null) {
response = {"Success":"","Status":500,"Error":"Stock-Code cannot be empty"}
return response;
}
else if(exchangeCode.toLowerCase() === "nfo") {
let pType = ["futures","options","futureplus","optionplus"];
if(productType === "" || productType === null) {
response = {"Success":"","Status":500,"Error":"Product-type cannot be empty for Exchange-Code 'nfo'"}
return response;
}
else if(!Boolean(pType.includes(productType.toLowerCase()))) {
response = {"Success":"","Status":500,"Error":"Product-type should be either 'futures', 'options', 'futureplus', or 'optionplus' for Exchange-Code 'NFO'"}
return response;
}
else if(productType.toLowerCase() === "options" && (strikePrice === "" || strikePrice === null)) {
response = {"Success":"","Status":500,"Error":"Strike-Price cannot be empty for Product-Type 'options'"}
return response;
}
else if(expiryDate === "" || expiryDate === null) {
response = {"Success":"","Status":500,"Error":"Expiry-Date cannot be empty for exchange-code 'nfo'"}
return response;
}
}
if(interval === "1minute") {
interval = "minute";
}
else if(interval === "1day") {
interval = "day";
}
let body = {
"interval": interval,
"from_date": fromDate,
"to_date": toDate,
"stock_code": stockCode,
"exchange_code": exchangeCode
}
if(productType !== "" && productType !== null) {
body["product_type"] = productType;
}
if(expiryDate !== "" && expiryDate !== null) {
body["expiry_date"] = expiryDate;
}
if(strikePrice !== "" && strikePrice !== null) {
body["strike_price"] = strikePrice;
}
if(right != "" && right !== null){
body["right"] = right
}
let headers = self.generateHeaders(body);
response = await self.makeRequest("GET", "historicalcharts", body, headers);
return response.data;
} catch (error) {
console.log("getHistoricalData() Error - ", error);
}
}
self.addMargin = async function({productType="", stockCode="", exchangeCode="", settlementId="", addAmount="", marginAmount="", openQuantity="", coverQuantity="", categoryIndexPerStock="", expiryDate="", right="", contractTag="", strikePrice="", segmentCode=""}) {
try {
let response = {"Success":"","Status":500,"Error":""};
let pType = ["futures","options","futureplus","optionplus","cash","eatm","margin"];
let rightTypes = ["call","put","others"];
if(exchangeCode === "" || exchangeCode === null) {
response = {"Success":"","Status":500,"Error":"Exchange-Code cannot be empty"}
return response;
}
else if(productType !== "" && productType !== null && !Boolean(pType.includes(productType.toLowerCase()))) {
response = {"Success":"","Status":500,"Error":"Product-type should be either 'futures', 'options', 'futureplus', 'optionplus', 'cash', 'eatm', or 'margin'"}
return response;
}
else if(right !== "" && right !== null && !Boolean(rightTypes.includes(right.toLowerCase()))) {
response = {"Success":"","Status":500,"Error":"Right should be either 'call', 'put', or 'others'"}
return response;
}
let body = {
"exchange_code": exchangeCode
}
if (productType !== "" && productType !== null) {
body["product_type"] = productType;
}
if(stockCode !== "" && stockCode !== null) {
body["stock_code"] = stockCode;
}
if(coverQuantity !== "" && coverQuantity !== null) {
body["cover_quantity"] = coverQuantity;
}
if(categoryIndexPerStock != "" && categoryIndexPerStock !== null){
body["category_index_per_stock"] = categoryIndexPerStock
}
if(contractTag != "" && contractTag !== null){
body["contract_tag"] = contractTag
}
if(marginAmount !== "" && marginAmount !== null) {
body["margin_amount"] = marginAmount;
}
if(expiryDate !== "" && expiryDate !== null) {
body["expiry_date"] = expiryDate;
}
if(right != "" && right !== null){
body["right"] = right
}
if(strikePrice != "" && strikePrice !== null){
body["strike_price"] = strikePrice
}
if(segmentCode != "" && segmentCode !== null){
body["segment_code"] = segmentCode
}
if(settlementId != "" && settlementId !== null){
body["settlement_id"] = settlementId
}
if(addAmount != "" && addAmount !== null){
body["add_amount"] = addAmount
}
if(openQuantity != "" && openQuantity !== null){
body["open_quantity"] = openQuantity
}
let headers = self.generateHeaders(body);
response = await self.makeRequest("POST", "margin", body, headers);
return response.data;
} catch (error) {
console.log("addMargin() Error - ", error);
}
};
self.getMargin = async function({exchangeCode=""}) {
try {
let response = {"Success":"","Status":500,"Error":""};
if(exchangeCode === "" || exchangeCode === null) {
response = {"Success":"","Status":500,"Error":"Exchange-Code cannot be empty"}
return response;
}
let body = {
"exchange_code": exchangeCode
}
let headers = self.generateHeaders(body);
response = await self.makeRequest("GET", "margin", body, headers);
return response.data;
} catch (error) {
console.log("getMargin() Error - ", error);
}
};
self.placeOrder = async function({stockCode="", exchangeCode="", product="", action="", orderType="", stoploss="", quantity="", price="", validity="", validityDate="", disclosedQuantity="", expiryDate="", right="", strikePrice="", userRemark=""}) {
try {
let response = {"Success":"","Status":500,"Error":""};
let productType = ["futures","options","futureplus","optionplus","cash","eatm","margin"];
if(stockCode === "" || stockCode === null || exchangeCode === "" || exchangeCode === null || product === "" || product === null || action === "" || action === null || orderType === "" || orderType === null || quantity === "" || quantity === null || price === "" || price === null || action === "" || action == null) {
if(stockCode === "" || stockCode === null) {
response = {"Success":"","Status":500,"Error":"Stock-Code cannot be empty"};
return response;
}
else if(exchangeCode === "" || exchangeCode === null) {
response = {"Success":"","Status":500,"Error":"Exchange-Code cannot be empty"};
return response;
}
else if(product === "" || product === null) {
response = {"Success":"","Status":500,"Error":"Product cannot be empty"};
return response;
}
else if(action === "" || action === null) {
response = {"Success":"","Status":500,"Error":"Action cannot be empty"};
return response;
}
else if(orderType === "" || orderType === null) {
response = {"Success":"","Status":500,"Error":"Order-Type cannot be empty"};
return response;
}
else if(quantity === "" || quantity === null) {
response = {"Success":"","Status":500,"Error":"Quantity cannot be empty"};
return response;
}
else if(validity === "" || validity === null) {
response = {"Success":"","Status":500,"Error":"Validity cannot be empty"};
return response;
}
}
else if(!Boolean(productType.includes(product.toLowerCase()))) {
response = {"Success":"","Status":500,"Error":"Product should be either 'futures', 'options', 'futureplus', 'optionplus', 'cash', 'eatm', or 'margin'"};
return response;
}
else if(action.toLowerCase() !== "buy" && action.toLowerCase() !== "sell") {
response = {"Success":"","Status":500,"Error":"Action should be either 'buy', or 'sell'"};
return response;
}
else if(orderType.toLowerCase() !== "limit" && orderType.toLowerCase() !== "market" && orderType.toLowerCase() !== "stoploss") {
response = {"Success":"","Status":500,"Error":"Order-type should be either 'limit', 'market', or 'stoploss'"};
return response;
}
else if(validity.toLowerCase() !== "day" && validity.toLowerCase() !== "ioc" && validity.toLowerCase() !== "vtc") {
response = {"Success":"","Status":500,"Error":"Validity should be either 'day', 'ioc', or 'vtc'"};
return response;
}
else if(right !== "" && right !== null && (right.toLowerCase() !== "put" && right.toLowerCase() !== "call" && right.toLowerCase() !== "others")) {
response = {"Success":"","Status":500,"Error":"Right should be either 'call', 'put', or 'others'"};
return response;
}
let body = {
"stock_code": stockCode,
"exchange_code": exchangeCode,
"product": product,
"action": action,
"order_type": orderType,
"quantity": quantity,
"price": price,
"validity": validity,
};
if(stoploss !== "" && stoploss !== null) {
body["stoploss"] = stoploss;
}
if(validityDate !== "" && validityDate !== null) {
body["validity_date"] = validityDate;
}