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

赫尔移动平均线 - MetaTrader 5脚本

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

Hull Moving Average - indicator for MetaTrader 5

Hull Moving Average - indicator for MetaTrader 5

Hull Moving Average - indicator for MetaTrader 5

Hull Moving Average - indicator for MetaTrader 5

我不明白其他 Hull MA 实现的来源,所以我决定自己实现它。它有四个输入参数:

这些参数是不言自明的。枚举 ENUM_COLOR_KIND 在单色和多色之间切换,默认为单色。在多色中,Hull MA 有另一种颜色表示上升值,另一种颜色表示下降值。在单色模式下,ENUM_COLOR_INDEX 设置 Hull MA 的单色。在多色模式下,默认颜色为灰色。上坡时颜色为绿色,下坡时颜色为红色。您可以在下面两张图片中看到它。

Hull Moving Average - indicator for MetaTrader 5

Hull Moving Average - indicator for MetaTrader 5

//+------------------------------------------------------------------+
//|                                                     MelzHull.mq5 |
//|                                       版权所有 2022,wm1@gmx.de |
//|                                                 https://melz.one |
//+------------------------------------------------------------------+
/*
  === 我的赫尔移动平均线实施

  在我的指示器中,您可以选择单色和多色
  指标线。

*/

枚举ENUM_COLOR_KIND {  // 单色或交替颜色  单色,
  多色
};枚举ENUM_COLOR_INDEX {// Indicator_color1 颜色的索引  颜色索引_0,
  颜色_索引_1,
  颜色_索引_2,
  颜色_索引_3,
  颜色_索引_4,
  颜色索引_5,
  颜色索引_6
};#财产版权  “版权所有 2022,W. Melz,wm1@gmx.de”
#财产关联        “https://melz.one”
#财产版本    “1.00”
#财产描述 “我的赫尔移动平均线的实现”
//--- 指标设置
#财产指标图表窗口              // 在图表窗口中绘制
#财产指标缓冲区 4                // 缓冲区:fullWMA、halfWMA、vHull、cHull
#财产指标图  1                // 只绘制一条线
#财产指标类型1  绘制_颜色_线  // 绘制颜色线
// 颜色索引可供选择:    0        1      2       3              4             5            6,随意将列表扩展到 64 种颜色
#财产指示器颜色1  灰灰,清绿,红细胞,清蓝,clr绿色黄色,clr道奇蓝,clrFireBrick
#财产指示器宽度1  1                // 线宽
#财产指标标签1  “HMA”            // 指标名称

//--- 输入参数
输入 整数                 InpHmaPeriod        =20;            // 指标周期,默认20
输入ENUM_COLOR_KIND     InpColorKind        = single_color;  // 指示器颜色的种类,单色或多色
输入ENUM_COLOR_INDEX    InpColorIndex       = color_index_3;  // 设置单色指示器的颜色
输入 整数                 InpMaxHistoryBars =240;            // 计算历史柱数,默认240,不能更多

//--- 指标缓冲区
双倍的值缓冲区[];          // 存储船体指标值
双倍的颜色缓冲区[];          // 将船体指示器颜色存储在栏上
双倍的fullWMABuffer[];        // 存储WMA全周期的计算
双倍的halfWMABuffer[];        // 存储计算的WMA半周期

//--- 指标全局变量
整数hmaPeriod、fullPeriod、halfPeriod、sqrtPeriod、maxHistoryBars;  // 存储输入值或默认值

//+------------------------------------------------------------------+
//|自定义指标初始化函数                         |
//+------------------------------------------------------------------+
整数 初始化时() {
  ENUM_INIT_RETCODE结果=检查输入();                // 检查输入参数是否正确  设置索引缓冲区0,值缓冲区,INDICATOR_DATA);          // 存储指标缓冲区映射  设置索引缓冲区1,颜色缓冲区,INDICATOR_COLOR_INDEX);    // 存储指标蜡烛颜色  设置索引缓冲区2,完整的WMA缓冲区,指标计算);// 存储fullWMA计算的结果  设置索引缓冲区3,halfWMABuffer,指标计算);// 存储halfWMA计算结果  指标集整数INDICATOR_DIGITS,_数字);          // 设置指示位  细绳简称=字符串格式“HMA(%d)”,hma 期间);  // 数据窗口和指标子窗口标签的名称  指标集字符串INDICATOR_SHORTNAME,简称);
  绘图索引设置字符串0,绘图标签,简称);// 计算指标的全局值  fullPeriod = hmaPeriod;                            // 从输入开始的周期  半周期 = 全周期 /2;                        // 计算半周期  sqrt周期 = (整数圆形的开方((双倍的)fullPeriod));  // 计算周期的平方根  返回(结果);                                    // 成功或失败,init完成}//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
ENUM_INIT_RETCODE检查输入(空白){      // 将此函数更改为您自己的指标参数  如果(InpHmaPeriod <=0){                // 检查输入值范围是否正确    hma周期=14;                      // 如果输入无效,则将周期设置为 14    打印格式“输入参数 InpTestPeriod = %d 不正确。指标将使用值 %d 进行计算。”,InpHma 周期,hma 周期);
  }别的    hmaPeriod = InpHmaPeriod;            // 设置输入的周期  maxHistoryBars = InpMaxHistoryBars;  // 否则使用输入值  返回初始化成功);                // 或 INIT_FAILED}//------------------------------------------------------------------
// 自定义指标去初始化函数
//------------------------------------------------------------------
空白 解初始化常量 整数原因) {
  数组自由(值缓冲区);
  数组自由(颜色缓冲区);
  数组自由(完整的WMA缓冲区);
  数组自由(半WMA缓冲区);
}//+------------------------------------------------------------------+
//|自定义指标迭代函数                              |
//+------------------------------------------------------------------+
整数 计算时常量 整数费率_总计,
                常量 整数先前计算的,
                常量 日期时间&时间[],
                常量 双倍的&打开[],
                常量 双倍的&高的[],
                常量 双倍的&低的[],
                常量 双倍的&关闭[],
                常量 长的&tick_volume[],
                常量 长的&体积[],
                常量 整数&传播[]) {
  如果(rates_total < maxHistoryBars + hmaPeriod)  // 测试可用柱,在计算其他指标时调整周期    返回0);                                  // 当没有可用柱时,在此报价上不执行任何操作。  整数开始栏;                // 存储索引值  如果(先前计算的==0){    // 如果之前没有计算历史柱    //Print("--- 计算历史柱");    // 第一个价格变动,计算所有历史柱,最早的索引 0,加上 rates_total - InpMaxHistoryBars -1(从索引开始)    startBar = rates_total - maxHistoryBars - hmaPeriod -1;
    绘图索引集整数0,绘图_绘制_开始, startBar + hmaPeriod);  // 设置绘图从索引为 startBar + hmaPeriod 的柱开始    // 进行计算    CalcHma(startBar,rates_total,close);  // 计算成交量上的 Ma 值并与柱尺寸进行比较  }
  
  如果(rates_total - prev_calculated ==1){
    //Print("-- 计算新柱");    开始栏 = rates_total -1;// 计算实际的新开盘柱    // 进行计算    CalcHma(startBar,rates_total,close);  // 计算成交量上的 Ma 值并与柱尺寸进行比较  }

  // 进行计算  //Print("- 计算每个刻度");  返回(费率_总计);  // 返回 prev_calculated 的值以供下次调用}// 在数组 buf 上计算从 startBar 到 rates_total 的 Ma
空白钙热值(整数开始栏,常量 整数费率_总计,常量 双倍的&buf[]) {
  为了整数栏=开始栏;栏 < rates_total && !已停止();酒吧++){// 循环遍历条形图  
    // (1) 指标计算,WMA 全周期    双倍的总和=0.0;                                      // 存储周期总和值以供以后除法使用    双倍的wMA =0.0;                                      // 存储该柱的计算值    整数wf=1;                                            // 将起始权重因子设置为 1    整数总和Wf =0;                                          // 将权重因子的总和设置为 0    为了整数i = 完整周期 -1;我 >=0;我 - ) {            // 循环遍历实际柱的整个周期
//      sum += getPrice(开盘价,最高价,最低价,收盘价,(bar - i)) * wf;  // 获取应用的价格并添加 n 个柱的价格,从最旧的柱、最低的索引开始      sum += buf[(bar - i)] * wf;                          // 获取应用的价格并添加 n 个柱的价格,从最旧的柱、最低的索引开始      sumWf += wf;                                          // 添加除法的所有权重因子      wf +=1;                                              // 增加下一个较新柱的线性权重的权重因子    }
    wMA=总和/sumWf;                                      // 计算整个 MA 周期的线性加权平均值    fullWMABuffer[bar] = wMA;                              // 将值保存到缓冲区以供以后使用    // (2) 指标计算,WMA半周期    总和=0.0;                                              // 存储周期总和值以供以后除法使用    wMA=0.0;                                              // 存储该柱的计算值    wf=1;                                                // 将起始权重因子设置为 1    总和Wf =0;                                              // 将权重因子的总和设置为 0    为了整数i = 半周期 -1;我 >=0;我 - ) {            // 循环实际柱的半个周期
//      sum += getPrice(开盘价,最高价,最低价,收盘价,(bar - i)) * wf;  // 获取应用的价格并添加 n 个柱的价格,从最旧的柱、最低的索引开始      sum += buf[(bar - i)] * wf;                          // 获取应用的价格并添加 n 个柱的价格,从最旧的柱、最低的索引开始      sumWf += wf;                                          // 添加除法的所有权重因子      wf +=1;                                              // 增加下一个较新柱的线性权重的权重因子    }
    wMA=总和/sumWf;                                      // 计算半个MA周期的线性加权平均值    halfWMABuffer[bar] = wMA;                              // 将值保存到缓冲区以供以后使用    // (3) 指标计算,计算Hull    总和=0.0;                                              // 存储周期总和值以供以后除法使用    wf=1;                                                // 将起始权重因子设置为 1    总和Wf =0;                                              // 将权重因子的总和设置为 0    为了整数i = sqrtPeriod -1;我 >=0;我 - ) {            // 循环实际柱的半个周期      总和 += (2* halfWMABuffer[bar - i] - fullWMABuffer[bar - i]) * wf;// 计算 sqrt(period) 之和并乘以权重因子      sumWf += wf;                                          // 添加除法的所有权重因子      wf +=1;                                              // 增加下一个较新柱的线性权重的权重因子    }
    wMA=总和/sumWf;                                      // 计算半个MA周期的线性加权平均值    valueBuffer[bar] = wMA;                                // 存储用于显示的HMA    // (4) 指示器颜色计算,根据需要调整    colorBuffer[bar] = getColor(bar);
  }
}// 计算每个条形的颜色,根据您的需要进行调整
双倍的获取颜色(整数酒吧) {
  双倍的雷瓦尔;                                  // 存储返回值  如果(InpColorKind == single_color)                // 设置单一颜色    retval = InpColorIndex;                      // 蓝色的
//    retval = InpHullColor;  别的{                                          // 设置多色,默认为灰色    检索值 =0;                                  // 灰色的    如果(valueBuffer[栏 -1] < valueBuffer[栏])  // 如果指标向上,则绿色      检索值 =1;                                // 绿色的    如果(valueBuffer[栏 -1] > valueBuffer[栏])  // 如果指标向下,则为红色      检索值 =2;                                // 红色的  }
  返回(检索);                                  // 返回计算出的颜色}//+------------------------------------------------------------------+

享受使用它的乐趣。


附件下载

📎 melzhull.mq5 (11.73 KB)

Source: MQL5 #39735

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