Erros, bugs, perguntas - página 3028

 
fxsaber:
Uma união com um único campo é uma coisa estranha.

Isto é o mesmo que estruturar - apenas o erro é mais óbvio. Está mesmo escrito na documentação sobre o mesmo:"Caso contrário, a união comporta-se como estrutura".

A Unionchar também é estranha, e também por clareza, mas pode ser reescrita:

union X3 { //(3) Error: 'X2' - struct is too large
        char x31[INT_MAX/2+1];
        int  x32[INT_MAX/8+1];
};
Por isso, também não parece estranho para ninguém.
 
Andrey Dik:

pensar de novo.

Precisa de pensar, Andrei. É no seu código que as baratas estão lá.

Bem, hoje estou tão inclinado... Vou tentar empurrar na direcção certa:

Um novo bar foi aberto... iBars() aumentou em um...... Mas o número de bares contados não mudou. E não vai mudar até recalcular este novo bar.

O que se segue?

 
Igor Makanu:

isto não deve funcionar correctamente nos indicadores:

se não me engano, na ajuda há uma quebra do script para paginação de dados para todas as TFs e deve haver um aviso de que os dados históricos não podem ser solicitados ao indicador desta forma, porque o indicador funciona de forma assíncrona

e recomenda-se usar BarsCalculated() uma vez depois de atar a pega


UPD: guião para paginação da história e explicação porque não funciona em indicadores:https://www.mql5.com/ru/docs/series/timeseries_access

tem a certeza de compreender o significado do código?

 
Alexey Viktorov:

Precisa de pensar, Andrei. É no seu código que existem baratas.

Bem, hoje estou tão inclinado... Vou tentar empurrar na direcção certa:

Um novo bar aberto... iBars() aumentou em um...... Mas o número de barras contadas não se alterou. E não vai mudar até recalcular este novo bar.

O que se segue?

meu bom homem, por favor não me escreva, você não está no laço.

Ou prová-lo com código.

 
Andrey Dik:

tem a certeza de compreender o significado do código?

Com uma elevada probabilidade - segura e compreendida

Pretende que o indicador sincronize o "TF superior" antes de chamar outro indicador

o meu indicador funciona, certo? - pode adicionar-lhe BarsCalculated() - mas como nos exemplos de indicadores da entrega, por exemplo MACD.mql5


HH: há muitos indicadores multitimeframe em QB. Se preciso de me lembrar o que fazer e como fazê-lo, normalmente procuro indicadores por Mladen Rakic e olho através do seu, o estilo de codificação é peculiar (mais correctamente a formatação), mas eles são 100% funcionais

https://www.mql5.com/ru/users/mladen

 
Andrey Dik:

Querida. por favor não me escreva, não estás no laço.

Ou prová-lo com um código.

Bem, então...

Os criadores não respondem a tais disparates, Igor vai-se aborrecer em breve... E fica e fala sozinho...

Basta pedir ao Baterista que mova as suas efusões para um fio à parte... para evitar a desordem...

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

Andrey Dik, 2021.05.28 05:16

Estou a tentar verificar a sincronização dos dados no prazo solicitado (M5) e a prontidão do indicador no mesmo, se não estiver pronto, vou sair.

Como resultado, o indicador funciona apenas uma vez na barra M1 aberta, e não a cada tick:


//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

//проверка на наличие нового бара
if (rates_total == prev_calculated) return rates_total;

Espero que os criadores ouçam os meus pedidos.

Não compreendo bem o seu código. O que deve acontecer depois de "devolver 0;" na próxima chamada para a OnCalculate?
 
Alexey Viktorov:

O Igor também se vai aborrecer em breve...

Tenho apenas um desejo de compreender

em MT5 há muitas armadilhas com sincronização, agora a questão é também sobre isso

imho, se o indicador utilizar construções em cada barra (linhas, não setas)

este ciclo é suficiente para um cálculo económico:

for(int i = prev_calculated; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }

se houver a primeira chamada, então o pré-cálculo será = 0, nas chamadas subsequentes as novas barras serão recalculadas


e se ambos os indicadores forem escritos correctamente, não é necessário sincronizar nada adicionalmente, tudo funcionará, a única coisa que resta é comparar CopyBuffer() com o número necessário de valores do indicador chamado

 
Igor Makanu:

Eu só quero descobrir.

em MT5 há muitas armadilhas com a sincronização, agora a questão é também sobre isso

imho, se o indicador utilizar uma construção em cada barra (linhas, não setas)

este ciclo é suficiente para um cálculo económico:

se houver a primeira chamada, então o pré-cálculo será = 0, nas chamadas subsequentes as novas barras serão recalculadas


e se ambos os indicadores forem escritos correctamente, não é necessário sincronizar nada adicionalmente, tudo funcionará, a única coisa que resta é comparar CopyBuffer() com o número necessário de valores do indicador chamado

É a isso que me refiro. Seria bom tentar sincronizar antes da primeira corrida, mas desta forma............

 
Igor Makanu:

Eu só quero descobrir.

em MT5 há muitas armadilhas com a sincronização, agora a questão é também sobre isso

imho, se o indicador utilizar uma construção em cada barra (linhas, não setas)

este ciclo é suficiente para um cálculo económico:

se houver a primeira chamada, então o pré-cálculo será = 0, nas chamadas subsequentes as novas barras serão recalculadas


e se ambos os indicadores forem escritos correctamente, não é necessário sincronizar nada adicionalmente, tudo funcionará, a única coisa que resta é comparar CopyBuffer() com o número necessário de valores do indicador chamado

se quiser compreender e não se opor, deve escrever algo como o código abaixo:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double         IBuffer[];

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   return(INIT_SUCCEEDED);
}

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 (rates_total == prev_calculated) return rates_total;
   
   ulong t = GetMicrosecondCount ();
   
   ArraySetAsSeries (high,        true);

   int limit = rates_total - prev_calculated - 1;

   for (int i = limit; i >= 0; i--)
   {
      IBuffer [i] = high [i];
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, рассчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- plot I
#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input ENUM_TIMEFRAMES  OldTF = PERIOD_M5;

double IBuffer[];
int    Handle = 0;

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   Handle = iCustom (Symbol (), OldTF, "OldTF.ex5");
   if (Handle == INVALID_HANDLE)
   {
      Print ("Не удалось получить хендл индикатора OldTF.ex5");
      return INIT_FAILED;
   }

   return INIT_SUCCEEDED;
}

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 (rates_total == prev_calculated) return rates_total;

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

   ulong t = GetMicrosecondCount ();

   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);
}

compilar ambos os códigos e executar o segundo. obter algo como isto nos registos ao executar em M1 e M3 do indicador sénior:

2021.05.28 19:05:01.408 OldTF (EURUSD,M3) 0.000234 seg, 50000 barras calculadas, 50000 barras total

2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0.007452 seg, 50023 bar calculado, 50023 bar total

2021.05.28 19:06:00.670 OldTF (EURUSD,M3) 0.000001 seg, calculado 1 barra, total de barras 50001

2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180 sec, 50024 bar calculado, 50024 bar total

2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004 seg, calculado 1 barra, total de barras 50025

2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014 seg, liquidado 1 barra, total de barras 50026

2021.05.28 19:09:00.959 OldTF (EURUSD,M3) 0.00000014 seg, calculado 1 barras, total de barras 50002

2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0.006898 seg, 50027 barras calculadas, total 50027 barras

2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004 seg, calculado 1 barra, total de barras 50028

mesmo a olho nu pode ver, em primeiro lugar, a forma mais rápida possível de construir indicadores rápidos e, em segundo lugar, que o pré-calc é zerado

Neste exemplo, o indicador é forçado a ser completamente recalculado em cada nova barra M3.

Alexey Viktorov:

Bem, não tem de o fazer.

Os criadores não respondem a tais disparates, o Igor em breve também se aborrecerá... E fica e fala sozinho...

Basta pedir à drubashka que mova as suas efusões para um fio separado, para não desarrumar o fio certo...

Veja o código acima, coma o seu passaporte, polvilhe cinzas na cabeça e enfie a sua arrogância onde ninguém a possa ver.