欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

在一个简单的面板中以图形方式显示所有时间范围的当前趋势 - MetaTrader 4脚本

author emer | 951 人阅读 | 0 人评论 |

Graphically display current trend for all time frames in one simple panel - indicator for MetaTrader 4

这是一个基于斜率方向趋势指标的图形指标,已以其他几种形式发布。

该指标已经发布了多个版本,但没有一个版本能够在屏幕上的单个图形面板中显示所有时间范围。

可以搜索一下https://www.mql5.com/en/search#!keyword=slope%20direction%20line查看多个结果。

我已采用该指标并将其制作成显示所有时间范围的图形面板,并对原始代码进行了一些细微的修改。其中之一是它允许用户选择用于平滑的第二移动平均方法。原始代码使用线性加权对数字进行第二次传递,而我为用户提供了选择平滑方法的选项。当使用线性加权进行这两种计算时,它会使指标过于敏感,从而可能对当前趋势给出错误的读数。如果我们使用简单作为第二种平均方法,我们会得到更能表明价格走势的趋势。

我所做的另一个改变是不仅能够获取趋势的方向(向上、向下或持平),而且还能够获取其价值。我将在我计划不久发布的另一篇文章中讨论这一点,内容是如何使用双 SlopeDirection 指标并用它创建一个 Expert Advisor。

Graphically display current trend for all time frames in one simple panel - indicator for MetaTrader 4 

但现在,让我们快速浏览一下代码。我首先定义我将使用的所有对象名称。这是一个很好的做法,因为每次将对象名称放在引号之间时,它都会在程序中为其分配空间。因此,如果它们被定义一次(通过使用定义语句),那么您只需使用代码中的空间一次。

// 定义趋势方向
#定义    上升趋势          1
#定义    下降趋势         -1
#定义    平趋势        0

// 定义对象
#定义    趋势面板        “趋势面板”
#定义    信息专线1        “信息热线1”
#定义    信息热线2        “信息热线2”
#定义    趋势标签        “趋势:M1 M5 M15 M30 H1 H4 D1 W1 MN”
#定义    趋势上升          “\233”
#定义    趋势下降        “\234”
#定义    趋势扁平化        “\232”
#定义    趋势未知      “\251”
#定义    统计对象错误  “%s(%d) 无法创建“%s”。错误 = %d”

接下来,我定义两个数组。第一个包含 9 个时间帧中每个时间帧的像素位置,第二个包含时间帧。这些被定义为全局变量。

// 定义全局变量
整数      趋势位置[] = {44,64,88,114,136,156,174,194,216};整数      趋势周期[] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};

我们的指标 OnInit() 函数调用一个函数来创建面板和面板内的对象。它还对用于计算趋势的柱进行快速“Dumn Dumn”检查。小于3是没有意义的。

//+------------------------------------------------------------------+
//|自定义指标初始化函数                         |
//+------------------------------------------------------------------+
整数  初始化时()
{
  // 去创建指标面板对象  如果(Create_Panel() && BarCount >=3)
      返回初始化成功);
  别的      返回初始化失败);
}

我不会详细介绍 GetTrend() 函数如何真正工作,该网站上已经有很好的文档。我们只看一下图形 DisplayTrend() 函数。

//+------------------------------------------------------------------+
//|显示所有时间范围的当前趋势
//+------------------------------------------------------------------+
空白  显示趋势(空白)
{
  整数      i、cntr、趋势、最后趋势;
  细绳   str;
   
  为了(我=1;我<10;我++)
   {
      str =“趋势”+双转字符串(我,0);
      趋势 = (整数)GetTrend(TrendPeriods[i-1]、BarCount、方法);
      如果(趋势 == 平面趋势)
      {
        // 我持平,找到最后的趋势方向         中心=1;
                 { 
            最后趋势 = (整数)GetTrend(TrendPeriods[i-1], BarCount, 方法,错误的, cntr++);
         }尽管(最后趋势 == 趋势);
        对象集文本(str,趋势平面,8,《翼丁》, (LastTrend == UPTREND ? 绿色: 红色));
        对象集整数0, , ,OBJPROP_Y距离,6);
      }
      别的      {
        对象集文本(str, (趋势 == 上升趋势 ? 趋势上升 : 趋势下降),8,《翼丁》, (趋势 == 上升趋势 ? 绿色 : 红色));
        对象集整数0, , ,OBJPROP_Y距离,5+(趋势 == 上升趋势?1:-1));
      }
   }
}

基本上,我们只需循环遍历 TrendPeriods[] 数组(以获取所有时间范围)并根据该时间范围的趋势方向设置趋势箭头。如果趋势是平坦的,我们会找到第一个不平坦的方向来了解趋势的来源,以便以该方向的颜色显示侧箭头。

OnInit() 中的 Create_Panel() 函数创建锚定到屏幕左下角的对象,并使用 TrendPosition[] 将箭头放置在正确的位置。

//+------------------------------------------------------------------+
//|在屏幕左下角创建趋势面板
//+------------------------------------------------------------------+
布尔值  创建面板(空白)
{

  整数      我;
  细绳   str;
   
  // 创建趋势指标窗口  如果对象创建(趋势面板,OBJ_RECTANGLE_LABEL,0,0,0))
   {
      对象集整数0, 趋势面板,OBJPROP_XDISTANCE,1);
      对象集整数0, 趋势面板,OBJPROP_Y距离,29);
      对象集整数0, 趋势面板,OBJPROP_XSIZE,240);
      对象集整数0, 趋势面板,OBJPROP_YSIZE,26);
      对象集整数0, 趋势面板,OBJPROP_BGCOLOR, 白色的);
      对象集整数0, 趋势面板,OBJPROP_BORDER_TYPE,0);
      对象集整数0, 趋势面板,OBJPROP_角,角左下角);
      对象集整数0, 趋势面板,OBJPROP_COLOR, 红色的);
      对象集整数0, 趋势面板,OBJPROP_STYLE,样式_实体);
      对象集整数0, 趋势面板,OBJPROP_WIDTH,2);
      对象集整数0, 趋势面板,OBJPROP_BACK,错误的);
      对象集整数0, 趋势面板,OBJPROP_SELECTABLE,错误的);
      对象集整数0, 趋势面板,OBJPROP_SELECTED,错误的);
      对象集整数0, 趋势面板,OBJPROP_HIDDEN,真的);
      对象集字符串0, 趋势面板,OBJPROP_工具提示,“\n”);
   }
  别的   {打印格式(统计对象错误,__功能__,__线__, 趋势面板,获取最后一个错误());返回错误的); }

  如果对象创建(信息热线 1,OBJ_LABEL,0,0,0))
   {
      对象集(信息热线 1,OBJPROP_角,角左下角);
      对象集(信息热线 1,OBJPROP_XDISTANCE,6);
      对象集(信息热线 1,OBJPROP_Y距离,15);
      对象集整数0, 信息热线 1,OBJPROP_SELECTABLE,错误的);
      对象集整数0, 信息热线 1,OBJPROP_HIDDEN,真的);
      对象集字符串0, 信息热线 1,OBJPROP_工具提示,“\n”);
      对象集文本(InfoLine1、趋势标签、8,“宋体”, 黑色的);
   }
  别的   {打印格式(统计对象错误,__功能__,__线__, 信息热线 1,获取最后一个错误());返回错误的); }
   
  如果对象创建(信息线2,OBJ_LABEL,0,0,0))
   {
      对象集(信息线2,OBJPROP_角,角左下角);
      对象集(信息线2,OBJPROP_XDISTANCE,6);
      对象集(信息线2,OBJPROP_Y距离,5);
      对象集整数0, 信息热线2,OBJPROP_SELECTABLE,错误的);
      对象集整数0, 信息热线2,OBJPROP_HIDDEN,真的);
      对象集字符串0, 信息热线2,OBJPROP_工具提示,“\n”);
      对象集文本(信息线2,” “+双转字符串(条数,0) +“/”+双转字符串(方法,0),8,“宋体”, 黑色的);
   }
  别的   {打印格式(统计对象错误,__功能__,__线__, 信息热线2,获取最后一个错误());返回错误的); }

  // 创建趋势对象并显示当前趋势      为了(我=1;我<10;我++)
   {
      str =“趋势”+双转字符串(我,0);
      如果对象创建(str,OBJ_LABEL,0,0,0))
      {
        对象集(str,OBJPROP_角,角左下角);
        对象集(str,OBJPROP_XDISTANCE, 趋势位置[i-1]);
        对象集(str,OBJPROP_Y距离,5);
        对象集整数0, , ,OBJPROP_SELECTABLE,错误的);
        对象集整数0, , ,OBJPROP_HIDDEN,真的);
        对象集字符串0, , ,OBJPROP_工具提示,“\n”);
      }
      别的      {打印格式(统计对象错误,__功能__,__线__, , ,获取最后一个错误());返回错误的); }
   }

  // 去显示当前趋势   显示趋势();
      
  // 一切都好  返回真的);
}

如果成功创建所有对象,该函数将返回 TRUE;如果创建对象出错,则返回 FALSE。好处是该指示器将在控制台的 EXPERT 选项卡中显示错误代码以及发生错误的代码的行号。

我们还需要为收到的每个新报价更新趋势指标。这是通过在 start() 函数中调用 DisplayTrend() 来完成的。

//+------------------------------------------------------------------+
//|自定义指标迭代函数                              |
//+------------------------------------------------------------------+
整数   开始()
{
  // 显示所有时间范围的当前趋势   显示趋势();   

  返回0);
}

最后,当我们关闭指标时,我们会销毁指标创建的所有对象。

//+------------------------------------------------------------------+
//|去初始化函数                                       |
//+------------------------------------------------------------------+
空白 解初始化常量 整数原因)
{
  // 删除指标对象  如果对象查找(趋势面板)>=0对象删除(趋势面板);
  如果对象查找(信息线1) >=0对象删除(信息线1);
  如果对象查找(信息线2) >=0对象删除(信息线2);
  为了整数我=1;我<10;我++)
      如果对象查找“趋势”+双转字符串(我,0)) >=0对象删除“趋势”+双转字符串(我,0));
}

基本上就是这样。现在,您有一个漂亮的指示器面板,在屏幕左下角显示所有时间范围的当前趋势。


附件下载

📎 slopedirection.mq4 (8.61 KB)

Source: MQL5 #15620

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录