# 交易基础接口

TraderApiBase对CTP交易接口所有功能进行了基础封装。可以使用一句话概括这些功能:报单、撤单、查询,及相关的响应与通知。

在此基础上,交易者可以实现具体的交易逻辑。

# 初始化参数

  • * broker_id 期货公司标识。
  • * td_server 交易服务器地址。
  • * investor_id 账户。
  • * password 密码。
  • * app_id 终端标识。
  • * auth_code 授权码。
  • md_queue=None 从行情进程获取数据的队列。
  • page_dir='' 交易接口相关文件存储路径,默认为当前目录。
  • private_resume_type=2
  • public_resume_type=2

# 常用属性

  • self.investor_id 账户。
  • self.status 状态。初始状态为-1;通过认证、账户登录并确认结算单后,状态重置为0;通信连接断开后状态重置为-2;自动重连成功后状态重置为0。
  • self.page_dir 交易接口相关文件存储路径。
  • self.front_id
  • self.session_id 会话ID。
  • self.md_queue 从行情进程获取数据的队列。

# 常用方法

# 初始化

  • init_extra(self) 建立通信连接之前的初始化工作,例如创建文件、连接据库等。

# 通信连接断开通知

  • OnFrontDisconnected(self, nReason) 无需在代码层面做任何工作,只需等待自动重连。

# 合约交易状态通知

  • OnRtnInstrumentStatus(self, pInstrumentStatus) 开市/收市时自动推送。
class InstrumentStatusField(BaseField):
    """合约状态"""
    _fields_ = [
        ('ExchangeID', c_char * 9),  # ///交易所代码
        ('ExchangeInstID', c_char * 31),  # 合约在交易所的代码
        ('SettlementGroupID', c_char * 9),  # 结算组代码
        ('InstrumentID', c_char * 31),  # 合约代码
        ('InstrumentStatus', c_char * 1),  # 合约交易状态
        ('TradingSegmentSN', c_int),  # 交易阶段编号
        ('EnterTime', c_char * 9),  # 进入本状态时间
        ('EnterReason', c_char * 1)  # 进入本状态原因
    ]

# 查询合约

  • ReqQryInstrument(self, pQryInstrument) pQryInstrument是AlgoPlus.CTP.APIStruct中定义的QryInvestorPositionField实例:
class QryInstrumentField(BaseField):
    """查询合约"""
    _fields_ = [
        ('InstrumentID', c_char * 31),  # ///合约代码
        ('ExchangeID', c_char * 9),  # 交易所代码
        ('ExchangeInstID', c_char * 31),  # 合约在交易所的代码
        ('ProductID', c_char * 31)  # 产品代码
    ]
  • OnRspQryInstrument(self, pInstrument, pRspInfo, nRequestID, bIsLast) pInstrument是AlgoPlus.CTP.APIStruct中定义的QryInvestorPositionField实例:
class QryInstrumentField(BaseField):
    """查询合约"""
    _fields_ = [
        ('InstrumentID', c_char * 31),  # ///合约代码
        ('ExchangeID', c_char * 9),  # 交易所代码
        ('ExchangeInstID', c_char * 31),  # 合约在交易所的代码
        ('ProductID', c_char * 31)  # 产品代码
    ]

# 查询资金

  • ReqQryTradingAccount(self, pQryTradingAccount)
class QryTradingAccountField(BaseField):
    """查询资金账户"""
    _fields_ = [
        ('BrokerID', c_char * 11),  # ///经纪公司代码
        ('InvestorID', c_char * 13),  # 投资者代码
        ('CurrencyID', c_char * 4),  # 币种代码
        ('BizType', c_char * 1),  # 业务类型
        ('AccountID', c_char * 13)  # 投资者帐号
    ]
  • OnRspQryTradingAccount(self, pTradingAccount, pRspInfo, nRequestID, bIsLast)
class TradingAccountField(BaseField):
    """资金账户"""
    _fields_ = [
        ('BrokerID', c_char * 11),  # ///经纪公司代码
        ('AccountID', c_char * 13),  # 投资者帐号
        ('PreMortgage', c_double),  # 上次质押金额
        ('PreCredit', c_double),  # 上次信用额度
        ('PreDeposit', c_double),  # 上次存款额
        ('PreBalance', c_double),  # 上次结算准备金
        ('PreMargin', c_double),  # 上次占用的保证金
        ('InterestBase', c_double),  # 利息基数
        ('Interest', c_double),  # 利息收入
        ('Deposit', c_double),  # 入金金额
        ('Withdraw', c_double),  # 出金金额
        ('FrozenMargin', c_double),  # 冻结的保证金
        ('FrozenCash', c_double),  # 冻结的资金
        ('FrozenCommission', c_double),  # 冻结的手续费
        ('CurrMargin', c_double),  # 当前保证金总额
        ('CashIn', c_double),  # 资金差额
        ('Commission', c_double),  # 手续费
        ('CloseProfit', c_double),  # 平仓盈亏
        ('PositionProfit', c_double),  # 持仓盈亏
        ('Balance', c_double),  # 期货结算准备金
        ('Available', c_double),  # 可用资金
        ('WithdrawQuota', c_double),  # 可取资金
        ('Reserve', c_double),  # 基本准备金
        ('TradingDay', c_char * 9),  # 交易日
        ('SettlementID', c_int),  # 结算编号
        ('Credit', c_double),  # 信用额度
        ('Mortgage', c_double),  # 质押金额
        ('ExchangeMargin', c_double),  # 交易所保证金
        ('DeliveryMargin', c_double),  # 投资者交割保证金
        ('ExchangeDeliveryMargin', c_double),  # 交易所交割保证金
        ('ReserveBalance', c_double),  # 保底期货结算准备金
        ('CurrencyID', c_char * 4),  # 币种代码
        ('PreFundMortgageIn', c_double),  # 上次货币质入金额
        ('PreFundMortgageOut', c_double),  # 上次货币质出金额
        ('FundMortgageIn', c_double),  # 货币质入金额
        ('FundMortgageOut', c_double),  # 货币质出金额
        ('FundMortgageAvailable', c_double),  # 货币质押余额
        ('MortgageableFund', c_double),  # 可质押货币金额
        ('SpecProductMargin', c_double),  # 特殊产品占用保证金
        ('SpecProductFrozenMargin', c_double),  # 特殊产品冻结保证金
        ('SpecProductCommission', c_double),  # 特殊产品手续费
        ('SpecProductFrozenCommission', c_double),  # 特殊产品冻结手续费
        ('SpecProductPositionProfit', c_double),  # 特殊产品持仓盈亏
        ('SpecProductCloseProfit', c_double),  # 特殊产品平仓盈亏
        ('SpecProductPositionProfitByAlg', c_double),  # 根据持仓盈亏算法计算的特殊产品持仓盈亏
        ('SpecProductExchangeMargin', c_double),  # 特殊产品交易所保证金
        ('BizType', c_char * 1),  # 业务类型
        ('FrozenSwap', c_double),  # 延时换汇冻结金额
        ('RemainSwap', c_double)  # 剩余换汇额度
    ]

# 查询持仓

  • ReqQryInvestorPosition(self, pQryInvestorPosition)
    class QryInvestorPositionField(BaseField):
        """查询投资者持仓"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('InvestUnitID', c_char * 17)  # 投资单元代码
        ]
    
  • OnRspQryInvestorPosition(self, pInvestorPosition, pRspInfo, nRequestID, bIsLast)
    class InvestorPositionField(BaseField):
        """投资者持仓"""
        _fields_ = [
            ('InstrumentID', c_char * 31),  # ///合约代码
            ('BrokerID', c_char * 11),  # 经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('PosiDirection', c_char * 1),  # 持仓多空方向
            ('HedgeFlag', c_char * 1),  # 投机套保标志
            ('PositionDate', c_char * 1),  # 持仓日期
            ('YdPosition', c_int),  # 上日持仓
            ('Position', c_int),  # 今日持仓
            ('LongFrozen', c_int),  # 多头冻结
            ('ShortFrozen', c_int),  # 空头冻结
            ('LongFrozenAmount', c_double),  # 开仓冻结金额
            ('ShortFrozenAmount', c_double),  # 开仓冻结金额
            ('OpenVolume', c_int),  # 开仓量
            ('CloseVolume', c_int),  # 平仓量
            ('OpenAmount', c_double),  # 开仓金额
            ('CloseAmount', c_double),  # 平仓金额
            ('PositionCost', c_double),  # 持仓成本
            ('PreMargin', c_double),  # 上次占用的保证金
            ('UseMargin', c_double),  # 占用的保证金
            ('FrozenMargin', c_double),  # 冻结的保证金
            ('FrozenCash', c_double),  # 冻结的资金
            ('FrozenCommission', c_double),  # 冻结的手续费
            ('CashIn', c_double),  # 资金差额
            ('Commission', c_double),  # 手续费
            ('CloseProfit', c_double),  # 平仓盈亏
            ('PositionProfit', c_double),  # 持仓盈亏
            ('PreSettlementPrice', c_double),  # 上次结算价
            ('SettlementPrice', c_double),  # 本次结算价
            ('TradingDay', c_char * 9),  # 交易日
            ('SettlementID', c_int),  # 结算编号
            ('OpenCost', c_double),  # 开仓成本
            ('ExchangeMargin', c_double),  # 交易所保证金
            ('CombPosition', c_int),  # 组合成交形成的持仓
            ('CombLongFrozen', c_int),  # 组合多头冻结
            ('CombShortFrozen', c_int),  # 组合空头冻结
            ('CloseProfitByDate', c_double),  # 逐日盯市平仓盈亏
            ('CloseProfitByTrade', c_double),  # 逐笔对冲平仓盈亏
            ('TodayPosition', c_int),  # 今日持仓
            ('MarginRateByMoney', c_double),  # 保证金率
            ('MarginRateByVolume', c_double),  # 保证金率(按手数)
            ('StrikeFrozen', c_int),  # 执行冻结
            ('StrikeFrozenAmount', c_double),  # 执行冻结金额
            ('AbandonFrozen', c_int),  # 放弃执行冻结
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('YdStrikeFrozen', c_int),  # 执行冻结的昨仓
            ('InvestUnitID', c_char * 17),  # 投资单元代码
            ('PositionCostOffset', c_double)  # 大商所持仓成本差值,只有大商所使用
        ]
    

# 查询成交

  • ReqQryTrade(self, pQryTrade)
    class QryTradeField(BaseField):
        """查询成交"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('TradeID', c_char * 21),  # 成交编号
            ('TradeTimeStart', c_char * 9),  # 开始时间
            ('TradeTimeEnd', c_char * 9),  # 结束时间
            ('InvestUnitID', c_char * 17)  # 投资单元代码
        ]
    
  • OnRspQryTrade(self, pTrade, pRspInfo, nRequestID, bIsLast)
    class TradeField(BaseField):
        """成交"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('OrderRef', c_char * 13),  # 报单引用
            ('UserID', c_char * 16),  # 用户代码
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('TradeID', c_char * 21),  # 成交编号
            ('Direction', c_char * 1),  # 买卖方向
            ('OrderSysID', c_char * 21),  # 报单编号
            ('ParticipantID', c_char * 11),  # 会员代码
            ('ClientID', c_char * 11),  # 客户代码
            ('TradingRole', c_char * 1),  # 交易角色
            ('ExchangeInstID', c_char * 31),  # 合约在交易所的代码
            ('OffsetFlag', c_char * 1),  # 开平标志
            ('HedgeFlag', c_char * 1),  # 投机套保标志
            ('Price', c_double),  # 价格
            ('Volume', c_int),  # 数量
            ('TradeDate', c_char * 9),  # 成交时期
            ('TradeTime', c_char * 9),  # 成交时间
            ('TradeType', c_char * 1),  # 成交类型
            ('PriceSource', c_char * 1),  # 成交价来源
            ('TraderID', c_char * 21),  # 交易所交易员代码
            ('OrderLocalID', c_char * 13),  # 本地报单编号
            ('ClearingPartID', c_char * 11),  # 结算会员编号
            ('BusinessUnit', c_char * 21),  # 业务单元
            ('SequenceNo', c_int),  # 序号
            ('TradingDay', c_char * 9),  # 交易日
            ('SettlementID', c_int),  # 结算编号
            ('BrokerOrderSeq', c_int),  # 经纪公司报单编号
            ('TradeSource', c_char * 1),  # 成交来源
            ('InvestUnitID', c_char * 17)  # 投资单元代码
        ]
    
  • ReqQryOrder(self, pQryOrder)
    class QryOrderField(BaseField):
        """查询报单"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('OrderSysID', c_char * 21),  # 报单编号
            ('InsertTimeStart', c_char * 9),  # 开始时间
            ('InsertTimeEnd', c_char * 9),  # 结束时间
            ('InvestUnitID', c_char * 17)  # 投资单元代码
        ]
    
  • OnRspQryOrder(self, pOrder, pRspInfo, nRequestID, bIsLast)
    class OrderField(BaseField):
        """报单"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('OrderRef', c_char * 13),  # 报单引用
            ('UserID', c_char * 16),  # 用户代码
            ('OrderPriceType', c_char * 1),  # 报单价格条件
            ('Direction', c_char * 1),  # 买卖方向
            ('CombOffsetFlag', c_char * 5),  # 组合开平标志
            ('CombHedgeFlag', c_char * 5),  # 组合投机套保标志
            ('LimitPrice', c_double),  # 价格
            ('VolumeTotalOriginal', c_int),  # 数量
            ('TimeCondition', c_char * 1),  # 有效期类型
            ('GTDDate', c_char * 9),  # GTD日期
            ('VolumeCondition', c_char * 1),  # 成交量类型
            ('MinVolume', c_int),  # 最小成交量
            ('ContingentCondition', c_char * 1),  # 触发条件
            ('StopPrice', c_double),  # 止损价
            ('ForceCloseReason', c_char * 1),  # 强平原因
            ('IsAutoSuspend', c_int),  # 自动挂起标志
            ('BusinessUnit', c_char * 21),  # 业务单元
            ('RequestID', c_int),  # 请求编号
            ('OrderLocalID', c_char * 13),  # 本地报单编号
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('ParticipantID', c_char * 11),  # 会员代码
            ('ClientID', c_char * 11),  # 客户代码
            ('ExchangeInstID', c_char * 31),  # 合约在交易所的代码
            ('TraderID', c_char * 21),  # 交易所交易员代码
            ('InstallID', c_int),  # 安装编号
            ('OrderSubmitStatus', c_char * 1),  # 报单提交状态
            ('NotifySequence', c_int),  # 报单提示序号
            ('TradingDay', c_char * 9),  # 交易日
            ('SettlementID', c_int),  # 结算编号
            ('OrderSysID', c_char * 21),  # 报单编号
            ('OrderSource', c_char * 1),  # 报单来源
            ('OrderStatus', c_char * 1),  # 报单状态
            ('OrderType', c_char * 1),  # 报单类型
            ('VolumeTraded', c_int),  # 今成交数量
            ('VolumeTotal', c_int),  # 剩余数量
            ('InsertDate', c_char * 9),  # 报单日期
            ('InsertTime', c_char * 9),  # 委托时间
            ('ActiveTime', c_char * 9),  # 激活时间
            ('SuspendTime', c_char * 9),  # 挂起时间
            ('UpdateTime', c_char * 9),  # 最后修改时间
            ('CancelTime', c_char * 9),  # 撤销时间
            ('ActiveTraderID', c_char * 21),  # 最后修改交易所交易员代码
            ('ClearingPartID', c_char * 11),  # 结算会员编号
            ('SequenceNo', c_int),  # 序号
            ('FrontID', c_int),  # 前置编号
            ('SessionID', c_int),  # 会话编号
            ('UserProductInfo', c_char * 11),  # 用户端产品信息
            ('StatusMsg', c_char * 81),  # 状态信息
            ('UserForceClose', c_int),  # 用户强评标志
            ('ActiveUserID', c_char * 16),  # 操作用户代码
            ('BrokerOrderSeq', c_int),  # 经纪公司报单编号
            ('RelativeOrderSysID', c_char * 21),  # 相关报单
            ('ZCETotalTradedVolume', c_int),  # 郑商所成交数量
            ('IsSwapOrder', c_int),  # 互换单标志
            ('BranchID', c_char * 9),  # 营业部编号
            ('InvestUnitID', c_char * 17),  # 投资单元代码
            ('AccountID', c_char * 13),  # 资金账号
            ('CurrencyID', c_char * 4),  # 币种代码
            ('IPAddress', c_char * 16),  # IP地址
            ('MacAddress', c_char * 21)  # Mac地址
        ]
    

# 报单

  • ReqOrderInsert(self, pInputOrder)
    class InputOrderField(BaseField):
        """输入报单"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('OrderRef', c_char * 13),  # 报单引用
            ('UserID', c_char * 16),  # 用户代码
            ('OrderPriceType', c_char * 1),  # 报单价格条件
            ('Direction', c_char * 1),  # 买卖方向
            ('CombOffsetFlag', c_char * 5),  # 组合开平标志
            ('CombHedgeFlag', c_char * 5),  # 组合投机套保标志
            ('LimitPrice', c_double),  # 价格
            ('VolumeTotalOriginal', c_int),  # 数量
            ('TimeCondition', c_char * 1),  # 有效期类型
            ('GTDDate', c_char * 9),  # GTD日期
            ('VolumeCondition', c_char * 1),  # 成交量类型
            ('MinVolume', c_int),  # 最小成交量
            ('ContingentCondition', c_char * 1),  # 触发条件
            ('StopPrice', c_double),  # 止损价
            ('ForceCloseReason', c_char * 1),  # 强平原因
            ('IsAutoSuspend', c_int),  # 自动挂起标志
            ('BusinessUnit', c_char * 21),  # 业务单元
            ('RequestID', c_int),  # 请求编号
            ('UserForceClose', c_int),  # 用户强评标志
            ('IsSwapOrder', c_int),  # 互换单标志
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('InvestUnitID', c_char * 17),  # 投资单元代码
            ('AccountID', c_char * 13),  # 资金账号
            ('CurrencyID', c_char * 4),  # 币种代码
            ('ClientID', c_char * 11),  # 交易编码
            ('IPAddress', c_char * 16),  # IP地址
            ('MacAddress', c_char * 21)  # Mac地址
        ]
    
  • OnRspOrderInsert(self, pInputOrder, pRspInfo, nRequestID, bIsLast)
  • OnRtnOrder(self, pOrder)
  • OnRtnTrade(self, pTrade)
  • OnErrRtnOrderInsert(self, pInputOrder, pRspInfo)

# 撤单

  • ReqOrderAction(self, pInputOrderAction)
    class InputOrderActionField(BaseField):
        """输入报单操作"""
        _fields_ = [
            ('BrokerID', c_char * 11),  # ///经纪公司代码
            ('InvestorID', c_char * 13),  # 投资者代码
            ('OrderActionRef', c_int),  # 报单操作引用
            ('OrderRef', c_char * 13),  # 报单引用
            ('RequestID', c_int),  # 请求编号
            ('FrontID', c_int),  # 前置编号
            ('SessionID', c_int),  # 会话编号
            ('ExchangeID', c_char * 9),  # 交易所代码
            ('OrderSysID', c_char * 21),  # 报单编号
            ('ActionFlag', c_char * 1),  # 操作标志
            ('LimitPrice', c_double),  # 价格
            ('VolumeChange', c_int),  # 数量变化
            ('UserID', c_char * 16),  # 用户代码
            ('InstrumentID', c_char * 31),  # 合约代码
            ('InvestUnitID', c_char * 17),  # 投资单元代码
            ('IPAddress', c_char * 16),  # IP地址
            ('MacAddress', c_char * 21)  # Mac地址
        ]
    
  • OnRspOrderAction(self, pInputOrderAction, pRspInfo, nRequestID, bIsLast)
  • OnErrRtnOrderAction(self, pOrderAction, pRspInfo)

# 异步等待

  • Join() CTP是一个异步系统,代码运行到最后一行时功能可能还未完成,如果没有调用Join方法,进程退出则无法接收后续数据或者执行结果。重载Join方法可以执行任何逻辑。