Erro CopyRates

 

Olá pessoal, agradeço imensamente se puderem me ajudar.

Tenho um indicador que roda no gráfico M1 do mini indice B3 e apenas preciso acessar os dados do indicador ADX mas com dados do gráfico diário.

Criaei o codigo abaixo apenas como exemplo para tentar acessar os dados de ADX do gráfico diário do dia 08/04/2024 mas o meu array sempre fica com 0 e cai no else de erro:


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[])

  {


for(int i=0;i<rates_total;i++)

   {


      string symbol = "WIN$N";

      datetime target_date = D'2024.04.08';

      int adx_handle = iADX(symbol, PERIOD_D1, 14);

      MqlRates rates_array[];

      

      int rates_copied = CopyRates(symbol, PERIOD_D1, target_date, 1, rates_array);

      

      // Verifica se os dados da barra foram copiados corretamente

      if(rates_copied > 0)

      {

          // Obtém o timestamp da barra diária desejada

          datetime daily_time = rates_array[0].time;

          // Cria um array para armazenar os valores do ADX

          double adx_values[];

          // Copia o valor do ADX para o array

          int copied = CopyBuffer(adx_handle, 0, daily_time, 1, adx_values);

          double daily_adx = adx_values[0];

      }

      else

      {

          Print("Erro ao acessar os dados diários: ", GetLastError());

      }


      //Restante do código do indicador abaixo:......

   }

   return(rates_total);

  }

 
Joselino de Souza Clemente JuniorOlá pessoal, agradeço imensamente se puderem me ajudar. Tenho um indicador que roda no gráfico M1 do mini indice B3 e apenas preciso acessar os dados do indicador ADX mas com dados do gráfico diário. Criaei o codigo abaixo apenas como exemplo para tentar acessar os dados de ADX do gráfico diário do dia 08/04/2024 mas o meu array sempre fica com 0 e cai no else de erro:

Olá, algumas observações:

1. Código formatado incorrectamente. Por favor utilize o botão do CÓDIGO (Alt -S) ao inserir o seu código.

Botão de código no editor

2. Declare globais as variáveis adx_handle symbol e inclua o código abaixo em OnInit():

adx_handle = iADX(symbol, PERIOD_D1, 14);
3. SEMPRE verifique adequadamente o retorno de todas as funções (iADX, CopyRates, CopyBuffer, ...)... Não confie que vai sempre funcionar sem erros.

4. A função CopyRates retorna true/false, não inteiro. Veja no exemplo abaixo como fazer a verificação correta:

//--- verificação
  MqlRates mql_rates[];
  if(CopyRates(Symbol(), PERIOD_CURRENT, 1, 10, mql_rates))
   {
    Print("mql_rates array:");
    ArrayPrint(mql_rates);
   }
  else
   {
    Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error ", GetLastError());
   }

5. Estou sem B3 em meu computador, mas testei o trecho do CopyRates em Forex (EURUSD) e não está indo para o else de erro... Desconfio desse símbolo que você está usando, né não ?

6. Faça um teste substituindo target_date por 1...

 
Joselino de Souza Clemente Junior:

Olá pessoal, agradeço imensamente se puderem me ajudar.

Tenho um indicador que roda no gráfico M1 do mini indice B3 e apenas preciso acessar os dados do indicador ADX mas com dados do gráfico diário.

Criaei o codigo abaixo apenas como exemplo para tentar acessar os dados de ADX do gráfico diário do dia 08/04/2024 mas o meu array sempre fica com 0 e cai no else de erro:


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[])

  {


for(int i=0;i<rates_total;i++)

   {


      string symbol = "WIN$N";

      datetime target_date = D'2024.04.08';

      int adx_handle = iADX(symbol, PERIOD_D1, 14);

      MqlRates rates_array[];

      

      int rates_copied = CopyRates(symbol, PERIOD_D1, target_date, 1, rates_array);

      

      // Verifica se os dados da barra foram copiados corretamente

      if(rates_copied > 0)

      {

          // Obtém o timestamp da barra diária desejada

          datetime daily_time = rates_array[0].time;

          // Cria um array para armazenar os valores do ADX

          double adx_values[];

          // Copia o valor do ADX para o array

          int copied = CopyBuffer(adx_handle, 0, daily_time, 1, adx_values);

          double daily_adx = adx_values[0];

      }

      else

      {

          Print("Erro ao acessar os dados diários: ", GetLastError());

      }


      //Restante do código do indicador abaixo:......

   }

   return(rates_total);

  }

Quando voce esta em um timeframe diferente do que voce quer os dados e esta a criar o handler no OnCalculate(), acontece que os dados vao pra uma fila para serem calculados como a fila de ticks. Entao, voce tem que sair da OnCalculate pra permitir a fila ser consumida do periodo desejado e dai sim passa a dar resultados. Sleep() pra tentar forcar a pausa e dar tempo pro indicador calcular se for o caso da fila que falei tambem nao tem efeito. Tem que sair da funcao.

 

Olá,

Você é programador?  foi realmente você quem criou esse código? Pois tem várias inconsistências de entendimento sobre como o MQL5 funciona com Higher Timeframes...

Ajude-nos a te ajudar...


;)

Razão: