指标: 更好的音量 - 页 2

oomeysh #:
我在 mt5 上使用了该指标,但没有任何显示... up
进入指标输入设置,将 "使用的成交量类型 "从 "真实成交量 "改为 "每分钟成交量"。

我把这个发给了克劳德·索内特 5.5,它显示:

优点

  • 缓冲区布局正确:3个缓冲区对应2个图表(直方图数据+颜色索引,外加移动平均线)。
  • 颜色列表与经典的“Better Volume”调色板一致。索引 0 到 5 与注释内容对应。
  • 此处的等值检查(如 IntTimesRange == IntMaxTimesRange)是安全的。窗口最大值是通过相同的表达式计算得出的,因此当当前K线达到最大值时,双精度数值完全匹配。
  • 通过 prev_calculated - 1 进行重新计算,能正确更新正在形成的K线。

错误列表,最严重的问题优先

1. 历史数据较短时发生数值越界崩溃(第 63–69 行)。
的限制仅在首次调用时被限制。假设周线图或月线图有 50 根K线,而 minbars 设为 100。 首次调用会跳过循环并返回 rates_total。在下一个 tick 时,prev_calculated 为 50,因此 limit 为 49。随后 MA 循环读取到 n = -1,导致指标因“数组越界”而崩溃。修复方法:

mql5

if(rates_total <= minbars) return(0); limit = (prev_calculated == 0) ? minbars : MathMax(prev_calculated - 1, minbars);

2. 在看跌K线中,“Climax Churn”(洋红色)信号丢失(第116–121行)。
“Climax Sell”代码块在“Climax Churn”之后运行,并覆盖了后者。 因此,同时满足“成交量-价格区间高潮”和“震荡”条件的K线,只有当其收盘价高于中点时才会显示洋红色;若收盘价低于中点,则显示为纯白色。设计意图是让“高潮震荡”优先于其他所有情况。

3. “额外震荡检查”永远不会触发(第123–125行)。
IntCandleRange > IntMiddlePrice * 2 展开后为高 - 低 > 高 + 低,这仅在低 < 0 时成立。对于任何常规交易品种,该条件都是死代码。此处的本意可能是与平均波动范围或类似指标进行比较,因此需要重新定义,而非仅仅进行修复。

4. 硬编码的 20 忽略了 InpLookBack(第 105 行)。
其他所有部分都使用了 InpLookBack,但低成交量测试却使用了 i - 19、20。除 20 以外的任何值都会导致类之间不一致。如果 InpLookBack 设置为大于 20,低成交量检测仍然只查看 20 根 K 线。

5. 零成交量数据会触发虚假信号,且默认设置存在陷阱。

  • 默认值为 VOLUME_REAL,在大多数外汇和差价合约(CFD)符号中该值为 0。
  • 当成交量全为零时,IntTimesRange (0) == IntMaxTimesRange (0) 和 IntDividedRange (0) == IntMaxDividedRange (0) 均成立。图表将充满“顶部”和“顶部震荡”的颜色。
  • 请将标志值设置为 > 0 ,并默认使用 VOLUME_TICK 。

6. OnInit 中没有输入验证。
,当 InpMAPeriod <= 0 时会导致除以零错误;当 InpLookBack <= 0 时会破坏窗口逻辑。对于这些情况,应返回 INIT_PARAMETERS_INCORRECT。

细微之处

  • NormalizeDouble(..., 0) 会将移动平均线(MA)四舍五入为整数,这会导致成交量较低的符号上线条失真。该操作并非必要。
  • minbars 之前的K线从未被写入,且未设置 PLOT_DRAW_BEGIN。请设置该标志并初始化缓冲区,以免早期K线显示乱码。
  • 移动平均线(MA)可以从 MAPeriod - 1 开始,而非 MAPeriod。使用累积和代替每根K线重新求和100根K线,速度也会更快。
  • 重复出现的 InpVolumeType == VOLUME_TICK ? ... : ... 三元运算符,若整合为一个小型辅助函数会更简洁。


    附上经 Claude 修正并翻译成英文的版本。(点击“转到讨论”查看文件)
附加的文件: