Search code examples
pythonschedule

Scheduling Jobs in Python using schedule


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

Solution

  • 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)