Skip to content

交易指令CTrade类选择

MT5CTP交易指令类库(\MQL5\Include\mt5ctp\Trade.mqh)中有交易指令类 MT5CTP::CTrade,MT5CTP交易指令类库(\MQL5\Include\mt5ctp\mt5toctp.mqh)中也有同名的交易指令类 CTrade,在实际开发中如何选择?

适配场景和开发建议

Trade.mqh -> MT5CTP::CTrade

  1. 操作[CTP汇总持仓],更加贴近CTP柜台
  2. 仅用于仿真测试和生产环境,不能用于历史数据回测

mt5toctp.mqh -> CTrade

  1. 操作[MT5分笔持仓],兼容MQL操作
  2. 可用于历史数据回测、仿真测试和生产环境,使用场景更加丰富
  3. MT5CTP建议在EA开发中优选使用 mt5toctp.mqh -> CTrade
  4. MT5CTP发布的脚本和策略开发框架中全部采用 mt5toctp.mqh -> CTrade实现全部功能,而完全忽略了 Trade.mqh -> MT5CTP::CTrade类库

示范脚本文件的 '#include' 部分

MQL5
// 生产环境应用标识|关闭可做历史数据回测
#define __MT5CTP__

// 包含类库|次序有要求
#ifdef __MT5CTP__
    #include <mt5ctp\SymbolInfo.mqh>
    #include <mt5ctp\AccountInfo.mqh>
    #include <mt5ctp\PositionInfo.mqh>
    #include <mt5ctp\OrderInfo.mqh>
    #include <mt5ctp\HistoryOrderInfo.mqh>
    #include <mt5ctp\DealInfo.mqh>
    // 次序有要求|mt5toctp.mqh最后导入
    #include <mt5ctp\mt5toctp.mqh>
#else
    // 包含MQL|Trade.mqh
    #include <Trade\Trade.mqh>
#endif

// 定义交易对象
CTrade _td;

// do...

mt5toctp.mqh -> CTrade类功能全面,适配场景丰富,建议EA开发中优先选用

无需回测的EA策略,如风险管理系统,可选用MT5CTP::CTrade类或两个类库同时使用,兼具高效率和灵活性。

修改MQL的EA适配MT5CTP

基于MQL开发者社区,量化交易爱好者可马上拥有数万+交易策略库,策略库汇聚最新研究成果和全球交易智慧,通过简单的修改,MQL5的EA策略就可适配MT5CTP,极大拓展程序员|交易员的能力,也让MT5CTP完全融入MQL5的生态。

第一步:包含MT5CTP的交易类库

在源代码的'include & define'区,导入MT5CTP的库文件

MQL5
// 生产环境应用标识|关闭可做历史数据回测
#define __MT5CTP__

// 包含类库|次序有要求
#ifdef __MT5CTP__
    // 按需导入MT5CTP库文件
    // 次序有要求|mt5toctp.mqh最后导入
    #include <mt5ctp\mt5toctp.mqh>
#else
    // 其他需要的库文件
#endif

第二步:定义全局变量交易对象,修改源代码中的交易报单函数

在源代码的全局变量定义区,定义交易类对象

MQL5
// 定义交易对象
CTrade _td;

在源代码的报单函数位置,替换报单函数或者使用条件预编译扩展

MQL5
// 使用条件预编译扩展
#ifdef __MT5CTP__
    // 新的报单代码,可直接调用 CTrade 的方法...
#else
    // 原报单代码...
#endif

关注 | 同步报单和异步报单的差异

MQL的函数基本使用同步报单,即程序停在报单函数位置,等待服务器返回报单错误(返回值:false)或已成交(返回值:true)后再继续执行后续代码,代码执行逻辑清晰。

MT5CTP的报单时异步报单,即程序调用报单函数将报单信息发给服务器后,不关注报单是否成交或者有错误,直接执行后续代码。

异步报单显然效率更高,适配较高的交易频率。但异步报单可能会造成同一条件重复报单而需要自行限制。

第三步:交易品类属性的微修

国内期货交易规则与MT5交易交易品类的属性上有所区别,特殊情况下需微调属性值,保持交易逻辑的完整和严谨,如报单数量或涉及报单数量的计算。