对于进阶交易者而言,MT4 内置的 30 多种技术指标和脚本,往往无法完全满足个性化的交易需求。例如,有的交易者希望将 “均线交叉 + RSI 背离” 两个信号融合成一个指标,有的交易者需要批量平仓、一键设置止损的脚本,此时就需要通过 MQL4 编程语言,编写自定义指标和脚本。MQL4 是 MT4 专属的编程语言,语法简单,贴近 C 语言,即使没有编程基础的交易者,也能通过入门学习,编写适合自己的交易工具。本文将讲解 MQL4 的核心基础、自定义指标编写步骤、脚本编写实战,帮助交易者迈出个性化工具开发的第一步。
首先,了解 MQL4 的开发环境 ——MetaEditor。MetaEditor 是 MT4 内置的编程编辑器,集成了代码编写、编译、调试等功能,是开发自定义指标、脚本、EA 的核心工具。打开 MetaEditor 的方式有三种:一是在 MT4 平台中,点击顶部工具栏的 “MetaQuotes Language Editor” 按钮(图标为 “MQ”);二是按快捷键 F4;三是在 MT4 数据文件夹的 “MQL4” 目录中,双击 “MetaEditor.exe”。
MetaEditor 的界面主要分为四个区域:左侧的 “项目管理区”,显示 MQL4 的文件目录(包含 Indicators、Scripts、Experts 等文件夹,分别对应自定义指标、脚本、EA);中间的 “代码编辑区”,用于编写代码;下方的 “编译日志区”,显示代码编译的结果,若有错误,会提示错误位置和原因;右侧的 “函数库区”,包含 MQL4 的所有内置函数,可直接调用。
其次,MQL4 的核心基础语法,是编写工具的前提。对于入门者而言,无需掌握复杂的语法,只需重点掌握以下 5 个核心部分:
- 变量与数据类型:变量用于存储数据,MQL4 的常用数据类型有:double(浮点型,用于存储价格、点数)、int(整型,用于存储手数、周期)、bool(布尔型,用于存储真 / 假)、string(字符串,用于存储文本)。例如,定义一个存储入场价的变量:double entryPrice = Ask;
- 内置函数:MQL4 提供了大量内置函数,用于获取市场数据、执行交易操作、绘制指标图形。常用函数有:iMA ()(获取均线数值)、iRSI ()(获取 RSI 数值)、OrderSend ()(发送订单)、PlotIndexSet ()(绘制指标曲线)。
- 事件处理函数:自定义指标和脚本的运行,依赖于事件处理函数。自定义指标的核心函数是 OnCalculate (),每当图表数据更新(如出现新的 K 线),该函数会自动执行;脚本的核心函数是 OnStart (),脚本启动后,只执行一次该函数。
- 条件语句与循环语句:条件语句(if…else)用于判断信号是否成立,循环语句(for、while)用于遍历 K 线数据。例如,判断 RSI 是否低于 30:if (iRSI (NULL,0,14,PRICE_CLOSE,0)<30) { Print (“RSI 超卖”); }
- 指标绘制:自定义指标需要将信号绘制在图表上,通过 PlotIndexSet () 函数设置指标样式,如曲线颜色、线条粗细、图标样式等。
接下来,实战编写第一个自定义指标 ——“均线金叉死叉信号指标”。该指标的功能是:当 5 日 EMA 上穿 20 日 SMA 时,在图表上绘制绿色向上箭头;当 5 日 EMA 下穿 20 日 SMA 时,绘制红色向下箭头,直观显示交易信号。
具体编写步骤:
第一步,在 MetaEditor 的项目管理区,右键点击 “Indicators” 文件夹,选择 “新建”→“指标”,弹出新建指标窗口,输入指标名称 “MA_Cross_Signal”,点击 “确定”,系统会自动生成指标的框架代码。
第二步,在代码编辑区,补充核心代码:
- 定义指标参数:在 input 组中,添加均线周期和类型的参数,方便后续调整。
plaintext
input int FastMAPeriod = 5; // 快速均线周期
input int SlowMAPeriod = 20; // 慢速均线周期
input int MA_Type = MODE_EMA; // 快速均线类型
input int Slow_MA_Type = MODE_SMA; // 慢速均线类型
- 获取均线数值:在 OnCalculate () 函数中,调用 iMA () 函数,获取当前 K 线和前一根 K 线的快速、慢速均线数值。
plaintext
double fastMA = iMA(NULL,0,FastMAPeriod,0,MA_Type,PRICE_CLOSE,0);
double fastMA_Prev = iMA(NULL,0,FastMAPeriod,0,MA_Type,PRICE_CLOSE,1);
double slowMA = iMA(NULL,0,SlowMAPeriod,0,Slow_MA_Type,PRICE_CLOSE,0);
double slowMA_Prev = iMA(NULL,0,SlowMAPeriod,0,Slow_MA_Type,PRICE_CLOSE,1);
- 判断金叉死叉信号,绘制箭头:使用 if 条件语句判断信号,调用 PlotIndexSet () 和 DrawArrow () 函数绘制箭头。
plaintext
// 金叉信号:前一根K线快速均线低于慢速,当前K线快速均线上穿慢速
if(fastMA_Prev < slowMA_Prev && fastMA > slowMA) {
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ARROW);
PlotIndexSetInteger(0,PLOT_ARROW_CODE,233); // 绿色向上箭头代码
PlotIndexSetDouble(0,PLOT_PRICE,Low[0]-10*Point); // 箭头绘制在最低价下方10点
}
// 死叉信号:前一根K线快速均线高于慢速,当前K线快速均线下穿慢速
if(fastMA_Prev > slowMA_Prev && fastMA < slowMA) {
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_ARROW);
PlotIndexSetInteger(1,PLOT_ARROW_CODE,234); // 红色向下箭头代码
PlotIndexSetDouble(1,PLOT_PRICE,High[0]+10*Point); // 箭头绘制在最高价上方10点
}
第三步,编译代码:按快捷键 F7,或点击 MetaEditor 顶部的 “编译” 按钮,若编译日志区显示 “编译成功”,则会在 “Indicators” 文件夹中生成 “MA_Cross_Signal.ex4” 文件;若有错误,根据提示修改代码,直至编译成功。
第四步,在 MT4 中使用指标:重启 MT4,在 “插入”→“技术指标”→“自定义指标” 中,找到 “MA_Cross_Signal”,点击确定,指标就会显示在图表上,清晰呈现金叉死叉信号。
然后,实战编写第一个脚本 ——“一键批量平仓脚本”。脚本与指标的区别在于,指标是实时运行的,而脚本是一次性执行的,适合执行批量操作。该脚本的功能是:一键平仓当前账户的所有未平仓订单,节省手动平仓的时间。
具体编写步骤:
第一步,在 MetaEditor 的项目管理区,右键点击 “Scripts” 文件夹,选择 “新建”→“脚本”,输入脚本名称 “Close_All_Orders”,点击 “确定”,生成脚本框架代码。
第二步,在 OnStart () 函数中,编写核心代码:
- 遍历所有订单:使用 OrdersTotal () 函数获取订单总数,通过 for 循环遍历每一笔订单。
- 判断订单状态:使用 OrderSelect () 函数选择订单,判断是否为未平仓订单(OP_BUY 或 OP_SELL)。
- 执行平仓操作:调用 OrderClose () 函数,平仓对应订单。
plaintext
void OnStart() {
int total = OrdersTotal(); // 获取订单总数
for(int i=total-1; i>=0; i--) { // 倒序遍历,避免删除订单后索引错乱
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { // 选择订单
// 判断是否为未平仓的多单或空单
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
// 执行平仓操作,OrderClose(订单号,手数,平仓价格,滑点,颜色)
bool closed = OrderClose(OrderTicket(),OrderLots(),OrderType()==OP_BUY?Bid:Ask,3,Red);
if(closed) {
Print("订单",OrderTicket(),"平仓成功");
} else {
Print("订单",OrderTicket(),"平仓失败,错误代码:",GetLastError());
}
}
}
}
}
第三步,编译代码:按 F7 编译,生成 “Close_All_Orders.ex4” 文件。
第四步,使用脚本:在 MT4 终端面板的 “脚本” 标签页中,找到该脚本,拖拽到任意图表上,脚本会立即执行,批量平仓所有未平仓订单。
最后,编写自定义指标和脚本的注意事项。对于入门者而言,建议从简单的工具开始,不要追求复杂功能;编写代码时,要添加注释,方便后续修改和理解;每次编写完成后,必须在模拟账户中测试,确保功能正常,避免因代码错误导致实盘亏损;同时,可参考 MT4 内置指标和脚本的源代码,学习编写思路。MQL4 的学习是一个循序渐进的过程,随着经验的积累,交易者可以编写更复杂的 EA 和指标,打造完全个性化的交易体系。下一篇文章,我们将讲解 MT4 平台的多账户管理技巧,适合资金量较大或管理多个账户的交易者。
原创文章,作者:MetaTrader 4,如若转载,请注明出处:https://www.cnmetatrader4.com/news/45.html