You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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轴范围本质上由你要展示的缓冲区数据决定,所以直接遍历缓冲区计算全局最值是最可靠的方式:

  1. 先声明全局变量存储极值,再在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:48