Appearance
[CTP持仓]信息类方法
类与对象
[CTP持仓]类定义在MT5CTP命名空间,需要显性调用,定义[CTP持仓]类的操作对象:
MQL5
// 类可理解为自定义类型,使用自定义类型定义了一个变量(对象) this_pos
MT5CTP::CPositionInfo this_pos;
// 调用对象方法 : 使用序号选定持仓,持仓序号从1开始
for(int i = this_pos.Total(); i > 0; i--) {
if(!this_pos.SelectByIndex(i))
continue;
// do...
}MQL支持动态指针,但需要自己管理指针的生命周期,如果不是必须,不建议使用:
MQL5
// 类可理解为自定义类型,使用自定义类型定义了一个变量(对象) this_pos
MT5CTP::CPositionInfo *this_pos= new MT5CTP::CPositionInfo();
if(CheckPointer(this_pos)==POINTER_DYNAMIC) {
// 调用对象方法 : 使用序号选定持仓,持仓序号从1开始
for(int i = this_pos.Total(); i > 0; i--) {
if(!this_pos.SelectByIndex(i))
continue;
// do...
}
// 销毁动态指针
delete(this_pos);
}扩展类功能
如果类的方法无法满足应用场景,可以使用继承的方式扩展类功能,在新的类中定义新方法,实现新功能(注意继承中使用的命名空间)。
MQL5
// 定义名为'NewPosition'的新类,继承自 MT5CTP::CPositionInfo
class NewPosition:public MT5CTP::CPositionInfo {
// do...
}完整的例子
三步走完成输出[CTP持仓]数据到日志的脚本代码:
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\PositionInfo.mqh>
// 第二步:定义[CTP持仓]对象 _self_position,注意调用命名空间 MT5CTP
MT5CTP::CPositionInfo _self_position;
// 自定义结构体
struct OuterPosition {
string symbol; // 合约代码
string exchange; // 交易所代码
string type; // 持仓多空
string type_date; // 昨仓今仓
long volume; // 持仓数量|可能为0
double price; // 持仓价格
double margin; // 保证金占用
double commission; // 手续费
double exit_profit; // 平仓盈亏
double Open_profit; // 平仓盈亏
double profit; // 盯市持仓盈亏
double margin_frozen; // 保证金冻结
double commission_frozen; // 手续费冻结
};
// 定义结构体数组
OuterPosition outer[];
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart() {
// 输出信息准备,结构体数组初始化
int total = _self_position.Total();
ArrayResize(outer,total);
// 第三步:[CTP持仓]对象循环遍历,提取数据
// 务必注意CTP持仓序号是从1开始,不是从0开始
int outer_index = WRONG_VALUE;
for(int i = 1; i <= total; i++) {
if(!_self_position.SelectByIndex(i))
continue;
// 提取持仓数据,填充输出结构体数组
::ZeroMemory(outer[++outer_index]);
outer[outer_index].symbol = _self_position.Symbol();
outer[outer_index].exchange = _self_position.ExchangeID();
outer[outer_index].type = _self_position.DirectionDescription();
outer[outer_index].type_date = _self_position.PositionDateDescription();
outer[outer_index].volume = _self_position.Position(); // 持仓数量|可能为0
outer[outer_index].price = _self_position.Price();
outer[outer_index].margin = _self_position.Margin();
outer[outer_index].commission = _self_position.Commission();
outer[outer_index].exit_profit = _self_position.CloseProfit();
outer[outer_index].Open_profit = _self_position.OpenProfit();
outer[outer_index].profit = _self_position.PositionProfit();
outer[outer_index].margin_frozen = _self_position.FrozenMargin();
outer[outer_index].commission_frozen = _self_position.FrozenCommission();
}
// 输出CTP持仓信息
ArrayPrint(outer);
}
//+------------------------------------------------------------------+