Discussão do artigo "O poder do ZigZag (parte I). Desenvolvimento da classe base do indicador" - página 8

 
 

A terceira e a quarta ainda não compilam.

 

'GetZigZagData' - nenhuma das sobrecargas pode ser aplicada à chamada de função TestZZZ_03.mq5 77 15

"Get ZigZag Data" - nenhuma das sobrecargas pode ser aplicada à chamada de função test z_03.mq5 77 15

---------------------

pode ser uma de 2 função(ões) TestZZZ_03.mq5 77 15

pode ser uma de 2 funções TestZZ_03.at MQL5 77 15

---------------------

void CZigZagModule::GetZigZagData(const int,int,int,const string,const ENUM_TIMEFRAMES,const datetime,const datetime) ZigZagModule.mqh 52 22

void CZigZagModule::GetZigZagData(const double&[],const double&[],const datetime&[]) ZigZagModule.mqh 51 22

______________

Ou seja, o compilador jura que uma mesma função é iniciada com parâmetros diferentes.

 
Sergey Voytsekhovsky:

A terceira e a quarta ainda não compilam.

Verifique os parâmetros transmitidos. O número ou os tipos deles estão incorretos. Isso ocorre quando se chama GetZigZagData.

 
ZY: Por que você programa em C se não tem certeza de que pode abordar uma função com parâmetros diferentes?
 

Obrigado pelo feedback. Ainda não sei como verificar os parâmetros, pois estou aprendendo a programar. Pelo que consegui entender - no código, o Expert Advisor chama o método GetZigZagData().

A primeira vez com os parâmetros GetZigZagData(h_zz,l_zz,t_zz),

a segunda vez com parâmetros diferentes GetZigZagData(zz_handle_current,_Symbol,_Period,start_time_in,stop_time_in).

O arquivo de inclusão tem as duas opções

void CZigZagModule::GetZigZagData(const double &zz_h[],const double &zz_l[],const datetime &time[])
  {
   int h_total =::ArraySize(zz_h);
   int l_total =::ArraySize(zz_l);
   int total   =h_total+l_total;
//--- Zeragem de variáveis ZZ
   ZeroZigZagData();
//--- Vamos percorrer os valores ZZ copiados
   for(int i=0; i<total; i++)
     {
      //--- Se já tivermos obtido o número necessário de máximos e mínimos de ZZ, saia do loop
      if(m_counter_highs==m_copy_extremums && m_counter_lows==m_copy_extremums)
         break;
      //--- Controle de superação de matriz
      if(i>=h_total || i>=l_total)
         break;
      //--- Preencher o array de máximos até que tenhamos copiado o número necessário de máximos
      if(zz_h[i]>0 && m_counter_highs<m_copy_extremums)
        {
         m_zz_high[m_counter_highs]      =zz_h[i];
         m_zz_high_bar[m_counter_highs]  =i;
         m_zz_high_time[m_counter_highs] =time[i];
         //--- Aumentar o contador de máximos
         m_counter_highs++;
        }
      //--- Preencha a matriz de mínimos até que o número necessário seja copiado
      if(zz_l[i]>0 && m_counter_lows<m_copy_extremums)
        {
         m_zz_low[m_counter_lows]      =zz_l[i];
         m_zz_low_bar[m_counter_lows]  =i;
         m_zz_low_time[m_counter_lows] =time[i];
         //--- Aumentar a contagem mínima.
         m_counter_lows++;
        }
     }
//--- Determinar a direção do movimento do preço
   m_direction=(m_zz_high_time[0]>m_zz_low_time[0])? 1 : -1;
  }
//+------------------------------------------------------------------+
//|| Obtém dados ZZ do identificador passado
//+------------------------------------------------------------------+
void CZigZagModule::GetZigZagData(const int handle,int buffer_num_highs,int buffer_num_lows,
                                  const string symbol,const ENUM_TIMEFRAMES period,
                                  const datetime start_time,const datetime stop_time)
  {
//--- Vamos obter os dados iniciais
   int times_total =::CopyTime(symbol,period,start_time,stop_time,m_zz_time_temp);
   int highs_total =::CopyBuffer(handle,buffer_num_highs,start_time,stop_time,m_zz_highs_temp);
   int lows_total  =::CopyBuffer(handle,buffer_num_lows,start_time,stop_time,m_zz_lows_temp);
//--- Número máximo de extremos
   int max_items =(int)::fmax((double)highs_total,(double)lows_total);
//--- Se isso não for suficiente, vamos tentar novamente.
   if(times_total<max_items)
     {
      while(true)
        {
         ::Sleep(100);
         times_total=::CopyTime(symbol,period,start_time,stop_time,m_zz_time_temp);
         if(times_total>=max_items)
            break;
        }
     }
//--- Contadores
   int lows_counter  =0;
   int highs_counter =0;
//--- Calcular os máximos
   int h_total=::ArraySize(m_zz_highs_temp);
   for(int i=0; i<h_total; i++)
     {
      if(m_zz_highs_temp[i]>0)
         highs_counter++;
     }
//--- Calcular os mínimos
   int l_total=::ArraySize(m_zz_lows_temp);
   for(int i=0; i<l_total; i++)
     {
      if(m_zz_lows_temp[i]>0)
         lows_counter++;
     }
//--- Obter o número de extremos
   int copy_extremums=(int)::fmin((double)highs_counter,(double)lows_counter);
   CopyExtremums(copy_extremums);
//--- Vamos percorrer os valores ZZ copiados
   GetZigZagData(m_zz_highs_temp,m_zz_lows_temp,m_zz_time_temp);
  }

escritas uma após a outra.

Carreguei arquivos antigos, depois novos, excluí o MT5 em geral, instalei um novo a partir do zero, nada ajuda, o erro da tela acima persiste.

 
Алексей Тарабанов:
ZY: Por que você programa em C se não tem certeza de que pode endereçar uma função com parâmetros diferentes?

Não estou entendendo muito bem. Tenho muitas opções sobre o que programar? Tenho o MT5, que está em MQL5, e estou tentando aprender.

Acho que uma função pode ser acessada com parâmetros diferentes, até li que isso se chama sobrecarga. Mas não entendo como lidar com isso. Além disso, tenho certeza de que o erro não é do autor, é muito provável que eu esteja cometendo um erro, a única questão é onde exatamente ????.

 
   CopyExtremums(copy_extremums);
//--- Vamos percorrer os valores ZZ copiados
   GetZigZagData(m_zz_highs_temp,m_zz_lows_temp,m_zz_time_temp);
Acho que está aqui.
 
Alguém pode explicar para uma pessoa o que é sobrecarga? Eu não programo em C.
 

Alterei os nomes dessas funções no arquivo de inclusão e acrescentei os números 1 e 2 a elas, respectivamente.

Encontrei todas as referências a elas no Expert Advisor e as editei. O erro antigo desapareceu, mas apareceu um novo. De fato - algum problema com os tipos de dados. O tradutor escreveu o seguinte:

'stop_time_in' - unable to convert enumeration TestZZ_03.mq5 77 78