Establecer niveles en objetos de nivel

Algunos objetos gráficos se construyen utilizando varios niveles (líneas repetitivas). Entre ellos figuran:

  • Horquilla de Andrews OBJ_PITCHFORK
  • Herramientas de Fibonacci:
    • Niveles OBJ_FIBO
    • Zonas horarias OBJ_FIBOTIMES
    • Abanico OBJ_FIBOFAN
    • Arcos OBJ_FIBOARC
    • Canal OBJ_FIBOCHANNEL
    • Extensión OBJ_EXPANSION

MQL5 permite establecer propiedades de nivel para dichos objetos. Las propiedades incluyen su número, colores, valores y etiquetas.

Identificador

Descripción

Tipo

OBJPROP_LEVELS

Número de niveles

int

OBJPROP_LEVELCOLOR

Color de la línea de nivel

color

OBJPROP_LEVELSTYLE

Estilo de línea de nivel

ENUM_LINE_STYLE

OBJPROP_LEVELWIDTH

Anchura de la línea de nivel

int

OBJPROP_LEVELTEXT

Descripción del nivel

string

OBJPROP_LEVELVALUE

Valor del nivel

double

Al llamar a las funciones ObjectGet y ObjectSet para todas las propiedades excepto OBJPROP_LEVELS, es necesario proporcionar un parámetro modificador adicional con el número de un nivel específico.

Tomemos como ejemplo el indicador ObjectHighLowFibo.mq5. Para un rango de barras determinado, que se define como el número de la última barra (baroffset) y el número de barras (BarCount) a la izquierda de la misma, el indicador encuentra los precios High y Low, y, a continuación, crea el objeto OBJ_FIBO para estos puntos. A medida que se formen nuevas barras, los niveles de Fibonacci se desplazarán hacia la derecha, hacia precios más actuales.

#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;
}

La configuración directa del objeto se realiza en la función auxiliar DrawFibo. En ella, en concreto, los niveles se pintan con los colores del arco iris, y su estilo y grosor se determinan en función de si los valores correspondientes están «redondeados» (sin parte fraccionaria).

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;
}

He aquí una variante del aspecto que puede tener un objeto en un gráfico:

Objeto de Fibonacci con configuración de niveles

Objeto de Fibonacci con ajustes de niveles