专家系统"解说员". 在MQL4程序中嵌入指标的实际应用

Andrey Opeyda | 19 一月, 2016


一个有经验的交易者永远不会在没有技术指标对其决定进行确认的情况下建立仓位. 例如, 交易者已经进行了技术分析并且确定应该在某个交易品种, 比如EURUSD上建立买入仓位. 为了在正确的价格上进入市场(参见下面图1), 一个有经验的交易者会检查根据指标获得的结果, 例如, 随机振荡指标, 等待直到它给出一个确认信号. 此指标和它的信号描述如下: https://www.metatrader5.com/en/terminal/help/indicators/oscillators/so. 在我们的例子中, 让我们使用这里描述的一个信号.

"...当%K线上升超过%D线时买入, 而当%K线下降超过%D线时卖出."


图1 EURUSD 的价格

%K 是主线, %D (短划线)是信号线. MQL4 允许使用内建的函数来进行指标计算. 这些函数的完整列表在文章末尾提供, 并且也包含在MQL4文档中. 随机振荡指标也在其中. 为了计算主线与信号线的数值, 使用了以下的函数:

double iStochastic( string symbol, int timeframe, int %Kperiod, 
                    int %Dperiod, int slowing, int method, 
                    int price_field, int mode, int shift)

在MQL4文档中有对此函数更加详细的描述.

以下就是MQL4中随机振荡指标主线的计算:

iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, i)

这里的参数 3,5,5 是指标平均的周期数, MODE_SMA 是计算移动平均的方法, i – 进行计算的烛形数量, 参数 MODE_MAIN 是说明需要计算主线 (%K). 相应地, 以下是信号线的计算:

iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL, i)

当使用内建函数进行指标计算时, 需要指定图表的时间框架和交易品种. 在我们的实例中, 使用的是当前图表的交易品种和时间框架(参数为 NULL 和 0). 需要记住的是可以在任何交易品种和时间框架上进行计算. 可以看到, 在随机振荡指标图表上, 主线的值等于54.4444而信号线的值是46.1238:

iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, i) > 
iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL, i)

现在我们可以简单地自动进行指标计算了. 如果指标不占用价格图表的空间就更加方便了. 最好的解决方案就是从图表上删除指标图, 只是显示以上计算得到的信号. 显示信号最常用的方法就是在图表上加上一定的字符. 我们会晚些时候讨论这种方法, 现在让我们使用另外一种MQL4的特性. 它就是Comment()函数.

void Comment( ...)

它可以用来在价格图表上显示任何注释.

//STOCH
 
      double valSTOCH=0; 
      string commentSTOCH = "Stoch:         ";
      string commentSTOCHAdd = "   没有数据 ";
      if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)
>iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0))
        commentSTOCHAdd =  "    可以买入";
               
      if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)
<iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0))
        commentSTOCHAdd =  "    可以卖出";   
        
      commentSTOCH =  commentSTOCH + commentSTOCHAdd;

以上的源代码把信号的信息翻译成文字, 然后在图表上显示.

Comment(commentSTOCH + "\n");

Comment 函数很方便, 因为用户可以使用换行符号按行显示注释. 使用以上的代码, 交易者就可以去掉随机振荡指标的图形了. 会有一个提醒系统来以文字的形式显示当前市场的发展.

图 2. 可以买入

现在让我们举例使用商品通道指数指标(CCI).

"...衡量商品价格与其统计平均价格之间的偏移. 指数值较高表明价格和平均值相比出现异常升高, 而较低的值表明价格过低. 虽然它的名字和商品有关, 商品通道指数是可以用于任何金融资产的, 而不仅仅是实物."

通过自动计算CCI指标, 我们将能得到另外的提示, 例如"价格过高". 使用叫做加速/减速(AC)指标, 它用于衡量当前趋势的加速/减速水平, 交易者得到的通知会更好. "...如果您发现加速/减速指标是一个早期提醒的信号, 它是有明显优势的."

同时显示多个指标信号的代码如下:

//   DeM指标
      double valDem=iDeMarker(NULL, 0, 13, 0);
      string commentDem = "DeMarker:    ";
      string commentDemAdd = "   没有数据";
     
      if (valDem < 0.30)
         commentDemAdd =  "   价格可能上涨";
      
      if (valDem > 0.70)
         commentDemAdd =   "   价格可能下跌";
      commentDem = commentDem + commentDemAdd;
 
//ATR
      double valATR=iATR(NULL, 0, 12, 0);
      string commentATR = "ATR:           ";
      commentATR=commentATR + "   趋势可能改变 " + valATR;
            
//CCI
      double valCCI=iCCI(NULL,0,12,PRICE_MEDIAN,0);
      string commentCCI = "CCI:            ";
      string commentCCIAdd = "  没有数据";
      if (valCCI > 100)
        commentCCIAdd =  "   超买 " + 
                         "(可能会有修正性下跌) ";
 
      if (valCCI < -100)
        commentCCIAdd =  "   超卖 " + 
                         "(可能会有修正性上涨) ";
        
      commentCCI =  commentCCI + commentCCIAdd + valCCI;
 
//MFI
      double valMFI=iMFI(NULL,0,14,0);
      string commentMFI = "MFI:            ";
      string commentMFIAdd = "   没有数据 ";
      if (valMFI > 80)
        commentMFIAdd =  "    也许是市场顶点 ";
 
      if (valMFI < 20)
        commentMFIAdd =  "    也许是市场低点 ";
        
        commentMFI =  commentMFI + commentMFIAdd + valMFI;

也可以根据数组进行计算. 以OnArray结尾的函数可以用于此类计算, 例如, iMAOnArray函数可以计算数组的移动平均. 有趣的是, 有一些指标有时可能给出相反的信号. 当然, 对于一个交易者, 没有信号也是一种信号. 交易并不只是根据方向下决定建仓, 也要考虑建仓时间. 交易系统"解说员"只是在当前时间框架计算信号, 而交易者也可以在程序代码中计算更大或者更小的时间框架. 应该注意的是, MQL4不是在任何方面约束交易者, 而是通过评估具有增强的功能.

MQL4中用于指标计算的内建函数列表如下:

iAC 
iAD 
iAlligator 
iADX 
iATR 
iAO 
iBearsPower 
iBands 
iBandsOnArray 
iBullsPower 
iCCI 
iCCIOnArray 
iCustom 
iDeMarker 
iEnvelopes 
iEnvelopesOnArray 
iForce 
iFractals 
iGator 
iIchimoku 
iBWMFI 
iMomentum 
iMomentumOnArray 
iMFI 
iMA 
iMAOnArray 
iOsMA 
iMACD 
iOBV 
iSAR 
iRSI 
iRSIOnArray 
iRVI 
iStdDev 
iStdDevOnArray 
iStochastic 
iWPR