Discussão do artigo "O uso de bibliotecas de classe de negócio padrão MQL5 ao escrever um Expert Advisor" - página 2

[Excluído]  
Trolls:

O que estou fazendo de errado? Por que o lance não está sendo impresso?

Aqui está o registro do trabalho


2011.01.31 20:20:18 00 (EURUSD,M1) EURUSD 0

Aqui está o código



Use \my_symbol.RefreshRates();\ em vez de \my_symbol.Refresh();\. Então, ele funciona!
 
-Alexey-:
Use \my_symbol.RefreshRates();\ em vez de \my_symbol.Refresh();\. Assim, ele funcionará!

Obrigado.

Essa provavelmente é uma pergunta para os desenvolvedores ou para a pessoa que escreve a Ajuda.

O artigo diz

mysymbol.Refresh()
Usado para atualizar todos os dados de um símbolo. Quando você especifica um novo nome de símbolo para uma classe, ele é chamado automaticamente.


mysymbol.RefreshRates()
Usado para atualizar as cotações. Quando um novo símbolo é definido, essa função é chamada automaticamente.

1. Acontece que nem todos os dados ?

2. Qual é a diferença entre especificar um novo símbolo e definir um novo símbolo?

3. Não entendo a palavra automaticamente. Parece que defini um símbolo com o comando my_symbol.Name(_Symbol), mas a atualização não aconteceu....

 
Trolls:

O artigo dizia

mysymbol.Refresh()
Usado para atualizar todos os dados de um símbolo. Quando um novo nome de símbolo é especificado para uma classe, ele é chamado automaticamente.

mysymbol.RefreshRates()
Usado para atualizar as cotações. Quando um novo símbolo é definido, essa função é chamada automaticamente.

1. Acontece que nem todos os dados ?

2. Qual é a diferença entre especificar um novo caractere e definir um novo caractere?

3. Não entendo a palavra automaticamente. Parece que defini o símbolo com o comando my_symbol.Name(_Symbol), mas a atualização não aconteceu....

Aquele raro momento em que você não precisa esperar por uma resposta do autor do artigo ou do autor do livro de referência :) Basta olhar o código-fonte para ver que a função RefreshRates() duplica completamente a função SymbolInfoTick(), que "retorna os preços atuais do símbolo especificado em uma variável do tipo MqlTick". Portanto, quando os autores dizem "sobre a atualização de cotações", eles estão realmente falando sobre a atualização dos valores de uma variável do tipo MqlTick.

2. Existe essa linha no código-fonte

void  Name(string name)  { m_name=name; Refresh();}
Isso indica que, ao chamar a função Name(), somente a função Refresh() é ativada automaticamente. Não encontrei nenhuma informação sobre a ativação automática da função RefreshRates() ao chamar a função Name(). Portanto, verifica-se que, "a partir de hoje", a alteração de um símbolo para a função Name() não ativa automaticamente a função RefreshRates(). Teremos de atualizar os valores da variável do tipo MqlTick ("atualizar cotações") de forma independente e forçada.
 
Trolls:

O que estou fazendo de errado? Por que o lance não é impresso? Aqui está o registro de trabalho 2011.01.31 20:20:18 00 (EURUSD,M1) EURUSD 0

Aqui está o código

void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }

Aqui está a resposta do motivo pelo qual o valor do Bid é impresso como zero. O código-fonte mostra que a função Bid() é descrita pela linha

double  Bid()  const { return(m_tick.bid);}

Assim, o valor da função Bid() está vinculado ao valor de um dos elementos de uma variável do tipo MqlTick. E essa variável é atualizada não automaticamente quando um símbolo é alterado, mas por uma chamada adicional da função RefreshRates(). Em seu código, a função Refresh() é chamada - na verdade, ela é chamada duas vezes (levando em conta o corpo da função Name()) - e a função RefreshRates() não é chamada uma vez.

[Excluído]  
Provavelmente, você pode aprimorar o código adicionando uma chamada para Refresh() na parte final deRefresh(). Então, todos os dados serão realmente atualizados.....
 
Interesting:
Talvez você possa aprimorar o código adicionando a chamada RefreshRates () na parte final deRefresh(). Então, todos os dados serão realmente atualizados.....
Adicionei a chamada RefreshRates() à função Name(). Mas ainda assim, esses são patches no nível de um usuário individual para suas necessidades.
[Excluído]  
Yedelkin:
Adicionei a chamada RefreshRates() à função Name(). Mas, ainda assim, esses são patches no nível de um usuário individual para suas necessidades.

Mas se os desenvolvedores colocarem Refresh() em outros lugares (a seu critério), será uma solução normal para a maioria dos usuários.

Se dissermos que Refresh atualiza todos os dados, então todos os dados devem ser realmente atualizados. IMHO


 
Interesting:

Mas se os desenvolvedores o colocarem em Refresh() e em outros lugares (a seu critério), será uma solução normal para a maioria dos usuários.

Se dissermos que Refresh atualiza todos os dados, então todos os dados devem ser realmente atualizados. IMHO

Não há como contestar isso. Mas, ainda assim, uma solução normal para os usuários seria uma descrição clara e compreensível dos designs disponíveis e de suas propriedades. Em seguida, o próprio usuário descobrirá como usar essas construções. E como essa solução é difícil de ser alcançada devido a vários motivos, aqueles que fazem perguntas adicionais a si mesmos e aos outros seguirão em frente :)
[Excluído]  
Yedelkin:
Não há nenhum argumento contra isso. Mas, ainda assim, a solução normal para os usuários seria uma descrição clara e compreensível dos designs disponíveis e de suas propriedades. Então, o próprio usuário descobrirá como usar essas construções. E como essa solução é difícil de ser alcançada devido a vários motivos, aqueles que fazem perguntas adicionais a si mesmos e aos outros seguirão em frente :)

Não sei, eu uso a biblioteca padrão apenas para fins de estudo. Escrevo todos os meus projetos em meus próprios componentes.

Esperarei até que os construtores se tornem mais convenientes e, então, abandonarei totalmente a biblioteca padrão....

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

A propósito, descobri que a classe CHistoryOrderInfo tem algumas linhas como esta

return(FormatType(str,Type()));
...
FormatType(type,Type())

Mas a função Type() não está presente na classe.