Ultimo peço dentro do Painel Dialog ??

Kleuton Novais  
Amigos como consigo colocar o ultimo preço, ask, bid etc.. dentro de uma painel com classe Dialog?
Vejam o código o Ultimo preço, bom como o ask e bid eu consigo colocar dentro de uma comentário, porem dentro do painel o valor fica estático não muda, fica o ultimo valor ao abri o robô, porém não fica atualizando o ultimo preço automaticamente. como posso inserir essa informação dinamica dentro do painel, para mudar a cada tick ?
//+------------------------------------------------------------------+
//|                                     			.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.000"
#property description "Painéis de Controle e Caixas de Diálogos."
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>   // classe botóes
#include <Controls\Label.mqh> // Classa LABEL
#include <Controls\SpinEdit.mqh> //BOX CONTRATOS

//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         (11)      // indent from left (with allowance for border width)
#define INDENT_TOP                          (11)      // indent from top (with allowance for border width)
#define INDENT_RIGHT                        (11)      // indent from right (with allowance for border width)
#define INDENT_BOTTOM                       (11)      // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X                      (2)      // gap by X coordinate
#define CONTROLS_GAP_Y                      (10)      // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH                        (120)     // size by X coordinate
#define BUTTON_HEIGHT                       (40)      // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT                         (20)      // size by Y coordinate
//--- for group controls
#define GROUP_WIDTH                         (150)     // size by X coordinate
#define LIST_HEIGHT                         (179)     // size by Y coordinate
#define RADIO_HEIGHT                        (56)      // size by Y coordinate
#define CHECK_HEIGHT                        (93)      // size by Y coordinate
//+------------------------------------------------------------------+






// MQL
MqlTick                 ultimoTick;

   
double                  PRC;//Preço normalizado
   

//---
//+------------------------------------------------------------------+
//| Classe CPanelDialog                                      |
//| Uso: caixa de diálogo principal do aplicativo Controls           |
//+------------------------------------------------------------------+
class CPanelDialog : public CAppDialog
  {
private:
   CLabel            m_label;                         // CLabel object Simbolo
   CLabel            m_label2;                        // CLabel object Periodo
   CLabel            m_label_ASK;                     // LABEL ASK
   CLabel            m_label_BID;                     // LABEL BID
   CLabel            m_label_PRECO;                   // LABEL PRECO

public:
                     CPanelDialog(void);
                    ~CPanelDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:
   
    //--- LABEL
   bool              CreateLabel(void);

   
//--- handlers of the dependent controls events
   void              OnClickLabel(void);
   

  };
  


//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialog)

EVENT_MAP_END(CAppDialog)

//+------------------------------------------------------------------+
//| Construtor                                                       |
//+------------------------------------------------------------------+
CPanelDialog::CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destrutor                                                        |
//+------------------------------------------------------------------+
CPanelDialog::~CPanelDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- cria os controles dependentes
  
   if(!CreateLabel())     return(false); // simbolo

//--- sucesso
   return(true);
  }
  
  
  
  



void OnTick()
  {             

     // CHAMA TICK 
      if(!SymbolInfoTick(Symbol(),ultimoTick))
         {
            Alert("Erro ao obter informações de Preços: ", GetLastError());
            return;
         }
  
   // TESTE EXIBIR ULTIMO PREÇO COMENTARIO
   Comment( "Time::",ultimoTick.time," --- Ultimo PREÇO: ",ultimoTick.last," --- Ask:",ultimoTick.ask," --- Bid:",ultimoTick.bid," --- Volume:",ultimoTick.volume );  // -- ULTIMO PREÇO COM OS TICKS DO MERCADO --// )

}



  
//+------------------------------------------------------------------+
//| Variável Global                                                  |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert                                |
//+------------------------------------------------------------------+
int OnInit()
  {
 
 SymbolInfoTick(Symbol(),ultimoTick);
        
  
//---Cria o diálogo do aplicativo
   if(!ExtDialog.Create(0,"PAINEL ",0,40,40,380,344))
      return(INIT_FAILED);
//---Execução da aplicação
   ExtDialog.Run();
//--- sucesso
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do Expert                             |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
//--- destrói o diálogo
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Função de evento do gráfico do Expert                            |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // ID do evento  
                  const long& lparam,   // parâmetro do evento do tipo long
                  const double& dparam, // parâmetro do evento do tipo double
                  const string& sparam) // parâmetro do evento do tipo string
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }

//+------------------------------------------------------------------+
//| Create the "CLabel"                                              |
//+------------------------------------------------------------------+
bool CPanelDialog::CreateLabel(void)
  {
//--- coordinates
   int x1=INDENT_RIGHT;
   int y1=INDENT_TOP;
   int x2=x1+100;
   int y2=y1+20;
   
//--- create /// - LABEL SIMBOLO
   if(!m_label.Create(m_chart_id,m_name+"Label",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_label.Text(_Symbol))
      return(false);
   if(!m_label.FontSize(16))
      return(false); 
   if(!Add(m_label))
      return(false);
      
   
   /// - LABEL PERIODO
   int xL1=INDENT_RIGHT+190;  
    string periodoatual;
   if ( _Period == PERIOD_M1 ){
      periodoatual = "M1";
   }else{
      periodoatual = _Period;
   }
    if(!m_label2.Create(m_chart_id,m_name+"Label2",m_subwin,xL1,y1,x2,y2))
      return(false);
   if(!m_label2.Text("P:"+periodoatual+"  | Spred:"+ MODE_SPREAD))
      return(false);
   if(!m_label2.FontSize(12))
      return(false); 
   if(!Add(m_label2))
      return(false);  
      
  
      
      /// - LABEL ASK   // ASK NÃO FUNCIONA
       xL1=INDENT_RIGHT;
   int yL1=INDENT_TOP+70;
     
    if(!m_label_ASK.Create(m_chart_id,m_name+"Label4",m_subwin,xL1,yL1,x2,y2))  return(false);
   if(!m_label_ASK.Text( "ASK:"+ ultimoTick.ask  ) )
      return(false);
   if(!m_label_ASK.Color(clrRed))  return(false); 
   if(!m_label_ASK.FontSize(10))  return(false); 
   if(!Add(m_label_ASK))  return(false); 
   
   /// - LABEL BID   // BID NÃO FUNCIONA
   if(!m_label_BID.Create(m_chart_id,m_name+"Label5",m_subwin,xL1+240,yL1,x2,y2))  return(false);
   if(!m_label_BID.Text( "BID:"+ ultimoTick.bid  ) )
      return(false);
   if(!m_label_BID.Color(clrBlue))  return(false); 
   if(!m_label_BID.FontSize(10))  return(false); 
   if(!Add(m_label_BID))  return(false);
   
   /// - LABEL PRECO  // LAST NÃO FUNCIONA   
   if(!m_label_PRECO.Create(m_chart_id,m_name+"Label6",m_subwin,xL1+110,yL1,x2,y2))  return(false);
   if(!m_label_PRECO.Text( "PREÇO:"+ ultimoTick.last )  )    
      return(false);
   if(!m_label_PRECO.FontSize(10))  return(false); 
   if(!Add(m_label_PRECO))  return(false);
      
      
    
//--- succeed
   return(true);
  }
  



Deste já agradeço a ajuda

Arquivos anexados:
Eduardo Oliveira  

porque vc tem que colocar para atualizar o painel a cada x segundos ou a cada tick e no painel vc coloca qual label vc quer atualizar, no seu caso seria o 

m_label_ASK.Text( "ASK:"+ ultimoTick.ask  )
m_label_BID.Text( "BID:"+ ultimoTick.bid  )

então para atualizar precisa dessas linhas no OnTick ou no OnTimer onde achar melhor...como esses labels estão privados talvez não consiga acessar diretamente elas no OnTick

Kleuton Novais  
Eduardo Oliveira:

porque vc tem que colocar para atualizar o painel a cada x segundos ou a cada tick e no painel vc coloca qual label vc quer atualizar, no seu caso seria o 

então para atualizar precisa dessas linhas no OnTick ou no OnTimer onde achar melhor...como esses labels estão privados talvez não consiga acessar diretamente elas no OnTick

não entendi como vou atualizar o painel a cada tick? é um comando ?
Vinicius Pereira De Oliveira  
Kleuton Novais:
não entendi como vou atualizar o painel a cada tick? é um comando ?

Boa noite @Kleuton Novais !


A sugestão do @Eduardo Oliveira seria fazer assim:

void OnTick()
  {             
   // CHAMA TICK 
   if(!SymbolInfoTick(Symbol(),ultimoTick))
     {
      Alert("Erro ao obter informações de Preços: ", GetLastError());
      return;
     }

   m_label_ASK.Text("ASK: " + (string)ultimoTick.ask);
   m_label_BID.Text("BID: " + (string)ultimoTick.bid);

   // TESTE EXIBIR ULTIMO PREÇO COMENTARIO // -- ULTIMO PREÇO COM OS TICKS DO MERCADO -- //
   Comment( "Time::",ultimoTick.time," --- Ultimo PREÇO: ",ultimoTick.last," --- Ask:",ultimoTick.ask," --- Bid:",ultimoTick.bid," --- Volume:",ultimoTick.volume );
  }


... E pra essa alteração poder funcionar, você precisa declarar globais / públicas as labels abaixo:

CLabel  m_label_ASK;     // LABEL ASK
CLabel  m_label_BID;     // LABEL BID


Tem uma boa referência para criar painel aqui (com indicador), se quiser dar uma olhada ...

Painel de Visualização Simples
Painel de Visualização Simples
  • www.mql5.com
O código foi projetado para ser uma simples referência de como criar (arrastar) painéis móveis e preenchê-lo com informações.
Kleuton Novais  
Vinicius de Oliveira:

Boa noite @Kleuton Novais !


A sugestão do @Eduardo Oliveira seria fazer assim:


... E pra essa alteração poder funcionar, você precisa declarar globais / públicas as labels abaixo:


Tem uma boa referência para criar painel aqui (com indicador), se quiser dar uma olhada ...

RESOLVIDO :::

@Vinicius de Oliveira , obrigado pelo esclarecimento, peguei o código do indicador e refiz para ser um EA. deu super certo Agradeço, segue o código abaixo caso outras pessoas tenham a mesma duvida.

//+------------------------------------------------------------------+
//|                                                        Ptest.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>

//+------------------------------------------------------------------+
//| Global parameters                                                |
//+------------------------------------------------------------------+
int      panelXX     =  20;
int      panelYY     =  20;
int      panelWidth  =  300;
int      panelHeight =  300;
//+------------------------------------------------------------------+
//| Global variabels                                                 |
//+------------------------------------------------------------------+
//--- Panel itself
CAppDialog m_panel;

//--- preco objects
CPanel m_precocolor;
CLabel m_precolabel;
//--- Bid objects
CPanel m_bidcolor;
CLabel m_bidlabel;
//--- Ask objects
CPanel m_askcolor;
CLabel m_asklabel;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   //--- Panel create
   m_panel.Create(0,"TEST PANEL",0,panelXX,panelYY,panelWidth,panelHeight);



//--- PREÇO label and colors
   m_precocolor.Create(0,"Last Background Color",0,1,1,panelWidth-30,30);
   m_precocolor.ColorBackground(clrBlack);
   m_panel.Add(m_precocolor);
   m_precolabel.Create(0,"Last Text",0,5,5,0,0);
   m_precolabel.Text("Preço "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_LAST),_Digits));
   m_precolabel.Color(clrWhite);
   m_panel.Add(m_precolabel);

//--- Bid label and colors
   m_bidcolor.Create(0,"Bid Background Color",0,1,79,panelWidth-30,50);
   m_bidcolor.ColorBackground(clrYellow);
   m_panel.Add(m_bidcolor);
   m_bidlabel.Create(0,"Bid Text",0,5,55,0,0);
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   m_bidlabel.Color(clrBlue);
   m_panel.Add(m_bidlabel);
//--- Ask label and colors
   m_askcolor.Create(0,"Ask Background Color",0,1,101,panelWidth-30,130);
   m_askcolor.ColorBackground(clrAqua);
   m_panel.Add(m_askcolor);
   m_asklabel.Create(0,"Ask Text",0,5,105,0,0);
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   m_asklabel.Color(clrRed);
   m_panel.Add(m_asklabel);
//--- Run panel
   m_panel.Run();
   return(0);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
//--- Destroy panel
   m_panel.Destroy(reason);
//--- Delete all objects
   ObjectsDeleteAll(0,0);
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//--- A very simples last label
   m_precolabel.Text("Preço "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_LAST),_Digits));
//--- A very simples bid label
   m_bidlabel.Text("Bid "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
//--- A very simples ask label
   m_asklabel.Text("Ask "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits));
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
//--- Move the panel with the mouse
   m_panel.ChartEvent(id,lparam,dparam,sparam);
//--- 
   
  }
//+------------------------------------------------------------------+
Vinicius Pereira De Oliveira  
Kleuton Novais:

RESOLVIDO :::

@Vinicius de Oliveira , obrigado pelo esclarecimento, peguei o código do indicador e refiz para ser um EA. deu super certo Agradeço, segue o código abaixo caso outras pessoas tenham a mesma duvida.

Beleza Kleuton!! 👍

Razão: