You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将OBJ_TREND的time1与price1转换为OBJ_BUTTON可用坐标

把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:40:15