# 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. poj-2337(欧拉回路输出)

    题意:给你n个字符串,每个字符串可以和另一个字符串连接的前提是,前一个字符串的尾字符等于后一个字符串的首字符,问你存不存在欧拉通路并输出 解题思路:基本标准流程,建图:把一个字符串可以看作一条首字符指 ...

  2. 【数学建模】day11-典型相关分析

    这与主成分分析有点相似. 0. 基本思想主成分分析(PCA)是把原始有相关性变量,线性组合出无关的变量(投影),以利用主成分变量进行更加有效的分析.而典型相关分析(CCA)的思想是: 分析自变量组 X ...

  3. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  4. BZOJ 1977 严格次小生成树(算竞进阶习题)

    树上倍增+kruskal 要找严格次小生成树,肯定先要找到最小生成树. 我们先把最小生成树的边找出来建树,然后依次枚举非树边,容易想到一种方式: 对于每条非树边(u,v),他会与树上的两个点构成环,我 ...

  5. python学习日记(文件操作)

    文件操作概述 计算机系统分为:操作系统,计算机硬件,应用程序. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序 ...

  6. 用keras实现基本的图像分类任务

    数据集介绍 fashion mnist数据集是mnist的进阶版本,有10种对应的结果 训练集有60000个,每一个都是28*28的图像,每一个对应一个标签(0-9)表示 测试集有10000个 代码 ...

  7. 【BZOJ3561】DZY Loves Math VI (数论)

    [BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...

  8. Codeforces Round #554 ( div.2 ) 总结

    应该经常需要锻炼一下英语阅读理解能力和代码能力,所以以后还是需要多打打CF. 今天大概就是水一水找找感觉. A. Neko Finds Grapes $n$个箱子,$m$个钥匙 ($n,m \leq ...

  9. javascript柯里化及组合函数~

    大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...

  10. String:字符串常量池

    String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...