Objetos e desenhos do gráfico
Os objetos do gráfico (desenhos) permitem desenhar linhas ou formas geométricas nos gráficos do cTrader. Ao utilizá-los, pode desenhar padrões ou mostrar determinados eventos nos gráficos com base nos dados do seu cBot ou indicador.
Os objetos do gráfico utilizam coordenadas X e Y para o posicionamento.
- O eixo X representa o tempo do gráfico ou os índices das barras.
- O eixo Y é o preço do símbolo.
Todos os objetos do gráfico são derivados da classe base ChartObject, o que significa que todos eles herdam determinadas características base.
Amostras de código de objetos do gráfico
Desenhar dentro das janelas do indicador
Ao criar objetos do gráfico, não está limitado ao gráfico do símbolo principal. Na verdade, pode desenhar objetos do gráfico dentro de quaisquer janelas que contenham resultados do indicador.
A classe Chart tem a coleção IndicatorAreas. Contém todas as janelas não sobrepostas ou separadas nas quais os indicadores podem exibir os seus resultados.
Também pode aceder à sua área de indicador atual utilizando a propriedade IndicatorArea da sua classe Indicator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Quando executa uma instância do indicador acima, deverá ver uma linha vermelha numa janela de indicador separada. Ao criar gráficos em áreas de indicador separadas, pode utilizar todos os métodos de desenho, uma vez que tanto Chart como IndicatorArea herdam da classe base ChartArea.
Texto estático
Em vez de utilizar coordenadas X e Y para o posicionamento, o texto estático utiliza alinhamentos horizontais e verticais estáticos. Para mostrar ou desenhar um texto estático, utilize o método DrawStaticText().
1 | |
Se anexar este objeto do gráfico a um indicador e executar uma instância, verá o seguinte texto no gráfico principal.

Linha vertical
Utilize o método DrawVerticalLine() para desenhar uma linha vertical.
1 2 3 | |
Linha horizontal
Utilize o método DrawHorizontalLine() para desenhar uma linha horizontal.
1 2 3 | |
Linha de tendência
Uma linha de tendência começa num determinado ponto do gráfico e termina noutro ponto. As linhas de tendência são úteis para criar diferentes formas ou padrões complexos.
Para desenhar uma linha de tendência, utilize o método DrawTrendLine().
1 2 3 4 5 6 7 | |
Retângulo
Utilize o método DrawRectangle() para desenhar um retângulo.
1 2 3 4 5 6 7 | |
Triângulo
Utilize o método DrawTriangle() para desenhar um triângulo.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Outros objetos do gráfico
Por uma questão de brevidade, não mencionámos vários outros objetos do gráfico nos fragmentos de código acima. Estes objetos incluem, entre outros, os seguintes:
- Elipse
- Ícone
- Garfo de Andrews
- Canal equidistante
- Expansão de Fibonacci
- Leque de Fibonacci
- Retração de Fibonacci
Todos estes objetos podem ser desenhados utilizando métodos Draw...() com nomes semelhantes que aceitam parâmetros semelhantes.
Risco/recompensa
A interface ChartRiskReward fornece tipos que permitem criar e gerir objetos de risco/recompensa programaticamente nos gráficos.
O código abaixo mostra como criar um indicador que desenha um objeto de risco/recompensa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |

Definições principais do objeto
Nomear objetos do gráfico
Sempre que tentar desenhar um objeto do gráfico, tem de fornecer o seu nome como argumento para o método de desenho.
Todos os nomes dos objetos do gráfico têm de ser únicos. Se este requisito não for cumprido, corre o risco de os objetos do gráfico substituírem objetos do gráfico com os mesmos nomes, dependendo dos seus tempos de execução. Pode utilizar o valor do índice da barra atual ou a hora atual para gerar nomes únicos para cada objeto.
Aceder a objetos do gráfico
Todos os objetos do gráfico estão contidos na coleção Objects. Esta coleção inclui objetos desenhados pelo utilizador. Como resultado, é possível aceder à coleção Objects para remover objetos dos gráficos ou modificar as suas propriedades.
O exemplo abaixo acede aos membros da coleção Objects:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | |
Eventos
Os objetos do gráfico têm vários eventos que pode utilizar para saber quais os objetos que são desenhados, atualizados ou removidos:
ObjectsAdded- é acionado quando um ou mais objetos do gráfico são adicionados a um gráfico.ObjectsRemoved- é acionado quando um ou mais objetos do gráfico são removidos de um gráfico.ObjectsUpdated- acionado quando um ou mais objetos do gráfico são atualizados (uma das suas propriedades é alterada pelo utilizador ou pelo indicador ou cBot ativo).ObjectsSelectionChanged- acionado quando um ou mais objetos do gráfico são selecionados pelo utilizador.ObjectHoverChanged- acionado quando o cursor do rato passa por cima de um objeto do gráfico.
O exemplo seguinte utiliza os cinco tipos de eventos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Objetos interativos e não interativos
Ao trabalhar com objetos interativos, os utilizadores podem alterar as suas propriedades, como a posição do objeto, cor, comentário, etc. Todos os objetos desenhados pelo utilizador são interativos por predefinição.
Nota
A propriedade ChartStaticText não pode ser alterada, independentemente de o objeto relacionado ser interativo ou não.
Para tornar um objeto interativo, defina a sua propriedade IsInteractive como true, conforme mostrado abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Todos os objetos do gráfico têm a propriedade IsInteractive. O seu valor predefinido é false.
Se um objeto do gráfico for interativo, não será removido quando uma instância de indicador ou cBot for removida ou parada. Por outro lado, os objetos não interativos são removidos automaticamente quando um indicador ou cBot deixa de funcionar.
Para evitar desordem, certifique-se de limpar os objetos interativos após a remoção da instância relacionada, utilizando os métodos Destroy do indicador ou OnStop do cBot.
Se um objeto do gráfico não for interativo, também será invisível em listas e coleções de objetos do gráfico.
Objetos bloqueados e desbloqueados
Bloquear um objeto do gráfico impede que o utilizador o modifique ou atualize. Pode fazê-lo através da caixa Trader (propriedades do gráfico) ou definindo a propriedade IsLocked como true. O valor predefinido é false.
Pode usar o bloqueio para tornar um objeto interativo, mas ao mesmo tempo impedir que o utilizador o atualize. O exemplo seguinte bloqueia um objeto de linha vertical:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Mostrar e ocultar
Pode desenhar um objeto no gráfico e, posteriormente, ocultá-lo. Embora o objeto ainda esteja presente no gráfico, ficará completamente invisível.
Para tal, defina a propriedade IsHidden como true.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
O uso de recursos é a principal consideração para utilizar esta funcionalidade. Se houver um objeto que deva aparecer frequentemente no gráfico (mas não o tempo todo), é melhor ocultá-lo em vez de removê-lo e redesenhá-lo sempre que for necessário.
Seleção de objetos e índice de aparência (ZIndex)
Naturalmente, podem ocorrer casos em que vários objetos se cruzam no gráfico, tornando difícil ou impossível selecionar um objeto específico. Apenas o objeto que foi desenhado por último será selecionável ao passar o cursor do rato sobre um grupo de objetos do gráfico que se cruzam.
Para alterar este comportamento, pode usar a propriedade ZIndex. Pode ser útil ao tentar exibir padrões complexos de objetos do gráfico.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
Uma vez anexado a um gráfico, o indicador acima exibirá uma linha vertical vermelha em vez de uma amarela. Como o valor da propriedade ZIndex da primeira linha é maior que o valor correspondente da segunda linha, ela tem precedência sobre a segunda linha (amarela).
Por outras palavras, a propriedade ZIndex determina quais objetos do gráfico são exibidos primeiro quando se sobrepõem. Todos os objetos do gráfico desenhados recebem automaticamente um determinado valor para a propriedade ZIndex.
Saber se um objeto foi removido
Todos os objetos do gráfico herdam a propriedade IsAlive da classe base ChartObject. O valor desta propriedade é true enquanto um objeto estiver presente no gráfico (independentemente de estar visível ou invisível). O valor é definido como false assim que um objeto é removido do gráfico.
Se guardar uma referência a um objeto do gráfico e este objeto for removido pelo utilizador, pode verificar a propriedade IsAlive para saber se um objeto está vivo ou morto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
Se executar uma instância deste indicador, clique com o botão direito do rato na linha vermelha e remova-a. O registo deve então exibir a mensagem "Object reference removed".
Se mantiver uma referência a um objeto do gráfico (morto), ocorrerá uma fuga de memória. Durante a recolha de lixo, o seu objeto ainda será considerado vivo, o que significa que sobreviverá ao processo de recolha.
Para evitar este problema, use o evento ObjectsRemoved em combinação com a propriedade IsAlive.
Índice de barra ou tempo
Ao codificar objetos do gráfico, pode usar o tempo do gráfico ou o índice da barra para o eixo X.
Na nossa opinião, o tempo do gráfico é a melhor opção. Ao usar índices de barras, não é possível planear valores futuros (porque os índices necessários ainda não existem) e não é possível contabilizar espaços entre barras. No entanto, os índices de barras podem ser mais fáceis de usar, particularmente no caso de objetos do gráfico relativamente simples.
Todos os métodos Chart.Draw têm diferentes sobrecargas para índices de barras e tempo do gráfico.