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

这是一个基于斜率方向趋势指标的图形指标,已以其他几种形式发布。
该指标已经发布了多个版本,但没有一个版本能够在屏幕上的单个图形面板中显示所有时间范围。
可以搜索一下https://www.mql5.com/en/search#!keyword=slope%20direction%20line查看多个结果。
我已采用该指标并将其制作成显示所有时间范围的图形面板,并对原始代码进行了一些细微的修改。其中之一是它允许用户选择用于平滑的第二移动平均方法。原始代码使用线性加权对数字进行第二次传递,而我为用户提供了选择平滑方法的选项。当使用线性加权进行这两种计算时,它会使指标过于敏感,从而可能对当前趋势给出错误的读数。如果我们使用简单作为第二种平均方法,我们会得到更能表明价格走势的趋势。
我所做的另一个改变是不仅能够获取趋势的方向(向上、向下或持平),而且还能够获取其价值。我将在我计划不久发布的另一篇文章中讨论这一点,内容是如何使用双 SlopeDirection 指标并用它创建一个 Expert Advisor。
但现在,让我们快速浏览一下代码。我首先定义我将使用的所有对象名称。这是一个很好的做法,因为每次将对象名称放在引号之间时,它都会在程序中为其分配空间。因此,如果它们被定义一次(通过使用定义语句),那么您只需使用代码中的空间一次。
// 定义趋势方向 #定义 上升趋势 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
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
