无论是 MT4 指标编程还是 MT4 EA 编程时,经常需要在图表中创建控件或者对象,如果按绝对坐标进行定位则没有问题,但有时需要按图表相对坐标定位时,会出现问题。
ChartGetDouble()、ChartGetInteger() 取值为 0 的错误
比如创建一个按钮,在图表右下角,这时在设置按钮控件的 X 坐标时,需要获取图表的宽度,而 Y 坐标的计算需要获取图表高度。
如果在 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() 取不到值的解决办法
- 在 OnInit() 函数中使用绝对定位。
- 单独编写定位函数,待 OnInit() 完成之后再刷新控件位置。
MT4 常见错误的解决办法、MT4 指标编程、MT4 EA 编程入门、MT4/MQL4 编译时报错怎么办、MQL4 语言编程文档。
版权声明:本站所有原创文章,作者保留版权。转载必须包含本声明,不得修改任何内容(包括文章标题),并以超链接的形式注明作者“Bary”和本文原始地址。