Administrator
2023-07-26 3feed17ec1a1bf174d8ddd05741d0eab9b2b13b4
bug修复
9个文件已修改
205 ■■■■ 已修改文件
l2/huaxin/huaxin_target_codes_manager.py 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager_new.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/history_k_data_util.py 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/kpl_api.py 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/kpl_data_manager.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/current_price_process_manager.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/trade_api_server.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/trade_server.py 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/socket_util.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/huaxin/huaxin_target_codes_manager.py
@@ -2,45 +2,98 @@
华鑫目标代码管理
"""
import json
import socket
from code_attribute import global_data_loader
from code_attribute.code_data_util import ZYLTGBUtil
from db import redis_manager
from utils import tool
from third_data import kpl_data_manager, kpl_api
from utils import tool, global_util, socket_util
redisManager = redis_manager.RedisManager(0)
def __get_redis():
    return redisManager.getRedis()
# 华鑫Level2订阅代码管理
class HuaXinL2SubscriptCodesManager:
    __L2_CODE_KEY = "huaxin_l2_code_list"
    __SUBSCRIPT_KEY = "huaxin_subscript_codes"
    @classmethod
    def __get_redis(cls):
        return redisManager.getRedis()
__L2_CODE_KEY = "huaxin_l2_code_list"
    @classmethod
    def clear(cls):
        cls.__get_redis().delete(cls.__L2_CODE_KEY)
__SUBSCRIPT_KEY = "huaxin_subscript_codes"
    @classmethod
    def push(cls, datas):
        cls.__get_redis().lpush(cls.__L2_CODE_KEY, json.dumps(datas))
    @classmethod
    def pop(cls):
        val = cls.__get_redis().lpop(cls.__L2_CODE_KEY)
        if val:
            return json.loads(val)
        return val
def clear():
    __get_redis().delete(__L2_CODE_KEY)
    # 设置订阅代码
    @classmethod
    def save_subscript_codes(cls, codes):
        cls.__get_redis().setex(cls.__SUBSCRIPT_KEY, tool.get_expire(), json.dumps(codes))
def push(datas):
    __get_redis().lpush(__L2_CODE_KEY, json.dumps(datas))
def pop():
    val = __get_redis().lpop(__L2_CODE_KEY)
    if val:
    # 获取订阅的代码
    @classmethod
    def get_subscript_codes(cls):
        val = cls.__get_redis().get(cls.__SUBSCRIPT_KEY)
        if not val:
            return []
        return json.loads(val)
    return val
# 设置订阅代码
def save_subscript_codes(codes):
    __get_redis().setex(__SUBSCRIPT_KEY, tool.get_expire(), json.dumps(codes))
# 根据华鑫L2选出目标代码
class HuaXinL1TargetCodesManager:
    @classmethod
    def set_level_1_codes_datas(cls, datas):
        yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes()
        # 订阅的代码
        flist = []
        for d in datas:
            code = d[0]
            # 格式 (代码,现价,涨幅,量,更新时间)
            # 剔除昨日涨停的票
            if code in yesterday_codes:
                continue
            # 剔除股价大于40块的票
            if d[1] > 40:
                continue
            # 获取自由流通市值
            if code not in global_util.zyltgb_map:
                zylt = ZYLTGBUtil.get(code)
                if zylt:
                    global_util.zyltgb_map[code] = zylt
            if code not in global_util.zyltgb_map:
                zylt = kpl_api.getZYLTAmount(code)
                if zylt:
                    # 保存自由流通股本
                    ZYLTGBUtil.save(code, zylt // 10000, 1)
                    global_util.zyltgb_map[code] = int(zylt)
            zyltgb = 0
            if code in global_util.zyltgb_map:
                zyltgb = global_util.zyltgb_map[code]
# 获取订阅的代码
def get_subscript_codes():
    val = __get_redis().get(__SUBSCRIPT_KEY)
    if not val:
        return []
    return json.loads(val)
            fitem = {"code": code, "price": d[1], "volume": d[3] // 10000, "volumeUnit": 1, "time": "00:00:00",
                     "zyltgb": zyltgb, "zyltgbUnit": 1}
            flist.append(fitem)
        fdata = {"type": 22, "data": flist}
        addr, port = "", 9001
        sk = socket.socket()  # 生成socket,连接server
        sk.connect((addr, port))
        sk.sendall(socket_util.load_header(json.dumps(fdata).encode('utf8')))
        result, header = socket_util.recv_data(sk)
        if result:
            result = json.loads(result)
            if result["code"] != 0:
                raise Exception(result["msg"])
l2/l2_data_manager_new.py
@@ -852,8 +852,7 @@
            if zyltgb >= 80 * 100000000:
                return True, False, "{9:30:00-9:35:00}自由市值≥80亿"
        # 判断板块
        yesterday_limit_up_data_records = kpl_data_manager.get_current_limit_up_data_records(1)[0][1]
        yesterday_codes = set([x[0] for x in yesterday_limit_up_data_records])
        yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes()
        plate_can_buy, msg = CodePlateKeyBuyManager.can_buy(code,
                                                            kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas,
                                                            kpl_data_manager.KPLLimitUpDataRecordManager.total_datas,
third_data/history_k_data_util.py
@@ -58,6 +58,12 @@
        return cls.__request("current", {"symbols": symbols, "fields": fields})
    @classmethod
    def get_exchanges_codes(cls, exchanges, sec_types, skip_suspended, skip_st, fields):
        return cls.__request("get_instruments",
                             {"exchanges": exchanges, "sec_types": sec_types, "skip_suspended": skip_suspended,
                              "skip_st": skip_st, "fields": fields})
    @classmethod
    def get_previous_trading_date(cls, exchange, date):
        return cls.__request("get_previous_trading_date", {"exchange": exchange, "date": date})
@@ -133,6 +139,19 @@
            data = JueJinHttpApi.current(symbols=",".join(symbols), fields='')
            return data
        # 返回指定日期的上个交易日
    # 获取交易所的代码
    @classmethod
    def get_exchanges_codes(cls, exchanges):
        if constant.JUEJIN_LOCAL_API:
            account_id, s_id, token = cls.getJueJinAccountInfo()
            gmapi.set_token(token)
            return gmapi.get_instruments(exchanges=exchanges, sec_types=[1], skip_suspended=True, skip_st=True,
                                         fields="symbol,sec_type,sec_id,sec_name,listed_date,sec_level,is_suspended,pre_close")
        else:
            return JueJinHttpApi.get_exchanges_codes(exchanges=exchanges, sec_types=[1], skip_suspended=True,
                                                     skip_st=True,
                                                     fields="symbol,sec_type,sec_id,sec_name,listed_date,sec_level,is_suspended,pre_close")
    @classmethod
    def get_previous_trading_date(cls, date):
@@ -244,4 +263,17 @@
if __name__ == "__main__":
    print(JueJinApi.get_gp_current_info(["000333", "600686"]))
    constant.JUEJIN_LOCAL_API = False
    list_ = JueJinApi.get_exchanges_codes(["SHSE","SZSE"])
    fdatas = []
    for d in list_:
        if d["sec_id"].find("60") != 0 and d["sec_id"].find("00") != 0:
            continue
        if d["sec_level"] != 1:
            continue
        if d["pre_close"] * 1.1 > 40:
            continue
        if (d["listed_date"] + datetime.timedelta(days=100)).timestamp() > datetime.datetime.now().timestamp():
            continue
        fdatas.append(d)
    print(len(fdatas))
third_data/kpl_api.py
@@ -78,3 +78,20 @@
    result = response.text
    result = json.loads(result)
    return result.get("ListJX")
# 获取自由流通市值
def getZYLTAmount(code):
    data = f"a=GetStockPanKou_Narrow&apiv=w32&c=StockL2Data&VerSion=5.8.0.2&State=1&PhoneOSNew=1&DeviceID=a38adabd-99ef-3116-8bb9-6d893c846e23&StockID={code}&"
    response = __base_request("https://apphq.longhuvip.com/w1/api/index.php", data=data)
    if response.status_code != 200:
        raise Exception("请求出错")
    result = response.text
    result = json.loads(result)
    if "real" in result:
        return result["real"].get("actualcirculation_value")
    return None
if __name__ == "__main__":
    print(getZYLTAmount("000333"))
third_data/kpl_data_manager.py
@@ -292,6 +292,11 @@
    return fresults
def get_yesterday_limit_up_codes():
    yesterday_limit_up_data_records = get_current_limit_up_data_records(1)[0][1]
    yesterday_codes = set([x[0] for x in yesterday_limit_up_data_records])
    return yesterday_codes
if __name__ == "__main__":
    fresults = get_current_limit_up_data_records(2)
    for d in fresults:
trade/current_price_process_manager.py
@@ -137,7 +137,7 @@
                        limit_up_price = round(float(limit_up_price), 2)
                        min_volume = int(round(50 * 10000 / limit_up_price))
                        add_datas.append((d, min_volume, limit_up_price))
                    huaxin_target_codes_manager.push(add_datas)
                    huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.push(add_datas)
            except Exception as e:
                logging.exception(e)
        else:
trade/huaxin/trade_api_server.py
@@ -243,7 +243,7 @@
                            {"code": 0, "data": {}, "msg": ""})
                    elif type_ == "get_huaxin_subscript_codes":
                        # 获取华鑫订阅的代码
                        codes = huaxin_target_codes_manager.get_subscript_codes()
                        codes = huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.get_subscript_codes()
                        fresults = []
                        if codes:
                            for code in codes:
@@ -351,7 +351,7 @@
def __set_target_codes():
    while True:
        try:
            datas = huaxin_target_codes_manager.pop()
            datas = huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.pop()
            if datas:
                codes = [d[0] for d in datas]
                for code in codes:
trade/huaxin/trade_server.py
@@ -1,3 +1,4 @@
import datetime
import hashlib
import json
import logging
@@ -14,11 +15,13 @@
from l2 import l2_data_manager_new, l2_log, code_price_manager, l2_data_util, l2_data_manager, transaction_progress
from l2.cancel_buy_strategy import HourCancelBigNumComputer, LCancelBigNumComputer, DCancelBigNumComputer
from l2.huaxin import huaxin_target_codes_manager
from l2.huaxin.huaxin_target_codes_manager import HuaXinL1TargetCodesManager
from l2.l2_data_manager_new import L2TradeDataProcessor
from log_module.log import hx_logger_l2_upload, hx_logger_contact_debug, hx_logger_trade_callback, \
    hx_logger_l2_orderdetail, hx_logger_l2_transaction, hx_logger_l2_market_data, logger_l2_trade_buy_queue
from third_data import block_info, kpl_api
from third_data import block_info, kpl_api, kpl_data_manager
from third_data.code_plate_key_manager import KPLCodeJXBlockManager
from third_data.history_k_data_util import JueJinApi
from trade import deal_big_money_manager, current_price_process_manager
from trade.huaxin import huaxin_trade_api as trade_api, trade_api_server, huaxin_trade_api, huaxin_trade_data_update
@@ -267,7 +270,34 @@
                            datas = data["data"]
                            print("l2_subscript_codes", data_json)
                            # 订阅的代码
                            huaxin_target_codes_manager.save_subscript_codes(datas)
                            huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.save_subscript_codes(datas)
                        finally:
                            sk.sendall(socket_util.load_header(json.dumps({"code": 0}).encode(encoding='utf-8')))
                    elif data_json["type"] == "get_level1_codes":
                        # 获取level1的代码
                        list_ = JueJinApi.get_exchanges_codes(["SHSE", "SZSE"])
                        fdatas = []
                        for d in list_:
                            if d["sec_id"].find("60") != 0 and d["sec_id"].find("00") != 0:
                                continue
                            if d["sec_level"] != 1:
                                continue
                            if d["pre_close"] * 1.1 > 40:
                                continue
                            if (d["listed_date"] + datetime.timedelta(
                                    days=100)).timestamp() > datetime.datetime.now().timestamp():
                                continue
                            fdatas.append(d["sec_id"])
                        sk.sendall(socket_util.load_header(json.dumps({"code": 0, "data":fdatas}).encode(encoding='utf-8')))
                    elif data_json["type"] == "set_target_codes":
                        try:
                            data = data_json["data"]
                            datas = data["data"]
                            print("set_target_codes", data_json)
                            HuaXinL1TargetCodesManager.set_level_1_codes_datas(datas)
                        except Exception as e:
                            logging.exception(e)
                        finally:
                            sk.sendall(socket_util.load_header(json.dumps({"code": 0}).encode(encoding='utf-8')))
                else:
utils/socket_util.py
@@ -72,4 +72,5 @@
    if sign == new_sign:
        return True
    else:
        return False
        return False