近日有朋友问:MT4的EA能运行没有打开窗口的货币对上吗?这问题听起来觉得有点绕,细细一想,其实就是问:MT4的EA能交易没有打开窗口的货币对吗、mt4的EA能跨图表交易吗、mt4的EA能同时交易多货币吗这方面的问题。
答案当然是肯定的,问题的核心也就是跨图表获取数据的问题。其实mt4的EA的运行并不是依靠所看到的图表数据,而是其内部函数对交易品种数据的获取。比如,当前mt4有100个交易品种,那么可以在一个EA里用相同的函数调用不同的品种名称参数来获取这100个品种的所有数据。获取数据后,就可以进行各种条件的比较来开仓交易了。
有一点我们要清楚,mt4的EA的主函数OnTick(),是依靠价格跳动来运行的,也就是说价格每跳动一次它执行一次。所以EA写好后,是要加载在有价格跳动并允许交易的图表上运行的。不管你的EA里面交易多少个品种,都要将EA加载到当前账号下可以正常交易的品种的图表上。
EA跨图表获取数据时,要注意所有参数的严谨性,不能有一点错误。比如不同品种的点(Point)是不同的,每个品种都要用对应的函数获取它的Point,然后在进行计算。在编写多货币跨图表EA上,要考虑它们的共同点和不同点,然后将不同点用参量来代替。EA编写时大部分函数都顺着共同点走,最终执行的时候调用不同的参量来执行。这样会省事很多。
比如我们现在要分别比较欧元兑美元、英镑兑美元两个货币对的日线图K线阴阳,为了便于理解,我们可以将开盘价与收盘价函数分开写,然后在比较。
double Syopen(string syname,ENUM_TIMEFRAMES Period_x,int si)
{
return(iOpen(syname, Period_x, si));
} //开盘价函数
double Syclose(string syname,ENUM_TIMEFRAMES Period_x,int si)
{
return(iClose(syname, Period_x, si));
} //收盘价函数
对于上面两个函数的参量,只要不搞错数据类型及命名规则就行。现在我们调用函数比较K线开盘与收盘。
if(Syclose("EURUSD",PERIOD_D1,0) > Syopen("EURUSD",PERIOD_D1,0)){/*欧元兑美元为阳线,可以去执行什么*/}
if(Syclose("GBPUSD",PERIOD_D1,1) < Syopen("GBPUSD",PERIOD_D1,1)){/*英镑兑美元昨日收阴线,可以去执行什么*/}
通过上面这个例子,可以简单的熟悉下如何跨图表获取数据来比较,当然,如果你往深处研究,也可以将它们整合成一个函数,在函数内直接比较开盘与收盘,再根据比较结果的不同来返回不同的值。那么调用起来更方便。
本文要说的主题是MT4 EA能交易没有打开窗口的货币对。或者说,EA并不一定要加载在要交易的图表上,ea最终运行的是其内部的函数,内部函数让它获取什么图表数据来交易,它就怎么交易。