首页 / 交易学院 / 在 MQL5 中实现电子表格:CTable 二维数据类
在 MQL5 中实现电子表格:CTable 二维数据类
📋

在 MQL5 中实现电子表格:CTable 二维数据类

MQL5 编程 难度 · 进阶 2010 11 分钟阅读
CTable二维数组Variant

为什么需要表格类

Excel 太重,而指标与 EA 内部经常需要“异质二维数据”:一行里既有字符串标签、又有数值、还有时间。原生二维数组只能存单一类型,CTable 用 Variant 思路弥补这一缺口。

CTable 的接口

CTable 采用“先列后行”的两步构造:FirstResize 用类型数组定列结构,SecondResize 用整数定行数。这借鉴了 C++ 中 Variant 单列特例的思想。

class CTable
{
public:
   void  FirstResize(const ENUM_DATATYPE &TYPE[]); // 设列类型
   void  SecondResize(int j);                       // 设行数
   int   FirstSize(void);                           // 列数
   int   SecondSize(void);                          // 行数
   void  CopyTable(const CTable &src);              // 深拷贝
   bool  Change(...);
   bool  Insert(...);
};

FirstResize / SecondResize 语义

FirstResize 接收 ENUM_DATATYPE 数组,长度即列数,每个元素声明该列单元格类型;行数此时无需指定,由 SecondResize 后续给出。这种分离让对象可作为函数参数传递后再划分。

单元格类型与 Variant

✦ 灵活但代价明确
用 ENUM_DATATYPE 数组描述每列类型(double/string/datetime…),比单一类型数组慢但灵活。把它视作 C++ Variant 类在表格上的推广。

CopyTable 与性能

CopyTable 做深拷贝,避免两个 CTable 指向同一底层缓冲产生别名 bug。在性能敏感路径,仍建议退回单一类型原生二维数组。

void CTable::CopyTable(const CTable &src)
{
   // 逐列按类型深拷贝,避免别名
   for(int c=0; c<FirstSize(); c++)
      CopyCol(c, src);
}

实战用途

小结

CTable 不是要取代 Excel,而是给 MQL5 一个轻量的“表格思维”工具。理解它的两步构造与 Variant 本质,能少写很多胶水代码。

常见问题

有开销(类型判断+对象封装),但用起来方便;高频热路径仍建议原生数组。
行数由 SecondResize 单独设定,First 只定列结构,遵循先列后行的两步构造。
可以,每列有独立 ENUM_DATATYPE,正是 Variant 式设计的目的。