Administrator
2023-07-10 d1b63cc3b79e3aa07317a32690a03c59cea9a3d4
华鑫适配
4个文件已修改
1个文件已添加
247 ■■■■ 已修改文件
l2/l2_data_manager_new.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/huaxin_trade_record_manager.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/huaxin/trade_server.py 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/huaxin_util.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager_new.py
@@ -789,13 +789,14 @@
        # if volume_rate_info[0] < 0.4:
        #     return False, True, f"量大于40%才下单,量比:{volume_rate_info[0]}"
        # 是否有K线形态(有K线形态或者天量大阳)
        has_k_format = score_info[1][3][6][0] or score_info[1][3][7][0]
        if not has_k_format:
            return False, True, f"无K线形态"
        # 是否有K线形态(有K线形态或者天量大阳),10点后才需要判断是否有K线形态与分值
        if int(tool.get_now_time_str().replace(":","")) > int("100000"):
            has_k_format = score_info[1][3][6][0] or score_info[1][3][7][0]
            if not has_k_format:
                return False, True, f"无K线形态"
        if score_index < 0:
            return False, True, f"分值:{score}未达到需要买入的分数线"
            if score_index < 0:
                return False, True, f"分值:{score}未达到需要买入的分数线"
        return True, False, ""
    @classmethod
main.py
@@ -14,16 +14,22 @@
# 交易服务
from third_data import data_server
from trade.huaxin import trade_server
from trade.huaxin import trade_server, trade_api_server
def createTradeServer():
    print("create TradeServer")
    # 初始化参数
    global_data_loader.init()
    # 数据服务
    t1 = threading.Thread(target=createDataServer, daemon=True)
    t1.start()
    # 交易接口服务
    t1 = threading.Thread(target=trade_api_server.run, daemon=True)
    t1.start()
    # 交易服务
    trade_server.run()
trade/huaxin/huaxin_trade_record_manager.py
@@ -10,6 +10,7 @@
from db import mysql_data, redis_manager
from third_data.history_k_data_util import HistoryKDatasUtils
# 委托列表
class DelegateRecordManager:
    @classmethod
@@ -66,11 +67,17 @@
            pass
    @classmethod
    def list_by_day(cls, day, min_update_time):
    def list_by_day(cls, day, min_update_time, orderStatus=[]):
        mysqldb = mysql_data.Mysqldb()
        try:
            where_list = [f"r.insertDate='{day}'"]
            if min_update_time:
                where_list.append(f"updateTime > '{min_update_time}'")
            if orderStatus:
                ss = " or ".join([f"orderStatus = {k}" for k in orderStatus])
                where_list.append(f"({ss})")
            results = mysqldb.select_all(
                f"select * from hx_trade_delegate_record r where r.insertDate='{day}' and updateTime > '{min_update_time}' order by createTime")
                f"select * from hx_trade_delegate_record r where {' and '.join(where_list)} order by createTime")
            # 转dict
            key_list = ["orderLocalID", "securityID", "securityName", "direction", "orderSysID", "insertTime",
                        "insertDate", "acceptTime", "cancelTime", "limitPrice", "turnover", "volume", "volumeTraded",
@@ -239,7 +246,6 @@
            return fresults
        finally:
            pass
# 资金管理
trade/huaxin/trade_server.py
@@ -158,117 +158,6 @@
                        datas = data["data"]
                        hx_logger_l2_transaction.info(f"{code}#{datas}")
                        sk.sendall(json.dumps({"code": 0}).encode(encoding='utf-8'))
                    # ------客户端请求接口-------
                    elif data_json["type"] == 'buy':
                        # 验证签名
                        if not socket_util.is_client_params_sign_right(data_json):
                            sk.sendall(
                                socket_util.load_header(
                                    json.dumps({"code": constant.RESPONSE_CODE_SIGIN_ERROR, "msg": "签名错误"}).encode(
                                        "utf-8")))
                            continue
                        codes_data = data_json["data"]
                        code = codes_data["code"]
                        volume = codes_data["volume"]
                        price = codes_data["price"]
                        try:
                            # 验证签名是否正确
                            result = trade_api.order(trade_api.TRADE_DIRECTION_BUY, code, volume,
                                                     round(float(price), 2))
                            if result:
                                resultJSON = json.loads(result)
                                if resultJSON['code'] == 0:
                                    # TODO 下单成功保存下单结果数据
                                    pass
                                else:
                                    # 返回下单失败
                                    raise Exception("下单失败")
                        except Exception as e:
                            pass
                        print("---下单结果----")
                        sk.sendall(result.encode("utf-8"))
                    elif data_json["type"] == 'cancel_order':
                        # 验证签名
                        if not socket_util.is_client_params_sign_right(data_json):
                            sk.sendall(
                                socket_util.load_header(
                                    json.dumps({"code": constant.RESPONSE_CODE_SIGIN_ERROR, "msg": "签名错误"}).encode(
                                        "utf-8")))
                            continue
                        codes_data = data_json["data"]
                        code = codes_data["code"]
                        orderSysID = codes_data["orderSysID"]
                        try:
                            result = trade_api.cancel_order(trade_api.TRADE_DIRECTION_BUY, code, orderSysID, True)
                            print("---撤单结果----")
                            print(result)
                            sk.sendall(result.encode("utf-8"))
                        except Exception as e:
                            sk.sendall(
                                socket_util.load_header(
                                    json.dumps({"code": 1, "msg": str(e)}).encode(
                                        "utf-8")))
                    elif data_json["type"] == 'sell':
                        # 验证签名
                        if not socket_util.is_client_params_sign_right(data_json):
                            sk.sendall(
                                socket_util.load_header(
                                    json.dumps({"code": constant.RESPONSE_CODE_SIGIN_ERROR, "msg": "签名错误"}).encode(
                                        "utf-8")))
                            continue
                        codes_data = data_json["data"]
                        code = codes_data["code"]
                        volume = codes_data["volume"]
                        price = codes_data["price"]
                        price_type = codes_data["price_type"]
                        result = trade_api.order(trade_api.TRADE_DIRECTION_SELL, code, volume, price,
                                                 price_type=price_type)
                        print("---卖出结果----")
                        print(result)
                    # 查询委托列表
                    elif data_json["type"] == 'test':
                        # 卖出
                        # trade_api.order(trade_api.TRADE_DIRECTION_SELL, "600854", 100, 5.45)
                        result = trade_api.get_deal_list()
                        print("\n\n---成交列表----")
                        for d in result["data"]:
                            print(d)
                        result = trade_api.get_delegate_list(True)
                        print("\n\n---可撤委托----")
                        for d in result["data"]:
                            print(d)
                        result = trade_api.get_delegate_list(False)
                        print("\n\n---全部委托----")
                        for d in result["data"]:
                            print(d)
                        result = trade_api.get_position_list()
                        print("\n\n---持仓列表----")
                        for d in result["data"]:
                            print(d)
                        result = trade_api.get_money()
                        print("\n\n---账户列表----")
                        for d in result["data"]:
                            print(d)
                    elif data_json["type"] == 'test_l2':
                        codes_data = data_json["data"]
                        result = trade_api.set_l2_codes_data(codes_data)
                        print("\n\n---L2设置结果----")
                        print(result)
                    else:
                        while True:
                            r = sk.recv(1024 * 100)
                            if r:
                                print(r.decode('utf-8'))
                                sk.sendall("123".encode('utf-8'))
                        # result = trade_server_processor.process(data_json["data"])
                        # sk.sendall(json.dumps({"code": 0}).encode(encoding='utf-8'))
                else:
                    # 断开连接
                    break
@@ -281,84 +170,16 @@
        super().finish()
def read_trade_data_queue():
    while True:
        try:
            data = trade_data_request_queue.get()
            if data:
                type_ = data["type"]
                hx_logger_trade_debug.info(f"获取交易数据开始:{type_}")
                if type_ == "delegate_list":
                    data = huaxin_trade_api.get_delegate_list(False)
                    dataJSON = json.loads(data)
                    if dataJSON["data"]["code"] == 0:
                        data = dataJSON["data"]["data"]
                        huaxin_trade_record_manager.DelegateRecordManager.add(data)
                elif type_ == "money":
                    data = huaxin_trade_api.get_money()
                    dataJSON = json.loads(data)
                    if dataJSON["data"]["code"] == 0:
                        data = dataJSON["data"]["data"]
                        huaxin_trade_record_manager.MoneyManager.save_data(data)
                elif type_ == "deal_list":
                    data = huaxin_trade_api.get_deal_list()
                    dataJSON = json.loads(data)
                    if dataJSON["data"]["code"] == 0:
                        data = dataJSON["data"]["data"]
                        huaxin_trade_record_manager.DealRecordManager.add(data)
                hx_logger_trade_debug.info(f"获取交易数据成功:{type_}")
        except Exception as e:
            hx_logger_trade_debug.exception(e)
        finally:
            # 有1s的间隔
            time.sleep(1)
def __set_target_codes():
    while True:
        try:
            datas = huaxin_target_codes_manager.pop()
            if datas:
                result = huaxin_trade_api.set_l2_codes_data(datas)
                print("设置L2代码结果:", result)
        except Exception as e:
            logging.exception(e)
        finally:
            time.sleep(1)
def run():
    # 拉取交易信息
    t1 = threading.Thread(target=lambda: read_trade_data_queue(), daemon=True)
    t1.start()
    t1 = threading.Thread(target=lambda: __set_target_codes(), daemon=True)
    t1.start()
    print("create TradeServer")
    laddr = "0.0.0.0", 10008
    tcpserver = MyThreadingTCPServer(laddr, MyBaseRequestHandle)  # 注意:参数是MyBaseRequestHandle
    # tcpserver.handle_request()  # 只接受一个客户端连接
    tcpserver.serve_forever()
def test1():
    r = (trade_api.ClientSocketManager.acquire_client(trade_api.ClientSocketManager.CLIENT_TYPE_TRADE))
    print("test1", r)
    time.sleep(random.randint(0, 3))
    if r:
        trade_api.ClientSocketManager.release_client(r[0])
def test2():
    time.sleep(random.randint(0, 3))
    print("test2", trade_api.ClientSocketManager.acquire_client(trade_api.ClientSocketManager.CLIENT_TYPE_TRADE))
if __name__ == "__main__":
        # l2.l2_data_util.save_l2_data(code, None, datas)
    # l2.l2_data_util.save_l2_data(code, None, datas)
    # ClientSocketManager.add_client(ClientSocketManager.CLIENT_TYPE_TRADE, "1", None)
    # ClientSocketManager.add_client(ClientSocketManager.CLIENT_TYPE_TRADE, "2", None)
utils/huaxin_util.py
New file
@@ -0,0 +1,29 @@
# 报单状态
TORA_TSTP_OST_Cached = 0  # 预埋
TORA_TSTP_OST_Unknown = 1  # 未知
TORA_TSTP_OST_Accepted = 2  # 交易所已接收
TORA_TSTP_OST_PartTraded = 3  # 部分成交
TORA_TSTP_OST_AllTraded = 4  # 全部成交
TORA_TSTP_OST_PartTradeCanceled = 5  # 部成部撤
TORA_TSTP_OST_AllCanceled = 6  # 全部撤单
TORA_TSTP_OST_Rejected = 7  # 交易所已拒绝
TORA_TSTP_OST_SendTradeEngine = '#'  # 发往交易核心
# 报单价格条件
TORA_TSTP_OPT_AnyPrice = 1  # 任意价
TORA_TSTP_OPT_LimitPrice = 2  # 限价
TORA_TSTP_OPT_BestPrice = 3  # 最优价
TORA_TSTP_OPT_FixPrice = 4  # 盘后定价
TORA_TSTP_OPT_FiveLevelPrice = 5  # 五档价
TORA_TSTP_OPT_HomeBestPrice = 6  # 本方最优
# 买卖方向
TORA_TSTP_D_Buy = 0  # 买入
TORA_TSTP_D_Sell = 1  # 卖出
# 交易所代码
TORA_TSTP_EXD_COMM = 0  # 通用(内部使用)
TORA_TSTP_EXD_SSE = 1  # 上海交易所
TORA_TSTP_EXD_SZSE = 2  # 深圳交易所
TORA_TSTP_EXD_HK = 3  # 香港交易所
TORA_TSTP_EXD_BSE = 4  # 北京证券交易所