如何将OBJ_TREND的time1与price1转换为OBJ_BUTTON可用坐标
要实现这个转换,核心是先将图表的时间-价格逻辑坐标(OBJ_TREND的time1、price1)转成屏幕像素坐标,再结合OBJ_BUTTON的锚点设置,计算出对应的OBJPROP_XDISTANCE和OBJPROP_YDISTANCE值,具体步骤如下:
1. 获取OBJ_TREND的目标坐标值
首先从已创建的OBJ_TREND对象中提取time1和price1:
datetime trendTime1 = ObjectGetInteger(0, "OBJ_TREND_NAME", OBJPROP_TIME1); double trendPrice1 = ObjectGetDouble(0, "OBJ_TREND_NAME", OBJPROP_PRICE1);
- 第一个参数
0代表当前图表窗口,替换成实际图表ID(如果需要操作其他窗口)。 "OBJ_TREND_NAME"是你的趋势线对象名称,换成实际名称。
2. 转换为屏幕像素坐标
使用ChartTimePriceToXY()函数,把时间和价格转成图表窗口内的像素位置:
int screenX, screenY; bool conversionSuccess = ChartTimePriceToXY(0, 0, trendTime1, trendPrice1, screenX, screenY);
- 第二个参数
0代表主图表子窗口(如果是指标窗口,换成对应子窗口ID)。 - 转换成功后,
screenX是该点距离图表窗口左边缘的像素数,screenY是距离上边缘的像素数。
3. 计算OBJ_BUTTON的坐标参数
OBJ_BUTTON的OBJPROP_XDISTANCE和OBJPROP_YDISTANCE是相对于锚点(由OBJPROP_CORNER设置)的像素偏移,默认锚点是CORNER_LEFT_UPPER(窗口左上角):
情况1:让按钮左上角对准目标点
直接用转换后的像素值作为距离参数:
ObjectSetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_XDISTANCE, screenX); ObjectSetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_YDISTANCE, screenY);
情况2:让按钮中心对准目标点
如果需要按钮中心落在目标位置,要结合按钮的宽高调整偏移:
int buttonWidth = ObjectGetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_XSIZE); int buttonHeight = ObjectGetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_YSIZE); ObjectSetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_XDISTANCE, screenX - buttonWidth / 2); ObjectSetInteger(0, "OBJ_BUTTON_NAME", OBJPROP_YDISTANCE, screenY - buttonHeight / 2);
关键注意事项
- 确保转换函数
ChartTimePriceToXY()返回true,如果返回false,说明目标时间/价格不在当前图表可视范围内,需要先调整图表视图(比如滚动到对应时间周期)。 - 如果图表窗口大小改变,像素坐标会变化,建议在图表重绘事件(
OnChartEvent()中的CHARTEVENT_CHART_CHANGE)中重新计算坐标。
内容的提问来源于stack exchange,提问作者Toby Toby
相关产品推荐
相关产品推荐

