最后由 麻爪 于 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,直接赋值会出错 |