Descargar MetaTrader 5

ArrayGetAsSeries

Esta función comprueba la dirección de indexación de un array.

bool  ArrayGetAsSeries(
   const void&  array[]    // array a comprobar
   );

Parámetros

array

[in]  Array comprobado.

Valor devuelto

Devuelve true, si el array especificado tiene puesta la bandera AS_SERIES, es decir, el acceso al array se realiza al revés, como en una serie temporal. Una serie temporal se diferencia de un array usual en que la indexación de los elementos de la serie temporal se realiza del fin del array al inicio (de los datos más recientes a los más antiguos).

Nota

Para comprobar si un array pertenece a una serie temporal hay que usar la función ArrayIsSeries(). Los arrays de los datos de precio que han sido pasados como los parámetros de entrada a la función OnCalculate(), no han de tener obligatoriamente la dirección de indexación como las series temporales. La función ArraySetAsSeries() puede establecer la dirección de indexación necesaria.

Ejemplo:

#property description "El indicador calcula los valores absolutos de diferencia entre los precios"
#property description "Open y Close o High y Low, y los visualiza en una subventana individual"
#property description "en forma de un histograma."
//--- ajustes del indicador
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
//--- parámetros de entrada
input bool InpAsSeries=true// Dirección de indexación en el búfer de indicadores
input bool InpPrices=true;   // Precios para el cálculo (true - Open,Close; false - High,Low)
//--- búfer de indicadores
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Cálculo de valores del indicador                                   |
//+------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
                        const double &first[],const double &second[],double &buffer[])
  {
//--- variable inicial para el cálculo de barras
   int start=prev_calculated;
//--- si los valores del indicador ya han sido calculados en el tick anterior, entonces trabajamos con la última barra
   if(prev_calculated>0)
      start--;
//--- definimos la dirección de la indexación en los arrays
   bool as_series_first=ArrayGetAsSeries(first);
   bool as_series_second=ArrayGetAsSeries(second);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- si hace falta, sustituimos la dirección de la indexación con la recta
   if(as_series_first)
      ArraySetAsSeries(first,false);
   if(as_series_second)
      ArraySetAsSeries(second,false);
   if(as_series_buffer)
      ArraySetAsSeries(buffer,false);
//--- calculamos los valores del indicador
   for(int i=start;i<rates_total;i++)
      buffer[i]=MathAbs(first[i]-second[i]);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- enlace de los búferes de indicadores
   SetIndexBuffer(0,ExtBuffer);
//--- fijamos la dirección de la indexación en el búfer de indicadores
   ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- comprobamos para qué tipo de precios se calcula el indicador
   if(InpPrices)
     {
      //--- precios Open y Close
      PlotIndexSetString(0,PLOT_LABEL,"BodySize");
      //--- determinamos el color del indicador
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);
     }
   else
     {
      //--- precios High y Low
      PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");
      //--- determinamos el color del indicador
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- cálculo del indicador en función del valor de la bandera
   if(InpPrices)
      CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
   else
      CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Véase también

Acceso a las series temporales, ArraySetAsSeries


Actualizado: 2015.12.03