提问:'str' object has no attribute 'minute'

为什么会提示这个?一开始运行好像还是好的,一会之后就变成这样了。希望朋友可以帮我看一下

img

import requests
from datetime import datetime,time,timedelta
from dateutil import parser
from time import sleep


class AstockTrading(object):
    def __init__(self,strategy_name):
        self._strategy_name = strategy_name
        self._Open = []
        self._High = []
        self._Low = []
        self._Close = []
        self._Dt = []
        self._tick = None
        self._Volume = []
        self._last_bar_start_minute = None
        self._isNewBar = False
        self._ma20 =None 
        self._current_orders = {}
        self._history_orders = {}
        self._order_number = 0
    def getTick(self):
        page = requests.get("http://hq.sinajs.cn/?format=text&list=sh600000");
        stock_info =page.text
        mt_info = stock_info.split(",")
        
        last = float(mt_info[1])
        trade_datetime = mt_info[30]+' '+mt_info[31]
        
        self._tick = (trade_datetime, last)
        
    def  get_history_data_from_local_mechine(self):
         self._Open = [1,2,3]
         self._High = [2,3,4]
          
    def  bar_generator(self):
        if  self._tick[0].minute %5 == 0 and self._tick[0].minute != self._last_bar_start_minute:
             
                self._last_bar_start_minute =self._tick[0].minute
                self._Open.insert(0,self._tick[1])
                self._High.insert(0,self._tick[1])
                self._Low.insert(0,self._tick[1])
                self._Close.insert(0,self._tick[1])
                self._Dt.insert(0,self._tick[0])
                self._isNewBar = True
                
        else:
           #update current bar
           self._High[0] = max(self._High[0],self._tick[0])
           self._Low[0] =  min(self._Low[0],self._tick[0])
           self._Close[0] = self._tick[0]
           self._Dt[0] = self._tick[0]
           self._isNewBar =False
           self._last_bar_start_minute =self._tick[0].minute
            
    def _buy(self, price, volume):
        self._order_number += 1
        key = "order"+str(self._order_number)
        self._current_orders[key] = {
                "open_datetime": self._Dt[0],
                "open_price": price,
                "volume": volume           
                }
        
    def _sell(self, key, price):
        self._current_orders[key]['close_price'] = price
        self._current_orders[key]['close_datetime'] = self._Dt[0]
        
        self._history_orders[key] = self._current_orders.pop(key)      
    
    
    def strategy(self):
        if self._isNewBar:
            sum_ = 0
            for item in Close[1:21]:
                sum_ = sum_ + item
            self._ma20 = sum_ / 20
            
        
            
        if 0 == len(self.__current_orders):
            if self._Close[0] < 0.95 * ma20:
                volume = int(100000/self._Close[0]/100)*100
                self._buy(self._Close[0]+0.01, volume) 
        else:
            if self._Close[0] > self._ma20 * 1.05:
                key = self._current_orders.keys()[0]
                self._sell(key, self._Close[0]-0.01)
       
ma = AstockTrading("ma")
ma.get_history_data_from_local_mechine()

while time(9,26)< datetime.now().time() < time(11,32) or \
      time(13)< datetime.now().time()<time(15,2):
      ma.getTick()
      ma.bar_generator()
      ma.strategy()
        

# 问题在于这个函数:  trade_datetime = mt_info[30] + ' ' + mt_info[31] ,你都给它拼接字符串了,而且你好像没有对程序做任何的反反爬虫技术
 def getTick(self):
        url = "http://hq.sinajs.cn/?format=text&list=sh600000"
        page = requests.get(url, headers=headers)
        stock_info = page.text
        print(stock_info)
        mt_info = stock_info.split(",")
        last = float(mt_info[1])
        trade_datetime = mt_info[30] + ' ' + mt_info[31]
        self._tick = (trade_datetime, last) 

改成: self._tick = (datetime.strptime(trade_datetime, '%Y-%m-%d %H:%M:%S'), last)
跑通的程序:

import requests
from datetime import datetime, time, timedelta
from dateutil import parser
from time import sleep

# 根据自己浏览器配置
headers = {

}


class AstockTrading(object):
    def __init__(self, strategy_name):
        self._strategy_name = strategy_name
        self._Open = []
        self._High = []
        self._Low = []
        self._Close = []
        self._Dt = []
        self._tick = None
        self._Volume = []
        self._last_bar_start_minute = None
        self._isNewBar = False
        self._ma20 = None
        self._current_orders = {}
        self._history_orders = {}
        self._order_number = 0

    def getTick(self):
        url = "http://hq.sinajs.cn/?format=text&list=sh600000"
        page = requests.get(url, headers=headers)
        stock_info = page.text
        print(stock_info)
        mt_info = stock_info.split(",")
        last = float(mt_info[1])
        trade_datetime = mt_info[30] + ' ' + mt_info[31]
        self._tick = (datetime.strptime(trade_datetime, '%Y-%m-%d %H:%M:%S'), last)

    def get_history_data_from_local_mechine(self):
        self._Open = [1, 2, 3]
        self._High = [2, 3, 4]

    def bar_generator(self):
        if self._tick[0].minute % 5 == 0 and self._tick[0].minute != self._last_bar_start_minute:
            self._last_bar_start_minute = self._tick[0].minute
            self._Open.insert(0, self._tick[1])
            self._High.insert(0, self._tick[1])
            self._Low.insert(0, self._tick[1])
            self._Close.insert(0, self._tick[1])
            self._Dt.insert(0, self._tick[0])
            self._isNewBar = True
        else:
            # update current bar
            self._High[0] = max(self._High[0], self._tick[1])
            self._Low[0] = min(self._Low[0], self._tick[1])
            self._Close[0] = self._tick[1]
            self._Dt[0] = self._tick[0]
            self._isNewBar = False
            self._last_bar_start_minute = self._tick[0].minute

    def _buy(self, price, volume):
        self._order_number += 1
        key = "order" + str(self._order_number)
        self._current_orders[key] = {
            "open_datetime": self._Dt[0],
            "open_price": price,
            "volume": volume
        }

    def _sell(self, key, price):
        self._current_orders[key]['close_price'] = price
        self._current_orders[key]['close_datetime'] = self._Dt[0]
        self._history_orders[key] = self._current_orders.pop(key)

    def strategy(self):
        if self._isNewBar:
            sum_ = 0
            for item in self._Close[1:21]:
                sum_ = sum_ + item
            self._ma20 = sum_ / 20

        if 0 == len(self._current_orders):
            if self._Close[0] < 0.95 * self._ma20:
                volume = int(100000 / self._Close[0] / 100) * 100
                self._buy(self._Close[0] + 0.01, volume)
        else:
            if self._Close[0] > self._ma20 * 1.05:
                key = self._current_orders.keys()[0]
                self._sell(key, self._Close[0] - 0.01)


ma = AstockTrading("ma")
ma.get_history_data_from_local_mechine()
while time(9, 26) < datetime.now().time() < time(11, 32) or \
        time(13) < datetime.now().time() < time(15, 2):
    ma.getTick()
    ma.bar_generator()
    ma.strategy()


你的第15行的self._tick = None,报错提示你的self._tick变成了一个字符串,在字符串里面self._tick[0]是单个字符,没有你后面的minute函数,应该是你对self._tick写入了单个字符串

将日期转成时间格式
trade_datetime = datetime.strptime(trade_datetime, '%Y-%m-%d %H:%M:%S')