You need to enable JavaScript to run this app. 如何在MQL5中创建存储MqlTick实例的列表、栈或队列并解决相关编译报错
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,直接传入&currentTick:该队列的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 11:45:07