| | |
| | | 华鑫目标代码管理 |
| | | """ |
| | | 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"]) |
| | |
| | | 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, |
| | |
| | | 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}) |
| | | |
| | |
| | | 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): |
| | |
| | | |
| | | |
| | | 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)) |
| | |
| | | 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")) |
| | |
| | | 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: |
| | |
| | | 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: |
| | |
| | | {"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: |
| | |
| | | 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: |
| | |
| | | import datetime |
| | | import hashlib |
| | | import json |
| | | import logging |
| | |
| | | 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 |
| | |
| | | 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: |
| | |
| | | if sign == new_sign: |
| | | return True |
| | | else: |
| | | return False |
| | | return False |
| | | |