第四节 市场信息函数

1价格信息查询

这节课比较重要,也是MQL4比较独特的地方,它可以直接获取当前的市场各货币对信息以及历史的信息,这对于量化交易来说是极为方便的。

打开MQ4帮助文件的目录,我们可以看到这一类的函数。



一般来说我们使用MarketInfo()函数来获取品种的相关信息,代码如下:

void OnStart()
  {
      double bid= MarketInfo("EURUSD",MODE_BID);
      double ask= MarketInfo("EURUSD",MODE_ASK);
      double point= MarketInfo("EURUSD",MODE_POINT);
      double digits= MarketInfo("EURUSD",MODE_DIGITS);
      double spread= MarketInfo("EURUSD", MODE_SPREAD);
      double bid_current= MarketInfo(Symbol() MODE_BID);
      Print("欧元兑美元卖出价="+(string)bid);
      Print("欧元兑美元买入价="+(string)ask);
      Print("欧元兑美元最小报价单位="+(string)point);
      Print("欧元兑美元小数点后的位数="+(string)digits);
      Print("欧元兑美元的点差="+(string)spread);
      Print("当前品种的卖出价="+(string)bid_current);
  }


输出结果如下:



可以看到程序是加载在原油的图表上的,但是通过MarketInfo()我可以查询EURUSD的信息,这个函数是非常关键的函数,比如说要做美国油和英国油的基差套利,那么我们就可以把EA加载在美国油上,然后用MarketInfo()函数查询英国油的价格,从而算出两个的价差以及两个品种的点差成本。因此这一函数对于对冲和套利的交易者来说是非常重要的。

MarketInfo()函数只能查询当前的信息,如果我要查询以往的信息要怎么做?如果只查询当前品种的信息,其实有一些方便一点的函数可以做到,比如说Ask、Bid、Close、Open等,用法如下:


void OnStart()
  {
      double close= Close[0];
      double open= Open[0];
      double high= High[0];
      double low= Low[0];
      datetime time= Time[0];
      double volume= Volume[0];
      double ask= Ask;
      double bid= Bid;
      Print("当前品种当前时间框架下当前K线的收盘价="+(string) close);
      Print("当前品种当前时间框架下当前K线的开盘价="+(string) open);
      Print("当前品种当前时间框架下当前K线的最高价="+(string) high);
      Print("当前品种当前时间框架下当前K线的最低价="+(string) low);
      Print("当前品种当前时间框架下当前K线的开盘时间="+(string) time);
      Print("当前品种当前时间框架下当前K线的成交量="+(string) volume);
      Print("当前品种当前时间框架下当前的买入价="+(string) ask);
      Print("当前品种当前时间框架下当前的卖出价="+(string) bid);
  }


输出结果如下:



在这里有必要说一下这几个函数的用法,以Close为例,其实这个函数是MT4中内置的一个数组,可以方便查询当前品种的信息,而输入的参数就是K线的编号,比如说上例中,输入的是0,那么系统就会查询编号为0的K线的收盘价,至于K线的编号方法,可以参照下图:



当前K线的编号为0,往前的K线顺延。

如果需要查询其他品种之前K线的价格信息,我们可以用Close的升级版,那就是i系列函数来查询,注意,这里不再是数组了,而是函数,代码如下:


void OnStart()
  {
      double close= iClose (Symbol(),60,1);
      double open= iopen (Symbol(),60,1);
      double high= iHigh (Symbol(),60,1);
      double low= iLow (Symbol(),60,1);
      datetime time= iTime (Symbol(),60,1);
      double volume= iVolume (Symbol(),60,1);
      Print("当前品种1h级别上一K线的收盘价="+(string) close);
      Print("当前品种1h级别上一K线的开盘价="+(string) open);
      Print("当前品种1h级别上一K线的最高价="+(string) high);
      Print("当前品种1h级别上一K线的最低价="+(string) low);
      Print("当前品种1h级别上一K线的开盘时间="+(string) time);
      Print("当前品种1h级别上一K线的成交量="+(string) volume);
  }


输出结果如下:



使用这几个函数需要输入三个参数,第一个参数,很好理解,是品种的名称,如果查询其他品种,那么可以把symbol()替换成其他品种的名称,比如”GBPUSD”等等;第二个参数是时间框架,如果是1h那么就是60min,也就是说这个参数输入60;第三个参数,指的是K线的编号。

有了这几个函数用于价格查询其实基本上就够了,所有的品种以及所有的K线的价格信息靠这几个函数都能查到,因此一般来说要查询价格都采用i系列的函数。除了一个数据用MT4是查不到的,那就是之前的点差数据,这对于剥头皮交易者来说还是有一些困扰的,因为剥头皮类型的策略需要非常精准的数据测试才能证明有用,所以很多时候,剥头皮交易者会采用ECN账户来做交易,一是点差成本低,二是减小了浮动点差的影响,其实盘的交易结果与测试的结果与标准账户比稍微可靠一点。

2品种信息查询

有的时候我们需要计算一个品种的盈亏,比如说我要计算1手XAUUSD这个品种波动1美元带来的盈亏,或者说我们要计算EURUSD波动一个最小单位(0.1个点)造成的盈利和亏损,但是我们会经常发现,有些平台每手合约的大小不一样(如黄金、白银、原油等商品类品种很多时候会出现这种情况),这个时候就很尴尬了,不能很方便地从价格直接计算出盈亏,这个时候怎么办?

这里最核心的,便是要查到品种合约的大小,这时可以使用SymolInfo这一系列函数来查询。比如说我要计算XAUUSD波动1个最小报价单位以及波动一美元时造成的盈亏,代码如下:


void OnStart()
  {
      double vlu= SymbolInfoDouble (Symbol(),
SYMBOL_TRADE_CONTRACT_SIZE);
      double point= SymbolInfoDouble (Symbol(),SYMBOL_POINT);
      double profit= vlu* point;
      Print("当前品种的合约大小="+(string) vlu);
      Print("当前品种的最小波动价格="+(string) point);
      Print("当前品种波动最小单位造成的盈亏="+(string) profit);
      profit= 1* vlu;
      Print("当前品种波动1美元造成的盈亏="+(string) profit);
  }


输出结果如下:



当然,对于交叉盘,盈亏的计算会比较复杂,需要配合之前课程中的品种识别以及现在的盈亏计算,这一块会放到以后的模块编写中来详细介绍,届时我们会实现盈亏计算模块的编写和封装。

其他的函数一般不怎么用到,在此不细讲,大家可以通过帮助文件来学习函数的用法。

那么本节课就到这,这是一节非常重要的课,以后会大量用到这些函数,望大家好好掌握,下一节我们将介绍开单、平仓、挂单函数,此后我们便可以开始写一些简单的EA了。


更多内容请关注公众号【Alpha自营交易室】~