价格和时间坐标

对于在报价坐标系中存在的对象类型,MQL5 API 支持多个用于指定时间和价格绑定的特性。如果对象有多个锚点,则在调用 ObjectSetObjectGet 函数时,相关特性需要指定一个包含锚点索引的修饰符参数。

标识符

说明

值类型

OBJPROP_TIME

时间坐标

datetime

OBJPROP_PRICE

价格坐标

double

这些特性当然适用于所有对象,但为使用 屏幕坐标的对象设置或读取这些特性并无实际意义。

为演示如何使用坐标,我们来分析无缓冲指标ObjectHighLowChannel.mq5。对于给定的柱线区间,该指标将绘制两条趋势线。它们在时间轴上的起点和终点与该区间的第一根和最后一根柱线重合,而在价格轴上,每条线的值计算方式不同:上线使用最 High价的最高值和最低值,下线使用最Low 价的最高值和最低值。随着图表更新,我们临时绘制的通道应随价格移动。

柱线范围通过两个输入变量设置:初始柱线编号 BarOffset和柱线数量BarCount。默认情况下,线条基于最新价格绘制,因为 bar offset = 0

input int BarOffset = 0;
input int BarCount = 10;
   
const string Prefix = "HighLowChannel-";

对象具有共同的名称前缀 "HighLowChannel-"。

OnCalculate处理程序中,我们通过第 0 根柱线的iTime 时间监控新柱线的出现。一旦柱线形成,将分析指定区间内的价格,提取两种价格类型(MODE_HIGH 和 MODE_LOW)各自的最大值和最小值,然后调用辅助函数 DrawFigure,该函数负责对象相关操作:创建对象和修改坐标。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
   static datetime now = 0;
   if(now != iTime(NULL00))
   {
      const int hh = iHighest(NULL0MODE_HIGHBarCountBarOffset);
      const int lh = iLowest(NULL0MODE_HIGHBarCountBarOffset);
      const int ll = iLowest(NULL0MODE_LOWBarCountBarOffset);
      const int hl = iHighest(NULL0MODE_LOWBarCountBarOffset);
   
      datetime t[2] = {iTime(NULL0BarOffset + BarCount), iTime(NULL0BarOffset)};
      double ph[2] = {iHigh(NULL0fmax(hhlh)), iHigh(NULL0fmin(hhlh))};
      double pl[2] = {iLow(NULL0fmax(llhl)), iLow(NULL0fmin(llhl))};
    
      DrawFigure(Prefix + "Highs"tphclrBlue);
      DrawFigure(Prefix + "Lows"tplclrRed);
   
      now = iTime(NULL00);
   }
   return rates_total;
}

DrawFigure函数如下。

bool DrawFigure(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0nameOBJ_TREND000);
   
   for(int i = 0i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0nameOBJPROP_TIMEit[i]);
      ObjectSetDouble(0nameOBJPROP_PRICEip[i]);
   }
   
   ObjectSetInteger(0nameOBJPROP_COLORclr);
   return true;
}

在调用 ObjectCreate函数确保对象存在后,将在所有锚点(本例为两个)处调用适用于 OBJPROP_TIME 和 OBJPROP_PRICE 的 ObjectSet 函数。

下图展示了该指标的运行结果:

基于最高价和最低价的两条趋势线构成的通道

基于最高价和最低价的两条趋势线构成的通道

可以在可视化测试程序中运行该指标,查看线条坐标如何实时变化。