繁体   English   中英

使用调度在 Python 中调度作业

[英]Scheduling Jobs in Python using schedule

我正在尝试编写一个脚本,该脚本使用 zerodha kiteconnect 下载股票的收盘价并计算 MACD,然后给出是否买入或卖出股票的信号。 我试图每分钟运行一次这个脚本。 请在下面找到代码:

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)
    
        






    
    

如下所示,我正在使用 schedule 来安排我的脚本,问题是当我使用 return 语句时,会生成错误“未定义购买”。 完整的错误output如图:

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

根据给出的建议,我能够解决这个问题。 完整的代码是:

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)

    
    
    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM