Características da linguagem mql5, subtilezas e técnicas - página 182

 
Konstantin Nikitin:

Por exemplo, eu apago todos os objectos do meu VDS. Só não quero sobrecarregar o horário. E não há lá necessidade deles. Utilizo globais. Portanto, tudo depende da situação.

Olha, não gosto deles por uma razão:

  1. É uma questão de atomicidade das operações com eles. Os documentos são silenciosos, embora na realidade seja um objecto e as operações com eles não sejam atómicas, e a própria leitura/escrita em x86 é, se não estou em erro, duas instruções.
  2. A acessibilidade das variáveis fora do programa.
Se o ponto 1 é mais um resmungo sobre a qualidade da documentação, o ponto 2 é sério.
 
Vladimir Simakov:

Olha, há uma razão para não gostar deles:

  1. A questão da atomicidade das operações com eles. Os documentos são silenciosos, embora, de facto, seja um objecto, e as operações com eles não são atómicas, e a leitura/escrita dupla em x86 é, se não estou em erro, duas instruções.
  2. A acessibilidade das variáveis fora do programa.
Se o item 1 é mais um resmungar sobre a qualidade da documentação, o item 2 é sério.

Bem, não há necessidade de o ler. Pode usar GlobalVariableCheck para verificar se a variável está ou não lá. Pode fazer o mesmo com objectos.
Por isso, basta criar/verificar/apagar uma variável.

 

Vladimir Simakov:

2. Disponibilidade de variáveis fora do programa.

sem problemas, todas as funções que funcionam com variáveis globais têm um valor de retorno - o resultado da operação

existe uma ferramenta de sincronizaçãohttps://www.mql5.com/ru/docs/globals/globalvariablesetoncondition , não é muito, mas use o que lhe é oferecido

Mas o grande inconveniente é o tipo de dados - apenas duplo , não gosto do duplo , mesmo que apenas ulong pudesse ser usado, e a organização de nome / valor ---> string / duplo causa um desejo de trocar - escrever dados em string e chave em duplo - mais para uma operação pode ser escrito / lido

mas tendo estimado todas estas "coisas" Pode escrevê-los em ficheiros binários, ou seja, liberdade total e sem incertezas.

provavelmente é necessário saber como trabalhar com eles

@fxsaber mostrou exemplos de trabalho com qualquer tipohttps://www.mql5.com/ru/forum/320395/page6#comment_12910394

 
Konstantin Nikitin:

Bem, não há necessidade de ler. Pode simplesmente usar GlobalVariableCheck para verificar se a variável existe ou não. Faz-se o mesmo com objectos.
Por isso, basta criar/verificar/apagar uma variável.

Sim, um conflito trivial de nomes e a corda no outro robô

GlobalVariableDel(yourValueName);

perderá o seu depósito))))

Dizer que o nome será único, que o outro robô nunca estará lá, que a criança/esposa/amigo/bêbado nunca chegará perto do terminal de batalha))) Concordo, mas a probabilidade não é zero, o que significa que o código se torna pouco fiável.

 
Vladimir Simakov:

É um conflito de nomes trivial e a linha do outro robô

irá drenar-vos do vosso depósito))))

Dirá que o nome será único, que o outro robô nunca estará lá, que a criança/esposa/amigo/bêbado nunca se aproximará do terminal de batalha)))) Concordo, mas a probabilidade não é zero, o que significa que o código se torna pouco fiável.

Tretas e fantasia

Uma EA em dinheiro funciona SEMPRE a partir de um terminal separado, no seu próprio VDS (ou mesmo servidor) e nunca ninguém se mete com ele.

 
Maxim Kuznetsov:

Tretas e fantasia

Uma EA sobre o dinheiro funciona SEMPRE a partir de um terminal separado, no seu próprio VDS (ou mesmo servidor) e nunca ninguém se mete com ele.

O que quer dizer SEMPRE? Hoje - sempre, amanhã pode calcular de forma diferente. E nem todos parecem estar de acordo consigo.

Salientei o perigo real da utilização de variáveis globais do terminal. Isto não é bom nem mau - é um dado que os criadores nos deram, só precisamos de estar cientes disso e de o ter em conta.

O mesmo fio

GlobalVariablesDeleteAll();

feito em qualquer argumento e oops...

 

O mesmo se passa com os objectos gráficos.

ObjectsDeleteAll(...


Apenas os recursos da EA não podem ser alterados por outros programas.

 

Colegas, por favor ajudem-me a fazer uma macro, se de todo possível.

Preciso de declarar dinamicamente uma matriz bidimensional. E a segunda dimensão também deve ser alterada. Isto é algo parecido com este laço:

for(int would_be_size2=0;would_be_size2<5;would_be_size2++)
    {
     double d_array[][would_be_size2];
     int size2=ArrayRange(d_array,1);
    }

É claro que o compilador não vai conseguir fazer isso:

'[' - invalid index value       t7.mq5  20      22

Eu gostaria de ver uma macro como:

#define  CREATE_MARRAY(type,arr_name,size2) (type arr_name[][##size2])

Em vez de uma linha:

double d_array[][would_be_size2];

Obrigado.

 
Denis Kirichenko:

Colegas, por favor ajudem-me a fazer uma macro, se de todo possível.

Preciso de declarar dinamicamente uma matriz bidimensional. E a segunda dimensão também deve ser alterada. Isto é algo parecido com este laço:

É claro que o compilador não vai conseguir fazer isso:

Gostaria de ver uma macro como a seguinte:

Em vez de uma linha:

Obrigado.

Mas a criação de uma matriz de tamanho (máximo) suficiente fora do laço é dificultada pela política ? :-)

A abordagem acima (recriar sempre a matriz no laço) não ganha nada em termos de velocidade ou consumo de memória.

 
Denis Kirichenko:

Gostaria de ver uma macro semelhante a esta:

Não vai funcionar.

Razão: