| | |
| | | OPERRATE_SET = 1 # 设置 |
| | | OPERRATE_DELETE = 2 # 删除 |
| | | OPERRATE_GET = 3 # 获取 |
| | | OPERRATE_ADD = 4 # 添加 |
| | | |
| | | # 代码名单类型 |
| | | CODE_LIST_WHITE = "white" |
| | | CODE_LIST_BLACK = "black" |
| | | CODE_LIST_WANT = "want" |
| | | CODE_LIST_PAUSE_BUY = "pause_buy" |
| | | |
| | | CODE_LIST_MUST_BUY = "must_buy" |
| | | CODE_LIST_GREEN = "green" |
| | | # 类型 |
| | | API_TYPE_TRADE = "trade" # 交易 |
| | | API_TYPE_TRADE_STATE = "trade_state" # 交易状态 |
| | | API_TYPE_TRADE_MODE = "trade_mode" # 交易模式 |
| | | API_TYPE_SELL_RULE = "sell_rule" # 卖出规则 |
| | | API_TYPE_CODE_LIST = "code_list" # 代码名单 |
| | | API_TYPE_EXPORT_L2 = "export_l2" # 导出L2数据 |
| | | API_TYPE_INIT = "init" # 初始化 |
| | |
| | | API_TYPE_CODE_ATRRIBUTE = "code_attribute" # 代码属性 |
| | | API_TYPE_CODE_TRADE_STATE = "code_trade_state" # 代码交易状态 |
| | | API_TYPE_GET_ENV = "get_env" # 获取环境信息 |
| | | API_TYPE_SYNC_L1_TARGET_CODES = "sync_l1_subscript_codes" # 同步L1需要订阅的代码 |
| | | API_TYPE_SYSTEM_LOG = "system_log" # 系统日志 |
| | | API_TYPE_GET_FROM_DATA_SERVER = "get_from_data_server" # 从数据服务器拉取数据 |
| | | API_TYPE_CODE_TRADE_INFO = "code_trade_info" # 代码交易信息 |
| | | API_TYPE_CODE_L2_LISTEN_ACTIVE_COUNT = "l2_listen_active_count" # L2有效监听数量 |
| | | API_TYPE_SAVE_RUNNING_DATA = "save_running_data" # 保存运行时数据 |
| | | API_TYPE_GET_CODE_POSITION_INFO = "get_code_position_info" # 获取代码持仓信息 |
| | | API_TYPE_COMMON_REQUEST = "common_request" # 通用请求 |
| | | # 超时时间2s |
| | | TIMEOUT = 5.0 |
| | | |
| | |
| | | raise Exception(f"读取内容超时: request_id={request_id}") |
| | | finally: |
| | | pass |
| | | else: |
| | | try: |
| | | # 如果不是阻塞请求需要释放客户端 |
| | | ClientSocketManager.release_client(client[0]) |
| | | except: |
| | | pass |
| | | |
| | | return None |
| | | |
| | |
| | | # blocking是否阻塞进程 |
| | | def trade_order(direction, code, volume, price, price_type=2, blocking=True): |
| | | print("客户端", ClientSocketManager.socket_client_dict) |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | {"type": API_TYPE_TRADE, "trade_type": 1, |
| | | "direction": direction, |
| | | "code": code, |
| | | "volume": volume, |
| | | "price_type": price_type, |
| | | "price": price, "sinfo": f"order_{code}_{round(time.time() * 1000)}"}) |
| | | request_id, client = __request( |
| | | ClientSocketManager.CLIENT_TYPE_TRADE if direction == 1 else ClientSocketManager.CLIENT_TYPE_TRADE_SELL, |
| | | {"type": API_TYPE_TRADE, "trade_type": 1, |
| | | "direction": direction, |
| | | "code": code, |
| | | "volume": volume, |
| | | "price_type": price_type, |
| | | "price": price, "sinfo": f"order_{code}_{round(time.time() * 1000)}"}) |
| | | |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | |
| | | "code": code, |
| | | "accountID": accountID, |
| | | "orderSysID": orderSysID, |
| | | "sinfo": f"cancel_order_{code}_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"cb_{code}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 设置交易状态 |
| | | def set_trade_state(state, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_TRADE_STATE, "operate": OPERRATE_SET, |
| | | "state": state, |
| | | "sinfo": f"cb_{API_TYPE_TRADE_STATE}_{round(time.time() * 1000)}"}) |
| | |
| | | |
| | | # 获取交易状态 |
| | | def get_trade_state(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_TRADE_STATE, "operate": OPERRATE_GET, |
| | | "sinfo": f"cb_{API_TYPE_TRADE_STATE}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | |
| | | |
| | | # 设置交易模式 |
| | | def set_trade_mode(mode, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_TRADE_MODE, "operate": OPERRATE_SET, "mode": mode, |
| | | "sinfo": f"cb_{API_TYPE_TRADE_MODE}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | |
| | | |
| | | # 获取交易模式 |
| | | def get_trade_mode(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_TRADE_MODE, "operate": OPERRATE_GET, |
| | | "sinfo": f"cb_{API_TYPE_TRADE_MODE}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | |
| | | |
| | | # -----代码名单操作---- |
| | | def add_code_list(code, code_list_type, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_LIST, "code_list_type": code_list_type, "code": code, |
| | | "operate": OPERRATE_SET, |
| | | "sinfo": f"cb_{API_TYPE_CODE_LIST}_{round(time.time() * 1000)}"}) |
| | |
| | | |
| | | |
| | | def remove_code_list(code, code_list_type, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_LIST, "code_list_type": code_list_type, "code": code, |
| | | "operate": OPERRATE_DELETE, |
| | | "sinfo": f"cb_{API_TYPE_CODE_LIST}_{round(time.time() * 1000)}"}) |
| | |
| | | |
| | | |
| | | def get_code_list(code_list_type, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_LIST, "code_list_type": code_list_type, |
| | | "operate": OPERRATE_GET, |
| | | "sinfo": f"cb_{API_TYPE_CODE_LIST}_{round(time.time() * 1000)}"}) |
| | |
| | | |
| | | # -----导出L2数据---- |
| | | def export_l2_data(code, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_EXPORT_L2, "code": code, |
| | | "sinfo": f"cb_{API_TYPE_CODE_LIST}_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"cb_{API_TYPE_EXPORT_L2}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # -----每日初始化---- |
| | | def everyday_init(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_INIT, |
| | | "sinfo": f"cb_{API_TYPE_CODE_LIST}_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"cb_{API_TYPE_INIT}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 刷新交易数据 |
| | | def refresh_trade_data(type, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | def refresh_trade_data(type, blocking=True, client_type=ClientSocketManager.CLIENT_TYPE_COMMON): |
| | | request_id, client = __request(client_type, |
| | | {"type": API_TYPE_REFRESH_TRADE_DATA, "ctype": type, |
| | | "sinfo": f"update_trade_data_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"cb_{API_TYPE_REFRESH_TRADE_DATA}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 获取代码属性 |
| | | def get_code_attribute(code, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_ATRRIBUTE, "code": code, |
| | | "sinfo": f"update_trade_data_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"cb_{API_TYPE_CODE_ATRRIBUTE}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 获取代码交易状态 |
| | | def get_code_trade_state(code, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_TRADE_STATE, "code": code, |
| | | "sinfo": f"update_trade_data_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"{API_TYPE_CODE_TRADE_STATE}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 获取环境信息 |
| | | def get_env_info(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_GET_ENV, |
| | | "sinfo": f"update_trade_data_{round(time.time() * 1000)}"}) |
| | | "sinfo": f"cb_{API_TYPE_GET_ENV}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 获取环境信息 |
| | | def sync_l1_subscript_codes(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_SYNC_L1_TARGET_CODES, |
| | | "sinfo": f"cb_{API_TYPE_SYNC_L1_TARGET_CODES}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 获取系统日志 |
| | | def get_system_logs(start_index, count, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_SYSTEM_LOG, "start_index": start_index, "count": count, |
| | | "sinfo": f"cb_{API_TYPE_SYSTEM_LOG}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | # 拉取data_server的内容 |
| | | def get_from_data_server(path, params, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_GET_FROM_DATA_SERVER, "path": path, "params": params, |
| | | "sinfo": f"cb_{API_TYPE_GET_FROM_DATA_SERVER}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking, timeout=30) |
| | | |
| | | |
| | | # 获取代码的交易信息 |
| | | def get_code_trade_info(code, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_TRADE_INFO, "code": code, |
| | | "sinfo": f"cb_{API_TYPE_CODE_TRADE_INFO}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking, timeout=30) |
| | | |
| | | |
| | | # L2有效监听数量 |
| | | def get_l2_listen_active_count(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_CODE_L2_LISTEN_ACTIVE_COUNT, |
| | | "sinfo": f"cb_{API_TYPE_CODE_L2_LISTEN_ACTIVE_COUNT}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking, timeout=30) |
| | | |
| | | |
| | | # 保存正在运行的数据 |
| | | def save_running_data(blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_COMMON, |
| | | {"type": API_TYPE_SAVE_RUNNING_DATA, |
| | | "sinfo": f"cb_{API_TYPE_SAVE_RUNNING_DATA}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking, timeout=30) |
| | | |
| | | |
| | | # 保存正在运行的数据 |
| | | def sell_rule(operate, data={}, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_SELL, |
| | | {"type": API_TYPE_SELL_RULE, "operate": operate, "data": data, |
| | | "sinfo": f"cb_{API_TYPE_SELL_RULE}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking, timeout=10) |
| | | |
| | | |
| | | # 获取代码持仓信息 |
| | | def get_code_position_info(code, blocking=True): |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_SELL, |
| | | {"type": API_TYPE_GET_CODE_POSITION_INFO, "code": code, |
| | | "sinfo": f"cb_{API_TYPE_GET_CODE_POSITION_INFO}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | def common_request(params={}, blocking=True, client_type=ClientSocketManager.CLIENT_TYPE_COMMON): |
| | | data = {"type": API_TYPE_COMMON_REQUEST, |
| | | "sinfo": f"cb_{API_TYPE_COMMON_REQUEST}_{round(time.time() * 1000)}"} |
| | | if params: |
| | | for k in params: |
| | | data[k] = params[k] |
| | | request_id, client = __request(client_type, data) |
| | | return __read_response(client, request_id, blocking, timeout=10) |
| | | |
| | | |
| | | ###############可转债################# |
| | | def trade_order_for_cb(direction, code, volume, price, price_type=2, blocking=True): |
| | | """ |
| | | 交易 |
| | | :param direction: 1-买 2-卖 |
| | | :param code: 代码 |
| | | :param volume: 量 |
| | | :param price: 价格 |
| | | :param price_type: 价格类型 |
| | | :param blocking: 是否阻塞 |
| | | :return: |
| | | """ |
| | | request_id, client = __request( |
| | | ClientSocketManager.CLIENT_TYPE_TRADE_CB, |
| | | {"type": API_TYPE_TRADE, "trade_type": 1, |
| | | "direction": direction, |
| | | "code": code, |
| | | "volume": volume, |
| | | "price_type": price_type, |
| | | "price": price, "sinfo": f"order_{code}_{round(time.time() * 1000)}"}) |
| | | |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | def get_position_for_cb(code=None, blocking=True): |
| | | """ |
| | | 获取持仓 |
| | | :param code: |
| | | :param blocking: |
| | | :return: |
| | | """ |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_CB, |
| | | {"type": API_TYPE_GET_CODE_POSITION_INFO, "code": code, |
| | | "sinfo": f"cb_{API_TYPE_GET_CODE_POSITION_INFO}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | def refresh_trade_data_for_cb(refresh_type, blocking=True): |
| | | """ |
| | | 刷新交易数据 |
| | | :param refresh_type: |
| | | :param blocking: |
| | | :return: |
| | | """ |
| | | |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_CB, |
| | | {"type": API_TYPE_REFRESH_TRADE_DATA, "ctype": refresh_type, |
| | | "sinfo": f"cb_{API_TYPE_REFRESH_TRADE_DATA}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | def get_account_money_for_cb(blocking=True): |
| | | """ |
| | | 获取账户资金情况 |
| | | :param code: |
| | | :param blocking: |
| | | :return: |
| | | """ |
| | | return common_request_for_cb({"ctype": "get_account_money"}, blocking) |
| | | |
| | | |
| | | def refresh_trade_data_for_cb(type_, blocking=True): |
| | | """ |
| | | 刷新可转债交易数据 |
| | | :param code: |
| | | :param blocking: |
| | | :return: |
| | | """ |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_CB, |
| | | {"type": API_TYPE_REFRESH_TRADE_DATA, "ctype": type_, |
| | | "sinfo": f"cb_{API_TYPE_REFRESH_TRADE_DATA}_{round(time.time() * 1000)}"}) |
| | | return __read_response(client, request_id, blocking) |
| | | |
| | | |
| | | def common_request_for_cb(params, blocking=True): |
| | | """ |
| | | 通用请求 |
| | | :param params: |
| | | :param blocking: |
| | | :return: |
| | | """ |
| | | data = {"type": API_TYPE_COMMON_REQUEST, |
| | | "sinfo": f"cb_{API_TYPE_COMMON_REQUEST}_{round(time.time() * 1000)}"} |
| | | if params: |
| | | for k in params: |
| | | data[k] = params[k] |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_CB, data) |
| | | return __read_response(client, request_id, blocking, timeout=10) |
| | | |
| | | |
| | | def common_request_for_low_suction(params, blocking=True): |
| | | """ |
| | | 通用请求 |
| | | :param params: |
| | | :param blocking: |
| | | :return: |
| | | """ |
| | | data = {"type": API_TYPE_COMMON_REQUEST, |
| | | "sinfo": f"cb_{API_TYPE_COMMON_REQUEST}_{round(time.time() * 1000)}"} |
| | | if params: |
| | | for k in params: |
| | | data[k] = params[k] |
| | | request_id, client = __request(ClientSocketManager.CLIENT_TYPE_TRADE_LOW_SUCTION, data) |
| | | return __read_response(client, request_id, blocking, timeout=10) |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | d = {"id": "123123"} |
| | | print(d.pop("id")) |
| | | pass |