四个时间范围的多个指标信号的同步显示

Pavel Chigirev | 26 二月, 2016

简介

手动交易时,你必须留意多个指标的值。这跟机械化交易略有不同。如果你有两个或三个指标,且已选择了一个时间范围进行交易,则任务并不复杂。但如果你有五个或六个指标,且交易策略要求考虑多个时间范围上的信号,你将如何做呢?此外,如果同时交易多个货币对,会发生什么?这项任务看起来非常复杂,在多数情况下会导致错误,从而发生亏损。

Real_Time_MultiIndicator_v1 是专门为解决这些任务而创建。该指标同时计算四个时间范围上的选定指标信号,并将其转换为主图表子窗口中的表格。在指标信号后面的括号内,可以看到表明信号的属于选中时间范围的最新柱数。

你可以更改指标的参数并添加自己的指标。现在,为了进行决策,你只需要查看表格中从四个时间范围收集的信号。


Real_Time_MultiIndicator_v1

指标在图表的单独子窗口中显示数据。这是指标的外部视图:



在“指标”列可以看到所用指标的名称,括号内是其参数。在M15、M30、H1、H4 列显示相应时间范围的指标信号。也显示表明信号的柱数。如果历史数据正在加载或缺失,就会看到相应时间范围的等待数据信息。如果终端连接至互联网,将会在几秒内加载必要的数据。

请注意平均价格“(最高价+最低价)/2”用于所有指标。可以跟默认值不同。如果将指标添加至图表或改变主图表的缩放比例,则数据表格可以拉伸或收缩。请不要感到迷惑。新的价格变动出现后,表格将呈现标准视图。如果终端未连接互联网,在图表缩放后执行以下操作:更改时间范围,例如,H1 至 H4 或 H4 至 H1,表格将呈现标准视图。

要使用指标,你必须下载 Real_Time_MultiIndicator_v1.mq4 文件至 terminal\experts\indicators 文件夹并重启终端。为了添加指标,在“导航器”中选择“用户的指标”部分,然后前往 Real_Time_MultiIndicator_v1。在菜单内



可以选择表格颜色(TColor),文本颜色(TxtColor),以及使用指标的参数。如果要更改指标的参数,必须执行以下操作:右击主图表并选择“指标列表”命令或使用“Ctrl+I”按钮,

然后选择 Real_Time_MultiIndicator_v1 并单击“属性”按钮。更改指标参数并不很难,但添加新指标需要一些努力和 MQL4 的入门知识。


在表格添加新指标

我还没有填充指标表格的最后三行,你可以添加所使用的指标或自己编写的指标。我试图使计算算法和数据转换为表格尽量容易。此外,我在源程序中留下了带有注释的代码片段,所以任何具有 MQL4 入门水平的人都可以添加指标至表格,无需深入探究算法的运行细节。

利用商品通道指标作为示例,我来展示添加新指标至表格的算法。请注意,我将用以下方式解读该指标的信号:指标值为 0 - 买入信号,反之亦然。这种解读跟经典做法略有不同,但我刻意这么做,使算法的解释更加容易。另外,你可以根据自己的需要解读信号。

在“导航”选择“用户的指标”部分,然后前往 Real_Time_MultiIndicator_v1 并单击“更改”按钮。


然后我们将更改源代码:

//----The parameters of the indicators
extern string p1 = "SAR parameters";
extern double SAR_Step = 0.01;
extern double SAR_Max = 0.1;
extern string p2 = "MACD parameters";
extern int Fast_EMA = 12;
extern int Slow_EMA = 26;
extern int MACD_SMA = 9;
extern string p3 = "Moving Average parameters";
extern int Fast_MA = 5;
extern int Slow_MA = 10;
extern string p4 = "ADX parameters";
extern int ADX_Period = 14;
//extern string p5 = "The parameters of the indicator 1";
//extern string p6 = "The parameters of the indicator 2";
//extern string p7 = "The parameters of the indicator 3";

在该代码块中,你必须删除“The parameters of the indicator 1”文本所在行的注释并添加商品通道指标(CCI)名称。这样将会得到:

extern string p5 = "CCI parameters";

然后添加商品通道指标的参数 - 周期:

extern string p5 = "CCI parameters";
extern int Period_CCI = 14;

在该行中

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","","",""};

添加在表格中显示的指标名称:

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","CCI","",""};

然后在指标初始化块

 int init()
    {
     string sn = "Real_Time_MultiIndicator_v1";
     IndicatorShortName(sn);
     SetIndexLabel(0, sn);
     name[0] = name[0] + "(" + DoubleToStr(SAR_Step, 2) + ", " +
               DoubleToStr(SAR_Max, 2) + ")";
     name[1] = name[1] + "(" + DoubleToStr(Fast_EMA, 0) + ", " +
               DoubleToStr(Slow_EMA, 0) + ", " + 
               DoubleToStr(MACD_SMA, 0) + ")";
     name[2] = name[2] + "(" + DoubleToStr(Fast_MA, 0) + ", " +
               DoubleToStr(Slow_MA, 0) + ")";
     name[3] = name[3] + "(" + DoubleToStr(ADX_Period, 0) + ")";
     //name[4] = name[4] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 1, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 1, 0) + ")";
     //name[5] = name[5] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 2, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 2, 0) + ")";
     //name[6] = name[6] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 3, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 3, 0) + ")";
     return(0);
    }

我们删除行中的注释

//name[4] = name[4] + "(" + 

//          DoubleToStr(1st paramater of the indicator 1, 0) +

//          ", " + DoubleToStr(2nd parameter of the indicator 1, 0) + ")";

并进行以下更改:

name[4] = name[4] + "(" + DoubleToStr(Period_CCI, 0) + ")";

然后从该代码块删除注释:

/*
//+------------------------------------------------------------------+
//| Function 1                                                       |
//+------------------------------------------------------------------+

string Function(int p)

 {
  int ii  = 1;
  if (C=Condition for the indicator - true - sell, false - buy)
    {
      while (Conditionc for sell)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while (Condition for buy)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }*/

写入函数的名称(例如 CCI),代替“Function”一词:

string CCI(int p)

现在编写为当前(零)柱买入信号的条件代替“Condition for the indicator - true - sell, false – buy”:

iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0

然后,编写买入信号以及计算显示该信号的已处理的柱数的条件代替“Condition for sell”行。

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)

ii—是相对当前柱的移位。以相同的方式将“while”行(买入条件)更改为

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)

可以看到以下结果:

string CCI(int p)
  {
    int ii = 1;
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0)
     {
       while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)       
ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }

如果要对从 100 到 -100 水平的信号计数,而不将范围(-100;100)视为买入或卖出信号,你必须将 0 更改为 -100 和 100 分别作为卖出和买入,并添加下一行以在表格中显示不确定性:

if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) &&   
iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100))
    return("N/A");

现在我们有:

string CCI(int p)
   {  
int ii = 1;
    if((iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
       (iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100) )
        return("N/A");
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < -100)
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < -100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Sell(" + DoubleToStr(ii, 0) + ")");
      }
    else
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Buy(" + DoubleToStr(ii, 0) + ")");
      }
   }

现在我们必须将计算结果转换为表格。执行以下操作:在程序文本中找到代码片段

/*//----------Fifth line    
  for (i = 1; i <= 4; i++)
     {
       ObjectDelete("6" + DoubleToStr(i, 0));
       ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT, 
                           WindowFind("Real_Time_MultiIndicator_v1"), textT[i+1], textC[6]);
       ObjectSetText("6" + DoubleToStr(i, 0), Функция(per[i-1]), 13, "Tahoma", TxtColor);
    }*/

并从其删除注释。因为显示文本的坐标为单独计算,令使用循环填充表格变为可能。必须设置计算结果的函数。然后写入函数名称代替“Function”。现在我们有:

 //----------Fifth line   
 for (i=1;i<=4;i++)
   {
     ObjectDelete("6" + DoubleToStr(i, 0));
     ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT,
                  WindowFind("Real_Time_MultiIndicator_v1"),
                  textT[i+1], textC[5]);
     ObjectSetText("6" + DoubleToStr(i, 0), CCI(per[i-1]), 13, 
                   "Tahoma", TxtColor);
   }

然后单击“编译”按钮。前往终端并添加指标至图表。由此可以得到:


如果要更改计算指标值的时间范围,必须执行以下操作:

在下行中:

int per[] = {15,30,60,240};

输入已经选择的时间范围的分钟数,例如:

int per[] = {5,30,60,240};

并在下行中:

string nameS[] = {"INDICATOR","M15","M30","H1","H4"}

输入其名称:

string nameS[] = {"INDICATOR","M5","M30","H1","H4"};

并进行编译。最终我们得到:




根据历史记录调试参数

所描述的指标仅能于在线模式使用。理由是在可视化模式下测试时,指标只会在当前时间范围显示合适的值。这是终端和测试程序的特色。如果要调试指标的参数或在根据历史记录测试可视化时测试自己的策略,我建议你应该使用 Real_Time_MultiExpert_v1。Real_Time_MultiIndicator_v1 和 Real_Time_MultiExpert_v1 所执行的函数绝对一致。其源代码是一致的,并且更改自动交易系统的代码跟更改指标代码具有相同的算法。要使用自动交易系统,必须下载 Real_Time_MultiExpert_v1. mq4 文件至 \terminal folder\experts\indicators 并重启终端。

要使用 Real_Time_MultiExpert_v1,必须制作名称为“Real_Time_MultiExpert_v1”的模板,且指标“Real_Time_MultiIndicator_v2”已添加至图表。“Real_Time_MultiIndicator_v2”指标任务是使用主图表下面的缩放建立子窗口。然后必须在测试程序的“Advisor”字段选择 Real_Time_MultiExpert_v1 以及在“模型”字段选择“所有价格变动”选项,否则自动交易系统在当前(零)柱上的指示可能跟实际状态不同,但指示整体来说是正确的。




切记单击自动移位按钮:

然后选择“可视化”选项并单击“启动”按钮。

在 Real_Time_MultiIndicator_v2 窗口可以看到指标信号的表格。可以选择任意时间范围进行测试,因为指标值并不取决于此。在所描述的智能交易系统和指标之间没有大的区别,可以按需选择。在我看来,于在线模式使用指标更加方便。


总结

本文我们讨论了收集和组织市场条件的重要信息的一个方法,- 来自四个时间范围的多个指标的信号。该方法可用于解决各种各样的问题。使用所描述的程序,你可以在根据历史报价测试时选择必要的指标参数。指标旨在用于手动交易。