Limpeza de matriz forçada em MT5? - página 4

 
Eu não sabia que em 4 a inicialização por zeros é feita durante o redimensionamento. Isto não é uma conveniência, mas algum tipo de bobagem, levando a uma menor velocidade dos programas. Isto é, se eu precisar inicializar a matriz com valor -1, então a dupla inicialização acontece.
E então se pergunta por que o MT4 é mais lento.
 
Vasiliy Sokolov:

... A MQL5, ao contrário da MQL4, não tenta entender o que um usuário quer e isto é correto.

Sugiro colocá-lo em um pôster. :) (só brincadeira)

Vasily, entendo que existem algumas nuances que justificam tal abordagem do MT5 para a conveniência do programador. E eu não me importo. Que assim seja.

 
Реter Konow:

1. A lógica nos diz que o procedimento de limpeza das matrizes é realizado pelo compilador uma vez em tempo de compilação.

Sim, você tem um problema de lógica :)

 
Nikolai Semko:
Eu não sabia que no 4ka a inicialização por zeros ocorre durante o redimensionamento. Isto não é conveniência, mas algum tipo de bobagem, levando a uma menor velocidade dos programas. Isto é, se eu precisar inicializar a matriz com valor -1, a dupla inicialização acontece.
E então eles se perguntam por que o MT4 é mais lento.

Em princípio, poderíamos acrescentar alguma bandeira ao declarar uma matriz, o que daria ao compilador a permissão para limpar a matriz. Seria conveniente ou rápido - sua escolha.

 
Реter Konow:

Em princípio, poderíamos acrescentar algum tipo de bandeira ao declarar um array que dissesse ao compilador para limpar o array. Seria conveniente ou rápido - sua escolha.

Que diferença isso faz? A inicialização é feita após o redimensionamento, é tudo a bandeira.
Especialmente quando se declara uma matriz dinâmica, o tamanho não é conhecido.
 
Nikolai Semko:
Qual é a diferença? Você faz a inicialização após o redimensionamento, essa é a bandeira inteira.
Especialmente quando se declara uma matriz dinâmica, o tamanho não é conhecido.

Sim, após cada declaração de matriz global e após cada redimensionamento de matriz. Mas e se você tiver 20-30 matrizes globais, algumas das quais mudam de tamanho sob certas circunstâncias? Você precisa escrever a inicialização em loops em todos os lugares? (as arrays podem ser bidimensionais). Não é uma fonte potencial de erros?

 
Реter Konow:

Sim, após cada declaração de matriz global e após cada redimensionamento de matriz. Mas e se você tiver 20 a 30 matrizes globais, algumas das quais mudam de tamanho sob certas circunstâncias? Você precisa escrever a inicialização em loops em todos os lugares? (as arrays podem ser bidimensionais). Não é este um potencial terreno fértil para erros?

Esta operação cirúrgica é feita de forma bastante simples. Substitua a palavra"ArrayResize" por algo mais - será o nome de sua função para redimensionamento. Verifique nele, se o redimensionamento for maior, então passe pelos novos elementos do laço e atribua zero a eles.

Também, no inite, inicializar todas as matrizes que tenham tamanho (se houver).

Também podem existir matrizes de um determinado tamanho em funções - essas também. Procure-os usando colchetes.

 
Dmitry Fedoseev:

Esta operação cirúrgica é feita de forma bastante simples. Substitua a palavra "ArrayResize" por algo mais - este será o nome de sua função de redimensionamento. Nele, se o redimensionamento for para cima, então passe pelos novos elementos do laço e lhes atribua zero.

Também, no inite, inicializar todas as matrizes que tenham tamanho (se houver).

Também podem existir matrizes de um determinado tamanho em funções - essas também. Procure-os por parênteses rectos.

A propósito, sim.
Pyotr, Dmitry está dizendo uma coisa sensata.
Uma definição devidamente escrita evitará que você reescreva o código inteiro.
 
Nikolai Semko:
A propósito, sim.
Peter, Dimitri está dizendo uma coisa sensata.
Uma definição devidamente escrita evitará que você reescreva o código inteiro.

Vou tentar. É um hack interessante.

 

Vou apoiar o iniciador do tema, embora haja muitas perguntas para sua criação ))))

Os desenvolvedores da MQL5, na busca da velocidade dos cálculos (ou alguns outros belos números?) removeram todos os "pequenos extras" que tornaram a MQL4 mais amigável,

Se houver uma regra geral na MQL5, os indicadores que são usados na MQL4 se tornarão uma "cartilha" na MQL5, e esta "cartilha" precisa ser lida no contexto do terminal comercial:

1. ao chamar o OnInit(), os buffers indicadores não são inicializados automaticamente

2. eu olhei uma centena de indicadores na kodobase, infelizmente, sob o pretexto de programação em MQL5 eles escrevem indicadores no estilo de MQL4 - eles expandem a numeração de arrays e timeseries

3. iOs mais altos / mais baixos não estão funcionando corretamente - eles procuram barras com os valores mais altos / mais baixos no sentido de aumentar a numeração das séries temporais... Isto é, se usarmos o esquema padrão de indicadores na MQL4 - cálculo a partir dos dados anteriores até o presente, este problema não é resolvido com iHighest e iLowest, pois a barra mais à esquerda é 0, e quando iLowest é chamado, estamos procurando por valores no futuro....

4. o mesmo problema com o ArrayMaximum() - é difícil de usar em indicadores... é difícil não aumentar a numeração de séries temporais, nós pegamos e constantemente subtraímos do número inicial de barras e obtemos ArrayMaximum(alto[i], i -Periodo,Ponto)

5. infelizmente, mesmo os especialistas da MQL5 usam construções questionáveis.... Digamos que uma certa base de muletas salvas na transição do MT4 ainda está sendo transportada.


Qual é o objetivo? - A MQL não finge ser pura С++, por que eles removeram implementações mais simples para os usuários... Eu venho revisando o Python há cerca de um mês, por que tantos trabalhos nele... Só agora eu entendo que Python permite que as pessoas ignorem as pequenas coisas e tem uma interface mais amigável ;) - para um programador experiente tudo parece errado, mas as pessoas o usam e Python é bastante popular