CopyRates

Recibe en el array rates_array datos históricos de la estructura MqlRates del símbolo-período especificado en cantidad especificada. La cuenta de elementos desde la posición de inicio se realiza del presente al pasado, es decir, la posición de inicio igual a 0 significa la barra corriente.

CopyRates

Cuando copiamos los datos sin conocer todavía el volumen a copiar, se recomienda usar un array dinámico como array de destino, porque si la cantidad de datos resulta ser menos (o más) de la que cabe en el array, entonces se intenta redistribuirlo de tal manera para que los datos solicitados quepan íntegramente.

Si sabemos la cantidad de datos que tenemos que copiar, con el fin de evitar la asignación excesiva de memoria es mejor hacerlo a un buffer asignado estáticamente.

La cuenta de elementos desde la posición de inicio se realiza del presente al pasado, es decir, la posición de inicio igual a 0 significa la barra corriente. Existen 3 variantes de la función.

Llamada según la posición de inicio y el número de elementos requeridos

int  CopyRates(
   string           symbol_name,       // nombre del símbolo
   ENUM_TIMEFRAMES  timeframe,         // período
   int              start_pos,         // posición de inicio 
   int              count,             // cantidad de datos a copiar
   MqlRates         rates_array[]      // array de destino en el que se copian los datos
   );

Llamada según la fecha de inicio y el número de elementos requeridos

int  CopyRates(
   string           symbol_name,       // nombre del símbolo
   ENUM_TIMEFRAMES  timeframe,         // período
   datetime         start_time,        // fecha y hora de inicio
   int              count,             // cantidad de datos a copiar
   MqlRates         rates_array[]      // array de destino en el que se copian los datos
   );

Llamada según la fecha de inicio y finalización del intervalo de tiempo requerido

int  CopyRates(
   string           symbol_name,       // nombre del símbolo
   ENUM_TIMEFRAMES  timeframe,         // período
   datetime         start_time,        // fecha y hora de inicio
   datetime         stop_time,         // fecha y hora de finalización
   MqlRates         rates_array[]      // array de destino en el que se copian los datos
   );

Parámetros

symbol_name

[in]  Símbolo.

timeframe

[in]  Período.

start_time

[in]  Hora de la barra correspondiente al primer elemento.

start_pos

[in]  Posición del primer elemento a copiar.

count

[in]  Cantidad de elementos a copiar.

stop_time

[in]  Hora de la barra correspondiente al último elemento.

rates_array[]

[out]  Array del tipo MqlRates.

Valor devuelto

Cantidad de elementos copiados del array, o -1 en caso del error.

Nota

Si el intervalo de datos solicitados se encuentra totalmente fuera del rango de datos disponibles del servidor, la función devuelve -1. Si los datos solicitados salen del rango de TERMINAL_MAXBARS (la cantidad máxima de barras en el gráfico), la función tambien devuelve -1.

Al solicitar los datos del indicador, si las series temporales solicitadas todavía no están construidas o hay que bajarlas del servidor, la función devolverá inmediatamente -1. Aunque en este caso, se iniciará el proceso de descarga/construcción.

Cuando se solicitan los datos a un Asesor Experto o un script, se iniciará la descarga desde el servidor si el terminal no dispone de estos datos a nivel local, o se empezará la construcción de la serie temporal necesaria si se puede construir los datos usando el historial local y ellos todavía no están listos. La función devolverá aquella cantidad de datos que estarán listos para el momento de vencimiento de timeout, pero el historial seguirá cargándose  y con la siguiente solicitud del mismo tipo la función devolverá más datos.

Cuando se solicitan los datos por la fecha inicial y el número de elementos requeridos, sólo se devuelven los datos cuya fecha es menor (anterior) o igual a la especificada. Este intervalo se establece y se cuenta con la precisión de segundos. Es decir, la fecha de apertura de cualquier barra para la que se devuelve el valor (volumen, spread, valor en el búfer de indicador, precio Open, High, Low, Close o la hora de apertura Time) siempre es igual o menor que la especificada.

Cuando se solicitan los datos de un período de fechas especificado, se devuelven los datos que entran sólo en este intervalo temporal especificado. Este intervalo se establece y se cuenta con la precisión de segundos. Es decir, la hora de apertura de cualquier barra para la que se devuelve el valor (volumen, spread, valor en el búfer de indicador, precio Open, High, Low, Close o la hora de apertura Time) siempre se encuentra en el intervalo especificado.

Por ejemplo, si el día corriente es sabado, al intentar copiar los datos del margen semanal indicando start_time=Último_Martes y stop_time=Último_Viernes, la función devolverá 0 porque la apertura en un período de tiempo semanal siempre cae en domingo, pero ninguna barra semanal no entra en el período especificado.

Si se necesita obtener el valor que corresponde a una barra corriente no finalizada, se puede usar la primera forma de llamada, indicando start_pos=0 y count=1.

Ejemplo:

void OnStart()
  {
//---
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(Symbol(),0,0,100,rates);
   if(copied>0)
     {
      Print("Barras copiadas: "+copied);
      string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
      string out;
      int size=fmin(copied,10);
      for(int i=0;i<size;i++)
        {
         out=i+":"+TimeToString(rates[i].time);
         out=out+" "+StringFormat(format,
                                  rates[i].open,
                                  rates[i].high,
                                  rates[i].low,
                                  rates[i].close,
                                  rates[i].tick_volume);
         Print(out);
        }
     }
   else Print("Fallo al recibir datos históricos para el símbolo ",Symbol());
  }

Puede encontrar un ejemplo más detallado de la solicitud de datos históricos en la sección Modos de enlace de objetos. En el script de aquella sección se muestra cómo se puede obtener los valores del indicador iFractals sobre las últimas 1000 barras, y cómo luego se puede visualizar en el gráfico los diez últimos fractales arriba y los diez último fractales abajo. Esta técnica puede ser utilizada para todos los indicadores que tienen omisiones de valores y suelen realizarse utilizando los siguientes estilos de construcción:

 

Véase también

Estructuras y clases, TimeToString, StringFormat