CopyRates

Obtém na matriz ou vetor as séries históricas da estrutura MqlRates do período-símbolo especificado com a quantidade especificada. Os itens da posição inicial são contados do presente para o passado, ou seja, uma posição inicial de 0 significa a barra atual.

Além disso, os dados serão copiados de tal forma que o elemento mais antigo no tempo seja colocado no início da matriz/vetor. Existem 3 variantes do método.

Acesso através da posição inicial e número de itens necessários.

bool  matrix::CopyRates(
   string           symbol,       // nome do símbolo
   ENUM_TIMEFRAMES  period,       // período
   ulong            rates_mask,   // combinação de sinalizadores para indicar a série solicitada
   ulong            start,        // número da barra inicial a partir da qual começar a copiar 
   ulong            count         // quantidade a copiar
   );

Acesso através da data inicial e número de itens necessários.

bool  matrix::CopyRates(
   string           symbol,       // nome do símbolo
   ENUM_TIMEFRAMES  period,       // período
   ulong            rates_mask,   // combinação de sinalizadores para indicar a série solicitada
   datetime         from,         // desde que data 
   ulong            count         // quantidade a copiar
   );

Acesso através das datas inicial e final dentro de um intervalo de tempo.

bool  matrix::CopyRates(
   string           symbol,       // nome do símbolo
   ENUM_TIMEFRAMES  period,       // período
   ulong            rates_mask,   // combinação de sinalizadores para indicar a série solicitada
   datetime         from,         // desde que data 
   datetime         to            // até que data
   );

Para um vetor, os métodos são semelhantes.

Acesso através da posição inicial e número de itens necessários.

bool  vector::CopyRates(
   string           symbol,       // nome do símbolo
   ENUM_TIMEFRAMES  period,       // período
   ulong            rates_mask,   // combinação de sinalizadores para indicar a série solicitada
   ulong            start,        // número da barra inicial a partir da qual começar a copiar 
   ulong            count         // quantidade a copiar
   );

Acesso através da data inicial e número de itens necessários.

bool  vector::CopyRates(
   string           symbol,       // nome do símbolo
   ENUM_TIMEFRAMES  period,       // período
   ulong            rates_mask,   // combinação de sinalizadores para indicar a série solicitada
   datetime         from,         // desde que data 
   ulong            count         // quantidade a copiar
   );

Acesso através das datas inicial e final dentro de um intervalo de tempo.

bool  vector::CopyRates(
   string           symbol,       // nome do símbolo
   ENUM_TIMEFRAMES  period,       // período
   ulong            rates_mask,   // combinação de sinalizadores para indicar a série solicitada
   datetime         from,         // desde que data 
   datetime         to            // até que data
   );

Parâmetros

symbol

[in]  Símbolo.

period

[in]  Período.

rates_mask

[in]  Combinação de sinalizadores provenientes da enumeração ENUM_RATES que indicam o tipo de série solicitada. Ao copiar para um vetor, apenas um valor da enumeração ENUM_RATES pode ser especificado, caso contrário, ocorrerá um erro.

start

[in]  Número do primeiro item copiado.

count

[in]  Número de itens a serem copiados.

from

[in]  Tempo de barra correspondente ao primeiro item.

to

[in]  Tempo de barra correspondente ao último item.

Valor retornado

Retorna true se for bem-sucedido, caso contrário, false se for erro.

Observação

Se o intervalo de dados solicitado estiver totalmente fora dos dados disponíveis no servidor, a função retorna false. Se os dados forem solicitados fora de TERMINAL_MAXBARS (número máximo de barras no gráfico), a função também retornará false.

Ao solicitar dados de um EA ou script, será iniciada um carregamento desde o servidor se o terminal não tiver esses dados localmente, ou será iniciada a construção da série temporal necessária se os dados puderem ser construídos a partir do histórico local, mas ainda não estiverem prontos. A função retornará a quantidade de dados que estarão prontos quando o tempo expirar, mas o carregamento do histórico continuará, e na próxima vez que uma solicitação semelhante for feita a função retornará mais dados.

Ao solicitar dados por data de início e número de itens necessários, somente os dados com data menor que (antes) ou igual à data especificada são devolvidos. O intervalo é definido e considerado com uma precisão de segundos. Ou seja, a data de abertura de qualquer barra para a qual um valor é retornado (volume, spread, preço de abertura, máximo, mínimo, fechamento ou hora) é sempre igual ou menor que o especificado.

Ao solicitar dados em um determinado intervalo de datas, apenas os dados que se enquadram no intervalo solicitado são retornados, enquanto o intervalo é definido e considerado com precisão de até um segundo. Ou seja, o tempo de abertura de qualquer barra para a qual um valor é retornado (volume, spread, valor no buffer do indicador, preço de abertura, máximo, mínimo, fechamento ou tempo) está sempre dentro do intervalo solicitado.

Assim, se o dia da semana atual for sábado, quando você tentar copiar dados no período semanal, especificando start_time=ultima_terça-feira e stop_time=ultima_sexta-feira a função retornará 0, pois o horário de abertura no período semanal sempre cai no domingo, mas nenhuma barra semanal está dentro do intervalo especificado.

Se você precisar obter o valor correspondente à barra incompleta atual, poderá usar a primeira forma da chamada, indicando start_pos=0 и count=1.

ENUM_COPY_RATES

A enumeração ENUM_COPY_RATES contém sinalizadores para especificar o tipo de dados a ser passado para a matriz ou array. A combinação de sinalizadores permite obter várias séries do histórico em uma solicitação. Nesse caso, a ordem das linhas na matriz corresponderá à ordem dos valores na enumeração ENUM_COPY_RATES, ou seja, a linha com dados High será sempre maior na matriz do que a linha com dados Low.

Identificador

Valor

Descrição

COPY_RATES_OPEN

1

Série de preços Open

COPY_RATES_HIGH

2

Série de preços High

COPY_RATES_LOW

4

Série de preços Low

COPY_RATES_CLOSE

8

Série de preços Close

COPY_RATES_TIME

16

Série Time (hora de abertura da barra)

 

A obtenção de tempo no valor float do vetor e matriz (vectord e matrixf) acarreta a perda de ~100 segundos, em outras palavras a precisão do valor float é fortemente limitado, e inteiros com um valor superior a 1<<24 não podem ser representados com precisão em um valor float.

COPY_RATES_VOLUME_TICK

32

Volumes de ticks

COPY_RATES_VOLUME_REAL

64

Volumes de negociação

COPY_RATES_SPREAD

128

Spreads

Combinação

 

 

COPY_RATES_OHLC

15

Séries Open, High, Low e Close

COPY_RATES_OHLCT

31

Série Open, Hilgh, Low, Close e Time

Disposição dos dados

 

 

COPY_RATES_VERTICAL

32768

As séries são copiadas na matriz ao longo do eixo vertical. Isso implica que os valores das séries na matriz são organizados de forma vertical, ou seja, os dados mais antigos são apresentados na primeira linha e os mais recentes, na última.

 

Por padrão, ao copiar para uma matriz, as séries são adicionadas ao longo do eixo horizontal.

 

O sinalizador só é relevante ao copiar para uma matriz.

Exemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- obtemos as cotações na matriz
  matrix matrix_rates;
  if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENTCOPY_RATES_OHLCT110))
    Print("matrix rates: \n"matrix_rates);
  else
    Print("matrix_rates.CopyRates failed. Error "GetLastError());
//--- verificação
  MqlRates mql_rates[];
  if(CopyRates(Symbol(), PERIOD_CURRENT110mql_rates)>0)
   {
    Print("mql_rates array:");
    ArrayPrint(mql_rates);
   }
  else
    Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error "GetLastError());
//--- obtemos cotações no vetor = chamada errada
  vector vector_rates;
  if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENTCOPY_RATES_OHLC115))
    Print("vector_rates COPY_RATES_OHLC: \n"vector_rates);
  else
    Print("vector_rates.CopyRates COPY_RATES_OHLC failed. Error "GetLastError());
//--- obtemos os preços de fechamento no vetor
  if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENTCOPY_RATES_CLOSE115))
    Print("vector_rates COPY_RATES_CLOSE: \n"vector_rates);
  else
    Print("vector_rates.CopyRates failed. Error "GetLastError());
 };
/*
   matrix rates:
   [[0.99686,0.99638,0.99588,0.99441,0.99464,0.99594,0.99698,0.99758,0.99581,0.9952800000000001]
    [0.99708,0.99643,0.99591,0.9955000000000001,0.99652,0.99795,0.99865,0.99764,0.99604,0.9957]
    [0.9961100000000001,0.99491,0.99426,0.99441,0.99448,0.99494,0.9964499999999999,0.99472,0.9936,0.9922]
    [0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
    [1662436800,1662440400,1662444000,1662447600,1662451200,1662454800,1662458400,1662462000,1662465600,1662469200]]
   mql_rates array:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [02022.09.06 04:00:00 0.99686 0.99708 0.99611 0.99641          4463        0             0
   [12022.09.06 05:00:00 0.99638 0.99643 0.99491 0.99588          4519        0             0
   [22022.09.06 06:00:00 0.99588 0.99591 0.99426 0.99441          3060        0             0
   [32022.09.06 07:00:00 0.99441 0.99550 0.99441 0.99464          3867        0             0
   [42022.09.06 08:00:00 0.99464 0.99652 0.99448 0.99594          5280        0             0
   [52022.09.06 09:00:00 0.99594 0.99795 0.99494 0.99697          7227        0             0
   [62022.09.06 10:00:00 0.99698 0.99865 0.99645 0.99758         10130        0             0
   [72022.09.06 11:00:00 0.99758 0.99764 0.99472 0.99581          7012        0             0
   [82022.09.06 12:00:00 0.99581 0.99604 0.99360 0.99528          6166        0             0
   [92022.09.06 13:00:00 0.99528 0.99570 0.99220 0.99259          6950        0             0
   vector_rates.CopyRates COPY_RATES_OHLC failedError 4003
   vector_rates COPY_RATES_CLOSE:
   [0.9931,0.99293,0.99417,0.99504,0.9968399999999999,0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
*/

Ver também

Acesso a séries temporais e indicadores, CopyRates