MT4/MQL4 ChartGetInteger() 获取图表属性的值为 0 怎么解决

无论是 MT4 指标编程还是 MT4 EA 编程时,经常需要在图表中创建控件或者对象,如果按绝对坐标进行定位则没有问题,但有时需要按图表相对坐标定位时,会出现问题。

ChartGetDouble()、ChartGetInteger() 取值为 0 的错误

比如创建一个按钮,在图表右下角,这时在设置按钮控件的 X 坐标时,需要获取图表的宽度,而 Y 坐标的计算需要获取图表高度。

MT4 图表属性取值失败

如果在 OnInit() 中创建按钮,以下代码:

OnInit(){
  ...
  int x = ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) - buttonWidth;
  int y = ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS) - buttonHeight;
  ObjectSetInteger(0, buttonName, OBJPROP_XDISTANCE, x);
  ObjectSetInteger(0, buttonName, OBJPROP_YDISTANCE, y);
  ...
}

其中 ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) 以及 ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS) 的值为 0,按钮不能正确定位。

该 MQL4 代码不会报错 Error(s),也没有 Warning(s),但在初始化后按钮的坐标为 (-buttonWidth, -buttonHeight),按钮被定位到图表之外,看不见了。

如将上述 MQL4 代码挪入 OnCalculate() 函数,则按钮可以正确放置。

类似的:

ChartGetInteger(0, CHART_WIDTH_IN_BARS);
ChartGetDouble(0, CHART_PRICE_MAX);
ChartGetDouble(0, CHART_FIXED_MIN);

等图表属性均不能在 OnInit() 中正确取值。

ChartGetDouble()、ChartGetInteger() 取不到值的解决办法

  1. 在 OnInit() 函数中使用绝对定位。
  2. 单独编写定位函数,待 OnInit() 完成之后再刷新控件位置。

MT4 常见错误的解决办法、MT4 指标编程、MT4 EA 编程入门、MT4/MQL4 编译时报错怎么办、MQL4 语言编程文档。

版权声明:本站所有原创文章,作者保留版权。转载必须包含本声明,不得修改任何内容(包括文章标题),并以超链接的形式注明作者“Bary”和本文原始地址。

发表评论

电子邮件地址不会被公开。 必填项已用*标注