Erros, bugs, perguntas - página 2723

 
Aleksey Mavrin:

Pode dizer-me o que está errado e como acelerar a actualização do gráfico? A função ChartRedraw é chamada pelo Conselheiro Especialista, mas ainda há um atraso de alguns minutos.

ChartRedraw é necessário apenas para desenho (actualização) de objectos gráficos, não precisamos de ChartRedraw para um indicador normal que desenha por amortecedores de indicador

acho que se deve procurar o problema no indicador, talvez o cálculo dos amortecedores em cada carrapato não esteja correcto, há "autores" que calculam toda a história em cada carrapato

ZZY: Não posso confirmar, mas talvez o ChartRedraw actualize todo o gráfico com o histórico sincronizado, se assim for, reinicia-se de facto o indicador com um cálculo completo de todo o histórico de cada vez

UPD: tentar limitar o histórico no gráfico a um número menor de barras 10 000 é suficiente, em MT4 houve um caso em que um indicador pesado "devorou" toda a memória e depois procurou porque é que a EA não funcionava correctamente (funcionava então não funcionava). Embora em MT5 seja improvável que toda a memória tenha sido usada.... mas isso acontece

 
Igor Makanu:

ChartRedraw é necessário apenas para desenho (actualização) de objectos gráficos, não é necessário ChartRedraw para um indicador normal que desenha por buffers indicadores

acho que se deve procurar o problema no indicador, talvez o cálculo dos amortecedores em cada carrapato não esteja correcto, há "autores" que calculam toda a história em cada carrapato

ZZY: Não posso confirmar, mas talvez o ChartRedraw actualize todo o gráfico com o histórico sincronizado, se assim for, reinicia-se de facto o indicador com um cálculo completo de todo o histórico de cada vez

UPD: tentar limitar o histórico no gráfico a um número menor de barras 10 000 é suficiente, em MT4 houve um caso em que um indicador pesado "devorou" toda a memória e depois procurou porque é que a EA não funcionava correctamente (funcionava então não funcionava). Embora em MT5 seja improvável que toda a memória tenha sido utilizada.... mas pode acontecer.

Tentei optimizar o cálculo e testei a versão anterior do indicador. Já calculei cada 1000 barras antes e agora estou à espera que se abra uma nova barra.

Se esta é a razão, ainda assim devo ficar muito surpreendido. 1k de barras de cálculos não muito fortes atrasa o desenho do gráfico durante 2 minutos?

 
Aleksey Mavrin:

Se essa é a razão, ainda vale a pena uma grande surpresa. 1 barra de cálculos não muito fortes atrasa o desenho do gráfico durante 2 minutos?

não pode ser, na minha opinião, o terminal descarregará tal indicador com uma mensagem que diz " cálculo demasiado longo no indicador xxx".

o tempo de execução do MT (4/5) é muito rápido, claro que pode calcular os mesmos dados várias vezes, mas imho, tem de o tentar arduamente

Penso que o autor do indicador não está familiarizado com o cálculo económico dos amortecedores de indicador, e esquece-se de calcular correctamente as últimas barras... vá a QB para estudar como os indicadores são escritos ;)

 
Slava :

Será que estes dois programas estão no mesmo terminal ou em dois terminais diferentes?

O código para reproduzir o problema é afixado aqui. https://www.mql5.com/en/forum/332849

É necessário correr o código pelo menos 2 vezes para o reproduzir.

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...
 
Alexey Navoykov:

Não é de todo necessário. Porquê C? E que tal C#? - Está mais próximo do C# em termos de significado.

Provavelmente porque µl c++ é semelhante, e as estruturas vieram de c.

Toda a conversa sobre estruturas passivas é toda noções arcaicas, imho.

Se precisar de construtores, use classes ou vá para Sharp. Porque devemos privar as estruturas desta conotação? Isto só irá tornar os programas mais expressivos. Posso pegar no código de alguém e ver que ele/ela tem uma estrutura em vez de uma classe e obter muita informação a partir de apenas uma palavra. Não obterá nada, estudará diligentemente o código fonte para obter o mesmo resultado, o que obtive num piscar de olhos. Na minha experiência - esta convenção de estruturas é respeitada, bem talvez algum tipo de marginalismo niilista e ventoso.

Acredito que, no mínimo, todos os tipos devem ter um construtor. Os campos não inicializados são maus e devem ser evitados.

Não há aí nenhum mal, parece-vos. Vaughn até arrastado para o padrão: leitura de char não assinado e std::byte não é um comportamento não desprevenido. Pode utilizar a inicialização agregada para a POD. E não se esqueça - toda esta inicialização não é gratuita, é um verdadeiro consumo de recursos (CPU, memória, tamanho de um executável). Se não quer saber disso com o seu crocante de números, no caso de algum microcontrolador pode ser importante. Afinal de contas, C/C++ não é apenas um embaralhamento do Windows como Sharp.

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5 d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5 d                      pop    %rbp
    1129:       c3                      retq
A inicialização de uma única variável aumentou o tamanho da instrução em 30%.
 
Stanislav Korotky:

Num terminal. O perito escreve os dados, o indicador lê os dados. Pendurado em gráficos diferentes, mas obviamente poderia estar no mesmo (se isso importar). Construir 2380.

O Consultor Especialista que lê o ficheiro deve manter este ficheiro fechado.

A peculiaridade da implementação de ficheiros na MQL5 é que eles mantêm os dados dos ficheiros nos seus próprios buffers ao máximo. Se a quantidade de informação é tão grande que não cabe no buffer, então o seu truque de mover o ponteiro para o início e depois para o fim do ficheiro pode funcionar.

Portanto, neste ponto, abra o ficheiro, verifique o conteúdo e depois feche-o novamente

 
Slava :

Um consultor especializado que lê um ficheiro deve manter este ficheiro fechado.

A peculiaridade da implementação de ficheiros na MQL5 é que guardam os dados dos ficheiros nos seus próprios buffers tanto quanto possível. Se a quantidade de informação é tão grande que não cabe no buffer, então o seu truque de mover o ponteiro para o início e depois para o fim do ficheiro pode funcionar.

Assim, neste momento, abra o ficheiro, verifique o seu conteúdo e depois feche-o novamente

Então FileFlush () é inútil?
 
Alain Verleyen:
Então FileFlush () é inútil?

Não. FileFlush deve ser feito se quiser que outra pessoa possa ler o ficheiro modificado

O problema é que o programa MQL5 lê o ficheiro no seu próprio buffer quando o abre. Não saberá nada sobre alterações no ficheiro até voltar a ler o ficheiro. O ficheiro só pode ser lido de novo fechando e depois abrindo o ficheiro

 
Slava:
Não. FileFlush deve ser feito se quiser que outra pessoa possa ler o ficheiro modificado

Mesmo que se feche o ficheiro?

 
Andrey Barinov:

Mesmo que se feche o ficheiro?

É exactamente disso que estou a falar. Fechar, depois reabrir

Ou quer dizer FileFlush antes de fechar o ficheiro?

Razão: