在上一节课中我们建立了第一个EA,并完成了一些很简单的功能。接下来,要开始介绍一些用于交易的函数了。第一个便是账户信息函数与检测函数,用来查找账户的信息,如账户的净值,账户的名称等。
1、账户信息函数
一般来说,在EA运行前,我们需要对账户进行判断,比如账户的信息是否正确,账户的净值是多少等等,账户信息核对通过后才可以使用我们的策略对账户的资金进行管理,同时也便于我们对账户的风险进行控制。
查找账户的信息一般采用AccountInfoDouble()、AccountInfoInteger()以及AccountInfoString()函数,这三个函数分别用来查询双精度浮点型账户信息、整数型账户信息以及字符串型账户信息。
比如说,现在我想查询账户的余额,由于余额是个小数,所以我们需要用查询双精度浮点型的账户信息函数AccountInfoDouble()来查询;如果要查账户的杠杆倍数,则用AccountInfoInteger()查找,如果查找交易商的名称,那么就要用AccountInfoString()。
当然,每个函数都有相应的子目录,以便查询各种不一样的信息,那首先介绍一下AccountInfoDouble()函数的用法。我们可以打开帮助文件查看这个函数的子目录如下:
可以看到这个函数可以查询非常多的账户信息,下面我们把它们一一输入进去,看看输出的结果。为了不重复输出,我们用脚本来编写。
void OnStart()
{
Print("账户余额="+(string) AccountInfoDouble(ACCOUNT_BALANCE));
Print("账户亏损="+(string) AccountInfoDouble(ACCOUNT_CREDIT));
Print("账户利润="+(string) AccountInfoDouble(ACCOUNT_PROFIT));
Print("账户净值="+(string) AccountInfoDouble(ACCOUNT_EQUITY));
Print("账户已用保证金="+(string) AccountInfoDouble
(ACCOUNT_MARGIN));
Print("账户可用保证金="+(string) AccountInfoDouble
(ACCOUNT_MARGIN_FREE));
Print("账户可用保证金比例="+(string) AccountInfoDouble
(ACCOUNT_MARGIN_LEVEL) +"%");
Print("账户追加保证金比例="+(string) AccountInfoDouble
(ACCOUNT_MARGIN_SO_CALL) +"%");
Print("爆仓保证金比例="+(string) AccountInfoDouble
(ACCOUNT_MARGIN_SO_SO) +"%");
Print("账户初始保证金="+(string) AccountInfoDouble
(ACCOUNT_MARGIN_INITIAL));
Print("账户维持保证金="+(string) AccountInfoDouble
(ACCOUNT_MARGIN_MAINTENANCE) ); /*用于期货市场*/
Print("账户活动资金="+(string) AccountInfoDouble
(ACCOUNT_ASSETS)); /*用于期货市场*/
Print("账户锁定保证金="+(string) AccountInfoDouble
(ACCOUNT_COMMISSION_BLOCKED)); /*用于期货市场*/
}
以上我们把所有的双精度型账户信息都输出了,得到的结果如下:
所谓账户的追加保证金比例,指的是当前保证金比例小于50%时,交易商会通知你追加保证金以免爆仓,而爆仓保证金比例指的是当保证金比例小于30%时,交易商会对账户强行平仓。
这么多函数其实不用记,只要知道AccountInfoDouble()函数是用来查询账户的小数一类的信息就行了,而这个也是非常简单,直接看这个函数的名字你就知道这个函数可以用来干什么了。如果没有记住这里面的子目录,可以打开帮助文件搜索AccountInfoDouble()来查这个函数的子目录及其功能。以后的MQL4函数也大都不用去背,如果死记硬背估计没个一年还用不了,我们只需要知道一些主要的函数,然后充分利用好帮助文件即可。
接下来是整数型的账户信息,如账户的ID号码等,所有的整数型账户信息如下:
void OnStart()
{
Print("账户ID="+(string) AccountInfoInteger (ACCOUNT_LOGIN));
Print("杠杆倍数="+(string) AccountInfoInteger (ACCOUNT_LEVERAGE));
Print("最大持仓单数="+(string) AccountInfoInteger
(ACCOUNT_LIMIT_ORDERS)); //如果为0则没有限制,由交易商规定
Print("是否允许账户交易="+(string) AccountInfoInteger
(ACCOUNT_TRADE_ALLOWED)); //如果为0则不允许交易,为1则允许交易
Print("是否允许EA交易="+(string) AccountInfoInteger
(ACCOUNT_TRADE_EXPERT)); //如果为0则不允许,为1则允许
Print("保证金的计算模式="+(string) AccountInfoInteger
(ACCOUNT_MARGIN_SO_MODE)); //如果为0,则用百分比计算保证金,若低于某一比例则需追加保证金;若为1则采用保证金的数值来计算保证金,当保证金低于某一值时需追加保证金,取决于交易商,一般来说采用百分比计算
}
如果是模拟账户是没有持仓单数的限制的,如果是实盘账户的话会有限制,每个交易商都不一样,所以在做策略时,特别是多策略多品种同时运行,单子特别多的时候,一定要注意交易商在持仓单数的限制,否则单子数量到了一定程度后交易是开不了单的。另外,是否允许账户交易,这个一般来说是允许的,如果是观摩账号就不会允许。
运行脚本可以得到以下输出:
最后我们看一下字符串类型的账户信息,代码如下:
void OnStart()
{
Print("账户名称="+(string) AccountInfoInteger (ACCOUNT_NAME));
Print("交易商服务器的名称="+(string) AccountInfoInteger
(ACCOUNT_SERVER));
Print("结算货币="+(string) AccountInfoInteger (ACCOUNT_CURRENCY));
Print("交易商公司名称="+(string) AccountInfoInteger
(ACCOUNT_COMPANY));
}
相对来说字符串类型的账户信息较少,但是在一些时候也是非常有用的。运行代码输出如下:
再次重申,以上函数千万不要死记硬背,这会浪费大量的实践时间,我觉得依靠帮助文件来查询来多用这些函数,到后面用多了也就自然熟悉了。总而言之,多编写一些东西,多练习就行。
2、检测函数
检测类函数在帮助文件的目录中对应的是Checkup这一类函数,如下图:
打开这一类函数,我们可以看多这类函数有很多。下面挑几个常用的说一下,其他的函数不经常用到,所以在此不讲解。
首先最常用的检测函数是GetLastError()函数,这个函数用来返回程序出错的原因。这个函数在以后的模块编写时会经常用到,但是很多时候会涉及到开仓等交易函数,因此暂时不说,只要记得这个函数有什么用即可。
IsStopped()这个函数检测的是程序是否被停止操作,一般来说用来检查程序是否允许运行。
Symbol()函数用来获取挂的图表的品种,Period()用来获取当前图表的时间框架,Digits()用来获取当前品种的价格在小数点后有几位小数,Point()则用来返回当前图表货币对的最小报价单位,代码如下:
void OnStart()
{
string a=Symbol();
int b=Period();
int c=Digits();
double d=Point();
Print("当前货币对为"+a+",当前时间周期为"+(string)b+",小数点后有"+(string)c+"位小数"+",最小报价单位为"+(string)d);
}
输出如下:
注意Period()函数以分钟为单位来区别时间周期,比如4h,那么函数返回的便是240。
还有一些检测函数如TerminalInfoInteger()、TerminalInfoDouble()、TerminalInfoString()等等,可以检测的内容非常多,包括检测账户是模拟账户还是真实账户,检测是否是在回测,检测网络是否通畅等等,大家可以打开MQL4帮助文件查看,不用背下来,只在有需要时用一下即可。
以上是本节课的内容,下节课我们将学习一下市场信息函数,通过市场信息函数我们可以获取各品种的报价、点差、交易量等等。