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

使用MQL5专家顾问在指标窗口绘制垂直线的最简方法

在MQL指标窗口绘制带数值标注的垂直线

我懂你的困扰——想在指标窗口里画出带数值的垂直线,虽然查到了OBJ_VLINE但官方示例太绕,而且你已经搞定了在主图加载ADX的EA代码,那咱们直接上手解决问题。

首先得明确:默认OBJ_VLINE是画在主图的,要让它出现在指标窗口,必须给对象指定对应的窗口索引;另外OBJ_VLINE本身不自带数值标注,得额外搭配文本标签(OBJ_LABEL)来实现。

结合你的ADX代码,完整实现方案

我把你的现有代码扩展一下,实现“当ADX达到某个条件时,在指标窗口画垂直线并标注当前ADX数值”的功能:

input int Candles_for_adx = 5;
input color maincolor_adx = Yellow, dpluscolor_adx=Lime,dminuscolor_adx = Red;
int adxWindowIndex; // 存储ADX所在的指标窗口索引

void OnInit() {
    // 获取当前图表的总窗口数,作为新指标窗口的索引
    adxWindowIndex = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL);
    // 加载ADX到新的指标窗口,保存索引后续用
    ChartIndicatorAdd(0, adxWindowIndex, iCustom(_Symbol, PERIOD_M1, "ADX", Candles_for_adx, maincolor_adx, dpluscolor_adx, dminuscolor_adx));
}

void OnTick() {
    // 取最新K线的时间和当前ADX数值
    datetime currentTime = Time[0];
    double adxValue = iADX(_Symbol, PERIOD_M1, Candles_for_adx, PRICE_CLOSE, MODE_MAIN, 0);
    
    // 这里可以加条件,比如ADX突破25时才绘制,示例先直接画最新K线
    if(adxValue > 25) {
        // 创建垂直线对象,用时间做后缀避免重复创建
        string vlineName = "ADX_VLine_" + IntegerToString(currentTime);
        if(!ObjectCreate(0, vlineName, OBJ_VLINE, adxWindowIndex, currentTime, 0)) {
            Print("垂直线创建失败,错误码:", GetLastError());
            return;
        }
        
        // 设置垂直线样式
        ObjectSetInteger(0, vlineName, OBJPROP_COLOR, clrCyan);
        ObjectSetInteger(0, vlineName, OBJPROP_WIDTH, 2);
        
        // 创建数值标注的文本标签
        string labelName = "ADX_Label_" + IntegerToString(currentTime);
        if(!ObjectCreate(0, labelName, OBJ_LABEL, adxWindowIndex, currentTime, adxValue)) {
            Print("文本标签创建失败,错误码:", GetLastError());
            ObjectDelete(0, vlineName); // 标签创建失败,删掉已生成的垂直线
            return;
        }
        
        // 配置文本标签的显示样式
        ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrWhite);
        ObjectSetString(0, labelName, OBJPROP_FONT, "Arial");
        ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 10);
        ObjectSetString(0, labelName, OBJPROP_TEXT, StringFormat("ADX: %.2f", adxValue));
        // 让标签对齐到垂直线右侧,避免挡住线条
        ObjectSetInteger(0, labelName, OBJPROP_ALIGN, ALIGN_RIGHT);
    }
}

关键细节解释

  1. 指定指标窗口:
    我们在OnInit里把ADX加载到的窗口索引存在adxWindowIndex里,后续创建垂直线和标签时,都把这个索引传给ObjectCreate的第四个参数,确保对象出现在ADX所在的指标窗口,而不是主图。

  2. 避免重复创建对象:
    用当前K线的时间戳作为对象名的后缀,这样每个K线的垂直线和标签都是唯一的,不会重复创建导致报错。

  3. 数值标注的定位:
    文本标签的时间和垂直线一致,价格位置用当前ADX的数值,这样标签会精准显示在ADX曲线对应的位置,和垂直线完美对齐。

  4. 错误处理:
    创建对象时判断是否成功,如果失败就打印错误码,还会删掉已创建的垂直线,避免残留无效对象。

额外提示

如果是在自定义指标里实现(不是EA),逻辑完全一样,只需要把绘制代码放到OnCalculate函数里,用当前计算的K线时间和指标数值即可。

内容的提问来源于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.20 11:20:07