Skip to content

CTP报单流与事件驱动

CTP报单流

图片和信息来源于上期技术发布的CTP客户端开发指南V3.5:

serv_trade_auto
  1. 交易终端通过交易接口向交易前置提交报单申请。
  2. 主排队机从前置机订阅交易申请报文。
  3. 主排队机将发布的交易序列报文发送给从排队机要求确认。
  4. 从排队机收到待确认报文后将相关报文写入流水文件,并立即返回报文确认信息。
  5. 交易核心从主排队机订阅交易序列报文。
  6. 交易核心对收到的交易序列报文做合法性检查,检查出错误的交易申请报文后就会返回给交易前置一个包含错误信息的报单响应报文,交易前置立即将该报文信息转发给交易终端。如果检出为合法的交易申 请报文,交易核心也会返回一个报单响应报文到交易前置,但是该报文不会被交易前置返回给交易终端。
  7. 两种情况:1,交易前置从交易核心订阅到错误的报单响应报文,以对话模式将该报文转发给交易终端。 2,交易核心返回给交易前置的响应报文是正确的,交易前置立即以私有模式返回对应报单的报单回报到 交易终端(图中前置机到交易终端8)。
  8. 两个过程:1,交易前置在订阅到交易核心的报单回报后,以私有模式将该报单回报发送到交易终端。2,交易核心向交易前置发送了第一个报单回报后,立即产生向交易所申请该报单插入的申请报文,该报文 被报盘管理订阅。
  9. 报盘管理订阅到交易所报盘插入申请报文后,将该报文转发到对应报盘接口。
  10. 报盘收到报盘管理的报单申请报文后,通过交易所提供的交易接口将该笔报单发送到交易所。
  11. 报盘通过交易接口从交易所前置接收报单回报以及成交回报或出错的报单响应报文。
  12. 报盘将从交易所接收到的报单回报及成交回报或报单响应汇总到报盘管理。
  13. 主排队机从报盘管理订阅从交易所返回的报单信息。
  14. 主排队机将报文信息序列化后发送给从排队机进行确认。
  15. 从排队机收到待确认报文后将该报文写入流水,并立即返回报文确认信息。
  16. 交易核心从主排队机订阅所有的报单以及成交回报信息。
  17. 交易前置从交易核心订阅所有交易核心发布的交易结果数据。
  18. 交易前置将订阅到的交易结果数据分发到各交易终端。

事件驱动

MT5CTP设计了事件驱动模式,实时响应报单、成交和错误信息回报,在客户端广播CTP柜台的回报信息,实现报单的全生命周期管理。基础库[mt5ctp.mqh]中定义了三个事件ID:

  1. EXPERT_CTP_ORDER:CTP柜台报单回报
  2. EXPERT_CTP_TRADE:CTP柜台成交回报
  3. EXPERT_CTP_ERROR:CTP柜台错误回报

MT5CTP::CTrade类中定义了相应的三个纯虚函数,响应上述三个事件:

OnOrder

OnOrder(

const int id,           // 事件ID,EXPERT_CTP_ORDER
const long &lparam,     // 报单信息:FrontID
const double &dparam,   // 报单信息:SessionID
const string &sparam    // 报单信息:OrderRef

) -> virtual void

功能:MT5CTP定义的事件响应接口虚函数,响应报单事件

参数:

id:事件ID,EXPERT_CTP_ORDER

lparam:报单信息:FrontID

dparam:报单信息:SessionID

sparam:报单信息:OrderRef

返回值类型:virtual void

OrderTicket(const long lparam, const double dparam, const string sparam) -> string

功能:报单事件函数OnOrder|OnError的关联函数,取得报单标识

参数:

lparam:报单事件中的参数

dparam:报单事件中的参数

sparam:报单事件中的参数

返回值类型:string

FrontID(long lparam) -> long

功能:报单事件函数OnOrder|OnError的关联函数,取得报单前置信息

参数:lparam:报单事件中的参数

返回值类型:long

SessionID(long dparam) -> long

功能:报单事件函数OnOrder|OnError的关联函数,取得报单会话信息

参数:dparam:报单事件中的参数

返回值类型:long

OrderRef(string sparam) -> string

功能:报单事件函数OnOrder|OnError的关联函数,取得报单引用

参数:sparam:报单事件中的参数

返回值类型:string

OnTrade

OnTrade(

const int id,           // 事件ID,EXPERT_CTP_TRADE
const long &lparam,     // 成交信息:ExchangeID
const double &dparam,   // 无意义
const string &sparam    // 成交标识ticket

) -> virtual void

功能:MT5CTP定义的事件响应接口虚函数,响应报单成交事件

参数:

id:事件ID,EXPERT_CTP_TRADE

lparam:成交信息:ExchangeID

dparam:无意义

sparam:成交标识ticket

返回值类型:virtual void

DealTicket(const long lparam, const double dparam, const string sparam) -> string

功能:成交事件函数OnTrade的关联函数,取得成交标识

参数:

lparam:成交事件中的参数

dparam:成交事件中的参数

sparam:成交事件中的参数

返回值类型:string

ExchangeID(long lparam) -> string

功能:成交事件函数OnTrade的关联函数,取得交易所代码

参数: lparam:成交事件中的参数

返回值类型:string

OrderSysID(string sparam) -> string

功能:成交事件函数OnTrade的关联函数,取得报单的交易所编码

参数: sparam:成交事件中的参数

返回值类型:string

TradeID(string sparam) -> string

功能:成交事件函数OnTrade的关联函数,取得成交的交易所编号

参数: sparam:成交事件中的参数

返回值类型:string

OnError

OnError(

const int id,           // 事件ID,EXPERT_CTP_ERROR
const long &lparam,     // 报单信息:FrontID
const double &dparam,   // 报单信息:SessionID
const string &sparam    // 报单信息:OrderRef

) -> virtual void

功能:MT5CTP定义的事件响应接口虚函数,响应报单错误事件

参数:

id:事件ID,EXPERT_CTP_ERROR

lparam:报单信息:FrontID

dparam:报单信息:SessionID

sparam:报单信息:OrderRef

返回值类型:virtual void

事件驱动应用

MT5CTP::CTrade类中的纯虚函数定义了事件响应函数的接口,默认操作为空,如果开发中需要使用事件响应,实时追踪报单的过程,需要使用类继承,在子类中实现事件响应函数,做自己感兴趣的处理逻辑。

MQL5
// 定义新的交易类 NewTrade 继承自 MT5CTP::CTrade,注意继承中使用命名空间
class NewTrade:public MT5CTP::CTrade {

    // 自定义 OnOrder 方法,函数名与形参与纯虚函数定义的事件接口一致
    void OnOrder(
        const int id,
        const long &lparam,
        const double &dparam,
        const string &sparam
    );

    // 自定义 OnTrade 方法,函数名与形参与纯虚函数定义的事件接口一致
    void OnTrade(
        const int id,
        const long &lparam,
        const double &dparam,
        const string &sparam
    );

    // 自定义 OnError 方法,函数名与形参与纯虚函数定义的事件接口一致
    void OnError(
        const int id,
        const long &lparam,
        const double &dparam,
        const string &sparam
    );
}

// 实现 OnOrder 方法,在方法中实现自定义事件处理逻辑
void NewTrade::OnOrder(
    const int id,
    const long &lparam,
    const double &dparam,
    const string &sparam
) {
    string order_ticket = OrderTicket(lparam,dparam,sparam);
    // do...
}

// 实现 OnTrade 方法,在方法中实现自定义事件处理逻辑
void NewTrade::OnTrade(
    const int id,
    const long &lparam,
    const double &dparam,
    const string &sparam
) {
    string deal_ticket = DealTicket(lparam,dparam,sparam);
    // do...
}

// 实现 OnError 方法,在方法中实现自定义事件处理逻辑
void NewTrade::OnError(
    const int id,
    const long &lparam,
    const double &dparam,
    const string &sparam
) {
    string order_ticket = OrderTicket(lparam,dparam,sparam);
    // do...
}

OnChartEvent

OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)

功能:EA中响应图表事件,驱动CTP事件接口的方法,需要在图表的 OnChartEvent 事件接口中调用

参数:

id:事件ID

lparam:事件响应的参数,类型为 long

dparam:事件响应的参数,类型为 double

sparam:事件响应的参数,类型为 string

返回值类型:void