MQL5技术求助:获取指标窗口Y轴最高值与最低值
嘿,我来帮你解决获取指标窗口Y轴最高/最低值的问题!先把你提供的代码片段整理好:
#include <MovingAverages.mqh> #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 3 #property indicator_type1 DRAW_LINE #property indicator_color1 Yellow//LightSeaGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 #property indicator_type2 DRAW_LINE #property indicator_color2 Lime//YellowGreen // 你的代码未完整展示,不过我们聚焦Y轴极值的核心需求
下面给你两种实用的解决方案,覆盖不同场景:
获取MQL5指标窗口Y轴极值的两种方法
方法1:手动计算指标缓冲区的极值(最精准可控)
指标窗口的Y轴范围本质上由你要展示的缓冲区数据决定,所以直接遍历缓冲区计算全局最值是最可靠的方式:
- 先声明全局变量存储极值,再在
OnCalculate函数里完成遍历计算:
// 全局变量存储Y轴极值 double g_yAxisHigh = 0.0; double g_yAxisLow = 0.0; // 假设你已经定义了指标缓冲区,比如buffer1、buffer2 double buffer1[]; double buffer2[]; int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { // 首次计算时初始化极值 if(prev_calculated == 0) { g_yAxisHigh = buffer1[0]; g_yAxisLow = buffer1[0]; } // 遍历所有有效数据点,更新极值 for(int i = prev_calculated; i < rates_total; i++) { // 检查第一个缓冲区的数值 if(buffer1[i] > g_yAxisHigh) g_yAxisHigh = buffer1[i]; if(buffer1[i] < g_yAxisLow) g_yAxisLow = buffer1[i]; // 检查第二个缓冲区的数值(如果有多个显示缓冲区,都要加进来) if(buffer2[i] > g_yAxisHigh) g_yAxisHigh = buffer2[i]; if(buffer2[i] < g_yAxisLow) g_yAxisLow = buffer2[i]; // 继续添加其他需要纳入范围的缓冲区... } return rates_total; }
方法2:调用内置函数直接获取窗口当前Y轴范围
如果你不需要手动计算,想直接获取图表上显示的Y轴实时范围,可以用MT5的内置函数:
// 先获取指标所在独立窗口的ID long indicatorChartId = ChartIndicatorGet(0, "你的指标名称", CHART_INDICATOR_CHART_ID); // 再获取该窗口的Y轴极值 double yAxisMin = ChartGetDouble(indicatorChartId, CHART_PRICE_MIN); double yAxisMax = ChartGetDouble(indicatorChartId, CHART_PRICE_MAX);
注意:把"你的指标名称"替换成你指标实际的名称(就是指标属性里的名称);如果Y轴被手动锁定,这个方法返回的是锁定的数值,而非数据实际极值。
额外小提示
- 如果你的指标数据会动态更新,记得在
OnCalculate或OnTick里重新计算/获取极值,保证数值最新; - 如果你需要把极值用于绘图或其他逻辑,直接调用全局变量或返回值即可。
内容的提问来源于stack exchange,提问作者Jaffer Wilson
相关产品推荐
相关产品推荐

