什么是常量
常量顾名思义,是指在程序执行过程中其值始终保持不变的数据。例如,数字 5
是一个整型常量;字符 'A'
是一个字符常量;而 2009.01.01 00:00:00
是一个表示 2009 年 1 月 1 日零点的 datetime
日期时间常量。
MQL4语言内置了种类繁多的标准常量,应用于价格数据、图表周期、颜色、交易操作等多个方面。例如,PERIOD_H1
是表示 H1 (小时) 图表周期的常量,OP_BUY
代表执行买入市价单操作,而 Red
则是代表红色的颜色常量。
您还可以使用 #define
预处理器指令来定义自己的常量。要查阅 MQL4中所有可用的标准常量及其含义,请参考 MQL 参考文档中的“标准常量 (Standard Constants)”章节。
变量就像一个“白板”,你可以随时写擦写改。常量就像一块“刻着字的石头”,一旦写上去,谁也不能改,用来保存那些固定死了的设定参数、类型、标识、编号、标签等。
常量的常见写法:
1. 用 #define
宏定义常量
这些值在整个程序里都能用,而且永远不会变。比如用 OrderSend()
时直接用常量:
2. 用 const
定义不可更改的变量(也是常量)
这些变量一旦设置,就不能在后续更改它们的值。
MQL4中常用的常量示例
类型 | 举例 | 用途 |
---|---|---|
操作类型常量 | OP_BUY , OP_SELL |
表示买单 / 卖单类型 |
图形常量 | OBJ_LABEL , OBJ_TREND |
创建图表上的图形或标签 |
时间常量 | PERIOD_M1 , TIME_DATE |
指定时间周期,或时间信息 |
错误常量 | ERR_NO_ERROR , ERR_TRADE_TIMEOUT |
用于错误检查 |
颜色常量 | clrRed , clrBlue |
设置图表颜色、箭头颜色等 |
变量 vs 常量
属性 | 变量(Variable) | 常量(Constant) |
---|---|---|
定义 | 一个可以存储并改变数值的命名空间 | 一个只能被定义一次、值不可更改的命名空间 |
关键词 | 使用数据类型如 int 、double 等 |
使用 #define 或 const |
值是否可变 | 可以随时更改 | 一旦设定就不能更改 |
作用时长 | 运行时动态分配与改变 | 编译前已经固定,不可变 |
是否可重复赋值 | 可以多次赋值 | 只能初始化一次 |
生命周期 | 程序运行期间有效 | 编译时就已固定值,运行中不可再变更 |
应用场景 | 储存价格、计算结果、交易状态、递增值等 | 储存手数、滑点、魔术号、图表样式等固定值 |
可读性 | 可能需要通过命名来加强可读性 | 常量通常用大写字母,能一眼识别是固定设定 |
代码安全性 | 可能在其他地方被修改,易引发逻辑错误 | 不可被修改,更安全更稳定 |
易维护性 | 值分散各处,维护不如常量 | 集中写在顶部,修改方便,一处修改全局生效 |
示例写法 | int count = 0; double price = Ask; |
#define SLIPPAGE 3 const double RISK = 0.01; |
编译器优化 | 变量可被多次修改,优化空间小 | 常量在编译阶段可直接替换为实际值,提高性能 |
推荐命名风格 | 小写开头,如 orderCount 、avgPrice |
大写字母+下划线,如 MAX_TRADES 、MAGIC_NUMBER |
易混淆点 | 程序复杂时,变量值来源不清晰,调试困难 | 常量值固定,程序逻辑清晰 |
关键字冲突风险 | 较低,变量名冲突时报错 | 使用 #define 可能造成宏替换冲突 |
系统内置支持 | 变量由用户自定义为主 | MQL4 系统内置了上千个常量(如 OP_BUY , clrRed , MODE_EMA , OBJ_LABEL ) |
现实生活的类比来帮助理解
类比内容 | 变量 | 常量 |
---|---|---|
白板 vs 石碑 | 白板上的字可以随时擦写 | 石碑刻字,一旦刻上去不能更改 |
文件 vs 印章 | 文件内容可修改 | 印章内容固定 |
水杯 vs 保温杯标签 | 水杯里的水可以换 | 保温杯上贴的标签是不会改的 |
游戏进度 | 玩家当前等级、血量(变量) | 游戏默认最大等级、每关BOSS血量(常量) |
变量/常量示例对比
变量示例
这些值可以随程序运行不断变化。
常量示例(#define
)
这些是程序设定的“死规则”,在编译时已决定,不可变!
常量示例(const
)
这些也不能在程序运行中更改,属于编译期固定值。
小结:
常量是“固定不变的规则”,变量是“可以变的值”。
常量让代码安全、清晰、易维护;变量让代码灵活、可控、具备逻辑。