在水平对象中设置水平位

一些图形对象是使用多个水平位(重复线条)构建的。这些包括:

  • Andrews 分叉线 OBJ_PITCHFORK
  • Fibonacci 工具:
    •  OBJ_FIBO 水平位
    •  时区 OBJ_FIBOTIMES
    •  扇形线 OBJ_FIBOFAN
    •  弧线 OBJ_FIBOARC
    •  通道 OBJ_FIBOCHANNEL
    •  扩展线 OBJ_EXPANSION

MQL5 允许你为这些对象设置水平位特性。这些特性包括它们的数量、颜色、数值和标签。

标识符

说明

类型

OBJPROP_LEVELS

水平线数量

int

OBJPROP_LEVELCOLOR

水平线颜色

color

OBJPROP_LEVELSTYLE

水平线样式

ENUM_LINE_STYLE

OBJPROP_LEVELWIDTH

水平线宽度

int

OBJPROP_LEVELTEXT

水平线描述

string

OBJPROP_LEVELVALUE

水平线值

double

在调用 ObjectGet和 ObjectSet 函数处理除 OBJPROP_LEVELS 外的所有特性时,需要提供一个额外的修饰符参数,用于指定具体级别编号。

作为示例,我们来看看指标ObjectHighLowFibo.mq5。对于给定的柱形范围(由最后一根柱线的编号 (baroffset) 及其左侧的柱数 (BarCount) 定义),该指标会先查找 High 和Low 价格,然后为这些价格点创建 OBJ_FIBO 对象。随着新柱线的形成,Fibonacci 水平位将向右移动,以贴合更近期的价格。

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
   
#include <MQL5Book/ColorMix.mqh>
   
input int BarOffset = 0;
input int BarCount = 24;
   
const string Prefix = "HighLowFibo-";
   
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
   static datetime now = 0;
   if(now != iTime(NULL, 0, 0))
   {
      const int hh = iHighest(NULL, 0, MODE_HIGH, BarCount, BarOffset);
      const int ll = iLowest(NULL, 0, MODE_LOW, BarCount, BarOffset);
   
      datetime t[2] = {iTime(NULL, 0, hh), iTime(NULL, 0, ll)};
      double p[2] = {iHigh(NULL, 0, hh), iLow(NULL, 0, ll)};
    
      DrawFibo(Prefix + "Fibo", t, p, clrGray);
   
      now = iTime(NULL, 0, 0);
   }
   return rates_total;
}

对象的直接设置是在辅助函数DrawFibo中完成的。在该函数中,水平位特别采用彩虹色进行绘制,而其样式和粗细则基于相应数值是否为“整数”(无小数部分)来决定。

bool DrawFibo(const string name, const datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0, name, OBJ_FIBO, 0, 0, 0);
   // anchor points
   for(int i = 0; i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
      ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
   }
   // general settings
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, true);
   // level settings
   const int n = (int)ObjectGetInteger(0, name, OBJPROP_LEVELS);
   for(int i = 0; i < n; ++i)
   {
      const color gradient = ColorMix::RotateColors(ColorMix::HSVtoRGB(0),
         ColorMix::HSVtoRGB(359), n, i);
      ObjectSetInteger(0, name, OBJPROP_LEVELCOLOR, i, gradient);
      const double level = ObjectGetDouble(0, name, OBJPROP_LEVELVALUE, i);
      if(level - (int)level > DBL_EPSILON * level)
      {
         ObjectSetInteger(0, name, OBJPROP_LEVELSTYLE, i, STYLE_DOT);
         ObjectSetInteger(0, name, OBJPROP_LEVELWIDTH, i, 1);
      }
      else
      {
         ObjectSetInteger(0, name, OBJPROP_LEVELSTYLE, i, STYLE_SOLID);
         ObjectSetInteger(0, name, OBJPROP_LEVELWIDTH, i, 2);
      }
   }
   
   return true;
}

以下是该对象在图表中的一种可能呈现样式。

带水平位设置的 Fibonacci 对象

带水平位设置的 Fibonacci 对象