# encoding: utf-8
import requests
import logging
import logging.config
import random
import os
import yaml
import time
import threading
import re
import datetime
import json class Observer(object):
open_price_last_1 = ''
close_price_last_1 = ''
highest_price_last_1 = ''
minimum_price_last_1 = ''
ding_fen_xing = []
di_fen_xing = []
not_ding_di = [] def __init__(self):
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', 'Connection': 'close'}
self.stop_flag = False
self.potential_stock_list = self.get_potential_stock()
#self.request_session = requests.session() def get_stock_data(self,stock_code,scale):
"""
获取K 线数据
:param stock_code: 代码
:param scale: 级别
:return: k线数据
"""
#url = 'http://ifzq.gtimg.cn/appstock/app/kline/mkline?param=sh600030,m30,,320&_var=m30_today&r=0.1700474168906776'
url = 'http://ifzq.gtimg.cn/appstock/app/kline/mkline'
params = {
'param': '{},m{},,320'.format(stock_code,scale),
'_var': 'm{}_today'.format(scale),
'r': '0.1700474{}'.format("".join(random.choice("") for i in range(10)))
}
logging.info('url:%s \t params:%s',url,params)
res = requests.get(url,params=params,headers=self.headers)
res_str = res.content.decode('unicode_escape').rstrip()
#logging.info('response:%s:',res_str)
res_dict = eval(res_str[res_str.index("={")+1:res_str.index("}}}")+3])
scale_data = res_dict['data'][stock_code]['m'+scale]
#logging.info(scale_data)
return scale_data def get_stock_code(self,a_type):
"""
获取两市股票代码
:param a_type: sh or sz
:return: stock_code
"""
#url = 'http://stock.gtimg.cn/data/index.php?appn=rank&t=rankash/chr&p=1&o=0&l=40&v=list_data'
url = 'http://stock.gtimg.cn/data/index.php'
params = {
'appn': 'rank',
't': 'ranka{}/chr'.format(a_type),
'p': 1,
'o': 0,
'l': 3000,
'v': 'list_data'
}
logging.info('url:%s \t params:%s', url, params)
res = requests.get(url, params=params, headers=self.headers)
res_str = res.content.decode('unicode_escape').rstrip()
#logging.info('response:%s:',res_str)
res_str_list = res_str[res_str.index("data:'") + 6:res_str.index("'}")].split(',')
logging.info(res_str_list)
return res_str_list def get_plate_data(self,stock_code):
"""
获取盘中数据,如果出现大于80万的买单弹框提示
:param stock_code:
:return:
"""
#url = 'http://web.sqt.gtimg.cn/q=sh601208?r=0.9884275211413494'
url = 'http://web.sqt.gtimg.cn'
params = {
'q': stock_code,
'r': '0.1700474{}'.format("".join(random.choice("") for i in range(10)))
}
logging.info('url:%s \t params:%s', url, params)
res = requests.get(url, params=params, headers=self.headers)
res_text = res.content.decode('GBK')
logging.info('response:%s:',res_text.rstrip())
plate_data = res_text.split('~')
stock_name_this = plate_data[1]
stock_code_this = plate_data[2]
for list_data in plate_data:
if '|' in list_data:
plate_date_strike = list_data.split('|')
#logging.info(plate_date_strike )
buy_list = []
for plate_date_strike_detail in plate_date_strike:
if 'B' in plate_date_strike_detail :
buy_list.append(int(plate_date_strike_detail.split('/')[4]))
logging.info(buy_list)
if buy_list and max(buy_list) > 800000:
logging.info('%s %s 动了' % (stock_name_this, stock_code_this))
self.alert_msg('%s %s 动了' % (stock_name_this, stock_code_this))
#self.stop_flag = True
self.potential_stock_list.remove(stock_code)
else:
logging.info('%s %s 没动' % (stock_name_this, stock_code_this)) def get_potential_stock(self):
potential_stock_list_new = []
stock_codes = self.get_stock_code('sh') + self.get_stock_code('sz')
logging.info(('stock_codes',stock_codes))
stock_codes_length_div25 = int(len(stock_codes)/25)
logging.info(stock_codes_length_div25)
for stock_codes_length_div25_index in range(stock_codes_length_div25):
logging.info(stock_codes_length_div25_index)
if stock_codes_length_div25_index == stock_codes_length_div25 -1:
req_str = ','.join(stock_codes[stock_codes_length_div25_index * 25:])
else:
req_str = ','.join(stock_codes[stock_codes_length_div25_index * 25:(stock_codes_length_div25_index + 1) * 25])
url = 'http://qt.gtimg.cn/q=%s&r=9%s'%(req_str,''.join(str(i1) for i1 in random.sample(range(1,9),8)))
logging.info(url)
#res = requests.get(url, headers=self.headers)
res = requests.session().get(url,headers=self.headers)
res_str = res.content.decode('GBK').rstrip()
stock_data_list = res_str.replace('\n','').split(';')
for stock_data in stock_data_list:
date_today = str(datetime.datetime.now()).split(' ')[0].replace('-','')
day_rise_str_match = re.search(date_today + '(.*)?/',stock_data)
logging.info(('day_rise_str_match',day_rise_str_match))
if day_rise_str_match :
day_rise_str = day_rise_str_match.group(1)
day_rise_float = float(day_rise_str.split('~')[2])
logging.info(('day_rise_float',day_rise_float))
#当日涨幅在4%和7%之间
if day_rise_float >4.0 and day_rise_float < 7.0:
match_str = re.search('v_([s,h,z]{2}\d+)=.*',stock_data)
if match_str:
stock_code = match_str.group(1)
# n天内涨停次数 > 6
if self.get_n_days_limit_up_times(stock_code,250) > 6 :
potential_stock_list_new.append(stock_code)
time.sleep(3)
potential_stock_list_new = list(set(potential_stock_list_new))
logging.info(('potential_stock_list_new',potential_stock_list_new))
return potential_stock_list_new def is_potential_stock_list_changed(self):
potential_stock_list_new = self.get_potential_stock()
#如果交集等于并集则表示没有改变
if set(potential_stock_list_new) & set(self.potential_stock_list) == set(potential_stock_list_new) | set(
self.potential_stock_list):
return False
else:
self.stop_flag = True
return True def get_n_days_limit_up_times(self,stock_code,n):
date_n_ago = str(datetime.datetime.now() - datetime.timedelta(days=n)).split(' ')[0]
date_today = str(datetime.datetime.now()).split(' ')[0]
rand_str = '0.1700474{}'.format("".join(random.choice("") for i in range(10)))
url = 'http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?_var=kline_dayqfq&param=%s,day,%s,%s,320,qfq&r=%s'%(stock_code,date_n_ago,date_today,rand_str)
res = requests.get(url, headers=self.headers) res_str = res.content.decode('unicode_escape').rstrip().replace('kline_dayqfq=','')
logging.info(res_str)
logging.info(stock_code)
#res_dict = json.loads(res_str)
#day_kline_data = res_dict.get('data').get(stock_code).get('day')
day_kline_data_match = re.search('\[\[(.*)?\]\]',res_str)
if day_kline_data_match :
day_kline_data_match_str = day_kline_data_match.group(1)
day_kline_data_match_str = day_kline_data_match_str.replace('"','')
day_kline_data = day_kline_data_match_str.split('],[')
logging.info(day_kline_data)
limit_up_times = 0
for i in range(len(day_kline_data)-1):
if float(day_kline_data[i+1].split(',')[2])/float(day_kline_data[i].split(',')[2]) > 1.095 :
limit_up_times = limit_up_times +1
return limit_up_times def monitor_start(self):
#self.stop_flag = False
for monitor_stock in self.potential_stock_list:
m = MonitorThread(monitor_stock,self)
m.start() def alert_msg(self,msg):
commond = 'msg * %s'%msg
os.system(commond) class MonitorThread(threading.Thread):
def __init__(self,stock_code,observer):
threading.Thread.__init__(self)
self.name = stock_code
self.stock_code = stock_code
self.observer = observer def run(self):
logging.info(self.name + '监控开始...')
while 1:
self.observer.get_plate_data(self.stock_code)
if self.observer.stop_flag :
break
if self.observer.is_potential_stock_list_changed():
Observer().monitor_start()
break
time.sleep(5)
logging.info(self.name + '监控结束!') if __name__ == '__main__':
path = 'logging.yaml'
value = os.getenv('LOG_CFG', None)
if value:
path = value
if os.path.exists(path):
with open(path, "r") as f:
config = yaml.load(f)
logging.config.dictConfig(config)
else:
print('log config file not found!') # monitor_list = ['sh603590','sz300702']
# for stock_code in monitor_list:
# thread_a = MonitorThread(stock_code)
# thread_a.start()
# o = Observer()
# code_list_sh = o.get_stock_code('sh')
# code_list_sz = o.get_stock_code('sz')
# code_list = code_list_sh + code_list_sz
# code_list_keguanzhu = []
# for stock_code in code_list:
# m30_data = o.get_stock_data(stock_code, '30')
# #倒数第二个k线最低点是最后三根k线最低点中最低且最后一根k线收盘价高于中间一个k线的最高价
# if min(float(m30_data[-1][4]), float(m30_data[-2][4]), float(m30_data[-3][4])) == float(m30_data[-2][4]) and float(m30_data[-1][2]) > float(m30_data[-2][3]):
# logging.info('%s可以关注'%stock_code)
# code_list_keguanzhu.append(stock_code)
# logging.info('可关注的%d个票:%s'%(len(code_list_keguanzhu),str(code_list_keguanzhu)))
Observer().monitor_start()
# a,b,c='aa,bb,cc'.split(',')
# print((a,b,c))

stock1114的更多相关文章

随机推荐

  1. iOS后台运行播放无声音频 测试可行

    如果打回来了,就自认倒霉吧 制作无声音频. @interface AppDelegate () { NSInteger count; } @property(strong, nonatomic)NST ...

  2. BZOJ1004[HNOI2008]Cards——polya定理+背包

    题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色 ...

  3. 微信小程序——创建自己的第一个小程序【一】

    注册 微信小程序注册 https://mp.weixin.qq.com/wxopen/waregister?action=step1   填写账号信息  作为登录帐号,请填写未被微信公众平台注册,未被 ...

  4. ☆ [POJ2559] Largest Rectangle in a Histogram 「单调栈」

    类型:单调栈 传送门:>Here< 题意:给出若干宽度相同的矩形的高度(条形统计图),求最大子矩形面积 解题思路 单调栈的经典题 显然,最终的子矩形高度一定和某一个矩形相等(反证).因此一 ...

  5. Python课程目录

    Python基础1 介绍.基本语法.流程控制 Python基础2 列表.字典.集合 Python基础3 基础3-函数

  6. hihocoder#1333 : 平衡树·Splay2 (区间操作)

    题面: #1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊! ...

  7. 三天STL与pbds(平板电视)

    19.02.11 ~ 19.02.13 hjmmm要专攻STL辣 先列一下大纲? 第一天:各种基础容器 第二天:实现平衡树和平板电视pbds 第三天:非变异算法和变异算法 那么我们就开始吧! Day1 ...

  8. HAOI2015 简要题解

    「HAOI2015」树上染色 题意 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0 \sim N\) 之内的正整数 \(K\),你要在这棵树中选择 \(K\) 个点,将其染成黑色,并将 ...

  9. Hdoj 1789 Doing Homework again 题解

    Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...

  10. Codeforces | CF1037D 【Valid BFS?】

    题目大意:给定一个\(n(1\leq n\leq 2\cdot10^5)\)个节点的树的\(n-1\)条边和这棵树的一个\(BFS\)序\(a_1,a_2,\dots,a_n\),判断这个\(BFS\ ...