Discussão do artigo "Criação de indicadores personalizados usando a classe CCanvas" - página 2

 
fxsaber:

Essa é uma boa notícia! Qual é a ideia? Em vez de um histórico de ticks, uma série temporal personalizada?

Não. Desenhe um histograma da taxa de ticks ao lado do histórico de ticks.

Assim, brincando com os parâmetros, você pode determinar visualmente os períodos de atividade e, talvez, encontrar alguns padrões.

 
Dennis Kirichenko:

Bom tópico. Graças ao autor, farei um indicador de tique no canvas.....

Notei o seguinte.

Há um membro de dados privado m_canvas_name, mas o método que define seu valor - Name() - é público. Na minha opinião, o princípio do encapsulamento foi violado. Vou tornar esse método privado.

Talvez protegido? Porque todos os outros herdam o CCanvasBase. E então será impossível usar esse método neles. Embora eu não saiba, talvez você tenha alterado algo mais na estrutura geral.

 
Alexander Fedosov:

Talvez protegido? Porque todos os outros herdam o CCanvasBase. E então você não pode usar esse método neles. Embora eu não saiba, talvez você tenha alterado algo mais na estrutura geral.


Portanto, sim, protegido.

Então aqui:

bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador personalizado
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ind.Delete();
   ChartRedraw();
  }

Por que o indicador é tão complicado? Na minha opinião, é necessário limpar a tela em si. Eu adicionaria ChartRedraw() ao método DeleteCanvas().

 
fxsaber:

Quando tiver esboços, envie capturas de tela/vídeo. Eu mesmo publiquei um indicador desse tipo, mas ele não foi para as pessoas. Embora eu não tenha encontrado um melhor. É interessante ver outras soluções no kanvas.


Estou criando um para FORTS. Eu o criei no formato usual, mas no Tester ele funciona muito bem quando chamado pelo corpo do EA. Agora vou transferir todo o código para o EA...

 
Dennis Kirichenko:

Sim, é isso mesmo.

Então aqui:

Por que o indicador é tão complicado? Na minha opinião, é necessário limpar a própria tela. Eu adicionaria ChartRedraw() ao método DeleteCanvas().

Sim, dessa forma haverá menos linhas desnecessárias. Deixamos a tela limpa e enviamos o redesenho para lá.

 

Essa não é realmente a maneira de fazer isso:

//+------------------------------------------------------------------+
//|| Exclui um recurso gráfico|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }

Por que um operador ternário? - Quando você pode simplesmente fazer isso:

//+------------------------------------------------------------------+
//|| Exclui um recurso gráfico|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return ObjectDelete(0,m_canvas_name);
  }

Eu fiz dessa forma:

//+------------------------------------------------------------------+
//|| Exclui um recurso gráfico|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   if(ObjectFind(0,m_canvas_name)>-1)
      if(ObjectDelete(0,m_canvas_name))
        {
         ChartRedraw();
         return true;
        }
   return false;
  }


Mas o canvas tem seu próprio método de exclusão CCanvas::Destroy().

Por que precisamos adicionar outra coisa?

 

Tenho um problema com a escala vertical.

Quero criar um gráfico de ticks no RTS, em que o máximo no eixo Y seja 97784,0 e o mínimo seja 97756,0.

Faço isso no código:

//--- atualizar o gráfico
double min_y=NormalizeDouble(min_pr-0.2*diff,_Digits);
double max_y=NormalizeDouble(max_pr+0.2*diff,_Digits);
ticks_ind.YMin(min_y);
ticks_ind.YMax(max_y);
ticks_ind.SetArrayValue(prices);


Obtenho o seguinte:

https://www.mql5.com/ru/charts/7227612/rts-9-17-m1-ao-otkritie-broker

A mínima é mostrada corretamente, mas depois ocorre um zumbido.

Aparentemente, o método CLineGraph::VerticalScale() não está tão bem ajustado quanto eu penso, ou pior, quanto deveria estar.

График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
  • www.mql5.com
Символ: RTS-9.17. Период графика: M1. Брокер: АО ''Открытие Брокер''. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2017.06.19 15:22 UTC.
 
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
  • www.mql5.com
Стандартная библиотека / Научные графики / CGraphic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Anatoly, obrigado pela dica, vou usá-la. É uma pena que a ideia acabe se tornando um código pouco amigável...