使用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); } }
关键细节解释
指定指标窗口:
我们在OnInit里把ADX加载到的窗口索引存在adxWindowIndex里,后续创建垂直线和标签时,都把这个索引传给ObjectCreate的第四个参数,确保对象出现在ADX所在的指标窗口,而不是主图。避免重复创建对象:
用当前K线的时间戳作为对象名的后缀,这样每个K线的垂直线和标签都是唯一的,不会重复创建导致报错。数值标注的定位:
文本标签的时间和垂直线一致,价格位置用当前ADX的数值,这样标签会精准显示在ADX曲线对应的位置,和垂直线完美对齐。错误处理:
创建对象时判断是否成功,如果失败就打印错误码,还会删掉已创建的垂直线,避免残留无效对象。
额外提示
如果是在自定义指标里实现(不是EA),逻辑完全一样,只需要把绘制代码放到OnCalculate函数里,用当前计算的K线时间和指标数值即可。
内容的提问来源于stack exchange,提问作者Jaffer Wilson
相关产品推荐
相关产品推荐

