def CEOIDataAvailable(self, ceData): try: strike = ceData['Strike'] time_x = ceData['Time'] ce_oi_y = ceData['OI'] niftyPrc = ceData['Nifty'] totVolume= ceData['Volume'] if [] == strike or [] == time_x or [] == ce_oi_y or [] == niftyPrc: return #Update existing CE data & Nifty graphs with SetData interface for plot in self.graphs: if plot.objectName() == str(strike): plot.setData(x = [self.TimeStamp(time) for time in time_x], y = ce_oi_y, pen='r') self.UpdateVolumeChart(time_x, totVolume, str(strike)+"CE"+"Volume" ) elif plot.objectName() == str(strike)+"Nifty": if True == self.ShowNiftyOnOI: pen = pg.mkPen(color=(0, 255, 0), width=1, style=QtCore.Qt.DotLine) plot.setData(x = [self.TimeStamp(time) for time in time_x], y = niftyPrc, pen=pen) else: plot.setData(x = [h.getTime()], y = [0]) plot.hide() except: log.logException("Exception in CEOIDataAvailable")
def activeContactDataAvailable(self, tableData): self.activeContactsWidget.clear() try: hLabels = ["STRIKE", "TYPE", "%Chng", "OI", "LTP"] rowCnt = len(tableData) colCnt = len(hLabels) self.activeContactsWidget.setRowCount(rowCnt) self.activeContactsWidget.setColumnCount(colCnt) self.activeContactsWidget.verticalHeader().setVisible(False) self.activeContactsWidget.horizontalHeader().setVisible(True) self.activeContactsWidget.horizontalHeader().setStyleSheet("font-weight:bold;border:1px") self.activeContactsWidget.setHorizontalHeaderLabels(hLabels) self.activeContactsWidget.setSortingEnabled(False) for r in range(rowCnt): for c in range(colCnt): self.activeContactsWidget.setItem(r,c, QtGui.QTableWidgetItem(str(tableData[r][c]))) self.activeContactsWidget.resizeColumnsToContents() self.activeContactsWidget.setSortingEnabled(True) self.activeContactsWidget.horizontalHeader().setStretchLastSection(True) self.activeContactsWidget.sortItems(1, QtCore.Qt.AscendingOrder) except: log.logException("Exception in activeContactDataAvailable")
def InsertData(self, data, contractType): try: time = str(h.getTime()) strkPrice = str(data['strikePrice']) expiryDate = str(data['expiryDate']) oi = data[contractType]['openInterest'] oiChg = data[contractType]['changeinOpenInterest'] pOiChg = data[contractType]['pchangeinOpenInterest'] totVol = data[contractType]['totalTradedVolume'] iv = data[contractType]['impliedVolatility'] ltp = data[contractType]['lastPrice'] totBuyQty = data[contractType]['totalBuyQuantity'] totSellQty = data[contractType]['totalSellQuantity'] undelying = data[contractType]['underlyingValue'] ContractType= contractType self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() self.c.execute("INSERT INTO OptionChain (Date, Time, Strike, Expiry, ContractType, OpenInterest, ChangeInOI, pChangeInOI, TotVol, IV, LTP, TotBuyQty, TotSellQty, Underlying) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?, ?)", (self.todaydate, time, strkPrice, expiryDate, ContractType, oi, oiChg, pOiChg, totVol, iv, ltp, totBuyQty, totSellQty, undelying)) self.conn.commit() self.c.close() self.conn.close() except: log.log("Strike = " + str(data['strikePrice']) + " expiry date = " + str(data['expiryDate'])) log.logException('OIDataWriterThread - Exception while inserting CE/PE data')
def WriteData(self): nifty50Stocks = h.GetNifty50Data() try: if [] != nifty50Stocks: time = str(h.getTime()) date = str(h.getDate()) for record in nifty50Stocks: if record['symbol'] in self.stockList: symbol = record['symbol'] ltp = record['lastPrice'] TotVol = record['totalTradedVolume'] dOpen = record['open'] dHigh = record['dayHigh'] dLow = record['dayLow'] pChg = record['pChange'] self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() self.c.execute( "INSERT INTO " + self.table + " (Date, Time, Symbol, LTP, TotVol, Open, DayHigh, DayLow, pChange) VALUES (?,?,?,?,?,?,?,?,?)", (date, time, symbol, ltp, TotVol, dOpen, dHigh, dLow, pChg)) self.conn.commit() self.c.close() self.conn.close() return True except: log.logException( "NiftyHeavyWeightsWriterThread - exception during write data") return False
def OIChangeDataAvailable(self, oiData): try: if oiData.empty == True: log.log('OIChangeDataAvailable - empty dataframe') return maxOI = max(oiData['OI']) for item in self.gScene.items(): if(item.strike == "Strike"): continue ceData = oiData.loc[item.strike + "-CE"] peData = oiData.loc[item.strike + "-PE"] item.setValues(maxOI, ceData['OI'], peData['OI'], ceData['PChange'], peData['PChange'], ceData['LTP'], peData['LTP']) self.gScene.update() ''' smin = self.gView.verticalScrollBar().minimum() smax = self.gView.verticalScrollBar().maximum() self.gView.verticalScrollBar().setValue((smax-smin)/2) ''' except: log.logException("Exception in OIChangeDataAvailable")
def run(self): while True: activeContactsByVolume = h.GetActiveContractsByVolume() try: allRecords = [] if [] != activeContactsByVolume: for record in activeContactsByVolume: if "NIFTY" == record['underlying']: row = [ record['strikePrice'], record['optionType'], ("%.2f" % record['pChange']), record['openInterest'], record['lastPrice'] ] allRecords.append(row) allRecords = allRecords[:5] self.activeContractsSgnl.emit(allRecords) else: log.log( "ActiveContractsReaderThread - active contacts by volume empty" ) t.sleep(10) continue except: log.logException( "ActiveContractsReaderThread - Exception while getting active contacts" ) t.sleep(10) continue t.sleep(self.timer)
def drawHeader(self, painter): try: bgBrush = QtGui.QBrush(QtGui.QColor(255, 255, 153)) painter.setBrush(bgBrush) adjustWidth = 60 painter.drawRect( QtCore.QRectF(self.rect.x(), self.rect.y(), (self.rect.width() / 2) - adjustWidth, self.rect.height())) painter.drawText( QtCore.QRectF(self.rect.x() + 5, self.rect.y() + 5, (self.rect.width() / 2) - adjustWidth, self.rect.height()), "CE OI") ceLtpX = (self.rect.width() / 2) - adjustWidth ceLtpW = 35 painter.drawRect( QtCore.QRectF(ceLtpX, self.rect.y(), ceLtpW, self.rect.height())) painter.drawText( QtCore.QRectF(ceLtpX + 5, self.rect.y() + 5, ceLtpW, self.rect.height()), "LTP") strikeX = ceLtpX + ceLtpW strikeW = 50 painter.drawRect( QtCore.QRectF(strikeX, self.rect.y(), strikeW + 3, self.rect.height())) painter.drawText( QtCore.QRectF(strikeX + 5, self.rect.y() + 5, strikeW, self.rect.height()), "Strike") peLtpX = strikeX + strikeW peLtpW = 35 painter.drawRect( QtCore.QRectF(peLtpX + 3, self.rect.y(), peLtpW, self.rect.height())) painter.drawText( QtCore.QRectF(peLtpX + 5, self.rect.y() + 5, peLtpW, self.rect.height()), "LTP") painter.drawRect( QtCore.QRectF((self.rect.width() / 2) + adjustWidth, self.rect.y(), (self.rect.width() / 2) - adjustWidth, self.rect.height())) painter.drawText( QtCore.QRectF((self.rect.width() / 2) + adjustWidth + 5, self.rect.y() + 5, (self.rect.width() / 2) - adjustWidth, self.rect.height()), "PE OI") except: log.logException("Exception in OpenInterestChangeItem while paint")
def createDB(self): try: self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() query = "create table if not exists " + self.table + " (id integer primary key AUTOINCREMENT, Date Date not null, Time Time not null, Symbol varchar(20), LTP real, TotVol integer, Open real, DayHigh real, DayLow real, pChange real)" self.c.execute(query) self.c.close() except: log.logException('Exception during Create NiftyHeavyWeights table') log.log('Aborting process...') exit()
def createDB(self): try: self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() query = "create table if not exists " + self.table + " (id integer primary key AUTOINCREMENT, Date Date not null, Time Time not null, Nifty50 real)" self.c.execute(query) self.c.close() except: log.logException('Exception during Create Nifty50 table') log.log('Aborting process...') exit()
def DeleteOldData(self): try: self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() self.c.execute("DELETE from Nifty50 WHERE Date != '"+ self.todaydate + "'") self.conn.commit() self.c.close() self.conn.close() log.log('Deleted previous days data of nifty 50') except: log.logException('Exception : can not delete old data of nifty 50')
def createDB(self): try: self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() query = "create table if not exists OptionChain(id integer primary key AUTOINCREMENT, Date Date not null, Time Time not null, Strike int not null, Expiry varchar(20) not null, ContractType varchar(2), OpenInterest integer,ChangeInOI integer, pChangeInOI real, TotVol integer, IV real, LTP real, TotBuyQty integer, TotSellQty integer, Underlying real)" self.c.execute(query) self.c.close() except: log.logException('OIDataWriterThread - Exception during CreateDB()') log.log('Aborting process...') exit()
def InsertNiftyData(self, niftyPrc): try: time = str(h.getTime()) date = str(h.getDate()) self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() self.c.execute("INSERT INTO " + self.table + " (Date, Time, Nifty50) VALUES (?,?,?)", (date, time, niftyPrc)) self.conn.commit() self.c.close() self.conn.close() except: log.logException("NiftyPriceWriterThread - exception during InsertNiftyData")
def NiftyPriceAvailable(self, niftyData): try: price = niftyData['Price'] time_x = niftyData['Time'] if [] == price or [] == time_x: return for plot in self.graphs: if plot.objectName() == "Nifty": pen = pg.mkPen(color=(0, 255, 0), width=1, style=QtCore.Qt.DotLine) plot.setData(x = [self.TimeStamp(time) for time in time_x], y = price, pen=pen) except: log.logException("Exception in NiftyPriceAvailable")
def DeleteOldData(self): try: self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() self.c.execute("DELETE from NiftyHeavyWeights WHERE Date != '" + self.todaydate + "'") self.conn.commit() self.c.close() self.conn.close() log.log( 'NiftyHeavyWeightsWriterThread - Deleted previous days data') except: log.logException( 'Exception : can not delete NiftyHeavyWeightsWriterThread old data' )
def ImportNseDataToDatabase(self): try: oiData = h.GetOIDataList() if oiData == []: log.log('empty OI data received') return for data in oiData: expiryDate = str(data['expiryDate']) if expiryDate in self.expiryDateList: if "CE" in data.keys(): self.InsertData(data, 'CE') if "PE" in data.keys(): self.InsertData(data, 'PE') except: log.logException('OIDataWriterThread - Exception while reading nse data or adding record to database')
def PEOIDataAvailable(self, peData): try: strike = peData['Strike'] time_x = peData['Time'] pe_oi_y = peData['OI'] totVolume= peData['Volume'] if [] == strike or [] == time_x or [] == pe_oi_y: return #Update PE graphs with SetData for plot in self.graphs: if plot.objectName() == str(strike)+"PE": plot.setData(x = [self.TimeStamp(time) for time in time_x], y = pe_oi_y, pen='b') self.UpdateVolumeChart(time_x, totVolume, str(strike)+"PE"+"Volume" ) except: log.logException("Exception in PEOIDataAvailable")
def UpdateVolumeChart(self, time_x_axis, VolumeList, uniqueID): try: time_x = copy.deepcopy(time_x_axis) if len(time_x) < 2: return volume = [] time_x.pop(0) volPrv = None for vl in VolumeList: if None != volPrv: volume.append(vl-volPrv) volPrv = vl volume_y = volume ''' volume_y = [] k = random.sample([1000, 1500], 1) if uniqueID.find('CE') != -1: volume_y = [ x + k[0] for x in volume ] else: volume_y = [ x + k[0] for x in volume ] ''' ''' log.log("-------------- " + uniqueID + " ----------------------") log.log(time_x) log.log(volume) log.log(VolumeList) log.log("--------------------------------------------------------------") ''' for plot in self.graphs: if plot.objectName() == uniqueID: plot.setOpts(x = [self.TimeStamp(time) for time in time_x], height=volume_y, width=0.5) if uniqueID.find('CE') != -1: plot.setZValue(5) else: plot.setZValue(4) except: log.logException("Exception while plotting volume cart for : " + uniqueID)
def HeavyWeightsDataAvailable(self, niftyHeavyWightsData): if [] == self.graphs: return try: heavyWeightsTimePrice = {} heavyWeightsTimeVol = {} for record in niftyHeavyWightsData: time = record[0] ltp = record[2] vol = record[3] if time in heavyWeightsTimePrice: heavyWeightsTimePrice[time] = heavyWeightsTimePrice[time] + ltp heavyWeightsTimeVol[time] = heavyWeightsTimeVol[time] + vol else: heavyWeightsTimePrice[time] = ltp heavyWeightsTimeVol[time] = vol #Heavy weights chart price = [] time_x = [] for pr in heavyWeightsTimePrice.values(): price.append(pr) for tm in heavyWeightsTimePrice.keys(): time_x.append(tm) for plot in self.graphs: if plot.objectName() == "NiftyHeavy": plot.setData(x = [self.TimeStamp(time) for time in time_x], y = price, pen='y') #Heavy weights volume chart self.UpdateVolumeChart(time_x, heavyWeightsTimeVol.values(), "HeavyWeightsVolume") except: log.logException("Exception in HeavyWeightsDataAvailable")
def ReadData(self): self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() tPeriod = self.timePeriod try: for strike in self.otmsToShow: ce_data = {} pe_data = {} query = "SELECT Time, OpenInterest, Underlying, TotVol FROM OptionChain WHERE Expiry = '" + self.currentExpiry + "' AND " query = query + " ContractType = 'CE' AND " + " Strike = " + str(strike) + " AND Date = '" + self.todayDate + "'" result = self.c.execute(query) ceRecords = result.fetchall() niftyPrc = [] timeLst = [] OI = [] TotVolume= [] i = 0 sz = len(ceRecords) for record in ceRecords: if 1 == tPeriod or 0 == i or i == sz-1 or 0 == (i % tPeriod): timeLst.append(record[0]) OI.append(record[1]) niftyPrc.append(record[2]) TotVolume.append(record[3]) ce_data['Strike'] = strike ce_data['Time'] = timeLst ce_data['OI'] = OI ce_data['Nifty'] = niftyPrc ce_data['Volume'] = TotVolume self.ceSignal.emit(ce_data) query = "SELECT Time, OpenInterest, TotVol FROM OptionChain WHERE Expiry = '" + self.currentExpiry + "' AND " query = query + " ContractType = 'PE' AND " + " Strike = " + str(strike) + " AND Date = '" + self.todayDate + "'" result = self.c.execute(query) peRecords = result.fetchall() timeLst = [] OI = [] TotVolume= [] i = 0 sz = len(peRecords) for record in peRecords: if 1 == tPeriod or 0 == i or i == sz-1 or 0 == (i % tPeriod): timeLst.append(record[0]) OI.append(record[1]) TotVolume.append(record[2]) i = i+1 pe_data['Strike'] = strike pe_data['Time'] = timeLst pe_data['OI'] = OI pe_data['Volume'] = TotVolume self.peSignal.emit(pe_data) query = "SELECT Time, Nifty50 FROM " + self.NiftyTable + " WHERE Date = '" + self.todayDate + "'" result = self.c.execute(query) niftyRecords = result.fetchall() timeLst = [] price = [] i = 0 sz = len(niftyRecords) for record in niftyRecords: if 1 == tPeriod or 0 == i or i == sz-1 or 0 == (i % tPeriod): timeLst.append(record[0]) price.append(record[1]) nifty_data = {} nifty_data['Time'] = timeLst nifty_data['Price'] = price self.niftySignal.emit(nifty_data) if [] != self.heavyWeightsList: subQry = "(" for stk in self.heavyWeightsList: subQry = subQry + "'" + stk + "'," subQry = subQry[:-1] subQry = subQry + ")" query = "SELECT Time, Symbol, LTP, TotVol, pChange FROM NiftyHeavyWeights WHERE Date = '" + self.todayDate + "'" query = query + " and Symbol in " + subQry result = self.c.execute(query) niftyRecords = result.fetchall() if [] != niftyRecords: self.niftyHeavyWeightsSgnl.emit(niftyRecords) else: self.niftyHeavyWeightsSgnl.emit([]) except: log.logException("OIDataReaderThread - exception during read data") self.c.close() self.conn.close()
def ReadData(self): self.conn = sqlite3.connect("OptionChain.db") self.c = self.conn.cursor() try: if [] == self.strikesToRead: log.log("OIChangeReaderThread - strikes to read in null") return indexList = [] strikeList = [] ExpiryList = [] ContractTypeList = [] OIList = [] pChgList = [] ltpList = [] for stk in self.strikesToRead: query = "SELECT Strike, Expiry, ContractType, OpenInterest, pChangeInOI, LTP FROM OptionChain WHERE Expiry = '" + self.currentExpiry + "' AND " query = query + " Strike = " + str( stk ) + " AND ContractType = 'CE' AND Date = '" + self.todayDate + "' order by Time desc limit 1" result = self.c.execute(query) allRecords = result.fetchall() if len(allRecords) == 1: lastRedord = allRecords[0] #dataFrame[str(stk)+"-CE"] = lastRedord #print(lastRedord) indexList.append(str(lastRedord[0]) + "-CE") strikeList.append(lastRedord[0]) ExpiryList.append(lastRedord[1]) ContractTypeList.append(lastRedord[2]) OIList.append(lastRedord[3]) pChgList.append(lastRedord[4]) ltpList.append(lastRedord[5]) query = "SELECT Strike, Expiry, ContractType, OpenInterest, pChangeInOI, LTP FROM OptionChain WHERE Expiry = '" + self.currentExpiry + "' AND " query = query + " Strike = " + str( stk ) + " AND ContractType = 'PE' AND Date = '" + self.todayDate + "' order by Time desc limit 1" result = self.c.execute(query) allRecords = result.fetchall() if len(allRecords) == 1: lastRedord = allRecords[0] #dataFrame[str(stk)+"-PE"] = lastRedord #print(lastRedord) indexList.append(str(lastRedord[0]) + "-PE") strikeList.append(lastRedord[0]) ExpiryList.append(lastRedord[1]) ContractTypeList.append(lastRedord[2]) OIList.append(lastRedord[3]) pChgList.append(lastRedord[4]) ltpList.append(lastRedord[5]) dataFrame = pd.DataFrame({ "index": indexList, "Strike": strikeList, "Expiry": ExpiryList, "ContractType": ContractTypeList, "OI": OIList, "PChange": pChgList, "LTP": ltpList }) dataFrame.set_index('index', inplace=True) self.olChgSignal.emit(dataFrame) except: log.logException( "OIChangeReaderThread - exception while reading data") self.c.close() self.conn.close()
def paint(self, painter, option, widget): try: if ("Strike" == self.strike): self.drawHeader(painter) return ceOIColor = QtGui.QBrush(QtGui.QColor(255, 127, 80)) peOIColor = QtGui.QBrush(QtGui.QColor(144, 238, 144)) grayBrush = QtGui.QBrush(QtGui.QColor(192, 192, 192)) #draw outer rect & strike defBrush = painter.brush() painter.setBackground(grayBrush) adjustWidth = 60 adjustHeightForText = 5 adjustWidthForText = 5 adjustWidthForText_sm = 2 painter.drawRect( QtCore.QRectF(self.rect.x(), self.rect.y(), (self.rect.width() / 2) - adjustWidth, self.rect.height())) painter.setBackground(defBrush) ceLtpX = (self.rect.width() / 2) - adjustWidth ceLtpW = 35 painter.drawText( QtCore.QRectF(ceLtpX + adjustWidthForText_sm, self.rect.y() + adjustHeightForText, ceLtpW, self.rect.height()), str(round(self.ceLtp, 1))) painter.drawLine(ceLtpX + adjustWidthForText_sm + ceLtpW - 1, 0, ceLtpX + adjustWidthForText_sm + ceLtpW - 2, self.rect.height()) painter.setBackground(grayBrush) strikeX = ceLtpX + ceLtpW strikeW = 50 painter.drawText( QtCore.QRectF(strikeX + adjustWidthForText, self.rect.y() + adjustHeightForText, strikeW, self.rect.height()), self.strike) painter.drawLine(strikeX + adjustWidthForText + strikeW - 1, 0, strikeX + adjustWidthForText + strikeW, self.rect.height()) painter.setBackground(grayBrush) peLtpX = strikeX + strikeW peLtpW = 35 painter.drawText( QtCore.QRectF(peLtpX + adjustWidthForText, self.rect.y() + adjustHeightForText, peLtpW, self.rect.height()), str(round(self.peLtp, 1))) painter.setBackground(grayBrush) painter.drawRect( QtCore.QRectF((self.rect.width() / 2) + adjustWidth, self.rect.y(), (self.rect.width() / 2) - adjustWidth, self.rect.height())) painter.setBackground(defBrush) #update the OI change painter.setBrush(ceOIColor) cePercentWidth = (((self.ceOI / self.maxOI) * 100.0) * ((self.rect.width() / 2) - adjustWidth)) / 100 painter.drawRoundedRect( QtCore.QRectF(self.rect.x(), self.rect.y() + 5, cePercentWidth, self.rect.height() - 10), 5, 0) ceChg = str(round(self.ceOI / 1000.0, 1)) + "k (" + str( round(self.cePercent, 1)) + "%)" painter.drawText( QtCore.QRectF(self.rect.x() + adjustWidthForText, self.rect.y() + adjustHeightForText, (self.rect.width() / 2), self.rect.height()), ceChg) painter.setBrush(peOIColor) pePercentWidth = (((self.peOI / self.maxOI) * 100.0) * ((self.rect.width() / 2) - adjustWidth)) / 100 painter.drawRoundedRect( QtCore.QRectF(self.rect.width() - pePercentWidth, self.rect.y() + 5, pePercentWidth, self.rect.height() - 10), 0, 5) peChg = str(round(self.peOI / 1000.0, 1)) + "k (" + str( round(self.pePercent, 1)) + "%)" painter.drawText( QtCore.QRectF( (self.rect.width() / 2) + adjustWidth + adjustWidthForText, self.rect.y() + adjustHeightForText, (self.rect.width() / 2) - adjustWidth, self.rect.height()), peChg) painter.setBrush(defBrush) except: log.logException( "Exception in OpenInterestChangeItem during paint")