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




我不明白其他 Hull MA 实现的来源,所以我决定自己实现它。它有四个输入参数:
这些参数是不言自明的。枚举 ENUM_COLOR_KIND 在单色和多色之间切换,默认为单色。在多色中,Hull MA 有另一种颜色表示上升值,另一种颜色表示下降值。在单色模式下,ENUM_COLOR_INDEX 设置 Hull MA 的单色。在多色模式下,默认颜色为灰色。上坡时颜色为绿色,下坡时颜色为红色。您可以在下面两张图片中看到它。
//+------------------------------------------------------------------+ //| 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小时后评论,即可解锁附件下载
立即登录
