Discussão do artigo "Conselhos de um programador profissional (Parte II): armazenamento e troca de parâmetros entre um EA, scripts e programas externos" - página 2

 
O artigo está mal desenvolvido.
Exemplos de parâmetros
  • Tempo de barra zero
....
Onde armazenar esses parâmetros?
Por que armazenar a hora da barra zero em um dos locais sugeridos?

Da tabela: o tempo de vida de um arquivo é limitado pelo tempo de vida do arquivo. O que há para não gostar de "o tempo de vida de uma variável global é limitado pelo tempo de vida de uma variável global" :)))?

Para empacotar dados arbitrários em variáveis globais, é melhor usar a união.

Nada é dito sobre arquivos binários....
 
Recentemente, o nível dos artigos vem caindo no sentido da complexidade das ideias e abordagens, mas não de todas elas, é claro.
 

...

Como você sabe, o manipulador OnInit de um Expert Advisor é acionado não apenas quando ele é iniciado, mas também quando o período de tempo é alterado. De fato, cada vez que o período de tempo é alterado, as variáveis são redefinidas e inicializadas novamente, exceto os parâmetros do Expert Advisor.

...

Incorreto. Isso é o que acontece no indicador. Quando os parâmetros são alterados e o símbolo/timeframe do gráfico é alterado, o Expert Advisor não é reinicializado.

Agora, com relação à transferência de informações entre os Expert Advisors/indicadores/serviços etc., o que acontece é que os parâmetros são alterados.

  1. Variável de terminal global - aha, o robô negocia com dinheiro real e seu trabalho é baseado nos dados aos quais todos têm acesso: indicadores, scripts, outros especialistas, filhos do usuário, o próprio usuário com mãos maliciosas....
  2. Um objeto gráfico em um gráfico é o mesmo.
  3. Comentários sobre ordens - o DC pode alterá-los (ops).
  4. Arquivo (binário é melhor) - provavelmente o melhor de todos os listados no artigo, mas os desenvolvedores nunca responderam (ou eu perdi) a pergunta sobre a sincronização do compartilhamento de arquivos. E isso é uma muleta.

Isso deixa apenas o EventChartCustom(...), com todas as suas desvantagens.

Portanto, marque a caixa de seleção para permitir a importação de dll e comece a fazer a coisa certa, ou, melhor ainda, de jeito nenhum.

 
Aliaksandr Hryshyn:
1) O artigo está mal desenvolvido.
Exemplos de parâmetros
  • Tempo de barra zero
2) Por que armazenar o tempo de barra zero em um dos locais sugeridos?

3) Da tabela: o tempo de vida de um arquivo é limitado pelo tempo de vida do arquivo. O que há de errado com "o tempo de vida de uma variável global é limitado pelo tempo de vida de uma variável global" :)))?

4) Para empacotar dados arbitrários em variáveis globais, é melhor usar a união.

5) Nada é dito sobre arquivos binários....

1) Fui elogiado pelo moderador.

2) para não executar a análise de barra repetidamente

3) o tempo de vida do arquivo é maior do que o da variável global

4) Mostrei uma das formas de empacotamento

5) Eu não os utilizo

 
Vladimir Simakov:

...

a) Incorreto. Isso é o que acontece no indicador. Quando os parâmetros são alterados e o símbolo/timeframe do gráfico é alterado, o Expert Advisor não é reinicializado.

Agora, quanto à transferência de informações entre Expert Advisors/indicadores/serviços etc., não há como fazer isso.

  1. Variável de terminal global - aha, o robô negocia com dinheiro real e seu trabalho é baseado nos dados aos quais todos têm acesso: indicadores, scripts, outros especialistas, filhos do usuário, o próprio usuário com mãos maliciosas....
  2. Um objeto gráfico em um gráfico é o mesmo.
  3. Comentários para ordens - o DC pode alterá-los (ops).
  4. Arquivo (binário é melhor) - provavelmente o melhor de todos os listados no artigo, mas os desenvolvedores nunca responderam (ou eu perdi) a pergunta sobre a sincronização do compartilhamento de arquivos. Ah, e é uma muleta.

b) Portanto, marque a caixa para permitir a importação de dll e comece a fazer isso corretamente ou, melhor ainda, não faça nada.

a) Concordo que a reinicialização das variáveis do Expert Advisor não é feita

1-2) estamos falando de troca entre o EA e os scripts. Se quiser, você pode criptografar as informações ;-)

3) o DC pode adicionar algo ao final no MT4. Não existe tal coisa no MT5, pelo menos para mim ;-)

4) Bem, eu geralmente uso o sinalizador FILE_SHARE_READ

int file = FileOpen(path, FILE_SHARE_READ|FILE_UNICODE);

b) Se você faz isso para si mesmo, então, como se diz, "flag in your hands....".

Se você fizer isso para o mercado, as DLLs não passam por lá.

 
Malik Arykov:

(a) Concorda que não há reinicialização das variáveis do EA

1-2) estamos falando sobre a troca entre o Expert Advisor e os scripts. Você pode criptografar as informações ;-)

3) para adicionar algo ao final no MT4. Não existe tal coisa no MT5, pelo menos para mim.

4) Bem, eu geralmente uso o sinalizador FILE_SHARE_READ

b) se você fizer isso para si mesmo, então, como dizem, "sinalize em suas mãos....".

Se estiver fazendo isso para o mercado, as DLLs não passam por lá.

1-2) Portanto, criptografe ou não criptografe, mas você ainda pode alterá-lo/excluí-lo)))))

3) Se não estiver explicitamente declarado que você não pode, então... Pessoalmente, não tenho certeza de que poderei fazer isso.

4) Não estou falando disso, estou falando da situação de "corridas" de dados ao compartilhar um recurso de diferentes threads. Execute os dois scripts anexados em gráficos diferentes. Execute a gravação primeiro. Essa é a resposta à minha pergunta de longa data sobre metaquotes. E, novamente, no contexto do resultado do teste, ao qual finalmente cheguei (graças ao TC) e à pergunta feita a eles: onde estão as primitivas de sincronização nativas?

Essa também é a resposta para o fato de que, de certa forma, é ruim para um profissional fazer uma coisa dessas no mercado sem avisar os clientes por meio de cartas enormes.

Arquivos anexados:
write.mq5  2 kb
read.mq5  2 kb
 
Vladimir Simakov:

....

Todos os exemplos de meus artigos funcionam bem para mim (em meu EA e em meus scripts)

 
Malik Arykov:

Todos os exemplos de meus artigos estão funcionando bem para mim (em meu EA e em meus scripts)

Minha postagem não é sobre o que não funciona, mas sobre o fato de que a segurança e a integridade dos dados não são garantidas. Ao usar todos os métodos de transferência de dados acima, a confiabilidade do mecanismo não é garantida. Além disso, ela não está relacionada a possíveis bugs de sistemas de terceiros (Terminal, SO, bugs de hardware), mas ao próprio método: colisão de nomes ou ações do usuário no caso de variáveis globais do terminal, as mesmas funções + exclusão para objetos gráficos, falta de sincronização para operações de leitura e gravação em um arquivo de diferentes threads.

Sim, a probabilidade disso pode ser reduzida a valores muito baixos, mas não a 0. É isso que você deve ter em mente)

 
Vladimir Simakov:

Minha postagem não é sobre o que não funciona, é sobre não garantir a segurança e a integridade dos dados. Ao usar todos os métodos de transferência de dados acima, a confiabilidade do mecanismo não é garantida. Além disso, isso não está relacionado a possíveis erros de sistemas de terceiros (terminal, sistema operacional, erros de hardware), mas ao próprio método: colisão de nomes ou ações do usuário no caso de variáveis globais do terminal, as mesmas funções + exclusão de objetos gráficos, falta de sincronização para operações de leitura e gravação em um arquivo de diferentes threads.

Sim, a probabilidade disso pode ser reduzida a valores muito baixos, mas não a 0. É isso que você deve ter em mente)

O armazenamento de parâmetros em arquivos oferece 100% de confiabilidade. Todas as suas "colisões" são resolvidas por prefixos de nomes de objetos, inclusive variáveis globais.

Por exemplo, os parâmetros de nível são armazenados em Files\Cayman\Params\128968168864101576\exp_05_Lev607A160E_H4.txt. Onde 128968168864101576 é o ChartID. Ninguém sabe sobre esse arquivo, exceto o analisador desse nível específico. Pegue qualquer trecho de código do artigo e tente "quebrá-lo" ;-) Se você conseguir, eu lhe mostrarei onde cometeu um erro ;-)

 
void OnStart()
  {
   while(!IsStopped())
      for(int i=GlobalVariablesTotal();i>=0;--i)
         GlobalVariableSet(GlobalVariableName(i),MathRand());
  }

Com um script como esse em qualquer EA/indicador/script/serviço executado por um usuário curioso, você terá semanas divertidas de busca por um bug irreproduzível que não existe)))))