Erros, bugs, perguntas - página 2995

 
   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

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

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Qualquer pessoa pode responder porque é que este código só funciona correctamente em minutos?

Isto é um indicador.


P. S.

Em prazos que não os minutos, produz valores errados.

 
Francuz:


Qualquer pessoa pode responder porque é que este código só funciona correctamente em minutos?

Isto é um indicador.

P. S.

Em prazos que não sejam minutos, produz valores errados.

Porque só fez uma única iteração logo na primeira visita da OnCalculate, quando pré_calculado = 0. Nessa altura, as barras podem ainda não ter sido formadas. E todas as TFs são formadas a partir de 1M TFs.
Inserir no cheque:

if(prev_calculated>0 && handle != INVALID_HANDLE)

E tudo irá funcionar.

 

Existem dois separadores EA abertos em ME, ambos têm alterações não guardadas, premimos o botão de compilação num deles e vemos que ME guarda as alterações em ambos os EAs. Porquê? Quem lhe pediu que o fizesse?

Se ME guardasse as alterações nos ficheiros ligados antes de compilar, seria um comportamento lógico, mas assim.... Claro que, porque é muito mais fácil, porquê ordenar que ficheiros pertencem a quem? É muito mais fácil guardar todos os ficheiros abertos e ser feito com ele....

 
Andrey Dik:
Em ME os separadores de dois EAs estão abertos, ambos têm alterações não guardadas, premir o botão de compilação de um deles e ver que ME guarda as alterações em ambos os EAs. Porquê? Quem lhe pediu que o fizesse?
De que outra forma o poderia fazer?
Esta é a única maneira.
Em todas as IDEs, é este o caso.
 
Nikolai Semko:
De que outra forma?
Esta é a única maneira.
Todas as IDEs são assim.

É certo em todas as IDEs?

Acabei de experimentar o VS, sim, o comportamento é o mesmo. Mas, deve o comportamento retardado de um produto, mesmo o mais famoso, ser considerado como uma referência? Vamos copiar todos os bugs e mal-entendidos do VS, porquê?

))

 
Andrey Dik:

é preciso em todas elas?

Acabei de experimentar o VS, sim, o comportamento é o mesmo. mas, o comportamento retardado de um produto, mesmo o mais conhecido, deve ser considerado a referência? vamos então copiar todos os bugs e mal-entendidos do VS, porquê.

))

Utilizei pelo menos 9 IDEs diferentes no último ano. É assim em todo o lado.
Bem, pense logicamente, quantos problemas podem existir se um ficheiro tem vários masters que não vêem as mudanças um do outro. Se um compilado com um código, e outro com outro código, já tem de criar dois ficheiros ex5 com o mesmo nome, etc.
 

Porque não fazer o Navigator como uma mesa à maneira da janela do Market Watch? OMarket Watch implementou a triagem, kudos! - Há muito tempo que o pedimos.

Chega agora a era do nosso novo sonho de mega legal usabilidade de exibir o conteúdo do Navigator e ordenação por colunas: Título, Autor, Data de Compilação, Data da Última Execução, Disponibilidade da Fonte, Tipo de Programa (e desactivando a ordenação e a volta à vista actual)

 
Nikolai Semko:
Utilizei pelo menos 9 IDEs diferentes no último ano. Em todo o lado é assim.
Pense bem, logicamente, quantos problemas podem existir se um ficheiro tem vários hospedeiros que não vêem as mudanças um do outro. Se um compilado com um código e o outro com outro código, já precisa de criar dois ficheiros ex5 com o mesmo nome, etc.

Se dois EAs diferentes forem abertos, qual pode ser a ligação entre eles? Apenas os inlúdios que fazem parte das corujas devem ser salvos, e não importa a quem mais pertencem esses inlúdios.

Por exemplo, se abrir algum ficheiro *txt que não esteja guardado, não tem nada a ver com o ficheiro compilado e/ou projecto, então porquê guardá-lo?

 
Nikolai Semko:

porque só se executa uma única iteração logo na primeira entrada OnCalculate, quando pré_calculado = 0. Nesta altura, as barras podem ainda não ter sido formadas. E todas as TFs são formadas a partir de 1M TFs.
Inserir no cheque:

e tudo irá funcionar.

Falhou o ponto. O código deve funcionar apenas uma vez. O seu objectivo é mostrar que o chamado indicador não funciona. O problema é que em quaisquer variantes do indicador chamado não funcionará se este (e o chamador) tiver um TimeFrame diferente do minuto. Descobri que é um bugdo MetaTrader que só pode ser resolvido com muletas. E este problema é bastante antigo. Pode ler os detalhes em "I can't get indicator data from the older TF 123".

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Francuz:

Não estás a perceber. O código só deve funcionar uma vez. O seu objectivo é mostrar claramente que o chamado indicador não funciona. O problema é que o indicador chamado não funcionará se ele (e o autor da chamada) tiver um TimeFrame diferente do minuto. Descobri que é um bugdo MetaTrader que só pode ser resolvido com muletas. E este problema é bastante antigo. Pode ler os detalhes em "I can't obtain indicator data from the major TF 123".

Isso já foi há muito tempo. O problema já foi resolvido há muito tempo. É necessário pelo menos uma vez de dois em dois minutos para aceder aos dados de um período/símbolo não nativo. No laço principal, se ainda não houver dados do prazo solicitado, é necessário sair do laço - basta devolver zero para esperar pelo próximo tick, e o indicador sabia que os dados históricos ainda não tinham sido calculados.