Discussão do artigo "Escrevendo um livro de ofertas de scalping com base na biblioteca gráfica CGraphic" - página 3

 
Konstantin Seredkin:

As palavras que escrevi em minha pergunta não significam nada?

Seu exemplo

Esse código foi publicado pelo autor do tópico na descrição da classe https://www.mql5.com/pt/articles/3336.

Portanto, essa pergunta não deve ser dirigida a mim, pelo menos...

Essas palavras não significam nada para mim, exceto uma coisa: você não estudou o código do exemplo.

você dá um exemplo de exclusão por meio de

m_book_market.SetMarketBookSymbol(Symbol())

Se abrirmos esse método, veremos que há uma assinatura do ticker passado.

bool CMarketDepth::SetMarketBookSymbol(string symbol) {
   m_sell_deals = 0;
   m_buy_deals  = 0;
   ArrayResize(market_book, 0);
   m_available = false;
   m_best_ask_index = -1;
   m_best_bid_index = -1;
   m_depth_total = 0;

   bool _selelect = SymbolSelect(symbol, true);
   if(_selelect)
      m_symbol = symbol;
   else {
      if(!SymbolSelect(m_symbol, true) && SymbolSelect(Symbol(),true))
         m_symbol = Symbol();
   }

   if(_selelect)
      if(!MarketBookAdd(m_symbol))
         printf("%s - %d: [ %s ] não é possível abrir o vidro!!!", __FUNCTION__, __LINE__, m_symbol);

   this.Refresh();
//---
   return _selelect;
}

mas não a exclusão da assinatura )) a exclusão da assinatura é feita por meio de uma função:

MarketBookRelease

Обеспечивает закрытие стакана цен по указанному инструменту, а также отменяет подписку на получение извещений об изменении указанного стакана.

bool  MarketBookRelease(
   string  symbol      // nome do caractere
   );

Параметры

symbol

[in]  Имя символа.

Возвращаемое значение

Значение true в случае успешного закрытия, иначе false.

Примечание

Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции OnInit() была вызвана соответствующая функция MarketBookAdd(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается соответствующая функция MarketBookAdd().
 
TheXpert:

Deve ser um copypasta. Isso acontece. O autor provavelmente escreveu esse código parcialmente no navegador.

Em vez de

CMarketBook MarketBook.mqh

escrever

CMarketBook MarketBook;

foi uma pergunta capciosa para seu homônimo )) ele não gosta de ler código, mas espera por uma resposta pronta ))

 
Konstantin:

era uma pergunta capciosa para meu homônimo )) ele não gosta de ler código, mas espera por uma resposta pronta ))

É exatamente isso que sempre faço e, inicialmente, fiz a remoção do vidro como deveria ser, como no seu exemplo, o que é realmente necessário ao trabalhar com o vidro a partir da ajuda.

Mas quando uso esse método,

if(!MarketBookRelease(Symbol()))
   {
   if(Debug){Print("Error MarketBookRelease ",m_symbol.Name());}}

recebo este erro


P|S descobri qual é o problema, pois acontece que se esse método for usado no construtor da classe, não é necessário usá-lo no OnDeinit.


Retiro minha pergunta, você pode me dar um doce.

 
Konstantin Seredkin:

Se você não usar um destrutor em uma classe

Essa construção funciona normalmente

Mas talvez eu simplesmente não saiba como usar o destrutor, ou talvez ele tenha sido implementado de forma incorreta e, portanto, não funcione como deveria.

Se você tiver muitos objetos em seu código e houver atrasos em sua exclusão, pode não haver tempo suficiente alocado para o processamento do OnDeinit, o que significa que alguns objetos não serão excluídos.

Nesse caso, você pode procurar um problema no código, o que é mais correto, pois é óbvio que há um problema e ele dará um tiro no pé um dia, ou simplesmente excluí-los no OnDeinit e esquecer o assunto.

ps.

Konstantin Seredkin:

Isso é o que eu sempre faço.

Obviamente, você não analisou o exemplo ou digitou um código errado desde o início, por exemplo, desmonte-o e eu vou rir))

Com esse objeto CMarketBook MarketBook.mqh, o compilador compilaria o código? Bem, você criou um objeto MarketBook.mqh, o compilador não percebeu esse sacrilégio, mas você está trabalhando com um objeto MarketBook, você teria um erro no estágio OnInit, porque você não tinha esse objeto.Prestei atenção imediatamente porque o exemplo obviamente não está funcionando, então fiz uma pergunta, mas você obedientemente culpou o desenvolvedor da classe e seu exemplo....

Forneça um exemplo de código funcional em que esse erro seja reproduzido ou explique tudo de uma vez, sem códigos desnecessários, como fez agora, e você também economizará seu tempo.

Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Определение трендов, построение каналов, выявление циклов и уровней поддержки/сопротивления — все эти и многие другие задачи решаются при помощи аналитических объектов. Всего в торговой платформе доступно 46 таких инструментов. Среди них имеются геометрические фигуры, различные каналы, инструменты Ганна, Фибоначчи, Эллиотта и многое другое. В...
 
Konstantin:

Se você tiver muitos objetos em seu código e houver atrasos na exclusão deles, pode não haver tempo suficiente alocado para o processamento do OnDeinit, o que significa que alguns objetos não serão excluídos.

Nesse caso, você pode procurar um problema no código, o que é mais correto, pois é óbvio que há um problema e ele dará um tiro no pé um dia, ou simplesmente excluí-los no OnDeinit e esquecer o assunto.

ps.

Obviamente, você não analisou o exemplo ou inseriu um código incorreto desde o início, portanto, descubra por si mesmo e eu darei risada ))

Com um objeto como o CMarketBook MarketBook.mqh, o compilador compilaria o código? Bem, você criou um objeto MarketBook.mqh, o compilador não percebeu esse sacrilégio, mas você está trabalhando com o objeto MarketBook, você teria um erro no estágio OnInit, porque você não criou esse objeto.Prestei atenção imediatamente porque o exemplo obviamente não está funcionando, então fiz uma pergunta, mas você obedientemente jogou tudo no desenvolvedor da classe....

Você deve fornecer um exemplo de código funcional em que esse erro seja reproduzido ou explicar tudo de uma vez, sem códigos desnecessários, como fez agora, e economizará seu tempo também.

Você está apenas em seu repertório, não me importa o que o autor fez no exemplo, quais erros de impressão ele cometeu, você precisa ser um completo idiota para não perceber que é apenas um erro de impressão.

A pergunta era completamente diferente.

Em seu exemplo, há inicialização - chamada do vidro, depois há sua atualização por meio do método Refresh(), mas não há sua exclusão por meio do método

MarketBookRelease

//+------------------------------------------------------------------+
//|MarketBook.mq5
//| Copyright 2017, MetaQuotes Software Corp.
//|http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
#include "GlobalMarketBook.mqh"
#include "MBookBtn.mqh"
#include "EventNewTick.mqh"

CMBookBtn MButton;
CEventNewTick EventNewTick;
double fake_buffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
   MarketBook.SetMarketBookSymbol(Symbol());
//--- mapeamento de buffers de indicadores
   SetIndexBuffer(0,fake_buffer,INDICATOR_CALCULATIONS);
// Caso o usuário tenha alterado o gráfico no qual o painel está sendo executado,
// você precisa ocultar e reabrir o painel. 
   MButton.Hide();
   MButton.Show();
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Evento de alteração do MarketBook|
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol!=MarketBook.GetMarketBookSymbol())
      return;
   MarketBook.Refresh();
   MButton.Refresh();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Eventos do gráfico|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // identificador de evento 
                  const long& lparam,   // parâmetro de evento de tipo longo
                  const double& dparam, // parâmetro de evento do tipo double
                  const string& sparam  // parâmetro de evento do tipo string
                  )
  {
   MButton.Event(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Deinit|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MButton.Hide();
   if(!MarketBookRelease(Symbol()))
   {
   Print("Error MarketBookRelease ",Symbol());}
  }
//+------------------------------------------------------------------+

OnDeinit ou implementação do mesmo, mas no destrutor da classe.

É por isso que fiz uma pergunta ao autor, como é mais correto, em sua opinião, matar o copo usando sua classe, porque esse trabalho está faltando no exemplo principal e na própria classe e seria bom implementá-lo antes, não estou dizendo que há algo ruim, etc., apenas que esse ponto está faltando, me parece.

A pergunta foi feita ao autor e normalmente formulada, por que fazer e discutir minhas perguntas e demagogia por várias páginas sobre o que li, o que quero obter de alguém, etc. Eu mesmo sou capaz de entender tudo em meu código, o que é realmente feito... A pergunta era bem diferente.

Acima, no código, acrescentei em amarelo o que, em minha opinião, deveria estar presente no indicador anexado.

 
Konstantin Seredkin:

Você está apenas em seu repertório, não me importa o que o autor fez no exemplo, quais erros de impressão ele cometeu, você tem que ser um completo idiota para não perceber que é apenas um erro de digitação.

A pergunta era completamente diferente.

Em seu exemplo, há inicialização - chamada do vidro, depois há sua atualização por meio do método Refresh(), mas não há sua exclusão por meio do método

OnDeinit ou implementação do mesmo, mas no destrutor da classe.

É por isso que fiz uma pergunta ao autor: na opinião dele, é mais correto eliminar o vidro usando a classe dele, pois esse trabalho está faltando no exemplo principal e na própria classe, e seria bom implementá-lo antes; não estou dizendo que há algo ruim, etc., mas me parece que esse ponto está faltando.

A pergunta foi feita ao autor e formulada normalmente, por que perguntar e discutir minhas perguntas e fazer demagogia por várias páginas sobre o que li, o que quero obter de alguém, etc. Eu mesmo sou capaz de entender tudo em meu código, que é exatamente o que fiz.... a pergunta era completamente diferente

Acima, no código, adicionei em amarelo o que, em minha opinião, deveria estar presente no indicador anexado.

não há telepatas aqui, o exemplo que você deu na pergunta original não reproduz o problema sobre o qual você está escrevendo, além disso, todos os mecanismos estão presentes na classe, a solução é dada a você, mas não vejo nada além de reprovações, a disputa está encerrada.

 
Konstantin:

Não há telepatas aqui, o exemplo que você deu em sua pergunta original não reproduz o problema sobre o qual você está escrevendo, além disso, todos os mecanismos estão presentes na aula, a solução é dada a você, mas não vejo nada além de reprovações, a disputa está encerrada.

- Em primeiro lugar, não havia problema algum em minha pergunta.

- Em segundo lugar, eu não repreendi ninguém por nada, apenas fiz uma pergunta simples ao autor para esclarecer minhas suposições... e de você, em todas as mensagens, algumas acusações ridículas e perguntas sobre o código, em minha direção, que eu não escrevi, mas tirei da descrição do artigo da classe como um exemplo.

A ajuda diz:

Destructor é uma função especial que é chamada automaticamente quando um objeto de uma classe é destruído. O nome do destrutor é escrito como o nome da classe com um til (~). Strings, matrizes dinâmicas e objetos que exigem desinicialização serão desinicializados de qualquer forma, independentemente da presença de um destrutor. Se um destrutor estiver presente, essas ações serão executadas depois que o destrutor for chamado.

Não há nenhum destrutor na classe que fecharia o vidro de preço pelo método

MarketBookRelease

Também no próprio indicador, em

void OnDeinit(const int reason)

também não está presente. Fizeram-me uma pergunta simples: Como fazer corretamente a desinicialização do vidro.

Eu esperava uma resposta para essa pergunta,

- não invente nada, a própria classe fechará tudo, mesmo que não haja um destrutor declarado nela.

- Adicione

void OnDeinit(const int reason)
  {
   if(!MarketBookRelease(Symbol()))
   {Print("Error MarketBookRelease ",Symbol());}
  }

Ou adicione um destrutor à própria classe.

public:
    ~CMarketBook(void);
//--
//--

CMarketBook::~CMarketBook(void)
{
   if(!MarketBookRelease(m_symbol)){
   printf(__FUNCTION__ + "Error MarketBookRelease ",m_symbol);} 
}

E você ficará feliz... e você começou uma demagogia me acusando de alguns erros de impressão no código de outra pessoa, que ele não compilará, o que eu sei sem você, que não consigo ler algo lá.... em russo, você me registrou como um veado.

 
Perfect ! Great Perfect ! Great job!
 
MetaQuotes Software Corp.:

Foi publicado o novo artigo Implementing a Scalping Market Depth Using the CGraphic Library:

Autor: Vasiliy Sokolov

Obrigado, essa é uma ótima ferramenta, muito fácil de modificar.

 
O código inteiro, quando copio e colo para compilar, da erro na hora de compilar. Alguém sabe de alguma solução?