Erros, bugs, perguntas - página 3031

 
Igor Makanu:

o meu código irá "martelar em cada tique" apenas o seu indicador #1, onde escreveu :

permitirá ao terminal construir independentemente o "horizonte temporal mais elevado".

Para mim - é "mais barato" do que fazer um recálculo completo do indicador 1, que acontece no seu código ao sincronizar o histórico na "TF superior".

Sim, mas porque é que a pré-falha é reiniciada no TF inferior?

 
Andrey Dik:

sim, mas porque é que o giz prev previne a reinicialização no TF inferior?

porque devolver 0;
 
Andrey Dik:

sim, mas porque é que a geleia é reiniciada no TF baixo?

há muitas variantes, não conhecemos a implementação


houve uma discussão semelhante sobre o MT4 no ano passado, disse um dos criadores (penso que Slava), que cada acesso à "TF mais antiga" inicia a sincronização de dados, se for necessário....

Penso que em MT5 o terminal também constrói TF por si só, se necessário, mas se houve atrasos na rede ou ..... a implementação é desconhecida... então o terminal, antes de dar os dados ao indicador num TF sénior, sincroniza os dados históricos com o servidor, quando acontece instantaneamente, e quando, talvez, demora muito tempo, é quando provavelmente será pré_calculado = 0

 
Igor Makanu:

há muitas opções, não conhecemos a implementação

Se o download alterar os dados históricos do TF baixo, o contador do TF baixo será forçado a zero pelo terminal, por isso não invente problemas a partir do nada

 
Andrey Dik:

estás a provar o meu ponto de vista, camarada.

Eu não sou...camarada do programador. Não é uma confirmação, é uma dica, não retorne 0. É todo o seu problema. Você mesmo está a causar um recálculo completo do indicador.

 


pré_calculado não aumenta; será sempre o mesmo que no final do cálculo

return(rates_total);


i.e., o que recebemos à saída de OnCalculated() será devolvido no próximo tick em prev_calculated (excepto prev_calculated == 0, o terminal faz isto ao lançar o indicador ou ao sincronizar TF......)


Andrei Trukhanovich:

se o descarregamento alterar os dados do histórico da TF baixa, o contador da TF baixa será forçosamente zerado pelo terminal, não crie problemas a partir do nada

Tenho estado a escrever-lhe pelo segundo dia - pegue nos indicadores de Mladen e estude-os - eles funcionam, e sem qualquer sincronização complicada entre as TFs, e aqui ... estamos a poupar recursos e não deixamos que o terminal forme as chamadas TF

 
Andrei Trukhanovich:

substituir

para

e testá-lo.

Não o faça... Ele não vai acreditar de qualquer maneira.

 
Alexey Viktorov:

Eu ... não sou amigo do codificador. Isto não é uma confirmação, mas uma dica, não retorne 0. É isso que causa todos os seus problemas. Você mesmo está a causar um recálculo completo do indicador.

Pode ser um idiota para dar uma dica, mas nem todos podem ajudá-lo a compreender e a explicar.

 
Andrei Trukhanovich:

substituir

para

e testá-lo.

Obrigado, Andrei. É a única pessoa que penetrou completamente na questão.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) O indicador para o período 3 ainda não foi calculado

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) O indicador do período 3 ainda não foi calculado

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 seg, 50046 barras calculadas, total 50046 barras

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 seg, 50000 barras calculadas, 50000 barras totais

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Indicador sobre o período 3 ainda não calculado

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 seg, 1 barra calculada, 50047 barras total

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 seg, calculado 1 barras, total de barras 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 seg, calculado 1 barras, total de barras 50002

agora tudo está a funcionar como planeado, os indicadores só foram totalmente calculados uma vez na primeira corrida e mais uma vez apenas uma vez por cada nova barra.


O código final do segundo indicador, espero que seja útil a alguém:

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[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

Qualquer tolo pode dar-lhe uma dica, mas nem todos podem ajudá-lo a compreender e ajudá-lo em pormenor.

Conta quantos tolos te aconselham... Só um tipo esperto não consegue ouvir ninguém e teimosamente...............

Criou o seu próprio problema e está a tentar apresentar o seu ...código como um bug mql.

Razão: