| | |
| | | FRONT_ADDRESS = "tcp://192.168.84.31:6500" |
| | | FRONT_ADDRESS1 = "tcp://192.168.84.32:26500" |
| | | |
| | | |
| | | |
| | | |
| | | TYPE_ORDER = 0 |
| | | TYPE_CANCEL_ORDER = 1 |
| | | TYPE_LIST_DELEGATE = 2 |
| | |
| | | |
| | | ENABLE_ORDER = True |
| | | |
| | | |
| | | class TradeSimpleApi: |
| | | req_id = 0 |
| | | __buy_sinfo_set = set() |
| | | __sell_sinfo_set = set() |
| | | __cancel_buy_sinfo_set = set() |
| | | __cancel_sell_sinfo_set = set() |
| | | __req_lock = threading.Lock() |
| | | |
| | | @classmethod |
| | | def set_login_info(cls, session_id, front_id): |
| | | cls.__session_id = session_id |
| | | cls.__front_id = front_id |
| | | |
| | | def __create_req_id(self): |
| | | try: |
| | | self.__req_lock.acquire(blocking=True) |
| | | self.req_id += 1 |
| | | req_id = self.req_id |
| | | return req_id |
| | | finally: |
| | | self.__req_lock.release() |
| | | |
| | | # sinfo char(32) |
| | | def buy(self, code, count, price, sinfo, order_ref, shadow_price=None): |
| | |
| | | async_log_util.info(logger_local_huaxin_trade_debug, |
| | | f"进入买入方法:code-{code} sinfo-{sinfo} order_ref-{order_ref}") |
| | | self.__buy_sinfo_set.add(sinfo) |
| | | self.req_id += 1 |
| | | req_id = self.__create_req_id() |
| | | # 请求报单 |
| | | req_field = traderapi.CTORATstpInputOrderField() |
| | | # TORA_TSTP_EXD_COMM(0): 通用(内部使用) |
| | |
| | | ''' |
| | | # 给L2发送消息 |
| | | |
| | | ret = api.ReqOrderInsert(req_field, self.req_id) |
| | | ret = api.ReqOrderInsert(req_field, req_id) |
| | | if ret != 0: |
| | | raise Exception('ReqOrderInsert fail, ret[%d]' % ret) |
| | | # 常态化监听不需要单独设置 |
| | |
| | | req_field.SInfo = shadow_sinfo |
| | | req_field.OrderRef = shadow_order_ref |
| | | req_field.VolumeTotalOriginal = constant.SHADOW_ORDER_VOLUME |
| | | self.req_id += 1 |
| | | ret = api.ReqOrderInsert(req_field, self.req_id) |
| | | req_id = self.__create_req_id() |
| | | ret = api.ReqOrderInsert(req_field, req_id) |
| | | if ret != 0: |
| | | raise Exception('ReqOrderInsert fail, ret[%d]' % ret) |
| | | # 影子订单撤单 |
| | |
| | | async_log_util.info(logger_local_huaxin_trade_debug, |
| | | f"进入撤单方法:code-{code} order_sys_id-{order_sys_id} order_ref-{order_ref} sinfo-{sinfo}") |
| | | self.__cancel_buy_sinfo_set.add(sinfo) |
| | | self.req_id += 1 |
| | | req_id = self.__create_req_id() |
| | | # 请求撤单 |
| | | req_field = traderapi.CTORATstpInputOrderActionField() |
| | | if tool.is_sz_code(code): |
| | |
| | | 委托方式字段根据券商要求填写,无特殊说明置空即可 |
| | | 其它字段置空 |
| | | ''' |
| | | ret = api.ReqOrderAction(req_field, self.req_id) |
| | | ret = api.ReqOrderAction(req_field, req_id) |
| | | if ret != 0: |
| | | raise Exception('ReqOrderAction fail, ret[%d]' % ret) |
| | | return |
| | |
| | | if sinfo in self.__sell_sinfo_set: |
| | | raise Exception(f'下单请求已经提交:{sinfo}') |
| | | self.__sell_sinfo_set.add(sinfo) |
| | | self.req_id += 1 |
| | | req_id = self.__create_req_id() |
| | | # 请求报单 |
| | | req_field = traderapi.CTORATstpInputOrderField() |
| | | # TORA_TSTP_EXD_COMM(0): 通用(内部使用) |
| | |
| | | ''' |
| | | 其它字段置空 |
| | | ''' |
| | | ret = api.ReqOrderInsert(req_field, self.req_id) |
| | | ret = api.ReqOrderInsert(req_field, req_id) |
| | | if ret != 0: |
| | | raise Exception('ReqOrderInsert fail, ret[%d]' % ret) |
| | | return |
| | |
| | | if sinfo in self.__cancel_sell_sinfo_set: |
| | | raise Exception(f'撤单请求已经提交:{sinfo}') |
| | | self.__cancel_sell_sinfo_set.add(sinfo) |
| | | self.req_id += 1 |
| | | req_id = self.__create_req_id() |
| | | # 请求撤单 |
| | | req_field = traderapi.CTORATstpInputOrderActionField() |
| | | if tool.is_sz_code(code): |
| | |
| | | 委托方式字段根据券商要求填写,无特殊说明置空即可 |
| | | 其它字段置空 |
| | | ''' |
| | | ret = api.ReqOrderAction(req_field, self.req_id) |
| | | ret = api.ReqOrderAction(req_field, req_id) |
| | | if ret != 0: |
| | | raise Exception('ReqOrderAction fail, ret[%d]' % ret) |
| | | return |
| | | |
| | | # 查询当日可撤销的委托 |
| | | def list_delegate_orders(self, is_cancel): |
| | | self.req_id += 1 |
| | | req_id = self.req_id |
| | | req_id = self.__create_req_id() |
| | | req_field = traderapi.CTORATstpQryOrderField() |
| | | # 以下字段不填表示不设过滤条件,即查询所有报单 |
| | | # req_field.SecurityID = '600000' |
| | |
| | | |
| | | # 查询当日成交的订单 |
| | | def list_traded_orders(self): |
| | | self.req_id += 1 |
| | | req_id = self.req_id |
| | | req_id = self.__create_req_id() |
| | | req_field = traderapi.CTORATstpQryTradeField() |
| | | ret = api.ReqQryTrade(req_field, req_id) |
| | | if ret != 0: |
| | |
| | | |
| | | # 查询持仓 |
| | | def list_positions(self): |
| | | self.req_id += 1 |
| | | req_id = self.req_id |
| | | req_id = self.__create_req_id() |
| | | req_field = traderapi.CTORATstpQryPositionField() |
| | | ret = api.ReqQryPosition(req_field, req_id) |
| | | if ret != 0: |
| | |
| | | |
| | | # 查询资金账户 |
| | | def get_money_account(self): |
| | | self.req_id += 1 |
| | | req_id = self.req_id |
| | | req_id = self.__create_req_id() |
| | | req_field = traderapi.CTORATstpQryTradingAccountField() |
| | | req_field.CurrencyID = traderapi.TORA_TSTP_CID_CNY |
| | | ret = api.ReqQryTradingAccount(req_field, req_id) |
| | |
| | | |
| | | else: |
| | | logger_local_huaxin_trade_debug.info('Login fail!!! [%d] [%d] [%s]' |
| | | % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) |
| | | % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg)) |
| | | |
| | | def OnRspUserPasswordUpdate(self, pUserPasswordUpdateField: "CTORATstpUserPasswordUpdateField", |
| | | pRspInfoField: "CTORATstpRspInfoField", nRequestID: "int") -> "void": |
| | |
| | | request_id) |
| | | |
| | | def OnDealList(self, client_id, request_id, sk): |
| | | async_log_util.info(logger_local_huaxin_trade_debug, f"请求成交列表:client_id-{client_id} request_id-{request_id}") |
| | | async_log_util.info(logger_local_huaxin_trade_debug, |
| | | f"请求成交列表:client_id-{client_id} request_id-{request_id}") |
| | | try: |
| | | # printlog("开始请求成交列表") |
| | | req_id = self.__tradeSimpleApi.list_traded_orders() |
| | |
| | | SendResponseSkManager.send_error_response("common", request_id, client_id, str(e)) |
| | | |
| | | def OnDelegateList(self, client_id, request_id, sk, is_cancel): |
| | | async_log_util.info(logger_local_huaxin_trade_debug, f"请求委托列表:client_id-{client_id} request_id-{request_id}") |
| | | async_log_util.info(logger_local_huaxin_trade_debug, |
| | | f"请求委托列表:client_id-{client_id} request_id-{request_id}") |
| | | try: |
| | | req_id = self.__tradeSimpleApi.list_delegate_orders(is_cancel) |
| | | req_rid_dict[req_id] = (client_id, request_id, sk) |
| | |
| | | json.dumps({"type": "response", "data": {"code": 0, "data": data}, "client_id": client_id, |
| | | "request_id": request_id}), type, client_id, request_id) |
| | | |
| | | async_log_util.info(logger_local_huaxin_trade_debug, "API回调结束 req_id-{} request_id-{}", req_id, request_id) |
| | | async_log_util.info(logger_local_huaxin_trade_debug, "API回调结束 req_id-{} request_id-{}", req_id, |
| | | request_id) |
| | | else: |
| | | async_log_util.info(logger_local_huaxin_trade_debug, "非API回调 req_id-{}", req_id) |
| | | send_response( |
| | |
| | | while True: |
| | | time.sleep(2) |
| | | |
| | | |
| | | if __name__ == '__main__': |
| | | run() |