大家好,今天我们来聊聊 Exp_2pbIdealMA EA,这款专家顾问(EA)是基于移动平均线交叉的策略,并结合趋势进行仓位缩放。当一根K线收盘时,如果快速移动平均线 2pbIdeal1MA 与慢速移动平均线 2pbIdeal3MA 发生交叉,就会形成交易信号。进一步地,如果上一个交易的盈利点数超过了EA输入参数中设定的阈值,它将会增加已开仓位的交易量。快速移动平均线的突破是买入信号,而突破下行则是卖出信号。关于仓位缩放的信息将以字符串形式存储在交易注释中,格式为:缩放次数 / 最后交易价格 / 最后交易量.
请将2pbIdeal1MA.ex5 和 2pbIdeal3MA.ex5编译文件放入<终端数据文件夹>\MQL5\Indicators中。
编译后,Exp_2pbIdealMA_ReOpen.ex5 专家文件将包含 2pbIdeal1MA.ex5 和 2pbIdeal3MA.ex5 指标作为资源,因此编译后的EA在工作时不需要在终端文件夹中存在这些指标!为此,相应的代码已被添加到EA代码中,以便将这些指标包含在专家的可执行文件中。
指标的可执行文件已作为全局资源添加。
//---- 将指标作为资源包含到EA代码中
#resource "\Indicators\2pbIdeal1MA.ex5"
#resource "\Indicators\2pbIdeal3MA.ex5"
#resource "\Indicators\2pbIdeal1MA.ex5"
#resource "\Indicators\2pbIdeal3MA.ex5"
在OnInit()函数块中,已经更改了作为资源使用的指标的字符串路径。
//---- 获取2pbIdeal1MA指标的句柄
InpInd1_Handle=iCustom(Symbol(),InpInd_Timeframe,"::Indicators\2pbIdeal1MA.ex5",Period1,Period2,0);
if(InpInd1_Handle==INVALID_HANDLE)
{
Print("获取2pbIdeal1MA指标句柄失败!错误代码=",GetLastError(),".");
return(INIT_FAILED);
}
//---- 获取2pbIdeal3MA指标的句柄
InpInd2_Handle=iCustom(Symbol(),InpInd_Timeframe,"::Indicators\2pbIdeal3MA.ex5",PeriodX1,PeriodX2,PeriodY1,PeriodY2,PeriodZ1,PeriodZ2,0);
if(InpInd2_Handle==INVALID_HANDLE)
{
Print("获取2pbIdeal3MA指标句柄失败!错误代码=",GetLastError(),".");
return(INIT_FAILED);
}
InpInd1_Handle=iCustom(Symbol(),InpInd_Timeframe,"::Indicators\2pbIdeal1MA.ex5",Period1,Period2,0);
if(InpInd1_Handle==INVALID_HANDLE)
{
Print("获取2pbIdeal1MA指标句柄失败!错误代码=",GetLastError(),".");
return(INIT_FAILED);
}
//---- 获取2pbIdeal3MA指标的句柄
InpInd2_Handle=iCustom(Symbol(),InpInd_Timeframe,"::Indicators\2pbIdeal3MA.ex5",PeriodX1,PeriodX2,PeriodY1,PeriodY2,PeriodZ1,PeriodZ2,0);
if(InpInd2_Handle==INVALID_HANDLE)
{
Print("获取2pbIdeal3MA指标句柄失败!错误代码=",GetLastError(),".");
return(INIT_FAILED);
}
这样,专家的编译可执行文件可以在其他交易终端上独立使用,而不需要这些指标。
在下方测试中使用的都是默认的专家顾问输入参数,测试中没有使用止损和止盈。

图 1. 图表上的交易示例
2015年GBPJPY H4的测试结果:

图 2. 测试结果图表