为什么会提示这个?一开始运行好像还是好的,一会之后就变成这样了。希望朋友可以帮我看一下
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')