Skip to content

合约信息类方法

类与对象

合约类定义在MT5CTP命名空间,需要显性调用,定义合约类的操作对象:

MQL5
// 类可理解为自定义类型,使用自定义类型定义了一个变量(对象) this_symbol
MT5CTP::CSymbolInfo this_symbol;
// 调用对象方法:选择合约    
if(this_symbol.Select()) {
    // do...
}

MQL支持动态指针,但需要自己管理指针的生命周期,如果不是必须,不建议使用:

MQL5
// 类可理解为自定义类型,使用自定义类型定义了一个变量(对象) this_symbol
MT5CTP::CSymbolInfo *this_symbol= new MT5CTP::CSymbolInfo();
if(CheckPointer(this_symbol)==POINTER_DYNAMIC) {
    // 调用对象方法:选择合约
    if(this_symbol.Select()) {
        // do...
    }
    // 销毁动态指针
    delete(this_symbol);
}

扩展类功能

如果类的方法无法满足应用场景,可以使用继承的方式扩展类功能,在新的类中定义新方法,实现新功能(注意继承中使用的命名空间)。

MQL5
// 定义名为'NewSymbol'的新类,继承自 MT5CTP::CSymbolInfo
class NewSymbol:public MT5CTP::CSymbolInfo {
    // do...
}

完整的例子

三步走完成输出图表合约数据到日志的脚本代码:

MQL5
#property copyright     "Copyright 2026, MT5CTP项目组"
#property link          "mt5ctp@qq.com"
#property version       "1.00"
#property description   "MT5CTP功能Demo|仅用于量化投资爱好者测试、研究"
#property description   "基于MT5CTP类库[API 2.00 build 0030]"
//+------------------------------------------------------------------+
//| Include & Define                                                 |
//+------------------------------------------------------------------+
// 第一步:导入MT5CTP类库
#include <mt5ctp\SymbolInfo.mqh>
// 第二步:定义合约对象 _self_symbol,注意调用命名空间 MT5CTP
MT5CTP::CSymbolInfo _self_symbol;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {    
    // 第三步:合约对象选择和检查图表合约
    if(!_self_symbol.Select())
        return;
    // 使用合约对象提取合约数据,输出信息到客户端[工具箱]-[专家]日志
    Print("合约代码:",_self_symbol.Symbol());
    Print("合约名称:",_self_symbol.Name());
    Print("交易所代码:",_self_symbol.ExchangeID());
    Print("产品代码:",_self_symbol.ProductID());
    Print("产品名称:",_self_symbol.ProductName());
    Print("到期日:",_self_symbol.ExpireDate());
    Print("交易日:",_self_symbol.TradingDay());
    Print("业务日期:",_self_symbol.ActionDay());
    Print("行情更新时间:",_self_symbol.UpdateTime());
    Print("最小变动价位:",_self_symbol.PriceTick());
    Print("涨停板价:",_self_symbol.UpperLimit());
    Print("跌停板价:",_self_symbol.LowerLimit());
    Print("申买价(bid):",_self_symbol.Bid());
    Print("申卖价(ask):",_self_symbol.Ask());
    Print("申买量:",_self_symbol.BidVolume());
    Print("申卖量:",_self_symbol.AskVolume());
    Print("当日均价:",_self_symbol.AvgPrice());
    Print("昨持仓量:",_self_symbol.PreOpenInterest());
    Print("今持仓量:",_self_symbol.OpenInterest());
    Print("多头保证金率:",_self_symbol.LongMarginRatioByMoney());
    Print("空头保证金率:",_self_symbol.ShortMarginRatioByMoney());
    Print("开仓手续费:",_self_symbol.OpenRatioByVolume());
    Print("开仓手续费率:",_self_symbol.OpenRatioByMoney());
    Print("平仓手续费:",_self_symbol.CloseRatioByVolume());
    Print("平仓手续费率:",_self_symbol.CloseRatioByMoney());   
    Print("平今仓手续费:",_self_symbol.CloseTodayRatioByVolume());
    Print("平今手续费率:",_self_symbol.CloseTodayRatioByMoney());
    Print("合约数量/乘数:",_self_symbol.ContractSize());
    Print("是否行情订阅:",_self_symbol.IsSubMarket());
    Print("是否指数合约:",_self_symbol.IsIndex());
    Print("是否主力合约:",_self_symbol.IsMain());
    Print("是否连续交易时间:",_self_symbol.SymbolExists());   
    Print("合约交易状态:",_self_symbol.StatusDescription());
    Print("成交数量:",_self_symbol.Volume());
    Print("成交金额:",_self_symbol.Turnover());
    Print("小数点位数:",_self_symbol.Digits());
    Print("最小报单量:",_self_symbol.MinLimitOrderVolume());
    Print("最大报单量:",_self_symbol.MaxLimitOrderVolume());
    Print("按小数点位数格式化数据:",_self_symbol.NormalizePrice(65536.789654123));
}
//+------------------------------------------------------------------+