Erros, bugs, perguntas - página 1499

 
Alexey Kozitsyn:
O caminho para a programação do inferno está pavimentado comvariáveisglobais" (Steve McConnell)
Apenas um exemplo da ausência deste aviso é mostrado. Criar uma variável como uma variável global ou local é uma questão de gosto e experiência de programador.
 
Ilyas:
Será acrescentado um aviso sobre a não utilização real de variáveis locais e globais (tipo simples ou "complexo" sem construtores), mas a prioridade desta tarefa é baixa.
Compreendido, obrigado. Por via das dúvidas, tentarei chamar a atenção dos programadores aqui.
 
Alexey Kozitsyn:
Uma activação por PC. Não importa quantos terminais existam.
Há alguma confirmação em algum lugar?
 
Vladimir Pastushak:
Há alguma confirmação em algum lugar?

O Comprador adquire o direito de activar o Produto tantas vezes quantas as especificadas pelo Vendedor no momento da compra ou aluguer do Produto. Por exemplo, se forem permitidas 20 activações para o Produto no momento da compra, o Comprador poderá instalá-lo em 20 configurações de hardware diferentes, mesmo que o Vendedor reduza posteriormente este número.

https://www.mql5.com/ru/market/rules

Правила покупки торговых роботов, индикаторов, книг и журналов в MetaTrader Market
Правила покупки торговых роботов, индикаторов, книг и журналов в MetaTrader Market
  • www.mql5.com
Общие положения и правила пользования сервисом Market
 
Este posto reduz automaticamente a resolução da imagem em até 6 vezes o tamanho (bytes) do original. Porquê?
 
Alexey Kozitsyn:
Slawa, boa tarde, pode comentar sobre a biblioteca (pergunta acima)?

É assim que se resolve o problema.

long CChart::Open(const string symbol_name,const ENUM_TIMEFRAMES timeframe)
  {
   m_chart_id=ChartOpen(symbol_name,timeframe);
   if(m_chart_id==0)
      m_chart_id=-1;
   return(m_chart_id);
  }
 
Slawa:

Esta é a forma de o corrigir

Sim, obrigado, isso é óptimo. Para a biblioteca. E o erro 4024?
 
Slawa:

É assim que se resolve o problema.

Qual é o objectivo de fazer isto? A biblioteca padrão deve ser utilizada não como o utilizador quiser, mas em estrita conformidade com a ideologia da sua estrutura.Alexey Kozitsyn utiliza-o incorrectamente e é por isso que recebe muitos bugs na produção. Basta anexar o gráfico ao objecto de classe utilizando o método Attach depois de ter criado o objecto CCart. Este método está sobrecarregado e pode anexar ambos, o gráfico actual e o necessário. A sua mudança para o método aberto matará a capacidade de trabalhar com o gráfico actual.

E o pedido aos criadores da biblioteca padrão - por favor faça uma descrição da estrutura da biblioteca. Muitos não o entendem e começam a cometer erros, e você alinha com eles, começa a quebrar tudo o que foi feito.

 
Alexey Kozitsyn:

Pergunta sobre a biblioteca padrão MT4.

Ficheiro Chart.mqh

Quero abrir a carta. Utilizo o método Open(const string symbol_name,const ENUM_TIMEFRAMES timeframe).

1. Se utilizar um símbolo indisponível, a função ChartOpen() devolverá o erro #4024 - erro interno. Sem dúvida, o erro pode ser interno, mas existe um código de erro muito mais exacto - #4106 - um símbolo desconhecido. Talvez devêssemos alterar o código de erro devolvido? Uma vez que o 4024 não diz nada ao programador sobre onde procurar o erro.

2. Em caso de falha, ChartOpen() atribui o valor 0 ao campo m_chart_id, ou seja, acontece que começamos a trabalhar com o gráfico actual, mas isto não é correcto, porque não conseguimos abrir o gráfico que precisamos para o trabalho. Consequentemente, se não chamarmos o método Detach(), o gráfico actual irá simplesmente fechar após o trabalho. Também penso que esta não é a abordagem correcta. A função ChartOpen() retornaria melhor -1 em caso de um erro.

Antes de trabalhar com um gráfico, ele precisa de ser anexado a um objecto de classe utilizando o método Attach!!! Se não quiser trabalhar com o gráfico actual ( 0 ), então implemente esta verificação e proíba a utilização do gráfico actual no seu trabalho.

E o que significa trabalhar com o gráfico e não fechá-lo usando o método Detach para sair? É realmente difícil escrever uma linha no destruidor das suas aulas ou no OnDeinit? O trabalho com objectos deve ser rigorosamente controlado, assim poderá evitar erros.

 
coderex:

Qual é o objectivo de fazer isto? A biblioteca padrão deve ser utilizada não como o utilizador deseja, mas em estrita conformidade com a ideologia da sua estrutura.Alexey Kozitsyn não o utiliza correctamente e é por isso que ele recebe muitos bugs na saída. Basta anexar o gráfico ao objecto de classe utilizando o método Attach depois de ter criado o objecto CCart. Este método está sobrecarregado e pode anexar ambos, o gráfico actual e o necessário. A sua mudança para o método aberto matará a capacidade de trabalhar com o gráfico actual.

E o pedido aos criadores da biblioteca padrão - por favor faça uma descrição da estrutura da biblioteca. Muitas pessoas não o compreendem e começam a cometer erros, e você está a seguir a sua pista e a começar a quebrar tudo o que fez.

Escrevi claramente acima qual é o objectivo de o fazer. Se houver um erro ao abrir o gráfico (por exemplo, se definir um símbolo inválido), então, por alguma razão, por analogia com o método Attach(void), o método Open() irá ligar o identificador do gráfico actual ao objecto. Porque deveria fazer isso? Se eu quiser trabalhar com o gráfico actual, chamarei o método Attach(void) { m_chart_id=ChartID(); } e é tudo. Mas aqui tenho uma situação obviamente errada onde, por alguma razão, começo a trabalhar com a coisa errada. Em geral, é um problema com a própria função ChartOpen(), mas como não a vão alterar, pelo menos deixem-na ser alterada na biblioteca.

Outro argumento. Por favor, pense logicamente. O método chama-se Open(). Isso implica que algo novo será aberto! E vamos começar a trabalhar com este novo artigo. Mas aqui parece que estamos a trabalhar com o antigo. Não vejo qualquer lógica. E parece utilizar esta inexactidão para os seus próprios fins.

Este método está sobrecarregado e pode ligar tanto o gráfico actual como o necessário. E a sua mudança para o método Aberto matará a capacidade de trabalhar com o gráfico actual.

O que irá matar? Continuará a ter o método Attach(), continuará a fazer o que estava a fazer. Como já disse, verifique o ID de retorno da função Open() e se for inferior a 0, chame o método Attach(void). E é tudo. Só não compreendo porque é que precisa de fazer tal confusão, se pode simplesmente chamar o método Attach(void) e anexar o gráfico actual.

Talvez eu não o compreenda. Depois dê-me um exemplo.

Pede-se também aos criadores da biblioteca padrão que façam uma descrição da estrutura da biblioteca. Muitas pessoas não o compreendem e começam a cometer erros, e você alinha com eles e começa a quebrar tudo o que fez.

Que afirmação tão barulhenta... Não pense que é mais esperto do que os outros, pode não o ser.