I am trying to write a script which downloads the close price of a stock using zerodha kiteconnect and computes MACD and then gives a signal whether to buy or sell a stock. I am trying to run this script every minute. Please find the code below:
def job():
# Import Libraries
from kiteconnect import KiteConnect
import os
import datetime as dt
import pandas as pd
import numpy as np
import matplotlib.pyplot as x
cwd = os.chdir("D:/Backup/Desktop/Zerodha")
#generate trading session
access_token = open("access_token.txt",'r').read()
key_secret = open("api_key.txt",'r').read().split()
kite = KiteConnect(api_key=key_secret[0])
kite.set_access_token(access_token)
data=kite.historical_data("408065", "2021-02-12", "2021-02-12", "5minute")
data= pd.DataFrame(data)
data=data.set_index('date')
data.head()
# Calculate the ema for Short Term. Periods=12
data['short_ema']=data.close.ewm(span=12,adjust=False).mean()
# Calculate the ema for Long Term Periods=26
data['long_ema']=data.close.ewm(span=26,adjust=False).mean()
# Calculate the MACD Line
data['MACD']= data['short_ema'] - data['long_ema']
#Calculate the Signal Line
data['Signal']=data['MACD'].ewm(span=9,adjust=False).mean()
MACD=data['MACD']
Signal=data['Signal']
print(MACD)
print(Signal)
data.head()
# Plot the Data
x.figure(figsize=(12.5,4.5))
x.plot(data.index, data.MACD, label='MACD Line',color='red')
x.plot(data.index, data.Signal, label='Signal Line',color='blue')
x.legend(loc='upper right')
x.show()
# Create Buy/Sell Signals
Signal=data['Signal']
def buy_sell(Signal):
Buy=[]
Sell=[]
flag = -1
for i in range (0,len(Signal)):
for i in range (0,len(Signal)):
if Signal['MACD'][i]>Signal['Signal'][i]:
Sell.append(np.nan)
if flag !=1:
Buy.append(Signal['close'][i])
flag=1
else:
Buy.append(np.nan)
elif Signal['MACD'][i]<Signal['Signal'][i]:
Buy.append(np.nan)
if flag !=0:
Sell.append(Signal['close'][i])
flag=0
else:
Sell.append(np.nan)
else:
Buy.append(np.nan)
Sell.append(np.nan)
return (Buy,Sell)
y=buy_sell(data)
data['Buy_Price']=y[0]
data['Sell_Price']=y[1]
data.head()
x.figure(figsize=(12,6))
x.scatter(data.index, data['Buy_Price'], color='green', label='Buy',marker='^', alpha=1)
x.scatter(data.index, data['Sell_Price'], color='red', label='Sell' ,marker='v', alpha=1)
x.plot(data['close'], label='Close Price',alpha=0.35)
x.title('Buy And Sell Signals')
x.xlabel('Date')
x.ylabel('Close Price In INR')
x.legend(loc='upper left')
x.show()
schedule.every(1).minute.do(job)
while(1):
schedule.run_pending()
time.sleep(1)
As shown below I am using schedule to schedule my scripts the issue being when I use the return statement the error is generated 'Buy is not defined'. The complete error output is as shown:
NameError Traceback (most recent call last)
<ipython-input-53-d154c91e8229> in <module>
102 schedule.every(1).minute.do(job)
103 while(1):
--> 104 schedule.run_pending()
105 time.sleep(1)
106
D:\Anaconda\envs\test\lib\site-packages\schedule\__init__.py in run_pending()
561 :data:`default scheduler instance <default_scheduler>`.
562 """
--> 563 default_scheduler.run_pending()
564
565
D:\Anaconda\envs\test\lib\site-packages\schedule\__init__.py in run_pending(self)
92 runnable_jobs = (job for job in self.jobs if job.should_run)
93 for job in sorted(runnable_jobs):
---> 94 self._run_job(job)
95
96 def run_all(self, delay_seconds=0):
D:\Anaconda\envs\test\lib\site-packages\schedule\__init__.py in _run_job(self, job)
145
146 def _run_job(self, job):
--> 147 ret = job.run()
148 if isinstance(ret, CancelJob) or ret is CancelJob:
149 self.cancel_job(job)
D:\Anaconda\envs\test\lib\site-packages\schedule\__init__.py in run(self)
464 """
465 logger.info('Running job %s', self)
--> 466 ret = self.job_func()
467 self.last_run = datetime.datetime.now()
468 self._schedule_next_run()
<ipython-input-45-53843c1fe105> in job()
81 Buy.append(np.nan)
82 Sell.append(np.nan)
---> 83 return (Buy,Sell)
84 y=buy_sell(data)
85 data['Buy_Price']=y[0]
NameError: name 'Buy' is not defined
As per the suggestion given I am able to solve the issue. The complete code is:
import schedule
import time
def job():
# Import Libraries
from kiteconnect import KiteConnect
import os
import datetime as dt
import pandas as pd
import numpy as np
import matplotlib.pyplot as x
cwd = os.chdir("D:/Backup/Desktop/Zerodha")
#generate trading session
access_token = open("access_token.txt",'r').read()
key_secret = open("api_key.txt",'r').read().split()
kite = KiteConnect(api_key=key_secret[0])
kite.set_access_token(access_token)
data=kite.historical_data("408065", "2021-02-15", "2021-02-15", "5minute")
data= pd.DataFrame(data)
data=data.set_index('date')
data.head()
data.to_csv('C:/Users/admin/Desktop/fiap.csv')
# Calculate the ema for Short Term. Periods=12
data['short_ema']=data.close.ewm(span=12,adjust=False).mean()
# Calculate the ema for Long Term Periods=26
data['long_ema']=data.close.ewm(span=26,adjust=False).mean()
# Calculate the MACD Line
data['MACD']= data['short_ema'] - data['long_ema']
#Calculate the Signal Line
data['Signal']=data['MACD'].ewm(span=9,adjust=False).mean()
MACD=data['MACD']
Signal=data['Signal']
print(MACD)
print(Signal)
data.head()
data.to_csv('C:/Users/Admin/Desktop/Untitled.csv')
x.figure(figsize=(12.5,4.5))
x.plot(data.index, data.MACD, label='MACD Line',color='red')
x.plot(data.index, data.Signal, label='Signal Line',color='blue')
x.legend(loc='upper right')
x.show()
Signal=data['Signal']
def buy_sell(Signal):
Buy=[]
Sell=[]
flag = -1
for i in range (0,len(Signal)):
if Signal['MACD'][i]>Signal['Signal'][i]:
Sell.append(np.nan)
if flag !=1:
Buy.append(Signal['close'][i])
flag=1
else:
Buy.append(np.nan)
elif Signal['MACD'][i]<Signal['Signal'][i]:
Buy.append(np.nan)
if flag !=0:
Sell.append(Signal['close'][i])
flag=0
else:
Sell.append(np.nan)
else:
Buy.append(np.nan)
Sell.append(np.nan)
return (Buy,Sell)
print('Done')
y=buy_sell(data)
data['Buy_Price']=y[0]
data['Sell_Price']=y[1]
print(data)
x.figure(figsize=(12,6))
x.scatter(data.index, data['Buy_Price'], color='green', label='Buy',marker='^', alpha=1)
x.scatter(data.index, data['Sell_Price'], color='red', label='Sell' ,marker='v', alpha=1)
x.plot(data['close'], label='Close Price',alpha=0.35)
x.title('Buy And Sell Signals')
x.xlabel('Date')
x.ylabel('Close Price In INR')
x.legend(loc='upper left')
x.show()
print ('******************** PROGRAM EXECUTION COMPLETE ENTERING NEXT CYCLE ******************')
schedule.every(20).seconds.do(job)
while(1):
schedule.run_pending()
time.sleep(1)