From ec4cc6d4ccba433cf10678b3d767e588a2d00e91 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期一, 16 十二月 2024 16:57:33 +0800 Subject: [PATCH] 去除掘金依赖 --- gui_wx.py | 2034 +---------------------------------------------------------- 1 files changed, 45 insertions(+), 1,989 deletions(-) diff --git a/gui_wx.py b/gui_wx.py index 801a038..e4aea57 100644 --- a/gui_wx.py +++ b/gui_wx.py @@ -1,22 +1,13 @@ -import array -import ctypes import json -import queue import random import socket -import struct import sys import time -import cv2 -import win32con import win32gui import constant -import juejin_data_export -from log import debug_logger -from utils import ocr_util, ths_ocr_util -from utils import opencv_util +from utils import ths_ocr_util import setting from utils import socket_util from utils import ths_util @@ -27,20 +18,8 @@ import multiprocessing import threading -import matplotlib.pyplot as plt -from matplotlib.widgets import Button - import wx import wx.html2 as webview -from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas -from matplotlib.figure import Figure - -import code_data_manager -import juejin_core -from utils import tool -import requests - -from sell_processor import TickDataProcess APP_TITLE = "鍗栫エ鐪嬫澘" APP_ICON = "" @@ -72,78 +51,6 @@ elif result == wx.ID_NO: callback(False) toastone.Destroy() - - -# 鎺橀噾鍒嗘椂涓嬭浇 -class JueJinTickDataDownloadFrame(wx.Frame): - def __init__(self): - wx.Frame.__init__(self, None, -1, "鎺橀噾鍒嗘椂鏁版嵁涓嬭浇", style=wx.SYSTEM_MENU ^ wx.CLOSE_BOX ^ wx.CAPTION ^ wx.STAY_ON_TOP, - size=(350, 250)) - - self.SetBackgroundColour(wx.Colour(224, 224, 224)) - boxsier = wx.BoxSizer() - flex = wx.FlexGridSizer(rows=4, cols=2, vgap=10, hgap=10) - # 绛栫暐 - label = wx.StaticText(self, label="浠g爜锛�") - flex.Add(label, flag=wx.ALIGN_RIGHT) - self.edit_code = wx.TextCtrl(self, size=(100, -1)) - flex.Add(self.edit_code) - - # 鐩綍 - label = wx.StaticText(self, label="鐩綍閫夋嫨锛�") - flex.Add(label) - - bs1 = wx.BoxSizer(wx.VERTICAL) - self.btn_dir = wx.Button(self, label="閫夋嫨鐩綍") - bs1.Add(self.btn_dir) - self.label_path = wx.StaticText(self, label="") - bs1.Add(self.label_path) - flex.Add(bs1) - - label = wx.StaticText(self, label="鏃堕棿閫夋嫨锛�") - flex.Add(label) - self.edit_start_time = wx.TextCtrl(self, size=(100, -1)) - self.edit_end_time = wx.TextCtrl(self, size=(100, -1)) - bs1 = wx.BoxSizer(wx.HORIZONTAL) - bs1.Add(self.edit_start_time, 1, wx.RIGHT, 10) - label = wx.StaticText(self, label="-") - bs1.Add(label) - bs1.Add(self.edit_end_time, 1, wx.LEFT, 10) - flex.Add(bs1) - - # 鍗犱綅 - flex.Add(wx.StaticText(self, label="")) - # 纭畾鎸夐挳 - ID_SURE = wx.NewId() - self.btn_sure = wx.Button(self, label='纭畾', id=ID_SURE) - self.btn_sure.Bind(wx.EVT_BUTTON, self.__sure_btn) - self.btn_dir.Bind(wx.EVT_BUTTON, self.__choose_dir) - flex.Add(self.btn_sure, 1, wx.TOP | wx.LEFT, 20) - - boxsier.Add(flex, 1, wx.TOP | wx.LEFT, 20) - self.SetSizer(boxsier) - - # 璧嬪垵鍊� - self.edit_start_time.SetValue("09:30:00") - self.edit_end_time.SetValue("10:00:00") - - def __choose_dir(self, event): - dialog = wx.DirDialog(None, "閫夋嫨淇濆瓨鐩綍:") - if dialog.ShowModal() == wx.ID_OK: - path = dialog.GetPath() - self.label_path.SetLabel(path) - dialog.Destroy() - - def __sure_btn(self, event): - code = self.edit_code.GetValue() - start_time = self.edit_start_time.GetValue() - end_time = self.edit_end_time.GetValue() - dir_path = self.label_path.GetLabel() - if code and start_time and end_time and dir_path: - juejin_data_export.export_tick_data(code, start_time, end_time, dir_path) - show_info("瀵煎嚭鎴愬姛", None) - else: - show_warning("鍙傛暟涓嶅畬鏁�", None) class JueJinSettingFrame(wx.Frame): @@ -195,121 +102,6 @@ if toastone.ShowModal() == wx.ID_YES: # 濡傛灉鐐瑰嚮浜嗘彁绀烘鐨勭‘瀹氭寜閽� self.Close() toastone.Destroy() - - -class CodesSettingFrame(wx.Frame): - def __init__(self, position, callback): - wx.Frame.__init__(self, None, -1, "浠g爜璁剧疆", style=wx.SYSTEM_MENU ^ wx.CLOSE_BOX ^ wx.CAPTION ^ wx.STAY_ON_TOP, - size=(170, 300)) - self.SetBackgroundColour(wx.Colour(224, 224, 224)) - self.SetPosition(wx.Point(position[0] - self.GetSize()[0] / 2, position[1] - self.GetSize()[1] / 2)) - boxsier = wx.BoxSizer(wx.VERTICAL) - # 瀹㈡埛绔爣璇� - label = wx.StaticText(self, label="瀹㈡埛绔爣璇嗭細") - boxsier.Add(label, 0, wx.LEFT | wx.RIGHT, 5) - self.edit_client = wx.TextCtrl(self) - boxsier.Add(self.edit_client, 0, wx.LEFT | wx.RIGHT, 5) - - # 浠g爜 - label = wx.StaticText(self, label="鐩爣浠g爜锛�") - boxsier.Add(label, 0, wx.LEFT | wx.RIGHT, 5) - - # 鑷姩濉厖鎸夐挳 - self.btn_position = wx.Button(self, label='濉厖鎸佷粨浠g爜') - self.btn_position.Bind(wx.EVT_BUTTON, self.__fill_position_codes) - boxsier.Add(self.btn_position, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) - - self.edit_codes = wx.TextCtrl(self, size=(150, 120), style=wx.TE_MULTILINE) - boxsier.Add(self.edit_codes, 0, wx.LEFT | wx.RIGHT, 5) - - # 纭畾鎸夐挳 - ID_SURE = random.randint(1000, 1200) - self.btn_sure = wx.Button(self, label='纭畾', id=ID_SURE) - self.btn_sure.Bind(wx.EVT_BUTTON, self.__sure_btn) - boxsier.Add(self.btn_sure, 0, wx.LEFT | wx.TOP, 5 | 5) - root_boxsier = wx.BoxSizer(wx.HORIZONTAL) - root_boxsier.Add(boxsier, 1, wx.TOP | wx.TOP, 10) - self.SetSizer(root_boxsier) - - # 鍒濆鍖栨暟鎹� - self.__init_data() - self.callback = callback - - def __init_data(self): - codes = juejin_core.GPCodeManager().get_codes() - self.edit_codes.SetValue("\n".join(codes)) - - client = setting.get_client() - if client: - self.edit_client.SetValue(client) - else: - self.edit_client.SetValue("") - - pass - - def __sure_btn(self, event): - codes_str = self.edit_codes.GetValue() - client = self.edit_client.GetValue() - setting.set_client(client) - codes = codes_str.split("\n") - codes_result = [] - for code in codes: - if code.strip(): - codes_result.append(code.strip()) - juejin_core.GPCodeManager().set_codes(codes_result) - - # 閲嶆柊璁㈤槄 - self.callback() - toastone = wx.MessageDialog(None, "鏇存敼鎴愬姛", "鎻愮ず", wx.YES_DEFAULT | wx.ICON_INFORMATION) - if toastone.ShowModal() == wx.ID_YES: # 濡傛灉鐐瑰嚮浜嗘彁绀烘鐨勭‘瀹氭寜閽� - self.Close() - toastone.Destroy() - - @classmethod - def get_position_codes(cls): - def request_position_codes(): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - try: - data = socket_util.encryp_client_params_sign( - {"type": "common", "data": {"ctype": "get_position_codes"}}) - client.send(socket_util.load_header(json.dumps(data).encode("utf-8"))) - result_str, header_str = socket_util.recv_data(client) - return result_str - finally: - client.close() - - result_str = request_position_codes() - result = json.loads(result_str) - if result["code"] == 0: - return result["data"] - else: - raise Exception(result["msg"]) - - # 濉厖鎸佷粨浠g爜 - def __fill_position_codes(self, event): - def request_position_codes(): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - try: - data = socket_util.encryp_client_params_sign( - {"type": "common", "data": {"ctype": "get_position_codes"}}) - client.send(socket_util.load_header(json.dumps(data).encode("utf-8"))) - result_str, header_str = socket_util.recv_data(client) - return result_str - finally: - client.close() - - try: - codes = self.get_position_codes() - if codes: - self.edit_codes.SetValue("\n".join(codes)) - else: - raise Exception("鏃犳寔浠�") - except Exception as e: - show_warning(str(e), None) class FobiddenCodesFrame(wx.Frame): @@ -443,666 +235,6 @@ self.Close() toastone.Destroy() -class FloatFrame(wx.Frame): - def __init__(self): - wx.Frame.__init__(self, None, -1, "鎮诞鐩洏", style=wx.CAPTION ^ wx.MINIMIZE_BOX ^ wx.CLOSE_BOX ^ wx.STAY_ON_TOP, - size=(435, 220)) - # - self.SetBackgroundColour(wx.Colour(224, 224, 224)) - self.SetTransparent(230) - self.Bind(wx.EVT_CLOSE, self.OnExit) - - # 璁剧疆瀛椾綋澶у皬 - font = self.GetFont() - font.SetPixelSize(wx.Size(0, 11)) - self.SetFont(font) - - # 璇诲彇閰嶇疆淇℃伅 - window_info = setting.get_float_watch_window_info() - if window_info: - self.SetPosition(wx.Point(window_info[0], window_info[1])) - # self.Size = wx.Size(window_info[2], window_info[3]) - - boxsier = wx.BoxSizer(wx.VERTICAL) - - # ------鎵�鏈夋帶浠跺畾涔�-------- - btn_width = 60 - - self.btn_already_canceled = wx.Button(self, label="鎾ゅ崟", size=(-1, 40)) - self.btn_sell = wx.Button(self, label="鍗�100%", size=(-1, 40)) - font = self.btn_already_canceled.GetFont() - font.SetPixelSize(wx.Size(0, 16)) - self.btn_already_canceled.SetFont(font) - self.btn_sell.SetFont(font) - - self.btn_remove_black = wx.Button(self, label="绉婚櫎榛戝悕鍗�", size=(btn_width, 30)) - - self.btn_close_buy = wx.Button(self, label="鍏抽棴浜ゆ槗", size=(65, 30)) - self.btn_close_buy.SetForegroundColour("#FF3232") - - self.btn_remove_white = wx.Button(self, label="绉婚櫎鐧藉悕鍗�", size=(btn_width, 30)) - - self.btn_open_buy = wx.Button(self, label="寮�鍚氦鏄�", size=(65, 30), ) - self.btn_open_buy.SetForegroundColour("#00e600") - - # 涔版兂涔� - self.btn_buy_mode_want = wx.Button(self, label="浠呬拱鎯充拱", size=(65, 30)) - self.btn_buy_mode_all = wx.Button(self, label="鍏ㄩ儴閮戒拱", size=(65, 30), ) - # self.btn_buy_mode_all.SetForegroundColour("#00e600") - - self.check_auto_refresh = wx.CheckBox(self, size=(-1, -1), label="浜ゆ槗鍒锋柊") - self.want_list = wx.Button(self, label="鎯充拱鍗�", size=(40, 20)) - self.btn_want_buy = wx.Button(self, label="鍔犲叆鎯充拱鍗�", size=(btn_width, 30)) - - self.check_auto_click = wx.CheckBox(self, size=(-1, -1), label="鍒嗙粍鍒锋柊") - - self.check_focus = wx.CheckBox(self, size=(-1, -1), label="鎶㈠崰鐒︾偣") - - self.check_trade_quick_key = wx.CheckBox(self, size=(-1, -1), label="浜ゆ槗蹇嵎閿�") - - self.btn_want_buy_remove = wx.Button(self, label="绉婚櫎鎯充拱鍗�", size=(btn_width, 30)) - - self.edit_code = wx.TextCtrl(self, size=(80, -1)) - self.edit_code.Show(False) - - self.pause_buy_list = wx.Button(self, label="涓嶄拱鍗�", size=(40, 20)) - self.btn_pause_buy = wx.Button(self, label="鍔犲叆鏆備笉涔�", size=(btn_width, 30)) - - # 浠g爜 - self.btn_black = wx.Button(self, label="鍔犲叆榛戝悕鍗�", size=(btn_width, 30)) - self.black_list = wx.Button(self, label="榛戝悕鍗�", size=(40, 20)) - self.black_list.SetForegroundColour("#00e600") - - self.btn_white = wx.Button(self, label="鍔犲叆鐧藉悕鍗�", size=(btn_width, 30)) - self.white_list = wx.Button(self, label="鐧藉悕鍗�", size=(40, 20)) - self.white_list.SetForegroundColour("#FF3232") - - self.btn_pause_buy_remove = wx.Button(self, label="绉婚櫎鏆備笉涔�", size=(btn_width, 30)) - - # ------甯冨眬-------- - # 绗�1鎺� 鎾ゅ崟涓庡崠 - bs1 = wx.BoxSizer(wx.HORIZONTAL) - bs1.Add(self.btn_already_canceled, 1, wx.ALL | wx.EXPAND, 2) - bs1.Add(self.btn_sell, 1, wx.ALL | wx.EXPAND, 2) - boxsier.Add(bs1, 0, wx.ALL | wx.EXPAND, 0) - boxsier.Add(wx.StaticText(self, size=wx.Size(-1, 5)), 0, wx.ALL | wx.EXPAND, 0) - - # 绗�2鎺� 鐧藉悕鍗� 榛戝悕鍗� 鏆備笉涔板崟 鎯充拱鍗� - bs1 = wx.BoxSizer(wx.HORIZONTAL) - # 鐧藉悕鍗� - bs2 = wx.BoxSizer(wx.HORIZONTAL) - bs_v = wx.BoxSizer(wx.VERTICAL) - bs_v.Add(self.btn_white) - bs_v.Add(self.btn_remove_white) - bs2.Add(bs_v) - bs2.Add(self.white_list, 0, wx.ALL | wx.EXPAND, 0) - bs1.Add(bs2, 1, wx.ALL | wx.EXPAND, 1) - - # 榛戝悕鍗� - bs2 = wx.BoxSizer(wx.HORIZONTAL) - bs_v = wx.BoxSizer(wx.VERTICAL) - bs_v.Add(self.btn_black) - bs_v.Add(self.btn_remove_black) - bs2.Add(bs_v) - bs2.Add(self.black_list, 0, wx.ALL | wx.EXPAND, 0) - bs1.Add(bs2, 1, wx.ALL | wx.EXPAND, 1) - - # 鏆備笉涔板崟 - bs2 = wx.BoxSizer(wx.HORIZONTAL) - bs_v = wx.BoxSizer(wx.VERTICAL) - bs_v.Add(self.btn_pause_buy) - bs_v.Add(self.btn_pause_buy_remove) - bs2.Add(bs_v) - bs2.Add(self.pause_buy_list, 0, wx.ALL | wx.EXPAND, 0) - bs1.Add(bs2, 1, wx.ALL | wx.EXPAND, 1) - - # 鎯充拱鍗� - bs2 = wx.BoxSizer(wx.HORIZONTAL) - bs_v = wx.BoxSizer(wx.VERTICAL) - bs_v.Add(self.btn_want_buy) - bs_v.Add(self.btn_want_buy_remove) - bs2.Add(bs_v) - bs2.Add(self.want_list, 0, wx.ALL | wx.EXPAND, 0) - bs1.Add(bs2, 1, wx.ALL | wx.EXPAND, 1) - - boxsier.Add(bs1, 0, wx.ALL | wx.EXPAND, 0) - boxsier.Add(wx.StaticText(self, size=wx.Size(-1, 5))) - # 绗�3鎺� 浜ゆ槗鎿嶄綔浣� - bs1 = wx.BoxSizer(wx.HORIZONTAL) - - bs_v = wx.BoxSizer(wx.VERTICAL) - bs_v.Add(self.check_auto_refresh) - bs_v.Add(self.check_auto_click) - bs1.Add(bs_v) - - bs_v = wx.BoxSizer(wx.VERTICAL) - bs_v.Add(self.check_focus) - bs_v.Add(self.check_trade_quick_key) - bs1.Add(bs_v, 0, wx.LEFT, 5) - - blank_label = wx.StaticText(self) - bs1.Add(blank_label, 1, wx.ALL | wx.EXPAND, 1) - bs1.Add(self.btn_close_buy) - bs1.Add(self.btn_open_buy) - bs1.Add(self.btn_buy_mode_want) - bs1.Add(self.btn_buy_mode_all) - - boxsier.Add(bs1, 0, wx.ALL | wx.EXPAND, 1) - - # 缁戝畾 - self.btn_open_buy.Bind(wx.EVT_BUTTON, self.__open_buy) - self.btn_close_buy.Bind(wx.EVT_BUTTON, self.__close_buy) - - self.btn_black.Bind(wx.EVT_BUTTON, self.add_black) - self.btn_white.Bind(wx.EVT_BUTTON, self.add_white) - self.btn_remove_black.Bind(wx.EVT_BUTTON, self.remove_from_black) - self.btn_remove_white.Bind(wx.EVT_BUTTON, self.remove_from_white) - - self.btn_want_buy.Bind(wx.EVT_BUTTON, self.add_want) - self.btn_want_buy_remove.Bind(wx.EVT_BUTTON, self.remove_from_want) - - self.btn_pause_buy.Bind(wx.EVT_BUTTON, self.add_pause_buy) - self.btn_pause_buy_remove.Bind(wx.EVT_BUTTON, self.remove_from_pause_buy) - - self.btn_buy_mode_want.Bind(wx.EVT_BUTTON, lambda e: self.__set_trade_mode(e, 1)) - self.btn_buy_mode_all.Bind(wx.EVT_BUTTON, lambda e: self.__set_trade_mode(e, 0)) - - self.btn_already_canceled.Bind(wx.EVT_BUTTON, self.cancel_buy) - - self.check_auto_click.Bind(wx.EVT_CHECKBOX, self.__auto_click_check) - self.check_auto_refresh.Bind(wx.EVT_CHECKBOX, self.__auto_refresh_check) - self.check_focus.Bind(wx.EVT_CHECKBOX, self.__auto_focus_check) - self.check_trade_quick_key.Bind(wx.EVT_CHECKBOX, self.__trade_quick_key_check) - self.white_list.Bind(wx.EVT_BUTTON, lambda e: self.show_list(e, "鐧藉悕鍗曞垪琛�", 302)) - self.black_list.Bind(wx.EVT_BUTTON, lambda e: self.show_list(e, "榛戝悕鍗曞垪琛�", 301)) - self.want_list.Bind(wx.EVT_BUTTON, lambda e: self.show_list(e, "鎯宠涔板垪琛�", 403)) - self.pause_buy_list.Bind(wx.EVT_BUTTON, lambda e: self.show_list(e, "鏆備笉涔板垪琛�", 413)) - - root_boxsier = wx.BoxSizer(wx.VERTICAL) - self.label_attribute = wx.StaticText(self, label="") - self.label_attribute.SetForegroundColour(wx.Colour(255, 0, 0)) - root_boxsier.Add(self.label_attribute, 0, wx.LEFT | wx.TOP | wx.RIGHT, 5) - root_boxsier.Add(boxsier, 1, wx.ALL, 5) - - self.SetSizer(root_boxsier) - - self.__bind_hot_keys() - # 鍒濆鍖栨暟鎹� - self.__init_data() - - self.timer = wx.Timer(self) # 鍒涘缓瀹氭椂鍣� - self.Bind(wx.EVT_TIMER, self.clear_msg, self.timer) - - def clear_msg(self, event): - self.label_attribute.SetLabelText("") - self.label_attribute.SetForegroundColour("#000000") - - def __ocr_code(self): - code = self.edit_code.GetValue() - if code is not None and len(code.strip()) == 0: - code = None - if code is not None: - if len(code) != 6: - self.show_warning("璇峰~鍐欐纭殑浠g爜") - return - else: - return - - code = ths_ocr_util.ocr_ths_code() - if code is None: - raise Exception("浠g爜璇嗗埆鍑洪敊") - self.edit_code.SetValue(code) - - def show_warning(self, content): - self.label_attribute.SetLabel(content) - self.label_attribute.SetForegroundColour("#FF7F27") - self.timer.Stop() - self.timer.StartOnce(20000) - - def show_info(self, content): - self.label_attribute.SetLabel(content) - self.label_attribute.SetForegroundColour("#008000") - self.timer.Stop() - self.timer.StartOnce(20000) - - def __get_code(self): - self.__ocr_code() - code = self.edit_code.GetValue() - if code is None or len(code) != 6: - raise Exception("璇峰~鍐欐纭殑浠g爜") - return code - - def add_black(self, event): - try: - code = self.__get_code() - print("鍔犲叆榛戝悕鍗�", code) - self.__request([code], 201) - self.show_info(f"{code}鍔犲叆榛戝悕鍗曟垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def add_white(self, event): - try: - code = self.__get_code() - print("鍔犲叆鐧藉悕鍗�", code) - result = self.__request([code], 202) - result = json.loads(result) - if result["code"] == 0: - self.show_info(f"{code}鍔犲叆鐧藉悕鍗曟垚鍔�") - else: - self.show_warning(f"鍔犲叆澶辫触锛歿result['msg']}") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def add_pause_buy(self, event): - try: - code = self.__get_code() - print("鍔犲叆鏆備笉涔�", code) - self.__request([code], 411) - self.show_info(f"{code}鍔犲叆鏆備笉涔板悕鍗曟垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def add_want(self, event): - try: - code = self.__get_code() - print("鍔犲叆鎯宠涔�", code) - self.__request([code], 401) - self.show_info(f"{code}鍔犲叆鎯宠涔板悕鍗曟垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def remove_from_black(self, event): - try: - code = self.__get_code() - print("绉婚櫎榛戝悕鍗�", code) - self.__request([code], 203) - self.show_info(f"{code}绉婚櫎榛戝悕鍗曟垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def remove_from_pause_buy(self, event): - try: - code = self.__get_code() - print("绉婚櫎鏆備笉涔板悕鍗�", code) - self.__request([code], 412) - self.show_info(f"{code}绉婚櫎鏆備笉涔版垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def remove_from_white(self, event): - try: - code = self.__get_code() - print("绉婚櫎鐧藉悕鍗�", code) - self.__request([code], 204) - self.show_info(f"{code}绉婚櫎鐧藉悕鍗曟垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def remove_from_want(self, event): - try: - code = self.__get_code() - print("绉婚櫎鎯宠涔板悕鍗�", code) - self.__request([code], 402) - self.show_info(f"{code}绉婚櫎鎯宠涔板悕鍗曟垚鍔�") - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def cancel_buy(self, event): - try: - code = self.__get_code() - print("鎾ゅ崟", code) - result = self.__request_cancel_buy(code) - result = json.loads(result) - if result["code"] == 0: - self.show_info(f"{code}鎾ゅ崟涓婃姤鎴愬姛") - else: - self.show_warning(result.get("msg")) - self.edit_code.SetValue("") - except Exception as e: - self.show_warning(str(e)) - return - - def show_list(self, event, title, type): - try: - result = self.__request_list(type) - result = json.loads(result) - self.__show_list(title, result["data"]) - except Exception as e: - show_warning(str(e), None) - - def __show_list(self, title, datas): - st = "" - for i in range(0, len(datas)): - st += datas[i] - if i % 2 == 1 and i != len(datas) - 1: - st += "\n" - elif i != len(datas) - 1: - st += " , " - - toastone = wx.MessageDialog(None, st, title) - if toastone.ShowModal() == wx.ID_YES: # 濡傛灉鐐瑰嚮浜嗘彁绀烘鐨勭‘瀹氭寜閽� - toastone.Destroy() - - def __bind_hot_keys(self): - # 蹇嵎閿� - setting_ = wx.Menu() - m_black = wx.MenuItem(setting_, id=101, text='&E', kind=wx.ITEM_NORMAL) - m_white = wx.MenuItem(setting_, id=102, text='&E', kind=wx.ITEM_NORMAL) - self.Bind(wx.EVT_MENU, self.add_black, m_black) - self.Bind(wx.EVT_MENU, self.add_white, m_white) - entries = [wx.AcceleratorEntry() for i in range(2)] - entries[0].Set(wx.ACCEL_CTRL, wx.WXK_F4, 101) - entries[1].Set(wx.ACCEL_CTRL, wx.WXK_F5, 102) - accel = wx.AcceleratorTable(entries) - self.SetAcceleratorTable(accel) - - def __init_data(self): - auto_click = setting.is_ths_auto_click() - if auto_click: - self.check_auto_click.SetValue(True) - else: - self.check_auto_click.SetValue(False) - - auto_refresh = setting.is_ths_trade_auto_refresh() - if auto_refresh: - self.check_auto_refresh.SetValue(True) - else: - self.check_auto_refresh.SetValue(False) - - auto_focus = setting.get_float_frame_auto_focus() - if auto_focus: - self.check_focus.SetValue(True) - else: - self.check_focus.SetValue(False) - - trade_quick_key = setting.get_float_frame_trade_quick_key() - if trade_quick_key: - self.check_trade_quick_key.SetValue(True) - else: - self.check_trade_quick_key.SetValue(False) - - self.__init_trade_state() - self.__init_trade_mode() - - def __init_trade_state(self): - # 鑾峰彇浜ゆ槗鐘舵�� - try: - result = self.__request_buy_state() - result = json.loads(result) - if result["code"] == 0: - if result["data"]["can_buy"]: - self.btn_open_buy.SetLabelText("寮�鍚氦鏄�*") - self.btn_close_buy.SetLabelText("鍏抽棴浜ゆ槗") - else: - self.btn_open_buy.SetLabelText("寮�鍚氦鏄�") - self.btn_close_buy.SetLabelText("鍏抽棴浜ゆ槗*") - except: - pass - - def __init_trade_mode(self): - # 鑾峰彇浜ゆ槗妯″紡 - try: - result = self.__request_buy_mode() - result = json.loads(result) - if result["code"] == 0: - if result["data"]["mode"] == 0: - self.btn_buy_mode_want.SetLabelText("浠呬拱鎯充拱") - self.btn_buy_mode_all.SetLabelText("鍏ㄩ儴閮戒拱*") - else: - self.btn_buy_mode_want.SetLabelText("浠呬拱鎯充拱*") - self.btn_buy_mode_all.SetLabelText("鍏ㄩ儴閮戒拱") - except: - pass - - def __auto_click_check(self, event): - if event.Selection: - setting.set_ths_auto_click(True) - else: - setting.set_ths_auto_click(False) - - def __auto_refresh_check(self, event): - if event.Selection: - setting.set_ths_trade_auto_refresh(True) - else: - setting.set_ths_trade_auto_refresh(False) - - def __auto_focus_check(self, event): - if event.Selection: - setting.set_float_frame_auto_focus(True) - else: - setting.set_float_frame_auto_focus(False) - - def __trade_quick_key_check(self, event): - if event.Selection: - setting.set_float_frame_trade_quick_key(True) - else: - setting.set_float_frame_trade_quick_key(False) - - def __request(self, codes, type): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": type, "data": {"codes": codes}} - client.send(json.dumps(data).encode("utf-8")) - result = client.recv(1024) - client.close() - return result.decode("gbk") - - def __request_list(self, type): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": type, "data": {}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(10240) - client.close() - return result.decode("gbk") - - def __request_buy(self, is_open): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 501, "data": {"open": is_open}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(10240) - client.close() - return result.decode("gbk") - - # 鑾峰彇涔板叆鐘舵�� - def __request_buy_state(self): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 502, "data": {}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(1024) - client.close() - return result.decode("gbk") - - # 鑾峰彇涔板叆妯″紡 - - def __request_buy_mode(self): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 504, "data": {}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(1024) - client.close() - return result.decode("gbk") - - def __request_set_buy_mode(self, mode): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 503, "data": {"mode": mode}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(1024) - client.close() - return result.decode("gbk") - - # 鏌ヨ鏄惁鍙互鎾ゅ崟 - def __request_can_cancel_buy(self, code): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 420, "data": {"codes": [code]}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(1024) - client.close() - return result.decode("gbk") - - # 鎾ゅ崟 - def __request_cancel_buy(self, code): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 80, "data": {"code": code}} - client.send(json.dumps(data).encode("utf-8")) - # 璇诲彇鍐呭 - result = client.recv(1024) - client.close() - return result.decode("gbk") - - def __set_trade_mode(self, event, mode): - try: - result = self.__request_set_buy_mode(mode) - result = json.loads(result) - if result["code"] != 0: - raise Exception(result["msg"]) - self.__init_trade_mode() - except Exception as e: - show_warning(str(e), None) - - def __open_buy(self, event): - def open_buy(sure): - if sure: - try: - result = self.__request_buy(True) - msg = json.loads(result)["msg"] - show_info(msg, None) - self.__init_trade_state() - except Exception as e: - show_warning(str(e), None) - - show_sure("鏄惁寮�鍚氦鏄�", open_buy) - - def __close_buy(self, event): - def close_buy(sure): - if sure: - try: - result = self.__request_buy(False) - msg = json.loads(result)["msg"] - show_info(msg, None) - self.__init_trade_state() - except Exception as e: - show_warning(str(e), None) - - show_sure("鏄惁鍏抽棴浜ゆ槗", close_buy) - - def __request_attribute(self, code): - client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = (constant.SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� - client.connect(ip_port) - data = {"type": 430, "data": {"code": code}} - client.send(json.dumps(data).encode("utf-8")) - result = client.recv(1024) - client.close() - return result.decode("gbk") - - @classmethod - def focus(cls, hwnd, code): - try: - int_buffer = array.array("L", [0]) - char_buffer = array.array('b', - json.dumps({"type": "set_code", "data": {"code": code}}).encode()) - int_buffer_address = int_buffer.buffer_info()[0] - char_buffer_address, char_buffer_size = char_buffer.buffer_info() - copy_struct = struct.pack("PLP", int_buffer_address, char_buffer_size, char_buffer_address) - win32gui.SendMessage(hwnd, win32con.WM_COPYDATA, None, copy_struct) - - # pythoncom.CoInitialize() - # shell = client.Dispatch("WScript.Shell") - # shell.SendKeys('%') - # # win32gui.ShowWindow(hwnd, win32con.SW_RESTORE) - # win32gui.SetForegroundWindow(hwnd) - # win32gui.PumpMessages() - # win32gui.SetFocus(hwnd) - # lib = CDLL("D:/workspace/GP/dll/Dll/x64/Debug/Dll.dll") - # win32gui.SendMessage(hwnd, win32con.WM_SETFOCUS, 0, 0) - # print("鎵ц缁撴灉", lib.focus(hwnd)) - - # remote_thread = win32process.GetWindowThreadProcessId(hwnd)[0] - # tid = win32api.GetCurrentThreadId() - # win32process.AttachThreadInput(tid, remote_thread, True) - # prev_handle = win32gui.SetFocus(hwnd) - # print("涔嬪墠鐨勭劍鐐瑰彞鏌�", prev_handle,hwnd) - except Exception as e: - logging.exception(e) - pass - - def is_admin(self): - try: - return ctypes.windll.shell32.IsUserAnAdmin() - except: - return False - - # 璁剧疆浠g爜锛岃姹備唬鐮佸睘鎬� - @classmethod - def setCode(cls, code): - # 鑾峰彇浠g爜灞炴�ф弿杩� - # auto_focus = setting.get_float_frame_auto_focus() - if True: - # 绐楀彛鏄剧ず鍦ㄦ渶鍓嶉潰 - hwnds = win32_util.search_window("鎮诞鐩洏") - if hwnds: - print("鍙ユ焺", hwnds[0]) - time.sleep(0.1) - wx.CallAfter(lambda: cls.focus(hwnds[0], code)) - return - - # wx.CallAfter(lambda: self.SetFocus()) - - # try: - # result = self.__request_attribute(code) - # result = json.loads(result) - # if result['code'] == 0: - # code_info = result['data']['code_info'] - # desc = f"{code_info[1]} {code_info[0]} {result['data']['desc']}" - # wx.CallAfter(lambda: self.label_attribute.SetLabelText(desc)) - # except Exception as e: - # wx.CallAfter(lambda: self.label_attribute.SetLabelText(str(e))) - - def OnExit(self, e): - try: - setting.set_float_watch_window_info((self.Position[0], self.Position[1], self.Size[0], self.Size[1])) - except Exception as e: - print("") - self.Hide() - class SocketApiUtil: @@ -1126,1068 +258,30 @@ raise Exception(result['msg']) -class TickFrame(wx.Frame): - mark_lines = {} - - def __init__(self): - '''鏋勯�犲嚱鏁�''' - wx.Frame.__init__(self, None, -1, APP_TITLE, style=wx.DEFAULT_FRAME_STYLE, - size=(800, 500)) - # ^ wx.RESIZE_BORDER ^ wx.STAY_ON_TOP - # 榛樿style鏄笅鍒楅」鐨勭粍鍚堬細wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN - self.SetBackgroundColour(wx.Colour(0, 0, 0)) - win_info = setting.get_tick_window_info() - if win_info: - self.SetPosition(wx.Point(win_info[0], win_info[1])) - self.Size = wx.Size(win_info[2], win_info[3]) - else: - self.Center() - - # 鎷夊彇鏁版嵁绾跨▼ - self.cost_price_threads = {} - - # 浠ヤ笅浠g爜澶勭悊鍥炬爣 - # if hasattr(sys, "frozen") and getattr(sys, "frozen") == "windows_exe": - # exeName = win32api.GetModuleFileName(win32api.GetModuleHandle(None)) - # icon = wx.Icon(exeName, wx.BITMAP_TYPE_ICO) - # else: - # icon = wx.Icon(APP_ICON, wx.BITMAP_TYPE_ICO) - # self.SetIcon(icon) - # 瀹氫箟绐楀彛鍏抽棴 - self.Bind(wx.EVT_CLOSE, self.OnExit) - self.Bind(wx.EVT_SIZE, self.OnResize) - self.panels = [] - self.scroll = None - self.col = 1 - self.ratio = 0.55 - self.__re_draw() - - self.timer = wx.Timer(self) # 鍒涘缓瀹氭椂鍣� - self.Bind(wx.EVT_TIMER, self.post_redraw, self.timer) # 缁戝畾涓�涓畾鏃跺櫒浜嬩欢 - self.last_size = (self.Size[0], self.Size[1]) - - # self.scroll.Layout() - # self.boxsier.Fit(self.scroll) - - # boxsier.Add(mainBoxsier, 1, wx.EXPAND | wx.ALL, 5) - # self.SetSizer(boxsier) - # mainBoxsier.Fit(self) - if setting.is_stay_on_top(): - self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.STAY_ON_TOP - - def scrollTo(self, pos): - self.scroll.Scroll(0, pos) - - def __re_draw(self): - codes_name = juejin_core.GPCodeManager().get_codes_with_names() - rows = len(codes_name) - if rows % self.col == 0: - rows = rows / self.col - else: - rows = rows / self.col + 1 - space = 0 - if self.scroll is None: - self.scroll = wx.ScrolledWindow(self, -1, size=(800, 1000)) - self.boxsier = wx.FlexGridSizer(rows, self.col, space, space) - self.scroll.SetSizer(self.boxsier) - self.scroll.EnableScrolling(False, True) - if self.panels: - for p in self.panels: - p.Destroy() - self.boxsier.Clear() - - pannel_height = round((self.Size[0] - (self.col - 1) * space) / self.col * self.ratio) - - self.scroll.SetScrollbars(1, 1, 0, pannel_height * rows) - self.scroll.SetScrollRate(0, pannel_height) - global drawManager - axes_list = [] - self.panels = [] - for i in range(0, len(codes_name)): - # pos=(0, i * pannel_height) - pannel = wx.Panel(self.scroll, size=(-1, pannel_height)) - pannel.BackgroundColour = wx.Colour(0, 0, 0) - self.panels.append(pannel) - self.boxsier.Add(pannel) - code = codes_name[i][0] - axes = self.__create_canvas(pannel, code, "{}({})".format(codes_name[i][0], codes_name[i][1]), - codes_name[i][1], - codes_name[i][2]) - - if code not in self.cost_price_threads: - t1 = self.run_get_cost_price(codes_name[i][0]) - self.cost_price_threads[code] = t1 - axes_list.append(axes) - - self.scroll.Layout() - # self.boxsier.Fit(self.scroll) - # - # 鍒濆鍖栨暟鎹� - drawManager = DrawManager(axes_list, codes_name) - t1 = threading.Thread(target=lambda: drawManager.init_code_datas()) - # 鍚庡彴杩愯 - t1.setDaemon(True) - t1.start() - - @classmethod - def set_mouse_data(cls, xdata, ydata, code, axes2): - try: - if code not in cls.mark_lines: - cls.mark_lines[code] = {} - if "mouse" not in cls.mark_lines[code]: - line_h = axes2.axhline(ydata, linestyle='-', color='white', lw=0.5, zorder=3) - line_v = axes2.axvline(xdata, linestyle='-', color='white', lw=0.5, zorder=3) - text_h = axes2.text(axes2.get_xlim()[1], ydata, r'', fontsize=10, color='white', - verticalalignment="center", bbox=dict(facecolor='white', alpha=0.9), zorder=3) - text_v = axes2.text(xdata, axes2.get_ylim()[0], r'', fontsize=10, color='red', - verticalalignment='top', horizontalalignment='center', - bbox=dict(facecolor='white', alpha=0.9), zorder=3) - - cls.mark_lines[code]["mouse"] = (line_h, line_v, text_h, text_v) - line = cls.mark_lines.get(code).get("mouse") - x = round(xdata) - y = round(ydata, 2) - - line[0].set_ydata(ydata) - line[1].set_xdata(xdata) - line[2].set_text(f"{y}%") - line[3].set_text(f"{tool.trade_time_add_second('09:30:00', x)}") - line[2].set_x(axes2.get_xlim()[1] * (1 + 0.005)) - line[2].set_y(y) - line[3].set_x(x) - line[3].set_y(axes2.get_ylim()[0] * (1 + 0.02)) - if y >= 0: - line[2].set_color('red') - else: - line[2].set_color('green') - axes2.figure.canvas.draw() - except Exception as e: - pass - - def __create_canvas(self, pannel, code, title, name, price, close_callback=None): - TickDataProcess.clear(code) - - def show_mouse_line(event): - # 鍒犻櫎涔嬪墠鐨勭嚎 - self.set_mouse_data(event.xdata, event.ydata, code, axes) - - def clear_mouse_line(event): - print("clear_mouse_line") - if code in self.mark_lines: - if self.mark_lines.get(code): - line = self.mark_lines.get(code).get("mouse") - if line is not None: - for l in line: - l.remove() - self.mark_lines.get(code).pop("mouse") - axes.figure.canvas.draw() - - def close_canvas(event): - print("鍏抽棴", title) - close_callback(title) - - dpi = 100 - width_dpi = self.Size[0] / (dpi * self.col) - figure_score = Figure(figsize=(width_dpi, round(width_dpi * (self.ratio), 2)), dpi=dpi) - # 璁剧疆澶栬竟璺� - right_padding_px = 85 - right = round((self.Size[0] - right_padding_px) / self.Size[0], 4) - figure_score.subplots_adjust(left=0.01, bottom=0.15, top=0.92, - right=right) - # 璁剧疆瀛椾綋棰滆壊 - plt.rcParams["text.color"] = "red" - plt.rcParams["axes.labelcolor"] = "red" - # 璁剧疆鍧愭爣杞存暟瀛楅鑹� - plt.rcParams["xtick.color"] = "white" - plt.rcParams["ytick.color"] = "white" - # 璁剧疆鍧愭爣杞撮鑹� - plt.rcParams["axes.edgecolor"] = "firebrick" - - # 瑙e喅涓枃涔辩爜闂 - plt.rcParams["font.sans-serif"] = ["SimHei"] # 璁剧疆瀛椾綋 - plt.rcParams["font.serif"] = ["SimHei"] - plt.rcParams["axes.unicode_minus"] = False # 璇ヨ鍙ヨВ鍐冲浘鍍忎腑鐨勨��-鈥濊礋鍙风殑涔辩爜闂 - - # 娴嬭瘯 - buttonaxe = plt.axes([0.94, 0.5, 0.1, 0.1]) - button1 = Button(buttonaxe, '鍏抽棴', color='white', hovercolor='yellow') - - axes = figure_score.add_subplot(1, 1, 1) - axes.autoscale(True) - - # axes_score.plot(t_score, s_score, 'ro', t_score, s_score, 'k') - axes.set_title(title) - axes.grid(False) - axes.set_xlabel(f'鏃堕棿锛坽name}锛�') - axes.dist = 0 - - # axes.set_ylabel(u'浠锋牸') - # 鑾峰彇骞冲紑浠� - extra = 0 # (tool.get_limit_up_price(price)-decimal.Decimal(price))*decimal.Decimal(0.02) - - axes.patch.set_facecolor('black') - figure_score.patch.set_facecolor('black') - - # 璁剧疆妯潗鏍�9:25-15:00 - xs_str = ["09:25", "09:30", "10:30", "11:30", "14:00", "15:00"] - xs_int = [DrawManager.get_x_time_as_seconds(f"0000-00-00 {x}:00") for x in xs_str] - axes.set_xticks(xs_int[1:]) - axes.set_xticklabels(xs_str[1:]) - axes.set_xlim([xs_int[0], xs_int[-1]]) - - axes2 = axes.twinx() - # axes2.grid(color='firebrick', ls='-', lw=0.5) - axes2.grid(color='firebrick', ls='-', lw=0.5) - # 榧犳爣鍦ㄧ敾甯冪Щ鍔� - # axes2.figure.canvas.mpl_connect('motion_notify_event', show_mouse_line) - # # 榧犳爣绂诲紑鐢诲竷 - # axes2.figure.canvas.mpl_connect('axes_leave_event', clear_mouse_line) - - # 璁剧疆绾靛潗鏍囪酱 - limit_up_price = float(tool.get_limit_up_price(price)) - max_rate = round((limit_up_price - price) / price, 4) * 100 - print("娑ㄥ仠鏈�澶ф瘮渚�", max_rate) - # 璁剧疆绾靛潗鏍囦俊鎭� - # max_rate = 2 - DrawManager.set_y_info(code, max_rate, axes, axes2, price) - - line = axes2.plot([], [], color='white', linewidth=1) - average_line = axes2.plot([], [], color='yellow', linewidth=1, linestyle='-') - average_line_1m = axes2.plot([], [], color='yellow', linewidth=1, linestyle='-') - # axes2.legend(loc='upper left') - cannvas = FigureCanvas(pannel, -1, figure_score) - axes2.text(1, 11.5, r'', fontsize=15, color='red') - axes2.text(-1, -11.5, r'', fontsize=15, color='red') - - axes2.spines['top'].set_visible(False) - axes.spines['top'].set_visible(False) - axes2.spines['bottom'].set_visible(True) - axes.spines['bottom'].set_visible(False) - - # 涓酱绾垮姞绮� - hline = axes2.axhline(0, linestyle='-', color='firebrick', lw=2, zorder=1) - - # 璁剧疆鍧愭爣杞存爣璁扮偣涓洪粦鑹� - axes.tick_params(axis='x', colors='firebrick') - axes.tick_params(axis='y', colors='black') - axes2.tick_params(axis='x', colors='firebrick') - axes2.tick_params(axis='y', colors='black') - - def update_data(i): - print("鏇存柊鏁版嵁锛�", i) - - return axes2, line, average_line_1m, average_line, axes - - def __show_top(self, event): - if event.Selection: - setting.set_stay_on_top(1) - self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.STAY_ON_TOP - else: - setting.set_stay_on_top(0) - self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN - - def OnExit(self, e): - try: - setting.set_tick_window_info((self.Position[0], self.Position[1], self.Size[0], self.Size[1])) - except Exception as e: - print("") - self.Hide() - - def post_redraw(self, evt): - - if abs(self.last_size[0] - self.Size[0]) > 20: - print("--------post_redraw--------") - self.last_size = (self.Size[0], self.Size[1]) - self.__re_draw() - - def OnResize(self, e): - print("鍙樺寲鍚庣殑灏哄", e.Size) - # 鐣欏嚭婊氬姩鏉★紝鐣欏嚭涓婅竟璺� - if self.scroll: - self.scroll.Size = (e.Size[0] - 15, e.Size[1] - 60) - for p in self.panels: - p_height = round(e.Size[0] * (450 / 800)) - p.Size = (e.Size[0], p_height) - self.timer.Stop() - self.timer.StartOnce(1000) - - # 闄嶄綆閲嶇粯棰戠巼 - # self.__re_draw() - - def set_codes_success(self): - print("璁剧疆浠g爜鎴愬姛鍥炶皟") - p2.send("resub") - self.__re_draw() - self.timer.Stop() - self.timer.StartOnce(1000) - self.Size = wx.Size(self.Size[0], self.Size[1] + 10) - time.sleep(0.1) - self.Size = wx.Size(self.Size[0], self.Size[1] - 10) - - def run_get_cost_price(self, code): - def request(code): - while True: - try: - price = SocketApiUtil.get_cost_price(code) - pre_price = juejin_core.GPCodeManager().get_pre_prices(code) - rate = round((price - pre_price) * 100 / pre_price, 2) - DrawManager.set_cost_rate(code, rate) - # wx.CallAfter(lambda :) - except Exception as e: - DrawManager.set_cost_rate(code, None) - # wx.CallAfter(lambda: str(e)) - except: - pass - finally: - time.sleep(3) - - t1 = threading.Thread(target=lambda: request(code), daemon=True) - t1.start() - return t1 - - -class TickCompareFrame(wx.Frame): - mark_lines = {} - - def __init__(self): - '''鏋勯�犲嚱鏁�''' - wx.Frame.__init__(self, None, -1, APP_TITLE, style=wx.DEFAULT_FRAME_STYLE, - size=(800, 1000)) - self.SetBackgroundColour(wx.Colour(0, 0, 0)) - - self.Center() - - # 鎷夊彇鏁版嵁绾跨▼ - self.cost_price_threads = {} - - # 浠ヤ笅浠g爜澶勭悊鍥炬爣 - # if hasattr(sys, "frozen") and getattr(sys, "frozen") == "windows_exe": - # exeName = win32api.GetModuleFileName(win32api.GetModuleHandle(None)) - # icon = wx.Icon(exeName, wx.BITMAP_TYPE_ICO) - # else: - # icon = wx.Icon(APP_ICON, wx.BITMAP_TYPE_ICO) - # self.SetIcon(icon) - # 瀹氫箟绐楀彛鍏抽棴 - self.Bind(wx.EVT_CLOSE, self.OnExit) - self.Bind(wx.EVT_SIZE, self.OnResize) - self.panels = [] - self.scroll = None - self.col = 1 - self.ratio = 0.55 - self.__re_draw() - - self.timer = wx.Timer(self) # 鍒涘缓瀹氭椂鍣� - self.Bind(wx.EVT_TIMER, self.post_redraw, self.timer) # 缁戝畾涓�涓畾鏃跺櫒浜嬩欢 - self.last_size = (self.Size[0], self.Size[1]) - - # 鍒濆鍖� - # self.scroll = wx.ScrolledWindow(self, -1, size=(800, 1000)) - self.boxsier = wx.BoxSizer(wx.VERTICAL) - boxSizer1 = wx.BoxSizer(wx.HORIZONTAL) - self.edit_code1 = wx.TextCtrl(self, size=(100, 30)) - self.edit_code2 = wx.TextCtrl(self, size=(100, 30)) - self.btn_load_data = wx.Button(self, label="鍔犺浇鏁版嵁", size=(100, 30)) - boxSizer1.Add(self.edit_code1) - boxSizer1.Add(self.edit_code2) - boxSizer1.Add(self.btn_load_data, 1, wx.LEFT | wx.TOP, 2) - - self.boxsier.Add(boxSizer1) - - # self.scroll.EnableScrolling(False, True) - - # self.boxsier.Add(wx.FlexGridSizer(rows, self.col, space, space)) - - # self.scroll.SetSizer(self.boxsier) - - # self.scroll.Layout() - # self.boxsier.Fit(self.scroll) - - # boxsier.Add(mainBoxsier, 1, wx.EXPAND | wx.ALL, 5) - # self.SetSizer(boxsier) - # mainBoxsier.Fit(self) - if setting.is_stay_on_top(): - self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.STAY_ON_TOP - - def __re_draw(self): - return - codes_name = juejin_core.GPCodeManager().get_codes_with_names() - rows = len(codes_name) - if rows % self.col == 0: - rows = rows / self.col - else: - rows = rows / self.col + 1 - space = 0 - if not self.scroll: - return - - if self.panels: - for p in self.panels: - p.Destroy() - self.boxsier.Clear() - - pannel_height = round((self.Size[0] - (self.col - 1) * space) / self.col * self.ratio) - - self.scroll.SetScrollbars(1, 1, 0, pannel_height * rows) - self.scroll.SetScrollRate(0, pannel_height) - global drawManager - axes_list = [] - self.panels = [] - for i in range(0, len(codes_name)): - # pos=(0, i * pannel_height) - pannel = wx.Panel(self.scroll, size=(-1, pannel_height)) - pannel.BackgroundColour = wx.Colour(0, 0, 0) - self.panels.append(pannel) - self.boxsier.Add(pannel) - code = codes_name[i][0] - axes = self.__create_canvas(pannel, code, "{}({})".format(codes_name[i][0], codes_name[i][1]), - codes_name[i][1], - codes_name[i][2]) - - if code not in self.cost_price_threads: - t1 = self.run_get_cost_price(codes_name[i][0]) - self.cost_price_threads[code] = t1 - axes_list.append(axes) - - self.scroll.Layout() - # self.boxsier.Fit(self.scroll) - # - # 鍒濆鍖栨暟鎹� - drawManager = DrawManager(axes_list, codes_name) - t1 = threading.Thread(target=lambda: drawManager.init_code_datas()) - # 鍚庡彴杩愯 - t1.setDaemon(True) - t1.start() - - @classmethod - def set_mouse_data(cls, xdata, ydata, code, axes2): - try: - if code not in cls.mark_lines: - cls.mark_lines[code] = {} - if "mouse" not in cls.mark_lines[code]: - line_h = axes2.axhline(ydata, linestyle='-', color='white', lw=0.5, zorder=3) - line_v = axes2.axvline(xdata, linestyle='-', color='white', lw=0.5, zorder=3) - text_h = axes2.text(axes2.get_xlim()[1], ydata, r'', fontsize=10, color='white', - verticalalignment="center", bbox=dict(facecolor='white', alpha=0.9), zorder=3) - text_v = axes2.text(xdata, axes2.get_ylim()[0], r'', fontsize=10, color='red', - verticalalignment='top', horizontalalignment='center', - bbox=dict(facecolor='white', alpha=0.9), zorder=3) - - cls.mark_lines[code]["mouse"] = (line_h, line_v, text_h, text_v) - line = cls.mark_lines.get(code).get("mouse") - x = round(xdata) - y = round(ydata, 2) - - line[0].set_ydata(ydata) - line[1].set_xdata(xdata) - line[2].set_text(f"{y}%") - line[3].set_text(f"{tool.trade_time_add_second('09:30:00', x)}") - line[2].set_x(axes2.get_xlim()[1] * (1 + 0.005)) - line[2].set_y(y) - line[3].set_x(x) - line[3].set_y(axes2.get_ylim()[0] * (1 + 0.02)) - if y >= 0: - line[2].set_color('red') - else: - line[2].set_color('green') - axes2.figure.canvas.draw() - except Exception as e: - pass - - def __create_canvas(self, pannel, code, title, name, price, close_callback=None): - TickDataProcess.clear(code) - - def show_mouse_line(event): - # 鍒犻櫎涔嬪墠鐨勭嚎 - self.set_mouse_data(event.xdata, event.ydata, code, axes) - - def clear_mouse_line(event): - print("clear_mouse_line") - if code in self.mark_lines: - if self.mark_lines.get(code): - line = self.mark_lines.get(code).get("mouse") - if line is not None: - for l in line: - l.remove() - self.mark_lines.get(code).pop("mouse") - axes.figure.canvas.draw() - - def close_canvas(event): - print("鍏抽棴", title) - close_callback(title) - - dpi = 100 - width_dpi = self.Size[0] / (dpi * self.col) - figure_score = Figure(figsize=(width_dpi, round(width_dpi * (self.ratio), 2)), dpi=dpi) - # 璁剧疆澶栬竟璺� - right_padding_px = 85 - right = round((self.Size[0] - right_padding_px) / self.Size[0], 4) - figure_score.subplots_adjust(left=0.01, bottom=0.15, top=0.92, - right=right) - # 璁剧疆瀛椾綋棰滆壊 - plt.rcParams["text.color"] = "red" - plt.rcParams["axes.labelcolor"] = "red" - # 璁剧疆鍧愭爣杞存暟瀛楅鑹� - plt.rcParams["xtick.color"] = "white" - plt.rcParams["ytick.color"] = "white" - # 璁剧疆鍧愭爣杞撮鑹� - plt.rcParams["axes.edgecolor"] = "firebrick" - - # 瑙e喅涓枃涔辩爜闂 - plt.rcParams["font.sans-serif"] = ["SimHei"] # 璁剧疆瀛椾綋 - plt.rcParams["font.serif"] = ["SimHei"] - plt.rcParams["axes.unicode_minus"] = False # 璇ヨ鍙ヨВ鍐冲浘鍍忎腑鐨勨��-鈥濊礋鍙风殑涔辩爜闂 - - # 娴嬭瘯 - buttonaxe = plt.axes([0.94, 0.5, 0.1, 0.1]) - button1 = Button(buttonaxe, '鍏抽棴', color='white', hovercolor='yellow') - - axes = figure_score.add_subplot(1, 1, 1) - axes.autoscale(True) - - # axes_score.plot(t_score, s_score, 'ro', t_score, s_score, 'k') - axes.set_title(title) - axes.grid(False) - axes.set_xlabel(f'鏃堕棿锛坽name}锛�') - axes.dist = 0 - - # axes.set_ylabel(u'浠锋牸') - # 鑾峰彇骞冲紑浠� - extra = 0 # (tool.get_limit_up_price(price)-decimal.Decimal(price))*decimal.Decimal(0.02) - - axes.patch.set_facecolor('black') - figure_score.patch.set_facecolor('black') - - # 璁剧疆妯潗鏍�9:25-15:00 - xs_str = ["09:25", "09:30", "10:30", "11:30", "14:00", "15:00"] - xs_int = [DrawManager.get_x_time_as_seconds(f"0000-00-00 {x}:00") for x in xs_str] - axes.set_xticks(xs_int[1:]) - axes.set_xticklabels(xs_str[1:]) - axes.set_xlim([xs_int[0], xs_int[-1]]) - - axes2 = axes.twinx() - # axes2.grid(color='firebrick', ls='-', lw=0.5) - axes2.grid(color='firebrick', ls='-', lw=0.5) - # 榧犳爣鍦ㄧ敾甯冪Щ鍔� - # axes2.figure.canvas.mpl_connect('motion_notify_event', show_mouse_line) - # # 榧犳爣绂诲紑鐢诲竷 - # axes2.figure.canvas.mpl_connect('axes_leave_event', clear_mouse_line) - - # 璁剧疆绾靛潗鏍囪酱 - limit_up_price = float(tool.get_limit_up_price(price)) - max_rate = round((limit_up_price - price) / price, 4) * 100 - print("娑ㄥ仠鏈�澶ф瘮渚�", max_rate) - # 璁剧疆绾靛潗鏍囦俊鎭� - # max_rate = 2 - DrawManager.set_y_info(code, max_rate, axes, axes2, price) - - line = axes2.plot([], [], color='white', linewidth=1) - average_line = axes2.plot([], [], color='yellow', linewidth=1, linestyle='-') - average_line_1m = axes2.plot([], [], color='yellow', linewidth=1, linestyle='-') - # axes2.legend(loc='upper left') - cannvas = FigureCanvas(pannel, -1, figure_score) - axes2.text(1, 11.5, r'', fontsize=15, color='red') - axes2.text(-1, -11.5, r'', fontsize=15, color='red') - - axes2.spines['top'].set_visible(False) - axes.spines['top'].set_visible(False) - axes2.spines['bottom'].set_visible(True) - axes.spines['bottom'].set_visible(False) - - # 涓酱绾垮姞绮� - hline = axes2.axhline(0, linestyle='-', color='firebrick', lw=2, zorder=1) - - # 璁剧疆鍧愭爣杞存爣璁扮偣涓洪粦鑹� - axes.tick_params(axis='x', colors='firebrick') - axes.tick_params(axis='y', colors='black') - axes2.tick_params(axis='x', colors='firebrick') - axes2.tick_params(axis='y', colors='black') - - def update_data(i): - print("鏇存柊鏁版嵁锛�", i) - - return axes2, line, average_line_1m, average_line, axes - - def __show_top(self, event): - if event.Selection: - setting.set_stay_on_top(1) - self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.STAY_ON_TOP - else: - setting.set_stay_on_top(0) - self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN - - def OnExit(self, e): - try: - setting.set_tick_window_info((self.Position[0], self.Position[1], self.Size[0], self.Size[1])) - except Exception as e: - print("") - self.Hide() - - def post_redraw(self, evt): - - if abs(self.last_size[0] - self.Size[0]) > 20: - print("--------post_redraw--------") - self.last_size = (self.Size[0], self.Size[1]) - self.__re_draw() - - def OnResize(self, e): - print("鍙樺寲鍚庣殑灏哄", e.Size) - # 鐣欏嚭婊氬姩鏉★紝鐣欏嚭涓婅竟璺� - if self.scroll: - self.scroll.Size = (e.Size[0] - 15, e.Size[1] - 60) - for p in self.panels: - p_height = round(e.Size[0] * (450 / 800)) - p.Size = (e.Size[0], p_height) - self.timer.Stop() - self.timer.StartOnce(1000) - - # 闄嶄綆閲嶇粯棰戠巼 - # self.__re_draw() - - def set_codes_success(self): - print("璁剧疆浠g爜鎴愬姛鍥炶皟") - p2.send("resub") - self.__re_draw() - self.timer.Stop() - self.timer.StartOnce(1000) - self.Size = wx.Size(self.Size[0], self.Size[1] + 10) - time.sleep(0.1) - self.Size = wx.Size(self.Size[0], self.Size[1] - 10) - - def run_get_cost_price(self, code): - def request(code): - while True: - try: - price = SocketApiUtil.get_cost_price(code) - pre_price = juejin_core.GPCodeManager().get_pre_prices(code) - rate = round((price - pre_price) * 100 / pre_price, 2) - DrawManager.set_cost_rate(code, rate) - # wx.CallAfter(lambda :) - except Exception as e: - DrawManager.set_cost_rate(code, None) - # wx.CallAfter(lambda: str(e)) - except: - pass - finally: - time.sleep(3) - - t1 = threading.Thread(target=lambda: request(code), daemon=True) - t1.start() - return t1 - - -# 缁樺浘绠$悊鍣� -class DrawManager: - X_RANGE_MINIUTES = 335 - X_DATA_MINIUTES = 335 - - h_lines_dict = {} - cost_mark_dict = {} - last_max_rate_dict = {} - cost_rate_dict = {} - sell_points_dict = {} - - # 娣诲姞鍗栫偣 - @classmethod - def add_sell_point(cls, code, time_str, rate): - if code not in cls.sell_points_dict: - cls.sell_points_dict[code] = queue.Queue() - # 鏆傛椂娉ㄩ噴鎺� - # cls.sell_points_dict[code].put_nowait((cls.get_x_time_as_seconds(time_str), rate)) - - @classmethod - def get_x_time_as_seconds(cls, created_at_str): - time_ = created_at_str[-8:] - if tool.get_time_as_second("13:00:00") > tool.get_time_as_second(time_) > tool.get_time_as_second( - "11:30:00"): - time_ = "11:30:00" - time_s = int(time_.split(":")[0]) * 3600 + int(time_.split(":")[1]) * 60 + int( - time_.split(":")[2]) - 9 * 3600 - 60 * 30 - - if int(time_.replace(":", "")) > int("11:30:00".replace(":", "")): - time_s -= 90 * 60 - return time_s - - @classmethod - def set_cost_rate(cls, code, rate): - cls.cost_rate_dict[code] = rate - - def __load_lack_datas(self, code, time_ranges): - codeDataManager = code_data_manager.CodeDataManager() - day = tool.get_now_date_str() - for time_range in time_ranges: - results = juejin_core.GPCodeManager().get_history_tick(code, day + " " + time_range[0], - day + " " + time_range[1]) - datas = [] - for data in results: - datas.append(juejin_core.parse_tick(data)) - # 淇濆瓨鏁版嵁 - last_time = None - for data in datas: - # 09:25:00涔嬪墠鐨勬暟鎹笉淇濆瓨 - created_at = data["created_at"].strftime("%Y-%m-%d %H:%M:%S") - time_ = created_at[-8:] - time_s = int(time_.replace(":", "")) - if time_s < int("092500") or time_s > int("150000"): - continue - if int("113000") < time_s < int("130000"): - continue - - # 涓嶆槸浠婂ぉ鐨勬暟鎹笉淇濆瓨 - if day != created_at[:10]: - continue - # 姣忛殧15s淇濆瓨涓�娆� - if last_time is None or tool.trade_time_sub(time_, last_time) >= 15: - last_time = created_at[-8:] - codeDataManager.save_data(data) - - def init_code_datas(self): - - global code_datas - global max_min_prices - codeDataManager = code_data_manager.CodeDataManager() - gpCodeManager = juejin_core.GPCodeManager() - code_datas = {} - max_min_prices = {} - codes = gpCodeManager.get_codes() - if codes: - # 鑾峰彇褰撴棩鐨勬渶楂樹环鏈�浣庝环 - res = juejin_core.GPCodeManager().get_min_and_max_price(codes) - for data in res: - max_min_prices[data[0]] = (data[1], data[2]) - - for code in codes: - # 娓呴櫎Y杞存渶澶ф尟骞� - if code in self.last_max_rate_dict: - self.last_max_rate_dict.pop(code) - # 鍔犺浇鍘嗗彶鏁版嵁 - code_datas[code] = [] - old_datas = codeDataManager.get_datas(code) - # 鑾峰彇缂哄け鐨勬暟鎹� - min_time = tool.get_now_time_str() - if int(min_time.replace(":", "")) > int("150000"): - min_time = "15:00:00" - elif int("113000") < int(min_time.replace(":", "")) < int("130000"): - min_time = "11:30:00" - - min_time = tool.trade_time_add_second(min_time, 0 - DrawManager.X_DATA_MINIUTES * 60) - # 濡傛灉鏈�灏忔椂闂村皬浜�9:25鍒欏彇9:25 - if int(min_time.replace(":", "")) < int("092500"): - min_time = "09:25:00" - - ranges = codeDataManager.get_lack_datas_time_range(old_datas, min_time) - - latest_time = min_time - if old_datas: - latest_time = old_datas[-1]['created_at'][-8:] - - now_time_str = tool.get_now_time_str() - if tool.trade_time_sub(now_time_str, "15:00:00") > 0: - now_time_str = "15:00:00" - - if tool.trade_time_sub(now_time_str, latest_time) > 15: - # 鍔犺浇鍒板綋鍓嶆椂闂� - if ranges: - ranges.append((ranges[-1][1], tool.get_now_time_str())) - else: - ranges.append((latest_time, tool.get_now_time_str())) - - if len(ranges) > 0: - self.__load_lack_datas(code, ranges) - old_datas = codeDataManager.get_datas(code) - # old_datas = [] - if old_datas: - code_datas[code].extend(old_datas) - # self.update(code, code_datas[code]) - wx.CallAfter(self.update, code, code_datas[code]) - - @classmethod - def __format_max_rate(cls, max_rate): - PERCENT_RATE = 1 - line_count = 0 - if max_rate % PERCENT_RATE < 0.0001: - line_count = int(round(max_rate // PERCENT_RATE)) - else: - line_count = int(round(max_rate // PERCENT_RATE)) + 1 - rate = line_count * PERCENT_RATE - # 杩樻湭鎺ヨ繎娑ㄥ仠澶氬鍔燩ERCENT_RATE - if rate + PERCENT_RATE < 9.8: - rate += PERCENT_RATE - return rate, PERCENT_RATE - - @classmethod - def set_y_info(cls, code, max_rate, axes, axes2, price): - # 璁剧疆y杞存暟鎹� - max_rate, amplitude = cls.__format_max_rate(max_rate) - line_count = int(round(max_rate / amplitude)) - print("line_count", line_count) - yticks2 = [] - for i in range(0, line_count * 2 + 1): - if i >= line_count: - yticks2.append(0 - round(max_rate * (line_count - i) / line_count, 4)) - else: - yticks2.append(round(max_rate * (i - line_count) / line_count, 4)) - yticks2_labels = [] - yticks = [] - yticks_labels = [] - if code not in cls.h_lines_dict: - cls.h_lines_dict[code] = [] - - for line in cls.h_lines_dict[code]: - line.remove() - cls.h_lines_dict[code].clear() - - for i in range(0, len(yticks2)): - # if i % 2 == 0: - yticks2_labels.append("{}%".format(abs(round(yticks2[i], 2)))) - # else: - # yticks2_labels.append("") - price_ = round((1 + yticks2[i] / 100) * price, 2) - yticks.append(price_) - if i % 2 == 0 and False: - yticks_labels.append("") - # yticks_labels.append(round(yticks[i], 2)) - if i == line_count: - hline = axes2.axhline(yticks2[i], linestyle='-', color='firebrick', lw=2) - cls.h_lines_dict[code].append(hline) - else: - # hline = axes2.axhline(yticks2[i], linestyle='-', color='firebrick', lw=1.2) - # cls.h_lines_dict[code].append(hline) - pass - else: - # axes2.axhline(yticks2[i], linestyle='-', color='firebrick', lw=0.5) - yticks_labels.append("") - axes2.set_ylabel(u'') - # 璁剧疆绾佃酱鐨勫�肩殑鑼冨洿 - axes2.set_ylim(0 - max_rate, max_rate) - axes.set_ylim(0 - max_rate, max_rate) - axes2.set_yticks(yticks2) - axes2.set_yticklabels(yticks2_labels) - # axes.axhline(0, color='firebrick', linewidth=2) - - # 璁剧疆绾靛潗鏍囨暟鍊奸鑹� - for i in range(0, line_count): - # axes.get_yticklabels()[i].set_color("green") - axes2.get_yticklabels()[i].set_color("green") - for i in range(line_count, line_count): - # axes.get_yticklabels()[i].set_color("white") - axes2.get_yticklabels()[i].set_color("white") - for i in range(line_count + 1, line_count * 2 + 1): - # axes.get_yticklabels()[i].set_color("red") - axes2.get_yticklabels()[i].set_color("red") - - @classmethod - def mark_code_info(cls, code, max_rate, axes2, cost_rate): - ## 鏍囪浠g爜鐩稿叧鐨勪俊鎭� - # 璁剧疆鎴愭湰绾� - if code in cls.cost_mark_dict: - cls.cost_mark_dict[code].remove() - if cost_rate is None: - return - mark_x = axes2.get_xlim() - mark_y = axes2.get_ylim() - if cost_rate > max_rate: - scatter_cost = axes2.scatter((mark_x[0] + mark_x[1]) // 2, mark_y[1] - mark_y[1] / 25, c='#159EEC', - marker='^', s=50) - cls.cost_mark_dict[code] = scatter_cost - elif cost_rate < 0 and abs(cost_rate) > max_rate: - scatter_cost = axes2.scatter((mark_x[0] + mark_x[1]) // 2, 0 - mark_y[1] + mark_y[1] / 25, c='#159EEC', - marker='v', s=50) - cls.cost_mark_dict[code] = scatter_cost - else: - line1 = axes2.axhline(cost_rate, linestyle='--', color='#FF8020', lw=1) - cls.cost_mark_dict[code] = line1 - - # 鏇存柊鏁版嵁 - def __update_data(self, code, axes, datas, pre_price, y_max_rate=10.5, cost_rate=None): - def on_pick(event): - ind = event.ind[0] - offset = event.artist.get_offsets()[ind] - x = offset[0] - y = offset[1] - TickFrame.set_mouse_data(x, y, code, axes[4]) - print(f"Clicked on point ({x}, {y})") - - y_max_rate, a = self.__format_max_rate(y_max_rate) - if code not in self.last_max_rate_dict or self.last_max_rate_dict[code] < y_max_rate: - self.last_max_rate_dict[code] = y_max_rate - # 璁剧疆绾靛潗鏍囩殑淇℃伅 - self.set_y_info(code, y_max_rate, axes[4], axes[0], pre_price) - # 鏍囪浠g爜鐩稿叧鐨勪俊鎭� - self.mark_code_info(code, self.last_max_rate_dict[code], axes[0], cost_rate) - - # 鍒犻櫎9:30浠ュ墠鐨勬暟鎹� - for i in range(0, len(datas)): - time_ = datas[i]["created_at"][-8:] - if int(time_.replace(":", "")) >= int("092600"): - datas = datas[i:] - break - # 鍙栨渶杩�14鍒嗛挓鐨勬暟鎹� - for i in range(len(datas) - 1, -1, -1): - time_ = datas[i]["created_at"][-8:] - if tool.trade_time_sub(datas[-1]["created_at"][-8:], time_) >= self.X_DATA_MINIUTES * 60: - datas = datas[i:] - break - - xs = [] - ys_rate = [] - ys_average_rate_1m = [] - ys_average_rate = [] - for data in datas: - xs.append(self.get_x_time_as_seconds(data["created_at"])) - ys_rate.append(data["rate"] * 100) - - ys_average_rate_1m.append(data["average_rate"] * 100 + 1.5) - ys_average_rate.append(data["average_rate"] * 100) - - xticks = [] - xticklabels = [] - # 璁剧疆X杞磋寖鍥翠负09:30:00 鍒�15:00:00 - # x杞磋寖鍥翠负0-15鍒嗛挓 - # end_x = "0000-00-00 " + tool.trade_time_add_second(datas[0]["created_at"][-8:], self.X_RANGE_MINIUTES * 60) - # axes[0].set_xlim(self.get_x_time_as_seconds(datas[0]["created_at"]), self.get_x_time_as_seconds(end_x)) - - xms = axes[0].get_xlim() - yms = axes[0].get_ylim() - # 鏆傛椂涓嶈缃甔鍧愭爣 - # step = (int(xms[1]) - int(xms[0])) // 30 - # for i in range(int(xms[0]), int(xms[1] + 1), step): - # xticks.append(i) - # xticklabels.append("") - # axes[0].set_xticks(xticks) - # axes[0].set_xticklabels(xticklabels) - - axes[1][0].set_data(xs, ys_rate) - - point_x = xs[0] + 1 - point_y = ys_rate[0] - - if code not in self.sell_points_dict: - self.sell_points_dict[code] = queue.Queue() - if code in self.sell_points_dict: - if not self.sell_points_dict[code].empty(): - item = self.sell_points_dict[code].get_nowait() - if item: - points = axes[0].scatter(item[0], item[1], s=15, c='green', zorder=2, picker=5) - # 璁剧疆鐐瑰嚮浜嬩欢 - axes[0].figure.canvas.mpl_connect('pick_event', on_pick) - - # 涓嶉渶瑕佷竴鍒嗛挓鍧囩嚎 - # axes[2][0].set_data(xs, ys_average_rate_1m) - if axes[3]: - axes[3][0].set_data(xs, ys_average_rate) - texts = axes[0].texts - texts[0].set_text("{}% ".format(round(datas[-1]["rate"] * 100, 2))) - if datas[-1]["rate"] > 0: - texts[0].set_color('red') - elif datas[-1]["rate"] == 0: - texts[0].set_color('white') - else: - texts[0].set_color('green') - # texts[1].set_text("{}".format(datas[-1]["created_at"].split(" ")[1])) - texts[1].set_text("") - texts[0].set_x(xms[1] - 130) - texts[0].set_y(yms[1] + yms[1] / 20) - texts[1].set_x(xms[0]) - texts[1].set_y(yms[0] - yms[1] / 9) - - # 鍒犻櫎涔嬪墠 - if code in self.lines: - for key in self.lines[code]: - line = self.lines[code][key] - line.remove() - self.lines.pop(code) - # 鏆傛椂涓嶉渶瑕� 缁樺埗鏈�澶ф渶灏忓潗鏍� - # line_min = axes[0].axhline(min_rate, linestyle='--', color='yellow', lw=0.5) - # line_max = axes[0].axhline(max_rate, linestyle='--', color='yellow', lw=0.5) - # self.lines[code] = {"min": line_min, "max": line_max} - axes[0].figure.canvas.draw() - axes[0].figure.canvas.flush_events() - - def __init__(self, axes_list, codes_info): - self.axes_list = axes_list - self.codes_info = codes_info - self.lines = {} - - def update(self, code, datas): - __start_time = time.time() - pre_price = juejin_core.GPCodeManager().get_pre_prices(code) - # 鑾峰彇褰撳墠鐨勫潗鏍囪寖鍥� - max_price = pre_price - for d in datas: - if abs(d['price'] - pre_price) > abs(max_price - pre_price): - max_price = d['price'] - y_max_rate = round(abs(max_price - pre_price) * 100 / pre_price, 2) - # 灞曠ず鏈�杩戠殑600涓� - # datas = datas[0 - self.X_DATA_MINIUTES * 20:] - # 淇閲忔暟鎹� - last_info = None - for i in range(1, len(datas)): - # 濡傛灉鍦� - if not last_info: - last_info = datas[i] - if int(datas[i]["created_at"][-2:]) - int(datas[i - 1]["created_at"][-2:]) < 0: - last_info = datas[i] - datas[i]['average_rate_1m'] = last_info['average_rate'] - datas[0]['average_rate_1m'] = datas[0]['average_rate'] - - for i in range(0, len(self.codes_info)): - if self.codes_info[i][0] == code: - try: - self.__update_data(code, self.axes_list[i], datas, pre_price, y_max_rate, - self.cost_rate_dict.get(code)) - except Exception as e: - logging.exception(e) - # print("缁樺浘鑺辫垂鏃堕棿:", time.time() - __start_time) - - class mainApp(wx.App): def __refresh(self): - codes = juejin_core.GPCodeManager().get_codes() - last_time = round(time.time()) while True: - try: - code = ths_ocr_util.ocr_ths_code() - if not code: - time.sleep(0.1) - continue - global_datas["pipe"].send(json.dumps({"code": code, "type": "code"})) - # 1s鏇存柊涓�娆� - if round(time.time()) - last_time > 5: - codes = juejin_core.GPCodeManager().get_codes() - last_time = round(time.time()) - for index in range(0, len(codes)): - if codes[index] == code: - self.frame.scrollTo(index) - break - except Exception as e: - # logging.exception(e) - # print(str(e)) - pass + if "expire_time" in ocr_settings and ocr_settings["expire_time"] > time.time(): + print("璇嗗埆") + try: + code = ths_ocr_util.ocr_ths_code() + if not code: + time.sleep(0.1) + continue + global_datas["pipe"].send(json.dumps({"code": code, "type": "code"})) + except Exception as e: + logging.exception(e) + # print(str(e)) + pass time.sleep(0.005) - def __show_float_frame(self): - self.floatFrame.Show() - - def __show_main_frame(self): - self.frame.Show() - def __init_data(self): - try: - codes = CodesSettingFrame.get_position_codes() - if codes: - juejin_core.GPCodeManager().set_codes(codes) - except: - pass + pass def OnInit(self): self.SetAppName(APP_TITLE) self.__init_data() - self.frame = TickFrame() - # self.floatFrame = FloatFrame() - global_datas["tickFrame"] = self.frame - # global_datas["floatFrame"] = self.floatFrame - t1 = threading.Thread(target=lambda: self.__refresh()) # 鍚庡彴杩愯 t1.setDaemon(True) @@ -2195,52 +289,6 @@ # self.__show_main_frame() return True - - -def recieve_tick(pipe): - codeDataManager = code_data_manager.CodeDataManager() - while True: - data = pipe.recv() - if data: - _type = data["type"] - if _type == 0: - # tick鏁版嵁 - data = data["data"] - code = data["code"] - if abs(float(data['rate'])) > 0.4: - continue - try: - if code not in code_datas: - code_datas[code] = [] - except: - continue - create_time = data['created_at'].strftime("%H:%M:%S") - last_time = None - if code_datas[code]: - if type(code_datas[code][-1]["created_at"]) == str: - last_time = code_datas[code][-1]["created_at"].split(" ")[1] - else: - last_time = code_datas[code][-1]["created_at"].strftime("%H:%M:%S") - if tool.trade_time_sub(create_time, "09:30:00") < 0: - TickDataProcess.init_origin_price(code, data['price'], data['rate'] * 100) - else: - if TickDataProcess.process_tick_data(code, create_time, data['price'], data['rate'] * 100): - drawManager.add_sell_point(code, create_time, data['rate'] * 100) - # 濡傛灉鐩稿樊15s灏辨坊鍔犺繘鍘� - if last_time is None or tool.trade_time_sub(create_time, last_time) >= 15: - code_datas[code].append(data) - codeDataManager.save_data(data) - else: - code_datas[code][-1]['rate'] = data['rate'] - code_datas[code][-1]['price'] = data['price'] - code_datas[code][-1]['average_price'] = data['average_price'] - code_datas[code][-1]['average_rate'] = data['average_rate'] - # 鏇存柊鏁版嵁 - try: - drawManager.update(code, code_datas[code]) - # print("鎺ュ彈鍒扮殑tick鏁版嵁:", data) - except: - pass def ths_auto_click(): @@ -2314,9 +362,7 @@ data = json.loads(value) print("鎺ュ彈鍒版暟鎹細", data) type_ = data["type"] - if type_ == "codes_setting": - wx.CallAfter(lambda: CodesSettingFrame(data["pos"], global_datas["tickFrame"].set_codes_success).Show()) - elif type_ == "juejin_setting": + if type_ == "juejin_setting": wx.CallAfter(lambda: JueJinSettingFrame(data["pos"]).Show()) elif type_ == "manage_ths_pos": wx.CallAfter(lambda: THSPositionSettingFrame(data["pos"]).Show()) @@ -2324,38 +370,42 @@ wx.CallAfter(lambda: global_datas["floatFrame"].Show()) elif type_ == "show_main_callback": wx.CallAfter(lambda: global_datas["tickFrame"].Show()) - elif type_ == "set_code": - code = data["code"] - t1 = threading.Thread(target=FloatFrame.setCode(code)) - # 鍚庡彴杩愯 - t1.setDaemon(True) - t1.start() - elif type_ == "juejin_tick_download": - wx.CallAfter(lambda: JueJinTickDataDownloadFrame().Show()) elif type_ == "exit": - try: - jueJinProcess.terminate() - except: - pass + pass wx.CallAfter(lambda: sys.exit()) except Exception as e: logging.exception(e) + + +from pynput.mouse import Listener + +ocr_settings = {} + + +def on_mouse_click(x, y, button, pressed): + """ + 榧犳爣鐐瑰嚮浜嬩欢 + :param x: + :param y: + :param button: + :param pressed: + :return: + """ + if pressed: + # 鐐瑰嚮浜嬩欢杩囧悗1s鍐呭彲鎴浘璇嗗埆浠g爜 + ocr_settings["expire_time"] = time.time() + 1 + + print(f"榧犳爣鍦� ({x}, {y}) 浣嶇疆鎸変笅锛屾寜閽�: {button}") + else: + print(f"榧犳爣鍦� ({x}, {y}) 浣嶇疆閲婃斁锛屾寜閽�: {button}") def run(pipe): global_datas["pipe"] = pipe global p2 p1, p2 = multiprocessing.Pipe() - global jueJinProcess - jueJinProcess = multiprocessing.Process(target=juejin_core.run, args=(p1,)) - jueJinProcess.start() t1 = threading.Thread(target=lambda: recieve_data(pipe)) - # 鍚庡彴杩愯 - t1.setDaemon(True) - t1.start() - - t1 = threading.Thread(target=lambda: recieve_tick(p2)) # 鍚庡彴杩愯 t1.setDaemon(True) t1.start() @@ -2373,6 +423,12 @@ global_datas["app"] = app app.MainLoop() + with Listener(on_click=on_mouse_click) as listener: + listener.join() + + while True: + time.sleep(2) + if __name__ == "__main__": app = mainApp() -- Gitblit v1.8.0