0% found this document useful (0 votes)
24 views9 pages

ST Amazing Script

Uploaded by

leninkumar2020
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
24 views9 pages

ST Amazing Script

Uploaded by

leninkumar2020
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 9

# import yfinance as yf

import pandas as pd
# import finplot as fplt
import numpy as np
import time
import sys
import talib as ta
import datetime
import pandas_ta as pandasTa
import math
import pyotp
from SmartAPI import SmartConnect

import sys
import os
sys.path.append(os.getcwd())
# from Strategy.RUDY.equityList import SdTicker, stockList
from Strategy.HFT.AngelOneDataDownloadUDF import getIntradayData

# ──────────────────────────────────────────────────────────────────────────────
api_key = 'nRijEqvd'
username = 'A529721'
pwd = 'Ridak@0786'
pin = '4321'
token = "EBVXXHCJUHDS5IFVPG6KJADOKY"

totp = pyotp.TOTP(token).now()

smartApi = SmartConnect(api_key)
smartApi.generateSession(username, pin, totp)

# ─── 𝗦𝗘𝗡𝗗


⁡ 𝗠𝗦𝗚 𝗧𝗢 𝗔 𝗦𝗣𝗘𝗖𝗜𝗙𝗜𝗖 𝗚𝗥𝗢𝗨𝗣⁡
───────────────────────────────────────────────────────────────────────
import asyncio
from telegram import Bot

async def send_message(msg):


bot_token = "7277333734:AAHrJf-z3xTAag9hToabPgxmNQJKh3uIs50"
# chat_id = "999149701" # this is my bot ID
chat_id = "-4538072667" # Replace with the actual group chat ID

bot = Bot(token=bot_token)
await bot.send_message(chat_id=chat_id, text=msg)

def angelOneBot(msg):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(send_message(msg))
loop.close()

SdTicker =['POLYCAB']
# Trades_Data =
pd.read_excel("/Users/nijanjyakhwo/Splash_Trade_Automation/Strategy_Excel/
StandardDeviationSpring.xlsx")
def print_red(text):
print('\033[91m' + text + '\033[0m')

# SdTicker = ["RELIANCE.NS"]

tradeData = pd.DataFrame()
# SdTicker = ['AARTIIND']

# ─── DOWNLOADING DATA FROM YFINANCE ───────────────────────────────────────────


for a in range(1000) :
try :
stockList = []
startTime = time.time()
failedTickers =[]
for i,StockName in enumerate(SdTicker):
try :
print(i)

print(StockName)
stockName = StockName

def func_stockFuturesAndATMstrike(stockName):
# ───────────── HISTORICAL DATA RANGE FOR STOCK DOWNLOAD
─────────────────────────────────────────────────────────────────
# token = 99926037
import datetime
currentTime = datetime.datetime.now()
threeDayBackDate = currentTime - datetime.timedelta(days = 50)
threeDayBackDate = threeDayBackDate.strftime("%Y-%m-%d") + "
09:15"
currentTime = currentTime.strftime("%Y-%m-%d %H:%M")

# ───────────── STOCK FUTURES NAME AND ITS TOKEN


─────────────────────────────────────────────────────────────────

stockTokenData = pd.read_excel("/Users/nijanjyakhwo/Splash-
Trade-Automation/Strategy/Broker/AngelOne/StockAndOptionsTokenExcelFile/
stockFuturesToken.xlsx")
stockNameIdx = np.where((stockTokenData["name"] == stockName)
& (stockTokenData['symbol'].str.contains('OCT', case=True, na=False)))[0][0]
stockToken = int(stockTokenData.at[stockNameIdx, "token"])

# ─────────────── DOWNLOAD STOCK DATA


───────────────────────────────────────────────────────────────
data = getIntradayData(smartApi, "NFO", stockToken,
"FIVE_MINUTE", historicalDays=7)
print(stockToken)
lastIdx = data.index[-1]
ltp = data.at[lastIdx, "Close"]

# ─────────────── FINDING ATM STRIKE PRICE


───────────────────────────────────────────────────────────────
# ─────────────── 1. Current Month Options Data
───────────────────────────────────────────────────────────────
currentMonthShortForm =
datetime.datetime.now().strftime("%b").upper()
stockOptionsTokenData =
pd.read_excel("/Users/nijanjyakhwo/Splash-Trade-Automation/Strategy/Broker/
AngelOne/StockAndOptionsTokenExcelFile/stockOptionsToken.xlsx")
currentMonthlyOPtions =
np.where((stockOptionsTokenData["name"] == stockName) &
(stockOptionsTokenData['symbol'].str.contains('OCT', case=True, na=False)))

currentMonthlyOPtionsData =
stockOptionsTokenData.loc[currentMonthlyOPtions]
currentMonthlyOPtionsData =
currentMonthlyOPtionsData.reset_index(drop = True)
currentMonthlyOPtionsData =
currentMonthlyOPtionsData.reset_index(drop = True)

# ─────────────── 2. Current Month ATM STRIKE PRICE


───────────────────────────────────────────────────────────────
currentMonthlyOPtionsData["diffBtwnStrikeAndLTP"] =
abs(currentMonthlyOPtionsData["strike"] - ltp)
minDiffBetwnStrikeAndLTP =
currentMonthlyOPtionsData["diffBtwnStrikeAndLTP"].min()
stockATMstrikeIdx =
np.where(currentMonthlyOPtionsData["diffBtwnStrikeAndLTP"] ==
minDiffBetwnStrikeAndLTP)[0][0]
stockATMstrike =
currentMonthlyOPtionsData.at[stockATMstrikeIdx, "strike"]
# currentMonthlyOPtionsStrike =
currentMonthlyOPtionsData["strike"].values

# ─────────────── 3. STOCK OPTIONS ATM SYMBOL AND TOKEN


───────────────────────────────────────────────────────────────
stockATMsymbol =
currentMonthlyOPtionsData.at[stockATMstrikeIdx, "symbol"]
stockATMcallSymbol = stockATMsymbol[:-2] + "CE"
stockATMputSymbol = stockATMsymbol[:-2] + "PE"

stockATMcallIdx = np.where(currentMonthlyOPtionsData["symbol"]
== stockATMcallSymbol)[0][0]
stockATMputIdx = np.where(currentMonthlyOPtionsData["symbol"]
== stockATMputSymbol)[0][0]

stockATMcallToken =
int(currentMonthlyOPtionsData.at[stockATMcallIdx, "token"])
stockATMputToken =
int(currentMonthlyOPtionsData.at[stockATMputIdx, "token"])

print(f"stockATMcallSymbol = {stockATMcallSymbol}")
print(f"stockATMcallIdx = {stockATMcallIdx}")
print(f"stockATMcallToken = {stockATMcallToken}")

print(f"stockATMputSymbol = {stockATMputSymbol}")
print(f"stockATMputIdx = {stockATMputIdx}")
print(f"stockATMputToken = {stockATMputToken}")

# ────────────── ATMstrikeData
────────────────────────────────────────────────────────────────
# ───────────── HISTORICAL DATA RANGE FOR OPTIONS DATA DOWNLOAD
─────────────────────────────────────────────────────────────────
token = 99926037
import datetime
currentTime = datetime.datetime.now()
threeDayBackDate = currentTime - datetime.timedelta(days = 20)
threeDayBackDate = threeDayBackDate.strftime("%Y-%m-%d") + "
09:15"
currentTime = currentTime.strftime("%Y-%m-%d %H:%M")

callATMData = getIntradayData(smartApi, "NFO",


stockATMcallToken, "FIVE_MINUTE", historicalDays=7)
# time.sleep(1)
putATMData = getIntradayData(smartApi, "NFO", stockATMputToken,
"FIVE_MINUTE", historicalDays=7)
# print(callATMData)

return callATMData, putATMData, stockATMcallSymbol,


stockATMputSymbol

# ───────────── ⁡
CALL AND PUT DATA⁡


─────────────────────────────────────────────────────────────────
# stockName = "CIPLA"
callAndPutData = func_stockFuturesAndATMstrike(stockName)
callATMData = callAndPutData[0]
putATMData = callAndPutData[1]
stockATMcallSymbol = callAndPutData[2]
stockATMputSymbol = callAndPutData[3]

# ────────────────── ⁡
STRATEGY CONDITION⁡


────────────────────────────────────────────────────────────
def func_StrategyCondition(data):
# ──────────── 1. Volume Condition
──────────────────────────────────────────────────────────
# fplt.volume_ocv(data[['Datetime','Open','Close','Volume']],
ax=axo)

data['EMA20vol'] = data["Volume"].ewm(span=20,
adjust=False).mean()
data["volCondition"] = data["Volume"] >= data['EMA20vol'] * 1.5
# fplt.plot(data['Datetime'], data["EMA20vol"], color = "black
", width=2, ax=axo, legend='volume ma')

# ──────────── 2. RSI Condition


──────────────────────────────────────────────────────────
# ─────────── ⁡
RSI14⁡


───────────────────────────────────────────────────────────────────
def func_RMA(series, period):
return series.ewm(alpha=1/period, adjust=False).mean()

def func_RSI(data, column, period):

delta = data[column].diff(1)

up = delta.where(delta > 0, 0)
down = -delta.where(delta < 0, 0)

avg_gain = func_RMA(up, period)


avg_loss = func_RMA(down, period)

rs = avg_gain / avg_loss
rsi = np.where(avg_loss == 0, 100, np.where(avg_gain == 0,
0, 100 - (100 / (1 + rs))))

data[f'RSI{14}'] = rsi
data[f'prevRSI{14}'] = data[f'RSI{14}'].shift(1)
return data
func_RSI(data, column='Close', period=14)
data["40"] = 40
data["60"] = 60
# fplt.plot(data['Datetime'], data['RSI14'], color = "black ",
width=2, legend='RSI14', ax = ax1)
# # fplt.plot(data['Datetime'], data["40"], color = "black ",
width=2, legend='RSI14', ax = ax1)
# fplt.plot(data['Datetime'], data["60"], color = "black ",
width=2, legend='RSI14', ax = ax1)

data["RSIcondition"] = data["RSI14"] >= 60

# ──────────── 3. VWAP Condition


──────────────────────────────────────────────────────────
# VWAP = Cumulative Typical Price x Volume/Cumulative Volume
# Where Typical Price = High price + Low price + Closing
Price/3

# ────── 1. Computation of Average OF H,L,C,V


────────────────────────────────────────────────────────────────────────
data["cumulativeTypicalPriceMultiplyByVolume"] =
round(((data["High"] + data["Low"] + data["Close"]) / 3) * data["Volume"], 2)
# print(data["cumulativeTypicalPriceMultiplyByVolume"])

# ─── ⁡
COMPUTATION OF PIVOT POINT⁡

────────────────────────────────────────
data["year"] = data["Datetime"].dt.year
data["month"] = data["Datetime"].dt.month
data["day"] = data["Datetime"].dt.day
data["hour"] = data["Datetime"].dt.hour
data["minute"] = data["Datetime"].dt.minute

# ────────────── ⁡
SESSION SEPARATION⁡


────────────────────────────────────────────────────────────────
data["newDay"] = None
# oneHourCondition =((data["hour"] == 9) & (data["minute"] ==
15)) | ((data["hour"] == 10) & (data["minute"] == 15)) | ((data["hour"] == 11) &
(data["minute"] == 15)) | ((data["hour"] == 12) & (data["minute"] == 15)) |
((data["hour"] == 13) & (data["minute"] == 15)) | ((data["hour"] == 14) &
(data["minute"] == 15))
# twoHourCondition =((data["hour"] == 9) & (data["minute"] ==
15)) | ((data["hour"] == 11) & (data["minute"] == 15)) | ((data["hour"] == 13) &
(data["minute"] == 15))
# threeHourCondition =((data["hour"] == 9) & (data["minute"] ==
15)) | ((data["hour"] == 12) & (data["minute"] == 15)) | ((data["hour"] == 15) &
(data["minute"] == 15))
wholeDayCondition =((data["hour"] == 9) & (data["minute"] ==
15))

daySeparateIdxArray = np.where(wholeDayCondition)[0]
data.loc[daySeparateIdxArray, "newDay"] = "newDay"
# Text_List_Fplt(Dataframe = data, Index =
daySeparateIdxArray , Column1 = "Datetime", Column2 = "Low", Text = "15" ,
font_family= "Roboto", font_size =9, font_style = "Bold", font_color = "brown")

# ───── 2. VWAP Computation


─────────────────────────────────────────────────────────────────────────
data["VWAP"] = None
data["vwapCondition"] = False
marketOpenTimeIdxArray = daySeparateIdxArray
for idx in marketOpenTimeIdxArray:
# ────── 2(A). Market Opening Index and Its Day
────────────────────────────────────────────────────────────────
currentMarketOpenTimeIdx = idx
marketOpeningBarDay = data.at[currentMarketOpenTimeIdx,
"day"]

# ────── 2(B). Applying VWAP Formula


────────────────────────────────────────────────────────────────
for i in range(currentMarketOpenTimeIdx,
currentMarketOpenTimeIdx+ 75) :
if i in data.index :
currentBarIdx = i
currentBarDay = data.at[currentBarIdx, "day"]

if marketOpeningBarDay == currentBarDay :
cumulativeVolTillCurrentBarOfDay =
data.loc[currentMarketOpenTimeIdx : currentBarIdx, "Volume"].sum()
if cumulativeVolTillCurrentBarOfDay >= 1:
cumulativePriceMultiplyVOl =
data.loc[currentMarketOpenTimeIdx : currentBarIdx,
"cumulativeTypicalPriceMultiplyByVolume"].sum()
VWAP = round(cumulativePriceMultiplyVOl/
cumulativeVolTillCurrentBarOfDay, 2)
data.at[currentBarIdx, "VWAP"] = VWAP
# print(i)
data['VWAP'] = pd.to_numeric(data['VWAP'], errors='coerce')
valid_data = data["Close"].notna() & data["VWAP"].notna()
data.loc[valid_data, "vwapCondition"] = data.loc[valid_data,
"Close"] > data.loc[valid_data, "VWAP"]
# ────── 3. Plotting VWAP
────────────────────────────────────────────────────────────────────────
# fplt.plot(data['Datetime'][:], data['VWAP'][10:], color =
"blue", width=2, legend='VWAP' )

conditionFulfilledIdxArray = np.where((data["vwapCondition"] ==
True) & (data["RSIcondition"] == True) & (data["volCondition"] == True))[0]
# Text_List_Fplt(Dataframe = data, Index =
conditionFulfilledIdxArray , Column1 = "Datetime", Column2 = "Low", Text = "R" ,
font_family= "Roboto", font_size =9, font_style = "Bold", font_color = "brown")

conditionFulfilled = False
conditionFulfilledTime = False
# data['timestamp_utc'] =
data['Datetime'].dt.tz_localize('UTC')

# # Convert to desired timezone (UTC+5:30 or 'Asia/Kolkata')


# data['Datetime'] =
data['timestamp_utc'].dt.tz_convert('Asia/Kolkata')

if (len(data) >= 1) and (np.size(conditionFulfilledIdxArray) >=


1):
lastIdx = data.index[-1]
# print("A")
print(conditionFulfilledIdxArray[-1])
# print(lastIdx)
if conditionFulfilledIdxArray[-1] == lastIdx:
conditionFulfilled = True
conditionFulfilledTime = data.at[lastIdx, "Datetime"]

return conditionFulfilled,conditionFulfilledTime

# data = callATMData
# ─── ⁢
⁡LOTTING CANDLESTICK CHART AND CREATING REQUIRED NUMBER OF
P

ROWS⁡────────────────────────────────────────────────────────────────
# ─── ⁡
BACKGROUND COLOR AND CREATION OF ROW⁡

────────────────────────────────────────────────────────────────────────
# ax,ax1, ax2 = fplt.create_plot('Price & RSI', rows=3)
# w = fplt.foreground = '#eef'
# fplt.cross_hair_color = "#000"

# b = fplt.background = fplt.odd_plot_background = '#e9edf7'

# p = fplt.candlestick_ochl(callATMData[["Datetime", "Open",
"Close", "High", "Low"]])
# p.colors.update(dict(bull_body='white', bull_shadow='#787b86',
bull_frame='#787b86',
# bear_body='#787b86', bear_shadow='#787b86',
bear_frame='#787b86'))

# axo = ax.overlay()

callATMcondition = func_StrategyCondition(callATMData)
callATMconditionFulfilled = callATMcondition[0]
callATMconditionFulfilledTime = callATMcondition[1]

putATMcondition = func_StrategyCondition(putATMData[:-6])
putATMconditionFulfilled = putATMcondition[0]
putATMconditionFulfilledTime = putATMcondition[1]

print_red("THIS IS THE DATA")


print(putATMconditionFulfilledTime)

# optionsList = []
if callATMconditionFulfilled == True:
ab = [stockATMcallSymbol, callATMconditionFulfilledTime]
# optionsList.append(stockATMcallSymbol)
stockList.append(ab)
print_red("YESssssssssssss")

if putATMconditionFulfilled == True:

# optionsList.append(stockATMputSymbol)#
Text_List_Fplt(Dataframe = data, Index = currentDayConditionIdxArray , Column1 =
"Datetime", Column2 = "Low", Text = "C" , font_family= "Roboto", font_size =9,
font_style = "Bold", font_color = "green")
ab = [stockATMputSymbol, putATMconditionFulfilledTime]
stockList.append(stockATMputSymbol)
print_red("YESssssssssssss")

time.sleep(2)

# list.append(True)

now = arrow.utcnow()
current_time = now.to('local').format('HH:mm:ss')
####print(current_time)
#
except Exception as e:
failedTickers.append(stockName) # Append the ticker to the

if len(stockList) >= 1:
angelOneBot(f"""ANGEL ONE OPTIONSLIST,\n TIMEFRAME = 5 Minutes \n
Options List = {stockList}""")
print(stockList)

time.sleep(300)

except Exception as e:
print("ERROR")
print(e)

end_time = time.time()
elapsed_time = end_time - startTime
print("Elapsed time: {:.2f} seconds".format(elapsed_time))
import arrow
now = arrow.utcnow()
current_time = now.to('local').format('HH:mm:ss')
print(current_time)

You might also like