Exemplo n.º 1
0
 def onFrontConnected(self):
     """
     Connect response, deal with front server connection.
     """
     logger.info('[onFrontConnected] connection status = True.')
     self.connection_status = True
     self.login()
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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))
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
    def onRtnTrade(self, data):
        """
        Trade response information.

        Args:
            data(dict): response data.
        """
        response = TradeResponse.from_ctp(data)
        logger.info('[onRtnTrade] {}'.format(response))
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
    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))
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
    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))
Exemplo n.º 14
0
    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))
Exemplo n.º 15
0
 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)
Exemplo n.º 16
0
    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()
Exemplo n.º 17
0
 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)
Exemplo n.º 18
0
    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
Exemplo n.º 19
0
 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)