获取窗口/子窗口的数量和可见性

使用 ChartGetInteger函数,MQL 程序可以查找图表上的窗口数量(包括子窗口)及其可见性状态。

标识符

说明

值类型

CHART_WINDOWS_TOTAL

图表窗口的总数,包括指标子窗口(只读)。

int

CHART_WINDOW_IS_VISIBLE

子窗口可见性,'window’ 参数为子窗口编号(只读)。

bool

如果某些指标在当前时间范围的“特性”对话框的“可视化”选项卡中被禁用,则对应的子窗口可能会被隐藏。无法重置所有标志:由于 tpl 模板的存储机制,这种状态会被解释为启用所有时间范围。因此,如果用户希望在某些时间段隐藏子窗口,必须在最不常用的时间范围上至少保留一个启用标志。

在不同时间范围上设置指标可见性

在不同时间范围上设置指标可见性

需要注意的是,MQL5 中未提供通过编程方式确定特定标志的状态和切换的标准工具。模拟这种控制的最简单方法是保存 tpl 模板并对其进行分析,后续可能进行编辑和加载(请参阅 处理 tpl 模板章节)。

在新版脚本 ChartList4.mq5中,我们输出以下内容:子窗口数量(始终存在一个主窗口)、图表活动状态标志、图表对象标志、Windows 句柄。

      const int win = (int)ChartGetInteger(idCHART_WINDOWS_TOTAL);
      const string header = StringFormat("%d %lld %s %s %s %s %s %s %lld",
         countidChartSymbol(id), PeriodToString(ChartPeriod(id)),
         (win > 1 ? "#" + (string)(win - 1) : ""), (id == me ? " *" : ""),
         (ChartGetInteger(idCHART_BRING_TO_TOP0) ? "active" : ""),
         (ChartGetInteger(idCHART_IS_OBJECT) ? "object" : ""),
         ChartGetInteger(idCHART_WINDOW_HANDLE));
      ...
      for(int i = 0i < wini++)
      {
         const bool visible = ChartGetInteger(idCHART_WINDOW_IS_VISIBLEi);
         if(!visible)
         {
            Print("  "i"/Hidden");
         }
      }

以下是可能的输出结果。

Chart List
N, ID, Symbol, TF, #subwindows, *active, Windows handle
0 132358585987782873 EURUSD M15 #1    68030
1 132360375330772909 EURUSD H1  * active  68048
 [S] ChartList4
2 132544239145024745 XAUUSD H1     395756
3 132544239145024732 USDRUB D1     395768
4 132544239145024744 EURUSD H1 #2    461286
  2/Hidden
Total chart number: 5, with MQL-programs: 1
Experts: 0, Scripts: 1

在第一张图表(索引 0)上有一个子窗口(#1)。在最后一张图表上有两个子窗口(#2),并且第二个子窗口当前处于隐藏状态。稍后,在 管理图表上的指标章节中,我们将展示完整版的 ChartList.mq5脚本,其中报告内容将包含位于子窗口和主窗口中的指标信息。

注意!对于 图表对象 中的图表,其 CHART_WINDOW_IS_VISIBLE 特性始终为 true,即使该对象的可视化在当前时间范围或全部时间范围中已被禁用。