UNPKG

uatbreezeconnect

Version:

UAT version of Breeze Connect API

997 lines (947 loc) 68.4 kB
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; }