ST Amazing Script
ST Amazing Script
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
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']
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")
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"])
currentMonthlyOPtionsData =
stockOptionsTokenData.loc[currentMonthlyOPtions]
currentMonthlyOPtionsData =
currentMonthlyOPtionsData.reset_index(drop = True)
currentMonthlyOPtionsData =
currentMonthlyOPtionsData.reset_index(drop = True)
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")
# ─────────────
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')
delta = data[column].diff(1)
up = delta.where(delta > 0, 0)
down = -delta.where(delta < 0, 0)
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)
# ───
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")
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')
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"
# 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]
# 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)