在水平对象中设置水平位

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

  • 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

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

作为示例,我们来看看指标ObjectHighLowFibo.mq5。对于给定的柱形范围(由最后一根柱线的编号 (baroffset) 及其左侧的柱数 (BarCount) 定义),该指标会先查找 HighLow 价格,然后为这些价格点创建 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(NULL00))
   {
      const int hh = iHighest(NULL0MODE_HIGHBarCountBarOffset);
      const int ll = iLowest(NULL0MODE_LOWBarCountBarOffset);
   
      datetime t[2] = {iTime(NULL0hh), iTime(NULL0ll)};
      double p[2] = {iHigh(NULL0hh), iLow(NULL0ll)};
    
      DrawFibo(Prefix + "Fibo"tpclrGray);
   
      now = iTime(NULL00);
   }
   return rates_total;
}

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

bool DrawFibo(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0nameOBJ_FIBO000);
   // anchor points
   for(int i = 0i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0nameOBJPROP_TIMEit[i]);
      ObjectSetDouble(0nameOBJPROP_PRICEip[i]);
   }
   // general settings
   ObjectSetInteger(0nameOBJPROP_COLORclr);
   ObjectSetInteger(0nameOBJPROP_RAY_RIGHTtrue);
   // level settings
   const int n = (int)ObjectGetInteger(0nameOBJPROP_LEVELS);
   for(int i = 0i < n; ++i)
   {
      const color gradient = ColorMix::RotateColors(ColorMix::HSVtoRGB(0),
         ColorMix::HSVtoRGB(359), ni);
      ObjectSetInteger(0nameOBJPROP_LEVELCOLORigradient);
      const double level = ObjectGetDouble(0nameOBJPROP_LEVELVALUEi);
      if(level - (int)level > DBL_EPSILON * level)
      {
         ObjectSetInteger(0nameOBJPROP_LEVELSTYLEiSTYLE_DOT);
         ObjectSetInteger(0nameOBJPROP_LEVELWIDTHi1);
      }
      else
      {
         ObjectSetInteger(0nameOBJPROP_LEVELSTYLEiSTYLE_SOLID);
         ObjectSetInteger(0nameOBJPROP_LEVELWIDTHi2);
      }
   }
   
   return true;
}

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

带水平位设置的 Fibonacci 对象

带水平位设置的 Fibonacci 对象