def OnTimerCtrl(win, debug=False): """ 定时器响应函数 :return: """ # 清屏 wx.PostEvent( win, ResultEvent(id=MSG_UPDATE_ID_S, data='检测时间:' + get_current_datetime_str() + '\n\n')) # 不在交易时间不使能定时器 if not is_in_trade_time(): wx.PostEvent( win, ResultEvent(id=MSG_UPDATE_ID_A, data='控制台定时器:当前不属于交易时间!\n')) return buy_stk_list = list( set(readConfig()['buy_stk'] + readConfig()['index_stk'])) if debug: print('OnTimerCtrl_4') # 局部变量 note_list = [] # 对股票进行检查 for stk in buy_stk_list: str_gui = JudgeSingleStk(stk_code=stk, stk_amount_last=400, qq='', gui=True) if len(str_gui['note']): note_list.append(str_gui['note']) # 打印流水信息 if len(str_gui['msg']): wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data=str_gui['msg'])) # 根据情况打印提示信息,并闪动 if len(note_list): # 清屏 wx.PostEvent( win, ResultEvent(id=NOTE_UPDATE_ID_S, data='检测时间:' + get_current_datetime_str() + '\n\n')) # 打印提示 for note in note_list: wx.PostEvent( win, ResultEvent(id=NOTE_UPDATE_ID_A, data=ChangeFontColor(note))) # 闪动图标提醒 wx.PostEvent(win, ResultEvent(id=FLASH_WINDOW_ID, data=None))
def get_pic_dict(): """ 获取图片字典 :return: """ dict_stk_list = { 'index': ['sh', 'sz', 'cyb'], 'buy': readConfig()['buy_stk'], 'concerned': readConfig()['concerned_stk'] } pic_dict = {} for tab in dict_stk_list.keys(): stk_list = dict_stk_list[tab] stk_list_pic_dict = {} for stk in stk_list: df = get_k_data_JQ(stk, 400) stk_pic_dict = { 'hour': gen_Hour_MACD_Pic(stk), 'day': gen_Day_Pic(df, stk_code=stk)[0], 'wm': gen_W_M_MACD_Pic(stk), 'index': gen_Idx_Pic(df, stk_code='')[0] } stk_list_pic_dict[stk] = stk_pic_dict # 将page中的stk pic存入字典 pic_dict[tab] = stk_list_pic_dict return pic_dict
def concerned_stk_middle_check(): towho = '影子2' stk_list = readConfig()['buy_stk'] + readConfig()['concerned_stk'] check_stklist_middle_level(stk_list, towho) # 检查小时MACD checkHourMACD_callback()
def updateRSVRecord(): try: code_list = list( set(readConfig()['buy_stk'] + readConfig()['concerned_stk'] + readConfig()['index_stk'])) # global RSV_Record for stk in code_list: RSV_Record[stk] = calRSVRank(stk, 5) / 100 except Exception as e: print(str(e))
def updateRSVRecord(self): try: code_list = list( set(readConfig()['buy_stk'] + readConfig()['concerned_stk'] + readConfig()['index_stk'])) # global RSV_Record for stk in code_list: RSV_Record[stk] = calRSVRank(stk, 5) except Exception as e: # print(str(e)) self.p_ctrl.m_textCtrlMsg.AppendText('RSV数据更新失败!原因:\n' + str(e) + '\n')
def sendConcernedStkPicToSelf_T(): """ 将自己关心的数据打印出图,发送到qq :return: """ towho = '影子2' send_qq(towho, '以下是已入的stk的形势图:') stk_buy = readConfig()['buy_stk'] for x in stk_buy + ['sh', 'sz', 'cyb']: df = get_k_data_JQ(x, 400) fig, _, attention = genStkPicForQQ(df, x) if attention: send_pic_qq(towho, fig) send_W_M_MACD(x, towho) plt.close() # 打印第二张套图 fig, _, attention = genStkIdxPicForQQ(df, x) if attention: send_pic_qq(towho, fig) plt.close()
def sendConcernedStkPicToSelf_V2(): """ 将自己关心的数据打印出图,发送到qq 相较于之前版本,本次改进为: 1、使用json文件中的code列表代替数据库中的列表 2、进行判断,出发发送条件再予以发送 :return: """ towho = '影子2' send_qq(towho, '以下是已入的stk的形势图:') code_list = readConfig()['buy_stk'] for x in code_list + ['sh', 'sz', 'cyb']: df = get_k_data_JQ(x, 400) fig, _ = genStkPicForQQ(df) plt.title(str(x)) send_pic_qq(towho, fig) # plt.show() plt.close() fig, _ = genStkIdxPicForQQ(df) plt.title(str(x)) send_pic_qq(towho, fig) # plt.show() plt.close() send_W_M_MACD(x, towho)
def update_middle_period_hour_data(): stk_list = readConfig()['buy_stk'] + readConfig()['concerned_stk'] # stk_list = readConfig()['buy_stk'] # 获取股票的小时数据 result = {} for stk in stk_list: df_hour = get_k_data_JQ(stk, count=None, start_date=add_date_str( get_current_date_str(), -60), freq='60m') result[stk] = list(df_hour['close'].values) with open(data_dir + 'middlePeriodHourData.json', 'w') as f: json.dump(result, f)
def JudgePChangeRatio(stk_code, price_diff_ratio, debug=True): """ 判断stk的变化是否达到一定的幅度,以杜绝反复上报 :param stk_code: :return: """ global price_diff_ratio_last_dic if debug: print('函数JudgeSingleStk:进入函数!') # 变化1个百分点再报,避免重复报 if stk_code in p_diff_ratio_last_dic.keys(): if math.fabs(price_diff_ratio - p_diff_ratio_last_dic[stk_code] ) * 100 > readConfig()['pcr']: p_diff_ratio_last_dic[stk_code] = price_diff_ratio if debug: print('函数JudgeSingleStk:' + str(stk_code) + '价格变化幅度达标,允许推送,并更新振幅记忆!' + '\np_ratio_now:' + str(price_diff_ratio) + '\np_ratio_last:' + str(p_diff_ratio_last_dic[stk_code])) return True else: print('函数JudgeSingleStk:' + str(stk_code) + '价格变化幅度不够,不许推送!' + '\np_ratio_now:' + str(price_diff_ratio) + '\np_ratio_last:' + str(p_diff_ratio_last_dic[stk_code])) return False else: p_diff_ratio_last_dic[stk_code] = price_diff_ratio if debug: print('函数JudgeSingleStk:' + str(stk_code) + '首次运行,允许推送!') return True
def updateRSVRecord(): try: code_list = readConfig()['buy_stk'] # global RSV_Record for stk in code_list: RSV_Record[stk] = calRSVRank(stk, 5) except Exception as e: send_qq('影子2', 'RSV数据更新失败!\n' + str(e))
def callback_gui(): towho = '影子2' buy_stk_list = readConfig()['buy_stk'] + readConfig()['concerned_stk'] for stk in buy_stk_list: str_gui = JudgeSingleStk(stk_code=stk, stk_amount_last=400, qq=towho, gui=True)
def sendRelaLevel2QQ(): send_qq(towho='影子2', msge='注意低位囤货:') calRelaPLevel(readConfig()['safe_stk'], -720, '影子2')
# encoding=utf-8
def OnTimer(win, debug=False): """ 定时器响应函数 :return: """ global last_upt_t upt_flag, last_upt_t = is_time_h_macd_update(last_upt_t) wx.PostEvent(win, ResultEvent(id=LAST_TIME_UPDATE_ID, data=last_upt_t)) if not upt_flag: wx.PostEvent( win, ResultEvent(id=MSG_UPDATE_ID_A, data='图片更新定时器:“小时图片”更新时间点未到!\n')) return # 清屏 wx.PostEvent( win, ResultEvent(id=NOTE_UPDATE_ID_S, data='检测时间:' + get_current_datetime_str() + '\n\n')) # 生成更新的图片 wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data='开始更新小时图片...\n')) pic_dict = timer_update_pic('h') wx.PostEvent(win, ResultEvent(id=HOUR_UPDATE_ID, data=pic_dict)) wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data='小时图片更新完成!\n')) # 中期水平检测 wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data='开始“中期水平检测”...!\n')) df_level = check_stk_list_middle_level( list(set(readConfig()['buy_stk'] + readConfig()['concerned_stk']))) wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data='“中期水平检测”完成!\n')) wx.PostEvent(win, ResultEvent(id=NOTE_UPDATE_ID_A, data=str(df_level) + '\n\n')) note_tmp = \ """ ---------------------------------------------------------------------------------- 小提示: 所谓“中期水平检测”是对自己的“持仓股票”和“关注股票”的当前价格在两个月内的水平 进行统计排名,由低到高排序,越在前面的,表示当前价格越是处于低位! level这一列表示处于低位的实际情况,是一个0~100的数,比如12.2表示当前价格只超过了两 个月来12.2%的时间! ---------------------------------------------------------------------------------- """ + '\n' wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data=note_tmp)) # 拐点检测 for stk in list( set(readConfig()['buy_stk'] + readConfig()['concerned_stk'] + readConfig()['index_stk'])): hour_macd_str = checkSingleStkHourMACD_wx(stk, source='jq') if len(hour_macd_str): wx.PostEvent( win, ResultEvent(id=NOTE_UPDATE_ID_A, data=ChangeFontColor(hour_macd_str))) wx.PostEvent(win, ResultEvent(id=FLASH_WINDOW_ID, data=None)) note_tmp = \ """ ---------------------------------------------------------------------------------- 小提示: 所谓“拐点检测”是对自己的“持仓股票”和“关注股票”以及“三大指数”的小时级别和半 小时级别的MACD柱子进行分析,找出“开始上涨”和“开始下跌”的情况,在控制台向用户提 示,用户收到提示后可以查看其相应的MACD图,以便对价格走势做进一步的判断! ---------------------------------------------------------------------------------- """ + '\n' wx.PostEvent(win, ResultEvent(id=MSG_UPDATE_ID_A, data=note_tmp))
def callback(): towho = '影子2' buy_stk_list = readConfig()['buy_stk'] for stk in buy_stk_list: JudgeSingleStk(stk_code=stk, stk_amount_last=400, qq=towho)