移动对象

要在时间/价格坐标中移动对象,不仅可以使用更改特性的 ObjectSet函数,还可以使用特殊函数 ObjectMove,该函数可更改对象指定锚点的坐标。

bool ObjectMove(long chartId, const string name, int index, datetime time, double price)

chartId参数用于设置图表 ID(0 表示当前图表)。name参数中传入对象的名称。锚点索引和坐标分别通过 indextimeprice 参数指定。

该函数使用异步调用,即它只是将命令发送到图表的事件队列,但不会等待对象实际完成移动。

该函数返回命令是否成功加入队列的标识(在这种情况下,结果为true表示成功)。应通过调用 ObjectGet函数获取对象的实际位置。

在指标 ObjectHighLowFibo.mq5 中,我们对 DrawFibo函数进行修改以启用ObjectMove。在遍历锚点的循环中,我们不再使用两次对 ObjectSet函数的调用,而是改为使用一次 ObjectMove 调用:

bool DrawFibo(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   ...
   for(int i = 0i < ArraySize(t); ++i)
   {
      // was:
      // ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
      // ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
      // became:
      ObjectMove(0nameit[i], p[i]);
   }
   ...
}

当锚点的两个坐标都需要更改时,使用ObjectMove函数是合理的。在某些情况下,只有一个坐标会产生影响(例如,在标准差通道和线性回归通道的锚点处,只有起始和结束日期/时间至关重要,通道会自动计算这些点的价格值)。在这种情况下,调用一次 ObjectSet函数比使用 ObjectMove 更合适。