Path: blob/master/src/utils/Utils.py
296 views
import math1import uuid2import time3import logging4import calendar5from datetime import datetime, timedelta67from config.Config import getHolidays8from models.Direction import Direction9from trademgmt.TradeState import TradeState1011class Utils:12dateFormat = "%Y-%m-%d"13timeFormat = "%H:%M:%S"14dateTimeFormat = "%Y-%m-%d %H:%M:%S"1516@staticmethod17def roundOff(price): # Round off to 2 decimal places18return round(price, 2)1920@staticmethod21def roundToNSEPrice(price):22x = round(price, 2) * 2023y = math.ceil(x)24return y / 202526@staticmethod27def isMarketOpen():28if Utils.isTodayHoliday():29return False30now = datetime.now()31marketStartTime = Utils.getMarketStartTime()32marketEndTime = Utils.getMarketEndTime()33return now >= marketStartTime and now <= marketEndTime3435@staticmethod36def isMarketClosedForTheDay():37# This method returns true if the current time is > marketEndTime38# Please note this will not return true if current time is < marketStartTime on a trading day39if Utils.isTodayHoliday():40return True41now = datetime.now()42marketEndTime = Utils.getMarketEndTime()43return now > marketEndTime4445@staticmethod46def waitTillMarketOpens(context):47nowEpoch = Utils.getEpoch(datetime.now())48marketStartTimeEpoch = Utils.getEpoch(Utils.getMarketStartTime())49waitSeconds = marketStartTimeEpoch - nowEpoch50if waitSeconds > 0:51logging.info("%s: Waiting for %d seconds till market opens...", context, waitSeconds)52time.sleep(waitSeconds)5354@staticmethod55def getEpoch(datetimeObj = None):56# This method converts given datetimeObj to epoch seconds57if datetimeObj == None:58datetimeObj = datetime.now()59epochSeconds = datetime.timestamp(datetimeObj)60return int(epochSeconds) # converting double to long6162@staticmethod63def getMarketStartTime(dateTimeObj = None):64return Utils.getTimeOfDay(9, 15, 0, dateTimeObj)6566@staticmethod67def getMarketEndTime(dateTimeObj = None):68return Utils.getTimeOfDay(15, 30, 0, dateTimeObj)6970@staticmethod71def getTimeOfDay(hours, minutes, seconds, dateTimeObj = None):72if dateTimeObj == None:73dateTimeObj = datetime.now()74dateTimeObj = dateTimeObj.replace(hour=hours, minute=minutes, second=seconds, microsecond=0)75return dateTimeObj7677@staticmethod78def getTimeOfToDay(hours, minutes, seconds):79return Utils.getTimeOfDay(hours, minutes, seconds, datetime.now())8081@staticmethod82def getTodayDateStr():83return Utils.convertToDateStr(datetime.now())8485@staticmethod86def convertToDateStr(datetimeObj):87return datetimeObj.strftime(Utils.dateFormat)8889@staticmethod90def isHoliday(datetimeObj):91dayOfWeek = calendar.day_name[datetimeObj.weekday()]92if dayOfWeek == 'Saturday' or dayOfWeek == 'Sunday':93return True9495dateStr = Utils.convertToDateStr(datetimeObj)96holidays = getHolidays()97if (dateStr in holidays):98return True99else:100return False101102@staticmethod103def isTodayHoliday():104return Utils.isHoliday(datetime.now())105106@staticmethod107def generateTradeID():108return str(uuid.uuid4())109110@staticmethod111def calculateTradePnl(trade):112if trade.tradeState == TradeState.ACTIVE:113if trade.cmp > 0:114if trade.direction == Direction.LONG:115trade.pnl = Utils.roundOff(trade.filledQty * (trade.cmp - trade.entry))116else:117trade.pnl = Utils.roundOff(trade.filledQty * (trade.entry - trade.cmp))118else:119if trade.exit > 0:120if trade.direction == Direction.LONG:121trade.pnl = Utils.roundOff(trade.filledQty * (trade.exit - trade.entry))122else:123trade.pnl = Utils.roundOff(trade.filledQty * (trade.entry - trade.exit))124tradeValue = trade.entry * trade.filledQty125if tradeValue > 0:126trade.pnlPercentage = Utils.roundOff(trade.pnl * 100 / tradeValue)127return trade128129@staticmethod130def prepareMonthlyExpiryFuturesSymbol(inputSymbol):131expiryDateTime = Utils.getMonthlyExpiryDayDate()132expiryDateMarketEndTime = Utils.getMarketEndTime(expiryDateTime)133now = datetime.now()134if now > expiryDateMarketEndTime:135# increasing today date by 20 days to get some day in next month passing to getMonthlyExpiryDayDate()136expiryDateTime = Utils.getMonthlyExpiryDayDate(now + timedelta(days=20))137year2Digits = str(expiryDateTime.year)[2:]138monthShort = calendar.month_name[expiryDateTime.month].upper()[0:3]139futureSymbol = inputSymbol + year2Digits + monthShort + 'FUT'140logging.info('prepareMonthlyExpiryFuturesSymbol[%s] = %s', inputSymbol, futureSymbol)141return futureSymbol142143@staticmethod144def prepareWeeklyOptionsSymbol(inputSymbol, strike, optionType, numWeeksPlus = 0):145expiryDateTime = Utils.getWeeklyExpiryDayDate()146todayMarketStartTime = Utils.getMarketStartTime()147expiryDayMarketEndTime = Utils.getMarketEndTime(expiryDateTime)148if numWeeksPlus > 0:149expiryDateTime = expiryDateTime + timedelta(days=numWeeksPlus * 7)150expiryDateTime = Utils.getWeeklyExpiryDayDate(expiryDateTime)151if todayMarketStartTime > expiryDayMarketEndTime:152expiryDateTime = expiryDateTime + timedelta(days=6)153expiryDateTime = Utils.getWeeklyExpiryDayDate(expiryDateTime)154# Check if monthly and weekly expiry same155expiryDateTimeMonthly = Utils.getMonthlyExpiryDayDate()156weekAndMonthExpriySame = False157if expiryDateTime == expiryDateTimeMonthly:158weekAndMonthExpriySame = True159logging.info('Weekly and Monthly expiry is same for %s', expiryDateTime)160year2Digits = str(expiryDateTime.year)[2:]161optionSymbol = None162if weekAndMonthExpriySame == True:163monthShort = calendar.month_name[expiryDateTime.month].upper()[0:3]164optionSymbol = inputSymbol + str(year2Digits) + monthShort + str(strike) + optionType.upper()165else:166m = expiryDateTime.month167d = expiryDateTime.day168mStr = str(m)169if m == 10:170mStr = "O"171elif m == 11:172mStr = "N"173elif m == 12:174mStr = "D"175dStr = ("0" + str(d)) if d < 10 else str(d)176optionSymbol = inputSymbol + str(year2Digits) + mStr + dStr + str(strike) + optionType.upper()177logging.info('prepareWeeklyOptionsSymbol[%s, %d, %s, %d] = %s', inputSymbol, strike, optionType, numWeeksPlus, optionSymbol)178return optionSymbol179180@staticmethod181def getMonthlyExpiryDayDate(datetimeObj = None):182if datetimeObj == None:183datetimeObj = datetime.now()184year = datetimeObj.year185month = datetimeObj.month186lastDay = calendar.monthrange(year, month)[1] # 2nd entry is the last day of the month187datetimeExpiryDay = datetime(year, month, lastDay)188while calendar.day_name[datetimeExpiryDay.weekday()] != 'Thursday':189datetimeExpiryDay = datetimeExpiryDay - timedelta(days=1)190while Utils.isHoliday(datetimeExpiryDay) == True:191datetimeExpiryDay = datetimeExpiryDay - timedelta(days=1)192193datetimeExpiryDay = Utils.getTimeOfDay(0, 0, 0, datetimeExpiryDay)194return datetimeExpiryDay195196@staticmethod197def getWeeklyExpiryDayDate(dateTimeObj = None):198if dateTimeObj == None:199dateTimeObj = datetime.now()200daysToAdd = 0201if dateTimeObj.weekday() >= 3:202daysToAdd = -1 * (dateTimeObj.weekday() - 3)203else:204daysToAdd = 3 - dateTimeObj.weekday()205datetimeExpiryDay = dateTimeObj + timedelta(days=daysToAdd)206while Utils.isHoliday(datetimeExpiryDay) == True:207datetimeExpiryDay = datetimeExpiryDay - timedelta(days=1)208209datetimeExpiryDay = Utils.getTimeOfDay(0, 0, 0, datetimeExpiryDay)210return datetimeExpiryDay211212@staticmethod213def isTodayWeeklyExpiryDay():214expiryDate = Utils.getWeeklyExpiryDayDate()215todayDate = Utils.getTimeOfToDay(0, 0, 0)216if expiryDate == todayDate:217return True218return False219220@staticmethod221def isTodayOneDayBeforeWeeklyExpiryDay():222expiryDate = Utils.getWeeklyExpiryDayDate()223todayDate = Utils.getTimeOfToDay(0, 0, 0)224if expiryDate - timedelta(days=1) == todayDate:225return True226return False227228@staticmethod229def getNearestStrikePrice(price, nearestMultiple = 50):230inputPrice = int(price)231remainder = int(inputPrice % nearestMultiple)232if remainder < int(nearestMultiple / 2):233return inputPrice - remainder234else:235return inputPrice + (nearestMultiple - remainder)236237238