Descargar MetaTrader 5

ArraySort

Ordena el array numérico multidimensional por orden ascendente de los valores en la primera dimensión.

bool  ArraySort(
   void&  array[]      // array para ordenar
   );

Parámetros

array[]

[in][out]  Array numérico para ser ordenado.

Valor devuelto

Devuelve true en caso de éxito, de lo contrario devuelve false.

Nota

El array siempre se ordena en orden ascendente independientemente del valor de la bandera AS_SERIES.

Las funciones ArraySort y ArrayBSearch reciben como parámetro el array de cualquiera dimensión, la ordenación y la búsqueda se realiza sólo para la primera (cero) dimensión.

Ejemplo:

#property description "El indicador analiza los datos del último mes y colorea todas las velas con"
#property description "volúmenes de ticks grandes y pequeños. Para determinar estas velas se lleva a cabo la clasificación del"
#property description "array de los volúmenes de ticks. Las velas cuyos volúmenes se componen de los primeros InpSmallVolume"
#property description "por cientos del array se consideran pequeñas. Las velas cuyos volúmenes se componen de "
#property description "los últimos InpBigVolume por cientos del array se consideran grandes."
//--- ajustes del indicador
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot
#property indicator_label1  "VolumeFactor"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrDodgerBlue,clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- constante predefinida
#define INDICATOR_EMPTY_VALUE 0.0
//--- parámetros de entrada
input int InpSmallVolume=15; // Porcentaje de volúmenes pequeños (<50)
input int InpBigVolume=20;   // Porcentaje de volúmenes grandes (<50)
//--- hora de inicio de análisis (va a desplazarse)
datetime ExtStartTime;
//--- búferes de indicadores
double   ExtOpenBuff[];
double   ExtHighBuff[];
double   ExtLowBuff[];
double   ExtCloseBuff[];
double   ExtColorBuff[];
//--- valores límite de volúmenes para visualización de velas
long     ExtLeftBorder=0;
long     ExtRightBorder=0;
//+------------------------------------------------------------------+
//| Recepción de valores de los límites para volúmenes de ticks                    |
//+------------------------------------------------------------------+
bool GetVolumeBorders(void)
  {
//--- variables
   datetime stop_time;  // hora del fin de copiado
   long     buff[];     // búfer al que vamos a copiar
//--- hora final - hora actual
   stop_time=TimeCurrent();
//--- hora de inicio - un mes antes del tiempo actual
   ExtStartTime=GetStartTime(stop_time);
//--- obtenemos los valores de volúmenes de ticks
   ResetLastError();
   if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1)
     {
      //--- no ha salido conseguir datos, devolvemos false para iniciar el comando de recálculo
      PrintFormat("No se ha podido conseguir los valores del volumen de ticks. Código del error = %d",GetLastError());
      return(false);
     }
//--- calculamos el tamaño del array
   int size=ArraySize(buff);
//--- clasificamos array
   ArraySort(buff);
//--- determinamos los valores del límite izquierdo y derecho para los volúmenes de ticks
   ExtLeftBorder=buff[size*InpSmallVolume/100];
   ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100];
//--- ejecución con éxito
   return(true);
  }
//+------------------------------------------------------------------+
//| Recepción de la fecha que sea un mes más antigua de la fecha que ha sido pasada                    |
//+------------------------------------------------------------------+
datetime GetStartTime(const datetime stop_time)
  {
//--- convertimos el tiempo de finalización a la variable de la estructura del tipo MqlDateTime
   MqlDateTime temp;
   TimeToStruct(stop_time,temp);
//--- obtenemos la fecha que sea un mes más antigua
   if(temp.mon>1)
      temp.mon-=1;  // el mes en curso no es el primero de este año, entonces el numero del mes anterior es uno menos
   else
     {
      temp.mon=12;  // el mes en curso es el primer mes del año, entonces el número del anterior es igual a 12
      temp.year-=1; // y el número del año será menos uno
     }
//--- el número del día no va a superar 28
   if(temp.day>28)
      temp.day=28;
//--- devolvemos la fecha obtenida
   return(StructToTime(temp));
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- comprobar si los parámetros de entrada satisfacen las condiciones
   if(InpSmallVolume<0 || InpSmallVolume>=50 || InpBigVolume<0 || InpBigVolume>=50)
     {
      Print("Parámetros de entrada incorrectos");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtOpenBuff);
   SetIndexBuffer(1,ExtHighBuff);
   SetIndexBuffer(2,ExtLowBuff);
   SetIndexBuffer(3,ExtCloseBuff);
   SetIndexBuffer(4,ExtColorBuff,INDICATOR_COLOR_INDEX);
//--- establecemos el valor que no va a mostrarse
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- establecemos las etiquetas para los búferes de indicadores
   PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
   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[])
  {
//--- comprobamos si hay más barras sin procesar
   if(prev_calculated<rates_total)
     {
      //--- obtenemos nuevos valores de los límites izquierdo y derecho para los volúmenes
      if(!GetVolumeBorders())
         return(0);
     }
//--- variable de inicio para el cálculo de barras
   int start=prev_calculated;
//--- si los valores del indicador ya han sido calculados en el tick anterior, trabajamos en la ultima barra
   if(start>0)
      start--;
//--- establecemos la dirección directa de indexación en series temporales
   ArraySetAsSeries(time,false);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
   ArraySetAsSeries(tick_volume,false);
//--- ciclo del cálculo de los valores del indicador
   for(int i=start;i<rates_total;i++)
     {
      //--- coloreamos las velas empezando de la fecha inicial
      if(ExtStartTime<=time[i])
        {
         //--- si el valor no es más bajo que el límite derecho, coloreamos la vela
         if(tick_volume[i]>=ExtRightBorder)
           {
            //--- obtenemos los datos para dibujar la vela
            ExtOpenBuff[i]=open[i];
            ExtHighBuff[i]=high[i];
            ExtLowBuff[i]=low[i];
            ExtCloseBuff[i]=close[i];
            //--- color DodgerBlue
            ExtColorBuff[i]=0;
            //--- seguimos con el ciclo
            continue;
           }
         //--- si el valor no es más alto que el límite izquierdo, coloreamos la vela
         if(tick_volume[i]<=ExtLeftBorder)
           {
            //--- obtenemos los datos para dibujar la vela
            ExtOpenBuff[i]=open[i];
            ExtHighBuff[i]=high[i];
            ExtLowBuff[i]=low[i];
            ExtCloseBuff[i]=close[i];
            //--- color Orange
            ExtColorBuff[i]=1;
            //--- seguimos con el ciclo
            continue;
           }
        }
      //--- para las barras que no han entrado en los cálculos, ponemos el valor vacío
      ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtHighBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtLowBuff[i]=INDICATOR_EMPTY_VALUE;
      ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Véase también

ArrayBsearch


Actualizado: 2015.12.03