MQL5语言帮助文件人话版(十一)数据类型之枚举型

| 发表于 前天 16:22 | 显示全部楼层 |复制链接
最后由 麻爪 于 2026-9-7 16:28 编辑

第十一章 枚举型

一、枚举的本质
枚举(enum),用一句话说就是限定选项的多选一格式。
形象理解就像下拉菜单,点一下会出来很多选项,你只能选其中一项。有的下拉菜单允许你选多项,但枚举这里只能选一项,其他项就不起作用了。
还有点类似布尔(bool)型,你选了真,就不能同时再选假。只不过枚举类型允许你设计或者可以为你提供多个选项。比如下单类型。多数交易平台都可以提供多种成交类型,比如:、
ORDER_TYPE_BUY      //当前市价买
ORDER_TYPE_SELL     //当前市价卖
ORDER_TYPE_BUY_LIMIT   //指定价格买
ORDER_TYPE_SELL_LIMIT  //指定价格卖
ORDER_TYPE_BUY_STOP    //突破价格买
ORDER_TYPE_SELL_STOP   //突破价格卖
当然还有其他种,这个内置的枚举名字就叫:ENUM_ORDER_TYPE,翻译成汉字就是:枚举_下单_类型,这是一个标准的见名知意的命名。你的策略无论怎么分析,最终给出的成交方式只有一个,你不可能让系统又挂单又市价又买又卖。所以这个下单类型必须做成枚举,一旦选了其中一个,其他方式作废。这就叫枚举选项之间的业务互斥性。
在系统成交函数中,内置了许多枚举类型的参数。因为成交过程,就是对许多操作进行选择的过程。
比如动作类型枚举,你要选择这一次要做什么,是开单、挂单、了结、改单、删除挂单还是修改止损止盈价位?必须先选一个,系统才能继续。
比如成交模式,你只要全部成交,还是可以先部分成交,剩下的慢慢成交,还是先部分成交,剩下的直接放弃,也需要做出选择。
比如挂单有效期,你需要选择挂单什么时候作废,是一直挂着,还是挂一天,还是挂到几点几分等等。
你会发现,这些其实做手动下单的时候,也需要点选,只是多数情况下系统会默认一种状态,让你可以一键成交。但写代码的时候,EA不懂默认,你怎么写,它就怎么做,不写,它很可能在运行过程中自动生成一些垃圾数字,然后胡乱操作。你不把成交函数中这些选项写明白,绝大多数情况下,系统都无法正常成交。

二、枚举的格式
MQL5 平台预先内置了大量现成枚举供开发者直接调用。同时,它还允许自定义枚举数据类型,用作自变量或者函数的参数。
自定义枚举数据类型有点绕,我们用整数型数据类型类比一下。前面说过,整数型数据类型有八种子类型:char、uchar、short、ushort、int、uint、long、ulong,这是系统自带的。但自定义枚举类型是我们自己创造的新的数据类型,可以定一个,也可以定十个一百个自定义枚举,每个自定义枚举都像整数型的int char等等,可以用来定义变量。整数数据类型定义的变量,可以赋值其允许的全部整数。自定义枚举定义的变量,只能赋值自定义枚举几个选项其中的一个。这也是所谓的“用作自变量的参数”的意思。
定义枚举数据与其他数据的格式类似,也就是 数据类型enum+变量名称 ,它的内容是多个枚举常量,写在后面的大括号中,以逗号,隔开,最后一个枚举常量后面不加逗号,。

枚举格式:
enum 枚举名 {枚举常量1, 枚举常量2,枚举常量3};
也可以换行写:
enum 枚举名
{
    枚举常量1,
    枚举常量2,
    枚举常量3
};
也可以这样写:
enum 枚举名
{
    枚举常量1=1,
    枚举常量2=2,
    枚举常量3=3
};

枚举中的常量,指的是编译期常量,在系统运行中不会变化。因为枚举本质上就是提供固定选项的格式。但这不是说你就不能修改它,但你改完之后再运行,这些量还是固定不变的。所以才叫常量。
在 MQL5 中,枚举常量的基础承载类型一般为 int(4 字节有符号整型),所以枚举成员可以拥有正数、0、负数,取值范围和 int 一致。本质上和前面说的用数字代替一种状态是同理的。
你可以人为设定这些常量具体为哪个数字,如果不规定,默认第一个是0,后面的依次加1。
这个数字仅仅是给枚举常量编号用的,没有数学上的意义。这个编号默认是连续的,你也可以设定为任意数字。
许多系统自带的枚举类型,你调用的时候,不需要写老长的枚举常量名,通过强制转换来写号码是一样的效果,但不能直接写号码。
在写自定义枚举里面的常量的时候,也不能直接写数字,必须写常量名字,可以给它们赋值0,1,2,3···,也可以不赋值,它自己默认0,1,2,3···。需要注意和强调的是,在枚举里面的所谓的赋值,不同于给变量赋值,不是真的给枚举的各项内容赋值,只是给它们编号而已。
三、定义和使用枚举常量

举一个简单的例子,演示如何定义和使用枚举。

//  --------定义枚举类型(大括号里面必须写名字)--------
enum Signal                 //建一个名叫Signal的枚举,意思是信号,这不是系统自带的,是我们自己创造的,并起了名字
{
    SIG_NONE,               //枚举Signal的第一个成员,默认编号0,意思是啥都不做信号
    SIG_BUY,                //枚举Signal的第二个成员,默认编号1,意思是做多信号
   SIG_SELL                 //枚举Signal的第三个成员,默认编号2,意思是做空信号
};  


// -------- 使用枚举变量 -------- 注意,这里才是真的给枚举成员赋值
Signal sig;                  //用枚举Signal建立一个变量 sig

sig = SIG_BUY;               //给变量 sig 赋值,标准写法就是写枚举Signal里面的常量名字      
sig = (Signal)1;             //给变量 sig 赋值,用我们自创的数据类型 枚举Signal 强制转换数字1的数据类型,也可以  ,但在系统自带的枚举中如果只用数字也就是序号赋值,会报错,我亲自试过,必须写里面的常量名字
sig = 1;                     //不能这么写,系统会报错,因为数值1的数据类型是int,变量sig的数据类型是自创的Signal,直接赋值会出错
最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册