def onFrontConnected(self): """ Connect response, deal with front server connection. """ logger.info('[onFrontConnected] connection status = True.') self.connection_status = True self.login()
def connect(self, user_id=None, password=None, broker_id=None, address=None): """ Initialize connect. Args: user_id(string): user id. password(string): password. broker_id(string): broker id. address(string): address. """ logger.info('[connect] user_id: {}, broker_id: {}, address: {}'.format( user_id, broker_id, address)) self.user_id = user_id or self.user_id self.password = password or self.password self.broker_id = broker_id or self.broker_id self.address = address or self.address if not self.connection_status: path = get_temp_path(self.__class__.__name__ + '_') self.createFtdcMdApi(path) self.registerFront(self.address) # 初始化连接,成功会调用onFrontConnected self.init() # 若已经连接但尚未登录,则进行登录 else: if not self.login_status: self.login() time.sleep(0.1)
def onErrRtnOrderAction(self, data, error): """ Response of cancel order error message. Args: data(dict): response data error(dict): error data """ logger.info('[onErrRspOrderAction] {}'.format(data))
def query_account(self): """ Query the basic information of account. """ logger.info('[query_account] broker_id: {}, user_id: {}.' ''.format(str(self.broker_id), str(self.user_id))) request = {'BrokerID': self.broker_id, 'InvestorID': self.user_id} self.reqQryTradingAccount(request, self.request_id) time.sleep(0.1)
def onRtnTrade(self, data): """ Trade response information. Args: data(dict): response data. """ response = TradeResponse.from_ctp(data) logger.info('[onRtnTrade] {}'.format(response))
def onRspOrderAction(self, data, error, n, last): """ Response of cancel order message. Args: data(dict): response data error(dict): error data n(unused): unused last(unused): unused """ logger.info('[onRspOrderAction] {}'.format(data))
def query_positions(self): """ Query positions information. """ logger.info('[query_positions] broker_id: {}, user_id: {}.' ''.format(str(self.broker_id), str(self.user_id))) request = { 'BrokerID': self.broker_id, 'InvestorID': self.user_id, } self.reqQryInvestorPosition(request, self.request_id)
def onRspSettlementInfoConfirm(self, data, error, n, last): """ Response of the settlement confirming information of account. Args: data(dict): response data error(dict): error data n(unused): unused last(unused): unused """ response = SettlementConfirmResponse.from_ctp(data) logger.info('[onRspSettlementInfoConfirm] {}'.format(response))
def subscribe(self, symbols): """ Subscribe market data. Args: symbols(string or list): subscribe symbol. """ logger.info('[subscribe] symbols: {}'.format(symbols)) symbols = [symbols] if isinstance(symbols, basestring) else symbols if self.login_status: for symbol in symbols: self.subscribeMarketData(str(symbol)) self.subscribed_symbols |= set(symbols) time.sleep(0.1)
def send_order(self, order): """ Send order to CTP, only support limit price order. Args: order(obj): order obj Returns: string: order id """ order_id = order.order_id order_type = order.order_type limit_price = float( order.price) if order_type != 'market' else float(0) if order_type == 'limit' and limit_price <= 0: logger.info( '[send_order] error, order_id: {}, limit price is zero.'. format(order_id)) return None direction, offset_flag = DIRECTION_OFFSET_MAP.get( (order.direction, order.offset_flag), ('1', '1')) assert order_id, 'Invalid order id.' request = dict() request['InstrumentID'] = order.symbol request['LimitPrice'] = limit_price request['VolumeTotalOriginal'] = abs(order.order_amount) request['OrderPriceType'] = ORDER_TYPE_MAP.get(order_type, '1') request['Direction'] = direction request['CombOffsetFlag'] = offset_flag request['OrderRef'] = str(order_id) request['InvestorID'] = str(self.user_id) request['UserID'] = str(self.user_id) request['BrokerID'] = str(self.broker_id) request['CombHedgeFlag'] = defineDict[ 'THOST_FTDC_HF_Speculation'] # 投机单 request['ContingentCondition'] = defineDict[ 'THOST_FTDC_CC_Immediately'] # 立即发单 request['ForceCloseReason'] = defineDict[ 'THOST_FTDC_FCC_NotForceClose'] # 非强平 request['IsAutoSuspend'] = 0 # 非自动挂起 request['TimeCondition'] = defineDict['THOST_FTDC_TC_GFD'] # 今日有效 request['VolumeCondition'] = defineDict['THOST_FTDC_VC_AV'] # 任意成交量 request['MinVolume'] = 1 # 最小成交量为1 logger.info( '[send_order] request_id: {}, order_id: {}, request: {}'.format( self.request_id, order_id, request)) self.reqOrderInsert(request, self.request_id) return order_id
def login(self): """ Request for logging in. """ if self.login_failed: return if self.user_id and self.password and self.broker_id: logger.info('[login] user_id: {},' 'broker_id: {}, ' 'address: {}'.format(self.user_id, self.broker_id, self.address)) request = dict() request['UserID'] = self.user_id request['Password'] = self.password request['BrokerID'] = self.broker_id self.reqUserLogin(request, self.request_id)
def connect(self, user_id=None, password=None, broker_id=None, address=None, auth_code=None, user_product_info=None): """ Initialize connect. Args: user_id(string): user id. password(string): password. broker_id(string): broker id. address(string): address. auth_code(string): authentication code user_product_info(string): product info Returns: """ self.user_id = user_id or self.user_id self.password = password or self.password self.broker_id = broker_id or self.broker_id self.address = address or self.address self.auth_code = auth_code or self.auth_code self.user_product_info = user_product_info or self.user_product_info logger.info('[connect] user_id: {}, broker_id: {}, address: {}'.format( self.user_id, self.broker_id, self.address)) if not self.connection_status: path = get_temp_path(self.__class__.__name__ + '_') self.createFtdcTraderApi(path) # 设置数据同步模式为推送从今日开始所有数据 # need set 1 when trading. self.subscribePrivateTopic(1) self.subscribePublicTopic(1) self.registerFront(self.address) self.init() else: if self.requireAuthentication and not self.auth_status: self.authenticate() elif not self.login_status: self.login() time.sleep(0.1)
def onRspQryTradingAccount(self, data, error, n, last): """ Response of the basic information of account. Args: data(dict): response data error(dict): error data n(unused): unused last(unused): unused """ response = AccountResponse.from_ctp(data) parameters = { 'account_response': response, } self.event_engine.publish(EventType.event_deal_with_account, **parameters) logger.info('[onRspQryTradingAccount] {}'.format(response))
def onRspQryInvestorPosition(self, data, error, n, last): """ Response of the current position information of account. Args: data(dict): response data error(dict): error data n(unused): unused last(unused): unused """ response = PositionResponse.from_ctp(data) parameters = { 'position_response': response, } self.event_engine.publish(EventType.event_deal_with_position, **parameters) logger.info('[onRspQryInvestorPosition] {}'.format(response))
def settlement_confirm(self): """ Request for settlement confirming. """ if self.user_id and self.password and self.broker_id: logger.info('[settlement_confirm] user_id: {},' 'broker_id: {}, ' 'address: {}'.format(self.user_id, self.broker_id, self.address)) request = { 'UserID': self.user_id, 'Password': self.password, 'BrokerID': self.broker_id } self.reqSettlementInfoConfirm(request, self._generate_next_request_id()) time.sleep(0.1)
def login(self): """ Request for logging in. """ if self.login_failed: return if self.user_id and self.password and self.broker_id: logger.info('[login] user_id: {},' 'broker_id: {}, ' 'address: {}'.format(self.user_id, self.broker_id, self.address)) request = { 'UserID': self.user_id, 'Password': self.password, 'BrokerID': self.broker_id } self.reqUserLogin(request, self._generate_next_request_id()) self.settlement_confirm()
def authenticate(self): """ Request for authenticate. """ if self.user_id and self.broker_id and self.auth_code and self.user_product_info: logger.info('[authenticate] user_id: {},' 'broker_id: {}, ' 'auth_code: {},' 'user_product_info'.format(self.user_id, self.broker_id, self.auth_code, self.user_product_info)) req = dict() req['UserID'] = self.user_id req['BrokerID'] = self.broker_id req['AuthCode'] = self.auth_code req['UserProductInfo'] = self.user_product_info self.request_id += 1 self.reqAuthenticate(req, self.request_id)
def onRspUserLogin(self, data, error, n, last): """ Login response, deal with user login. Args: data(dict): response data error(dict): error data n(unused): unused last(unused): unused """ if error['ErrorID'] == 0: logger.info('[onRspUserLogin] succeed. ' 'front_id: {}, session_id: {}'.format( str(data['FrontID']), str(data['SessionID']))) self.front_id = str(data['FrontID']) self.session_id = str(data['SessionID']) self.login_status = True else: # 标识登录失败,防止用错误信息连续重复登录 self.login_failed = True
def authenticate(self): """ Request for authenticate. """ if self.user_id and self.broker_id and self.auth_code and self.user_product_info: logger.info('[authenticate] user_id: {},' 'broker_id: {}, ' 'auth_code: {},' 'user_product_info'.format(self.user_id, self.broker_id, self.auth_code, self.user_product_info)) request = { 'UserID': self.user_id, 'BrokerID': self.broker_id, 'AuthCode': self.auth_code, 'UserProductInfo': self.user_product_info } self.request_id += 1 self.reqAuthenticate(request, self.request_id) time.sleep(0.1)