Skip to content

Commit 8610d57

Browse files
authored
Update NSE_Option_Chain_Analyzer.py
1 parent 3fd9b87 commit 8610d57

File tree

1 file changed

+42
-12
lines changed

1 file changed

+42
-12
lines changed

NSE_Option_Chain_Analyzer.py

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,28 @@
77
import webbrowser
88
import csv
99
import requests
10+
import sys
11+
import streamtologger
1012

1113

1214
# noinspection PyAttributeOutsideInit
1315
class Nse:
14-
def __init__(self, window):
16+
def __init__(self, window: Tk):
1517
self.seconds = 60
18+
self.stdout = sys.stdout
19+
self.stderr = sys.stderr
1620
self.previous_date = None
1721
self.previous_time = None
1822
self.first_run = True
1923
self.stop = False
24+
self.logging = False
2025
self.dates = [""]
2126
self.indices = ["NIFTY", "BANKNIFTY", "NIFTYIT"]
2227
self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, '
2328
'like Gecko) '
2429
'Chrome/80.0.3987.149 Safari/537.36',
2530
'accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'}
31+
self.url_oc = "https://www.nseindia.com/option-chain"
2632
self.session = requests.Session()
2733
self.cookies = {}
2834
self.login_win(window)
@@ -33,14 +39,13 @@ def get_data(self, event=None):
3339
if self.first_run:
3440
self.index = self.index_var.get()
3541
try:
36-
url_oc = "https://www.nseindia.com/option-chain"
3742
url = f"https://www.nseindia.com/api/option-chain-indices?symbol={self.index}"
38-
request = self.session.get(url_oc, headers=self.headers, timeout=5)
43+
request = self.session.get(self.url_oc, headers=self.headers, timeout=5)
3944
self.cookies = dict(request.cookies)
4045
response = self.session.get(url, headers=self.headers, timeout=5, cookies=self.cookies)
4146
except Exception as err:
42-
print(request.status_code)
43-
print(response.status_code)
47+
print(request)
48+
print(response)
4449
print(err, "1")
4550
messagebox.showerror(title="Error", message="Error in fetching dates.\nPlease retry.")
4651
self.dates.clear()
@@ -52,7 +57,16 @@ def get_data(self, event=None):
5257
try:
5358
url = f"https://www.nseindia.com/api/option-chain-indices?symbol={self.index}"
5459
response = self.session.get(url, headers=self.headers, timeout=5, cookies=self.cookies)
60+
if response.status_code == 401:
61+
self.session.close()
62+
self.session = requests.Session()
63+
url = f"https://www.nseindia.com/api/option-chain-indices?symbol={self.index}"
64+
request = self.session.get(self.url_oc, headers=self.headers, timeout=5)
65+
self.cookies = dict(request.cookies)
66+
response = self.session.get(url, headers=self.headers, timeout=5, cookies=self.cookies)
67+
print("reset cookies")
5568
except Exception as err:
69+
print(request)
5670
print(response)
5771
print(err, "2")
5872
return
@@ -92,7 +106,7 @@ def get_data(self, event=None):
92106

93107
return response, json_data
94108

95-
def login_win(self, window):
109+
def login_win(self, window: Tk):
96110
self.login = window
97111
self.login.title("NSE")
98112
window_width = self.login.winfo_reqwidth()
@@ -127,7 +141,7 @@ def login_win(self, window):
127141
self.sp_entry.focus_set()
128142
self.get_data()
129143

130-
def focus_widget(event, mode):
144+
def focus_widget(event, mode: int):
131145
if mode == 1:
132146
self.get_data()
133147
self.date_menu.focus_set()
@@ -182,7 +196,21 @@ def export(self, event=None):
182196
messagebox.showerror(title="Export Failed",
183197
message="An error occurred while exporting the data.")
184198

185-
def links(self, link, event=None):
199+
def log(self, event=None):
200+
if not self.logging:
201+
streamtologger.redirect(target="nse.log", header_format="[{timestamp:%Y-%m-%d %H:%M:%S} - {level:5}] ")
202+
self.logging = True
203+
self.options.entryconfig(self.options.index(2), label="Logging: On (Ctrl+L)")
204+
messagebox.showinfo(title="Started", message="Debug Logging has been enabled.")
205+
elif self.logging:
206+
sys.stdout = self.stdout
207+
sys.stderr = self.stderr
208+
streamtologger._is_redirected = False
209+
self.logging = False
210+
self.options.entryconfig(self.options.index(2), label="Logging: Off (Ctrl+L)")
211+
messagebox.showinfo(title="Stopped", message="Debug Logging has been disabled.")
212+
213+
def links(self, link: str, event=None):
186214

187215
if link == "developer":
188216
webbrowser.open_new("https://github.com/VarunS2002/")
@@ -197,7 +225,7 @@ def links(self, link, event=None):
197225

198226
self.info.attributes('-topmost', False)
199227

200-
def about_window(self):
228+
def about_window(self) -> Toplevel:
201229
self.info = Toplevel()
202230
self.info.title("About")
203231
window_width = self.info.winfo_reqwidth()
@@ -225,7 +253,7 @@ def about(self, event=None):
225253
heading.grid(row=0, column=0, columnspan=2, sticky=N + S + W + E)
226254
version_label = Label(self.info, text="Version:", relief=RIDGE)
227255
version_label.grid(row=1, column=0, sticky=N + S + W + E)
228-
version_val = Label(self.info, text="3.3", relief=RIDGE)
256+
version_val = Label(self.info, text="3.4", relief=RIDGE)
229257
version_val.grid(row=1, column=1, sticky=N + S + W + E)
230258
dev_label = Label(self.info, text="Developer:", relief=RIDGE)
231259
dev_label.grid(row=2, column=0, sticky=N + S + W + E)
@@ -253,7 +281,7 @@ def close(self, event=None):
253281
if ask_quit:
254282
self.session.close()
255283
self.root.destroy()
256-
quit()
284+
sys.exit()
257285
elif not ask_quit:
258286
pass
259287

@@ -274,13 +302,15 @@ def main_win(self):
274302
self.options = Menu(menubar, tearoff=0)
275303
self.options.add_command(label="Stop (Ctrl+X)", command=self.change_state)
276304
self.options.add_command(label="Export to CSV (Ctrl+S)", command=self.export)
305+
self.options.add_command(label="Logging: Off (Ctrl+L)", command=self.log)
277306
self.options.add_separator()
278307
self.options.add_command(label="About (Ctrl+M)", command=self.about)
279308
self.options.add_command(label="Quit (Ctrl+Q)", command=self.close)
280309
menubar.add_cascade(label="Menu", menu=self.options)
281310
self.root.config(menu=menubar)
282311

283312
self.root.bind('<Control-s>', self.export)
313+
self.root.bind('<Control-l>', self.log)
284314
self.root.bind('<Control-x>', self.change_state)
285315
self.root.bind('<Control-m>', self.about)
286316
self.root.bind('<Control-q>', self.close)
@@ -435,7 +465,7 @@ def set_values(self):
435465
else:
436466
self.pcr_val.config(text=self.put_call_ratio, bg=red)
437467

438-
def set_itm_labels(call_change, put_change):
468+
def set_itm_labels(call_change: float, put_change: float) -> str:
439469
label = "No"
440470
if put_change > call_change:
441471
if put_change >= 0:

0 commit comments

Comments
 (0)