0% found this document useful (0 votes)
20 views

ST Amazing Script

Uploaded by

leninkumar2020
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
20 views

ST Amazing Script

Uploaded by

leninkumar2020
Copyright
© © All Rights Reserved
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