[Dúvida] Como escrever um texto no gráfico permanentemente

 

Olá senhoras e senhores, bom dia, boa tarde ou boa noite!


Gostaria de mais uma vez deixar uma de minhas dúvidas, e agradeço caso algum(a) nobre cidadã(o) puder me auxiliar caso consiga.


Meu objetivo é fazer com que apareça na tela do gráfico o resultado de uma divisão que estou realizando a partir da amplitude da banda de Boillinger/IFR, esse cálculo é gerado quando o candle atual [0] se fecha. Consegui fazer com que este número aparecesse em tela, porém, toda vez que um candle novo [0] surge e se fecha, o texto que aparecia referente ao candle até então fechado anteriormente [1] é apagado e um novo texto com outro cálculo (referente ao atual candle que acabou de fechar) aparece, e eu gostaria que estes cálculos ficassem registrados ao longo do gráfico, permanentemente.

Segue o código que utilizei para que o evento mencionado a cima acontecesse: 


//========================SETTANDO TEXTO (GLOBAL)=======================
void SetText(string name, string text, int x, int y, color colour, int fontsize=12)
{
   if(ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0))
   {
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_COLOR, colour);
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontsize);
   ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   }
   ObjectSetString(0, name, OBJPROP_TEXT, text);
}

//===============OnTick===================

double divisao_banda_ifr = banda / rsi[0];

 ChartTimePriceToXY(0, 0, rates[1].time, rates[1].close, x, y);

 SetText("Divisão", DoubleToString(divisao_banda_ifr, 2), x, y-50, clrWhite, 16); 
 


Ainda não entendi muito bem como funcionam os posicionamentos do texto, estou testando aqui e aprendendo com os resultados obtidos, mas pro momento isso não importa tanto, seria mais a questão dessa divisão ficar presente permanentemente para que este dado possa ser estudado posteriormente a partir do registro no gráfico. Agradeço a todos pela atenção e pela eventual ajuda, tenham um ótimo dia!


Atenciosamente,

Christian Alves

 
Christian Alves:

Olá senhoras e senhores, bom dia, boa tarde ou boa noite!


Gostaria de mais uma vez deixar uma de minhas dúvidas, e agradeço caso algum(a) nobre cidadã(o) puder me auxiliar caso consiga.


Meu objetivo é fazer com que apareça na tela do gráfico o resultado de uma divisão que estou realizando a partir da amplitude da banda de Boillinger/IFR, esse cálculo é gerado quando o candle atual [0] se fecha. Consegui fazer com que este número aparecesse em tela, porém, toda vez que um candle novo [0] surge e se fecha, o texto que aparecia referente ao candle até então fechado anteriormente [1] é apagado e um novo texto com outro cálculo (referente ao atual candle que acabou de fechar) aparece, e eu gostaria que estes cálculos ficassem registrados ao longo do gráfico, permanentemente.

Segue o código que utilizei para que o evento mencionado a cima acontecesse: 



Ainda não entendi muito bem como funcionam os posicionamentos do texto, estou testando aqui e aprendendo com os resultados obtidos, mas pro momento isso não importa tanto, seria mais a questão dessa divisão ficar presente permanentemente para que este dado possa ser estudado posteriormente a partir do registro no gráfico. Agradeço a todos pela atenção e pela eventual ajuda, tenham um ótimo dia!


Atenciosamente,

Christian Alves

Boa tarde.

Todos os objetos criados pelo MT5 serão permanentes até que algo ou alguém o apague. Para fugir deste erro (alguém apagar) você poderia salvar o template sempre que quiser e resgatar quando necessário.


Notei que no seu código você está usando um "LABEL". Acontece que o label é "flutuante" e quando vc movimenta o gráfico ele fica na mesma posição da tela. Veja que vc converte preço em pixel para posicionar ele na tela e não no gráfico.

Se eu entendi bem, use o objeto "TEXT" ao invés de "LABEL", pois ele vai ficar amarrado ao preço e tempo (portanto amarrado ao gráfico e não à tela).

Como sugestão, antes de programar objetos, use com mouse mesmo para ver como o objeto se comporta e se é o objeto certo para o que você quer. Depois, veja na documentação (lá tem até alguns exemplos) e por fim vá para a programação.


Se não respondi sua pergunta, dá um toque que depois eu complemento aqui.


Sucesso e bons trades.

 
Christian Alves:

. . .

Olá, Christian, boa tarde!!


Sempre trabalhando a partir da sua ideia, do seu código, talvez se você identificar cada texto pelo horário do candle (por exemplo), resolva o problema da permanência no gráfico:

   SetText("Divisão_" + TimeToString(iTime(_Symbol, PERIOD_CURRENT, 0)), DoubleToString(divisao_banda_ifr, 2), x, y-50, clrWhite, 16);


Teste aí e avise se mudou alguma coisa...


Abraço!!

 

Boa tarde senhores! Obrigado pelas respostas!


Ricardo Branco #:

Boa tarde.

Todos os objetos criados pelo MT5 serão permanentes até que algo ou alguém o apague. Para fugir deste erro (alguém apagar) você poderia salvar o template sempre que quiser e resgatar quando necessário.


Notei que no seu código você está usando um "LABEL". Acontece que o label é "flutuante" e quando vc movimenta o gráfico ele fica na mesma posição da tela. Veja que vc converte preço em pixel para posicionar ele na tela e não no gráfico.

Se eu entendi bem, use o objeto "TEXT" ao invés de "LABEL", pois ele vai ficar amarrado ao preço e tempo (portanto amarrado ao gráfico e não à tela).

Como sugestão, antes de programar objetos, use com mouse mesmo para ver como o objeto se comporta e se é o objeto certo para o que você quer. Depois, veja na documentação (lá tem até alguns exemplos) e por fim vá para a programação.


Se não respondi sua pergunta, dá um toque que depois eu complemento aqui.


Sucesso e bons trades.


Ricardo, muito obrigado pelo conselho, realmente ao ir até o "inserir objeto" no gráfico, percebi que eu precisava realmente trabalhar com o OBJ_TEXT e não com o OBJ_LABEL, agradeço demais pela sua explicação, foi muito importante para que eu compreendesse a diferença entre um e outro. Infelizmente quando eu tentava alterar na função o LABEL por TEXT, a função não era mais executada, e não sei explicar o porque devido a falta de conhecimento mesmo :(


Vinicius de Oliveira #:

Olá, Christian, boa tarde!!


Sempre trabalhando a partir da sua ideia, do seu código, talvez se você identificar cada texto pelo horário do candle (por exemplo), resolva o problema da permanência no gráfico:


Teste aí e avise se mudou alguma coisa...


Abraço!!


Vinicius, executei aqui o código conforme você colocou e ao testa-lo, executei-o com o mesmo código que eu havia feito e postei a cima na criação deste tópico. Realmente os textos não se apagavam, porém, eles ficavam um em cima do outro, de forma que cobria as informações anteriores que foram geradas, até chegar certo momento que eram diversos registros na tela em uma mesma área do gráfico, tentei fazer algumas alterações para ver se eu conseguia chegar em algo, mas infelizmente não fui capaz.


A fim de trocar meu código de LABEL por TEXT, optei por realizar diretamente o código dentro de onTick, e, por algumas alterações que realizei, não foi mais possível que os textos ficassem registrados no gráfico, nem da maneira anterior na qual ficavam os textos um em cima do outro.


int divisao_banda_ifr = banda / rsi[0];

ObjectCreate(0, "Texto", OBJ_TEXT, 0, TimeToString(iTime(_Symbol, PERIOD_CURRENT, 0)), rates[1].high);

ObjectSetInteger(0, "Texto", OBJPROP_FONTSIZE, 16);

ObjectSetInteger(0, "Texto", OBJPROP_COLOR, clrRed);

ObjectSetDouble(0, "Texto", OBJPROP_ANGLE, 90);

ObjectSetString(0, "Texto", OBJPROP_TEXT, ("Div: "+ divisao_banda_ifr));


Tentei fazer uma adaptação para o que você mandou Vini, fiz algumas alterações também pra que ficasse melhor registrado no gráfico do que anteriormente, agora ele aparece lateralmente a cima da alta do candle anterior, porém, ainda segue excluindo o objeto criado anteriormente na hora em que gera um novo objeto. 


Portanto senhores, continuo na labuta para encontrar uma forma de que este texto fique registrado de maneira permanente no gráfico. Agradeço pela ajuda que me deram com vossos conhecimentos até então! Grande abraço, tenham uma ótima noite.


Atenciosamente,

Christian Alves

 
Christian Alves #:

Boa tarde senhores! Obrigado pelas respostas!



Ricardo, muito obrigado pelo conselho, realmente ao ir até o "inserir objeto" no gráfico, percebi que eu precisava realmente trabalhar com o OBJ_TEXT e não com o OBJ_LABEL, agradeço demais pela sua explicação, foi muito importante para que eu compreendesse a diferença entre um e outro. Infelizmente quando eu tentava alterar na função o LABEL por TEXT, a função não era mais executada, e não sei explicar o porque devido a falta de conhecimento mesmo :(



Vinicius, executei aqui o código conforme você colocou e ao testa-lo, executei-o com o mesmo código que eu havia feito e postei a cima na criação deste tópico. Realmente os textos não se apagavam, porém, eles ficavam um em cima do outro, de forma que cobria as informações anteriores que foram geradas, até chegar certo momento que eram diversos registros na tela em uma mesma área do gráfico, tentei fazer algumas alterações para ver se eu conseguia chegar em algo, mas infelizmente não fui capaz.


A fim de trocar meu código de LABEL por TEXT, optei por realizar diretamente o código dentro de onTick, e, por algumas alterações que realizei, não foi mais possível que os textos ficassem registrados no gráfico, nem da maneira anterior na qual ficavam os textos um em cima do outro.



Tentei fazer uma adaptação para o que você mandou Vini, fiz algumas alterações também pra que ficasse melhor registrado no gráfico do que anteriormente, agora ele aparece lateralmente a cima da alta do candle anterior, porém, ainda segue excluindo o objeto criado anteriormente na hora em que gera um novo objeto. 


Portanto senhores, continuo na labuta para encontrar uma forma de que este texto fique registrado de maneira permanente no gráfico. Agradeço pela ajuda que me deram com vossos conhecimentos até então! Grande abraço, tenham uma ótima noite.


Atenciosamente,

Christian Alves

No ligar de usar rates[1] tente variar o número ali dentro para ver o que isso vai mudar...

Pode usar também rates[1].time para pegar o tempo... 


 
Ricardo Branco #:
No ligar de usar rates[1] tente variar o número ali dentro para ver o que isso vai mudar...

Pode usar também rates[1].time para pegar o tempo... 


Olá Ricardo! Bom dia.


Tentei variar o número, isso somente modifica o posicionamento onde o texto é inserido no gráfico :/


Quanto a utilização do rates[].time, é possível fazer essa alteração para pegar o tempo, funciona normalmente assim como o código anterior:

//ObjectCreate(0, "Texto", OBJ_TEXT, 0, TimeToString(iTime(_Symbol, PERIOD_CURRENT, 0)), rates[0].high);

ObjectCreate(0, "Texto", OBJ_TEXT, 0, rates[1].time, rates[1].high);


Sigo na busca meus amigos, apesar dessas alterações o texto segue apagando na formação de um novo candle e ficando registrada somente a escrita do atual candle em aberto... postarei nos fóruns do MQL5 em inglês também para ver se consigo achar tal resposta, caso encontre-a, compartilharei com vocês. Caso tenha outras sugestões ou ideias, mande aqui pois as testarei!


Grande abraço e tenhaum ótimo dia.


Atenciosamente,

Christian Alves

 

Bom dia Christian e Ricardo!!


Segue exemplo bem simples, mas funcional, desse procedimento:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   string obj_name = "Divisão" + TimeToString(iTime(_Symbol, PERIOD_CURRENT, 1));
   string divisao_banda_ifr = DoubleToString((iHigh(_Symbol, PERIOD_CURRENT, 1) + iLow(_Symbol, PERIOD_CURRENT, 1)) / 2.0, _Digits);


   if(ObjectFind(0, obj_name) < 0)
     {
      if(ObjectCreate(0, obj_name, OBJ_TEXT, 0, iTime(_Symbol, PERIOD_CURRENT, 1), iHigh(_Symbol, PERIOD_CURRENT, 1)))
        {
         ObjectSetInteger(0, obj_name, OBJPROP_COLOR, clrWhite);
         ObjectSetInteger(0, obj_name, OBJPROP_FONTSIZE, 12);
         ObjectSetDouble(0, obj_name, OBJPROP_ANGLE, 90);
         ObjectSetString(0, obj_name, OBJPROP_TEXT, divisao_banda_ifr);
        }
     }
  }




Christian, você precisará editar a variável divisao_banda_ifr para os seus valores corretos, além de ver melhor posicionamento/alinhamento e outras propriedades do texto, essas coisas...

 
Vinicius de Oliveira #:

Bom dia Christian e Ricardo!!


Segue exemplo bem simples, mas funcional, desse procedimento:




Christian, você precisará editar a variável divisao_banda_ifr para os seus valores corretos, além de ver melhor posicionamento/alinhamento e outras propriedades do texto, essas coisas...

Fala Vinicius, bom dia irmão! Realizei a alteração aqui na variável divisao_banda_ifr para os valores corretos e ajustei um pouco a questão do tamanho/alinhamento do angulo para aparecer de melhor forma no gráfico!


E agradeço-lhe do fundo do coração por ter compartilhado mais uma vez seu conhecimento irmão, após a utilização deste código que você postou a cima, funcionou exatamente da maneira como eu esperava! Agora posso redirecionar meus estudos a outros conteúdos, inclusive aquela outra questão do fórum que postei e que inclusive vi que você respondeu, estudarei agora mesmo. Obrigado mais uma vez meu irmão, tenha um ótimo dia por ai!

 
Christian Alves #:

Fala Vinicius, bom dia irmão! Realizei a alteração aqui na variável divisao_banda_ifr para os valores corretos e ajustei um pouco a questão do tamanho/alinhamento do angulo para aparecer de melhor forma no gráfico!


E agradeço-lhe do fundo do coração por ter compartilhado mais uma vez seu conhecimento irmão, após a utilização deste código que você postou a cima, funcionou exatamente da maneira como eu esperava! Agora posso redirecionar meus estudos a outros conteúdos, inclusive aquela outra questão do fórum que postei e que inclusive vi que você respondeu, estudarei agora mesmo. Obrigado mais uma vez meu irmão, tenha um ótimo dia por ai!


De nada, meu amigo!! Tenha um bom dia, bom aprendizado (pra todos nós)!! 😊👍

 
Ola como esta?
eu tou bem,vi sua duvida referente a como fazer aparecer um determinado valor da label no grafico constantemente,quero saber como voce fez para que esses dados da lebal aparecem?me ajuda porque eu nao quero que a informacao que ta na label apareca so no testador,mas sim no grafico real