create an alerts.txt file with following:
25000, above
24900, below
Then create a python script nifty_tray.py :
————————————————————
import time
import threading
import requests
"""from win10toast import ToastNotifier"""
import pystray
from PIL import Image, ImageDraw
import os
import queue
from winotify import Notification, audio
CHECK_INTERVAL = 30
ALERTS_FILE = os.path.join(os.path.dirname(__file__), "alerts.txt")
current_ltp = 0
icon = None
alerts = []
"""toaster = ToastNotifier()"""
alert_state = {}
notif_queue = queue.Queue()
def load_alerts():
"""Load alerts from alerts.txt"""
global alerts, alert_state
alerts = []
if not os.path.exists(ALERTS_FILE):
return
with open(ALERTS_FILE, "r") as f:
for line in f:
line = line.strip()
if not line or line.startswith("#"):
continue
try:
level_str, direction = line.split(",")
level = float(level_str.strip())
direction = direction.strip().lower()
alerts.append((level, direction))
if (level, direction) not in alert_state:
alert_state[(level, direction)] = False
except Exception:
continue
def fetch_nifty():
"""Fetch latest Nifty value"""
url = "https://www.nseindia.com/api/marketStatus"
headers = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/json",
"Referer": "https://www.nseindia.com/"
}
try:
resp = requests.get(url, headers=headers, timeout=10)
data = resp.json()
return float(data["marketState"][0]["last"])
except Exception:
return 0
def queue_notification(title, message):
notif_queue.put((title, message))
def process_notifications():
while not notif_queue.empty():
title, message = notif_queue.get_nowait()
toast = Notification(app_id="Nifty Tray",
title=title,
msg=message,
duration="short")
toast.set_audio(audio.Default, loop=False)
toast.show()
def monitor_price():
"""Monitor Nifty price and trigger alerts"""
global current_ltp, icon
while True:
load_alerts()
ltp = fetch_nifty()
if ltp > 0:
current_ltp = ltp
if icon:
icon.title = f"Nifty: {ltp}"
for level, direction in alerts:
key = (level, direction)
if direction == "above":
if ltp > level and not alert_state[key]:
queue_notification("Nifty Alert", f"Nifty crossed above {level} (Now {ltp})")
alert_state[key] = True
elif ltp <= level:
alert_state[key] = False
elif direction == "below":
if ltp < level and not alert_state[key]:
queue_notification("Nifty Alert", f"Nifty crossed below {level} (Now {ltp})")
alert_state[key] = True
elif ltp >= level:
alert_state[key] = False
time.sleep(CHECK_INTERVAL)
def notification_loop():
"""Background loop to process notifications"""
while True:
process_notifications()
time.sleep(1)
def create_image():
"""Tray icon image"""
img = Image.new("RGB", (64, 64), "green")
d = ImageDraw.Draw(img)
d.rectangle([16, 16, 48, 48], fill="white")
return img
def quit_app(icon_obj, item):
icon_obj.stop()
def run_tray():
global icon
load_alerts()
icon = pystray.Icon(
"nifty",
create_image(),
"Nifty: Loading...",
menu=pystray.Menu(pystray.MenuItem("Quit", quit_app))
)
# background threads
threading.Thread(target=monitor_price, daemon=True).start()
threading.Thread(target=notification_loop, daemon=True).start()
# run tray icon loop
icon.run()
if __name__ == "__main__":
run_tray()
————————————–
install following python modules
pip install requests plyer pystray pillow
pip install pyinstaller
pip install win10toast
pip install winotify
pip install –upgrade packaging
Now Compile the above script to generate an exe file:
C:\Users\admin\AppData\Roaming\Python\Python312\Scripts\pyinstaller.exe --noconsole --onefile nifty_tray.py