MQL5结构体与类的高级用法

新帖
登录发帖
Exness 推荐平台

入金门槛低,出金到账快,支持多种账户类型

FSA(塞舌尔)/FCA(英国) / CySEC(塞浦路斯) · 最低入金 $130
ryan63
ryan63 楼主 2 小时前 浏览 8 回复 0 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 4 帖数 18 积分 1057 汇币 754
1楼
凌晨两点多,MT5的编辑器还亮着,我在给一个多品种对冲EA加日志模块,本来想用结构体把订单信息打包传进函数,结果编译一直报“结构体不能包含动态数组”,折腾了快一个小时才换成类。趁这个劲儿还没过去,把MQL5里结构体和类这块我踩过的坑捋一捋,给已经能写基本EA、想再往深走一步的朋友参考。
先说结构体。很多人习惯拿它当纯数据容器用,这没错,但MQL5的结构体有几个隐性限制得注意。结构体里不能放动态数组、不能放字符串以外的复杂对象成员,我最早想把持仓列表塞进一个struct里循环处理,声明了string数组直接编译不过。后来改成固定长度数组加一个计数变量才过。另外结构体做函数参数时默认是按值传递,大结构体频繁传会拖性能,尤其Tick级调用的函数,能传引用就传引用,加个&符号的事,但记得加const避免误改。还有个坑是结构体初始化,MQL5不像C++支持构造函数,你得手动写个Init函数或者用ZeroMemory,我有次忘了清零,结构体里残留上一轮的价格数据,回测跑出来的单子逻辑全乱,查了半天才发现是未初始化成员在作怪。
再说类。类真正好用的地方是封装状态和资源管理,比如把VPS上跑的多账户配置、指标句柄、文件句柄都收进一个类里,析构函数里统一释放。指标句柄一定要在析构里用IndicatorRelease释放,我早期写EA没管这个,挂在一台VPS上跑了一周多,句柄数一直涨,最后图表直接卡死。类的另一个高频用法是继承,比如写个基础的CStrategy基类,把OnTick的骨架、下单封装、滑点处理放进去,具体策略继承后只重写信号判断。这里要注意虚函数必须用virtual声明,重写时参数签名一字不能差,我有次在子类里把参数类型从double写成int,编译过了但运行时调的还是父类版本,信号压根没触发,这种问题不看日志很难发现。访问权限也别全public,内部状态用private,暴露必要的getter,不然多策略共用时一个类改了另一个类的成员,排查起来很痛苦。
实操上我建议这么走:

  • 先把订单、持仓这类实体定义成结构体,只放POD类型,负责数据传递
  • 把带行为的东西——开平仓逻辑、指标计算、日志输出——包成类,用组合而不是继承去拼装
  • 类成员里的数组和句柄,统一在析构函数里清理,养成习惯
  • 跨文件复用时用#include引头文件,结构体和类定义放.h里,实现放.mqh,避免重复定义
  • 调试阶段在类里加个EnableLog开关,正式挂VPS前关掉,减少IO开销

最后提一句,结构体和类在MQL5里都能用new动态分配,但结构体用new之后记得delete,类虽然也有自动回收,但指针成员还是得自己管。我现在这个对冲EA的日志模块就是把每条成交记录做成结构体、写盘逻辑做成类,跑回测时日志写入速度比之前直接拼字符串快了差不多三成。你们在写多品种EA时,结构体和类一般怎么分工的?有没有遇到过句柄或者内存没释放导致VPS上跑崩的情况,评论区聊聊。🙂
0 回复 众裁0 复制
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 ATFX大非农时段滑点实测记录,交流