如何在MQL5中创建存储MqlTick实例的列表、栈或队列并解决相关编译报错
MQL5 存储MqlTick实例的泛型容器适配方案
原有三次尝试的报错核心原因
- 直接以MqlTick作为泛型参数定义
CQueue<MqlTick> myQueue:MQL5内置泛型容器要求存储元素必须支持引用传递,MqlTick作为原生结构体是值传递类型,无法满足容器内部数组的存储语法要求,因此触发objects are passed by reference only类编译错误。 - 以MqlTick*作为泛型参数定义
CQueue<MqlTick *> longQueue:MQL5内置泛型容器的类型参数仅支持类类型,不允许直接传入原生结构体指针,因此触发class type expected的编译拦截。 - 以CObject*作为泛型参数定义
CQueue<CObject *> longQueue,直接传入¤tTick:该队列的Add()方法要求入参必须是CObject基类的实例指针,而MqlTick是原生结构体,既不继承自CObject,也不存在类型转换兼容关系,因此无法匹配方法参数签名,触发重载匹配失败的报错。
可行的适配实现
将MqlTick封装为继承自CObject的自定义类,即可完全满足内置泛型容器的参数要求,实现栈、队列、列表的存储逻辑。
实现步骤
- 定义包装类,继承CObject,内部持有MqlTick结构体实例作为成员变量
- 使用包装类作为泛型参数初始化对应的容器实例
- 入队/入栈时,创建包装类实例绑定原始tick数据,传入容器方法
- 出队/出栈取数据时,从容器返回的包装类实例中读取内部存储的tick结构体
参考代码
#include <Generic\Queue.mqh> #include <Object.mqh> // 自定义MqlTick包装类,满足泛型容器的类型要求 class CTickWrapper : public CObject { public: MqlTick tickData; CTickWrapper(MqlTick &srcTick) { tickData = srcTick; } }; // 初始化存储tick的队列,同逻辑可替换为CStack、CList CQueue<CTickWrapper> tickQueue; int OnStart() { MqlTick currentTick; // 获取当前最新tick数据 if(!CopyTickBuffer(_Symbol, currentTick)) return -1; // 入队:创建包装实例加入队列 CTickWrapper *newItem = new CTickWrapper(currentTick); tickQueue.Add(newItem); // 出队:取出元素读取数据 if(tickQueue.Count() > 0) { CTickWrapper *popItem = tickQueue.Peek(); // 直接读取内部存储的原始tick数据 Print("队列中tick的最新价:", popItem->tickData.last); // 释放内存避免泄漏 delete popItem; tickQueue.Remove(); } return 0; }
注意事项
- 内置泛型容器存储的是类实例指针,入队时通过
new创建的对象,出队使用完成后需要手动调用delete释放内存,避免运行时内存泄漏。 - 该封装逻辑对CStack、CList等同系列内置泛型容器完全通用,不需要额外修改适配逻辑。
内容的提问来源于stack exchange,提问作者Trayan Momkov
相关产品推荐
相关产品推荐

