对于进阶交易者而言,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个核心部分:
1. 变量与数据类型:变量用于存储数据,MQL4的常用数据类型有:double(浮点型,用于存储价格、点数)、int(整型,用于存储手数、周期)、bool(布尔型,用于存储真/假)、string(字符串,用于存储文本)。例如,定义一个存储入场价的变量:double entryPrice = Ask;
2. 内置函数:MQL4提供了大量内置函数,用于获取市场数据、执行交易操作、绘制指标图形。常用函数有:iMA()(获取均线数值)、iRSI()(获取RSI数值)、OrderSend()(发送订单)、PlotIndexSet()(绘制指标曲线)。
3. 事件处理函数:自定义指标和脚本的运行,依赖于事件处理函数。自定义指标的核心函数是OnCalculate(),每当图表数据更新(如出现新的K线),该函数会自动执行;脚本的核心函数是OnStart(),脚本启动后,只执行一次该函数。
4. 条件语句与循环语句:条件语句(if…else)用于判断信号是否成立,循环语句(for、while)用于遍历K线数据。例如,判断RSI是否低于30:if(iRSI(NULL,0,14,PRICE_CLOSE,0)<30) { Print(“RSI超卖”); }
5. 指标绘制:自定义指标需要将信号绘制在图表上,通过PlotIndexSet()函数设置指标样式,如曲线颜色、线条粗细、图标样式等。
接下来,实战编写第一个自定义指标——“均线金叉死叉信号指标”。该指标的功能是:当5日EMA上穿20日SMA时,在图表上绘制绿色向上箭头;当5日EMA下穿20日SMA时,绘制红色向下箭头,直观显示交易信号。
具体编写步骤:
第一步,在MetaEditor的项目管理区,右键点击“Indicators”文件夹,选择“新建”→“指标”,弹出新建指标窗口,输入指标名称“MA_Cross_Signal”,点击“确定”,系统会自动生成指标的框架代码。
第二步,在代码编辑区,补充核心代码:
1. 定义指标参数:在input组中,添加均线周期和类型的参数,方便后续调整。
input int FastMAPeriod = 5; // 快速均线周期
input int SlowMAPeriod = 20; // 慢速均线周期
input int MA_Type = MODE_EMA; // 快速均线类型
input int Slow_MA_Type = MODE_SMA; // 慢速均线类型
2. 获取均线数值:在OnCalculate()函数中,调用iMA()函数,获取当前K线和前一根K线的快速、慢速均线数值。
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);
3. 判断金叉死叉信号,绘制箭头:使用if条件语句判断信号,调用PlotIndexSet()和DrawArrow()函数绘制箭头。
// 金叉信号:前一根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()函数中,编写核心代码:
1. 遍历所有订单:使用OrdersTotal()函数获取订单总数,通过for循环遍历每一笔订单。
2. 判断订单状态:使用OrderSelect()函数选择订单,判断是否为未平仓订单(OP_BUY或OP_SELL)。
3. 执行平仓操作:调用OrderClose()函数,平仓对应订单。
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和指标,打造完全个性化的交易体系。
原创文章,作者:MetaTrader 4,如若转载,请注明出处:https://www.cnmetatrader4.com/news/64.html