
- 预定义常量
- 编译控制
- 文件包含
- 函数导入
预处理程序是MQL4编译程序的一个特殊的构成部分,用于在程序被编译以前预先做好准备程序源码。
预处理程序能加强程序源码的可读性。在MQL4程序中,通过包含指定的文件可以得到结构化源码,给常量取一个易于记忆的名字有利于加强源码的可读性。
预处理程序也允许MQL4程序定义特定的参数。
假使#号置于程序的第一行,那么该行就是预处理程序的控制指令。预处理程序指令以回车换行终结。
运用 #define 命令,我们可以在程序中定义符号名或符号常量代表特定的字符串。随后,编译程序会将所有符号名替换成相应的字符串。实际上,这些名称可以被任意的文本替换,并没有局限于数字:
#define identifier value
常量符号名同样遵守变量名的命名规则,值可以是下方任意类型:
#define ABC 100#define PI 0.314#define COMPANY_NAME "myEAtrade Inc."...void ShowCopyright() { Print("版权所有 © 2001-2007, ",COMPANY_NAME);Print("http://www.myeatrade.com");}
每个MQL4程序允许指定更多的特定参数,这些参数用#property命名,它不需要用户清晰地起步程序,就可帮助客户端供应合适的服务。要注意的是,这个功能还与技术指标的外部设定相关。
#property 识别值
常数 | 类型 | 描述 |
---|---|---|
link | string | 公司网站的有关连接 |
copyright | string | 公司名称 |
stacksize | int | 堆栈大小 |
library | 库 | |
indicator_chart_window | void | 在图表窗口表明指标 |
indicator_separate_window | void | 在独立表明窗口表明指标 |
indicator_buffers | int | 计算指标的缓冲区个数,最大为8 |
indicator_minimum | double | 独立表明的指标窗口下端缩放比例 |
indicator_maximum | double | 独立表明的指标窗口上端缩放比例 |
indicator_colorN | color | 线1到线8的表明颜色 |
indicator_widthN | int | 线1到线8的表明宽度 |
indicator_styleN | int | 线1到线8的表明样式 |
indicator_levelN | double | 自定义指标的第N条水平线(N为1到8) |
indicator_levelcolor | color | 自定义指标的第N条水平线颜色(N为1到8) |
indicator_levelwidth | int | 自定义指标的第N条水平线宽度(N为1到8) |
indicator_levelstyle | int | 自定义指标的第N条水平线样式(N为1到8) |
show_confirm | void | 在脚本运行以前表明证实框 |
show_inputs | void | 在脚本运行以前表明它的属性表;禁用show_confirm属性 |
示例:
#property link "http://www.myeatrade.com"#property copyright "myEAtrade Inc."#property library#property stacksize 1024
在所实施模块的设置中,编译程序将令保存这些已表明的值。
#include 命令行可以放置在程序的任意部分,但是所有的“文件包含”一般都被统一放置在源代码的开头。调用格式:
#include#include "file_name";
示例:
#include#include "mylib.mqh"
预处理程序将用WinUser32.mgh文件内容替换这一行。尖括号表明WinUser32.mqh文件将令从默认目录调用(一般默认目录为terminal_ directory/experts/include)。不会搜索目前目录。
假使文件名用引号括起来,将于目前目录中搜索该文件(源码主文件所在位置)。不会搜索标准目录。
函数可从MQL4编译过的模块(*.EX4文件)和操作系统文件模块(*.DLL文件)导入过来。模块名需要在#import指令中指定。由于编译程序能够以适当的方式生成被导入的函数调用和传递参数,函数的完整表明是必需的。函数表明要紧跟在 #import "module name” 命令后而,以新的#import命令(不带参数)终结导入函数表明块。
#import "file_name" func1 define; func2 define; ... funcN define;#import
导入函数务必有唯一的名称。相同名称的函数无法从不同的模块同期导入。导入的函数名称不能与那些内置函数矛盾。
受于导入函数是在模块之外编译的,编译程序无法检查参数传递的正确性。这就是为何,为了避免运行时错误,有必要精确地表明参数类型定义和参数顺序的原因。传递到导入函数(从EX 和从DLL模块)的这些参数不能通过默认值得到值。
示例:
#import "user32.dll" int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);#import "stdlib.ex4" string ErrorDescription(int error_code);int RGB(int red_value, int green_value, int blue_value);bool CompareDoubles(double number1, double number2);string DoubleToStrMorePrecision(double number, int precision);string IntegerToHexString(int integer_number);#import "Expert示例.dll" int GetIntValue(int);double GetDoubleValue(double);string GetStringValue(string);double GetArrayItemValue(double arr[], int, int);bool SetArrayItemValue(double& arr[], int,int, double);double GetRatesItemValue(double rates[][6], int, int, int);int SortStringArray(string& arr[], int);int ProcessStringArray(string& arr[], int);#import
对于在MQL4程序实施阶段导入的函数,采取了所谓的“后期联编”。这就代表着只要导入的函数未被调用,相应的模块(EX4或DLL)就不会被加载。
不推荐运用全路径文件名Drive:/Directory/FileName.Ext加载模块。MQL4库会从terminal_dir/experts/libraries文件夹中载入进来。假使没有寻到库,就会试图从terminal_dir/experts文件夹中加载。