Discussão do artigo "Como criar um painel gráfico de qualquer nível de complexidade" - página 12

 
Vladimir Karputov #:

Isso é proibido. O painel está vinculado ao gráfico.

Muito obrigado. Estou vendo.

Posso fazer mais uma pergunta, por favor?

Quero criar um painel para mostrar uma tabela como esta






















Mas só consigo encontrar o controle abaixo. Isso significa que o painel não é compatível com a criação da tabela?

CLabel

Controle baseado no objeto gráfico "Rótulo de texto".

CBmpButton

Controle baseado no objeto gráfico "Bitmap label" (rótulo de bitmap)

CButton

Controle baseado no objeto gráfico "Botão".

CEdit

Controle baseado no objeto gráfico "Edit field" (campo de edição)

CPanel

Controle baseado no objeto gráfico "Rectangle label" (rótulo de retângulo)

CPicture

Controle, baseado no "rótulo Bitmap"

Documentation on MQL5: Standard Library / Panels and Dialogs / CEdit
Documentation on MQL5: Standard Library / Panels and Dialogs / CEdit
  • www.mql5.com
CEdit - Panels and Dialogs - Standard Library - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Quan tum # :

Muito obrigado. Estou vendo.

Posso fazer mais uma pergunta, por favor.

Quero criar um painel para mostrar uma tabela como esta






















Mas só consigo encontrar o controle abaixo. Isso significa que o painel não é compatível com a criação da tabela?

CLabel

Controle baseado no objeto gráfico "Rótulo de texto".

CBmpButton

Controle baseado no objeto gráfico "Bitmap label".

CButton

Controle baseado no objeto gráfico "Botão".

CEdit

Controle baseado no objeto gráfico "Edit field" (campo de edição)

CPanel

Controle baseado no objeto gráfico "Rectangle label" (rótulo de retângulo)

CPicture

Controle, baseado no "rótulo Bitmap"

Você mesmo precisa criar a tabela. Procure exemplos em artigos e no CodeBase.

 
Vladimir Karputov #:

Você mesmo precisa criar a tabela. Procure exemplos em Artigos e no CodeBase.

Ok, muito obrigado. Acho que sim.

Tentarei encontrá-los no artigo e na base de código.

Mais uma vez, obrigado por seu apoio .

 
Como
 

Estou tentando criar uma barra de rolagem vertical sem vincular ao painel, apenas no gráfico, mas isso não funciona por algum motivo.

Por exemplo, com uma caixa de seleção, esse código reage a um clique do mouse. O tique aparece e desaparece.

#include <Controls\CheckBox.mqh>
CCheckBox Chbox;
//+------------------------------------------------------------------+
void OnInit()
{
  Chbox.Create(0, "MyCheckBox", 0, 20, 20, 100, 40);
  ChartRedraw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Chbox.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+


Mas com uma rolagem vertical, não há reação aos cliques do mouse.

#include <Controls\Scrolls.mqh>
CScrollV Scroll;

void OnInit()
{
  Scroll.Create(0, "MyScrollV", 0, 20, 20, 40, 200);
  ChartRedraw();
}

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Scroll.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+

Você pode me dizer quem sabe como fazer esse elemento combinado funcionar em um gráfico?

 

Você pode me dizer como chamar uma caixa de diálogo?
Por exemplo, criei um painel em que há um botão "Close all positions" (Fechar todas as posições). Quando clico nesse botão, uma caixa "Tem certeza?" deve ser exibida. Sim/Não. Como implementar isso?

Atualmente, herdando do CAppDialog, criei um pequeno formulário com os botões Ok/Cancel. Ao clicar no botão Ok, adicionei uma linha

gDialogForm.Destroy();
ChartRedraw();

Mas o formulário de diálogo ainda permanece na tela.
Como corrigir?

 
Nextor caixa de diálogo?
Por exemplo, criei um painel em que há um botão "Close all positions" (Fechar todas as posições). Quando clico nesse botão, uma caixa "Tem certeza?" deve ser exibida. Sim/Não. Como implementar isso?

Atualmente, herdando do CAppDialog, criei um pequeno formulário com os botões Ok/Cancel. Ao clicar no botão "Ok", adicionei uma linha

Mas o formulário de diálogo ainda permanece na tela.
Como corrigir isso?

void OnChartEvent(const int id,         // ID do evento
                  const long& lparam,   // Parâmetro do tipo long event
                  const double& dparam, // Parâmetro do tipo double event
                  const string& sparam  // Parâmetro de eventos do tipo string
                 )
{
  // Fechar todas as contas
  if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"ClosePos",0)!=-1)) {
    int MB=MessageBox("Close All Positions\nAccount Profit= "+DoubleToString(AccountInfoDouble(ACCOUNT_PROFIT),2),
                      "Close All Positions?", MB_OKCANCEL|MB_ICONQUESTION);
    if(MB==1)
      ClosePosSortProfit("", -1, -1, clrGray);
  }
}
 
Nextor caixa de diálogo?
Por exemplo, criei um painel em que há um botão "Close all positions" (Fechar todas as posições). Quando clico nesse botão, uma caixa "Tem certeza?" deve ser exibida. Sim/Não. Como implementar isso?

Atualmente, herdando do CAppDialog, criei um pequeno formulário com os botões Ok/Cancel. Ao clicar no botão "Ok", adicionei uma linha

Mas o formulário de diálogo ainda permanece na tela.
Como corrigir isso?

Talvez este comentário possa ajudar
 
Nextor caixa de diálogo?
Por exemplo, criei um painel em que há um botão "Close all positions" (Fechar todas as posições). Quando clico nesse botão, uma caixa "Tem certeza?" deve ser exibida. Sim/Não. Como implementar isso?

Atualmente, herdando do CAppDialog, criei um pequeno formulário com os botões Ok/Cancel. Ao clicar no botão "Ok", adicionei uma linha

Mas o formulário de diálogo ainda permanece na tela.
Como corrigir isso?

Pegue o exemplo Close On Chart Panel e insira uma chamada "MessageBox" nos manipuladores de cliques.

No arquivo "Close On Chart Panel Dialog.mqh", faça essas alterações:

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   int answer=MessageBox("Close all Sell?","Close all Sell",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_SELL);
     }
  }
//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton2(void)
  {
   int answer=MessageBox("Close all Buy?","Close all Buy",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_BUY);
     }
  }
//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton3(void)
  {
   int answer=MessageBox("Close all Profit?","Close all Profit",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseProfitPositions();
     }
  }
//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton4(void)
  {
   int answer=MessageBox("Close all Loss?","Close all Loss",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseLossPositions();
     }
  }


Result:


Close On Chart Panel
Close On Chart Panel
  • www.mql5.com
Советник-утилита. Панель на базе класса CDialog. Кнопки на базе класса СButton. Четыре кнопки для закрытия BUY, SELL, всех прибыльных, всех убыточных. Работа по текущему символу
 

Olá, obrigado por seu incrível tutorial

Estou tentando fazer o meu próprio, no meu painel, quando clico em um botão, o outro deve ser desativado e ocultado, mas quando clico na área do botão oculto, ele continua funcionando

Coloquei meus códigos aqui. Se puder me ajudar, seria ótimo.

Indicador:

//+------------------------------------------------------------------+
//|Indicator_Q_Test.mq4
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include  <WinUser32.mqh>
#include "PanelDialog_Q.mqh"
CPanelDialogQ ExtDialog;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores

   if(!ExtDialog.CreateQ(0,"Question",0,100,100,400,230,"This the test Question?"))
      return(INIT_FAILED);
//--- executar o aplicativo
   if(!ExtDialog.Run())
      return(INIT_FAILED);
 
      

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| Função ChartEvent|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
      ExtDialog.ChartEvent(id,lparam,dparam,sparam);

  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   ExtDialog.Destroy(reason);


  }

Class:

//+------------------------------------------------------------------+
//|PanelDialog.mqh
//| Copyright 2009-2015, MetaQuotes Software Corp. |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\ListView.mqh>
#include <Controls\ComboBox.mqh>
#include <Controls\SpinEdit.mqh>
#include <Controls\RadioGroup.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Scrolls.mqh>
//+------------------------------------------------------------------+
//| define|
//+------------------------------------------------------------------+
//--- recuos e intervalos
#define  INDENT_LEFT_ScrollQ                         (11)      // recuo da esquerda (com tolerância para a largura da borda) (somente para a barra de rolagem)
#define  INDENT_LEFTQ                         (11)      // recuo da esquerda (com tolerância para a largura da borda)
#define  INDENT_TOPQ                          (11)      // recuo a partir do topo (com tolerância para a largura da borda)
#define  INDENT_RIGHTQ                        (11)      // recuo da direita (com tolerância para a largura da borda)
#define  INDENT_BOTTOMQ                       (11)      // recuo da parte inferior (com tolerância para a largura da borda)
#define  CONTROLS_GAP_XQ                      (80)      // intervalo por coordenada X
#define  CONTROLS_GAP_YQ                      (40)      // intervalo por coordenada Y
//--- para botões
#define  BUTTON_WIDTHQ                        (60)     // tamanho por coordenada X
#define  BUTTON_HEIGHTQ                       (20)      // tamanho por coordenada Y
//--- para a área de indicação

#define  EDIT_HEIGHTQ                         (20)      // tamanho por coordenada Y
#define  GROUP_WIDTHQ                         (150)     // tamanho por coordenada X
#define  LIST_HEIGHTQ                         (379)     // tamanho por coordenada Y
#define  RADIO_HEIGHTQ                        (56)      // tamanho por coordenada Y
#define  CHECK_HEIGHTQ                        (93)      // tamanho por coordenada Y
//+------------------------------------------------------------------+
//| Classe CPanelDialog|
//| Uso: diálogo principal do aplicativo SimplePanel
//+------------------------------------------------------------------+
class CPanelDialogQ : public CAppDialog
  {
private:

   CLabel            m_Label_Q_text;


   CButton           m_button_Yes;
   CButton           m_button_No;




   //****************************************************


public:
                     CPanelDialogQ(void);
                    ~CPanelDialogQ(void);
   //--- criar
   virtual bool      CreateQ(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2,string QText);
   //--- manipulador de eventos de gráfico
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:

   //--- criar controles dependentes

   bool              CreateLabel_Q_text(string QT);

   bool              CreateButton_Yes(void);
   bool              CreateButton_No(void);


   void              OnClick_button_Yes(void);
   void              OnClick_button_No(void);


  };
//+------------------------------------------------------------------+
//| Tratamento de eventos|
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CPanelDialogQ)

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
ON_EVENT(ON_CLICK,m_button_Yes,OnClick_button_Yes)
ON_EVENT(ON_CLICK,m_button_No,OnClick_button_No)

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
CPanelDialogQ::CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Destruidor|
//+------------------------------------------------------------------+
CPanelDialogQ::~CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Criar|
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateQ(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2,string QText)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- criar controles dependentes

   if(!CreateLabel_Q_text(QText))
      return(false);
   if(!CreateButton_Yes())
      return(false);
   if(!CreateButton_No())
      return(false);

//--- bem-sucedido
   return(true);
  }


//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateLabel_Q_text(string QT)
  {
//--- coordenadas
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ;
   int x2=ClientAreaWidth()-(INDENT_RIGHTQ+BUTTON_WIDTHQ+CONTROLS_GAP_XQ);
   int y2=y1+EDIT_HEIGHTQ;

//--- criar
   if(!m_Label_Q_text.Create(m_chart_id,"QT",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_Label_Q_text.Text(QT))
      return(false);
   if(!m_Label_Q_text.FontSize(12))
      return(false);
   if(!m_Label_Q_text.Color(clrBlack))
      return(false);
   if(!m_Label_Q_text.ColorBorder(clrBlack))
      return(false);
   if(!m_Label_Q_text.ColorBackground(clrBlack))
      return(false);
// se(!m_edit.ReadOnly(true))
// return(false);
   if(!Add(m_Label_Q_text))
      return(false);

   m_Label_Q_text.Alignment(WND_ALIGN_WIDTH,INDENT_LEFTQ,0,INDENT_RIGHTQ+BUTTON_WIDTHQ+CONTROLS_GAP_XQ,0);
//--- bem-sucedido
   return(true);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_Yes(void)
  {
//--- coordenadas
   int x1=INDENT_LEFTQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- criar
   if(!m_button_Yes.Create(m_chart_id,m_name+"Yes",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button_Yes.Text("Yes"))
      return(false);
   if(!Add(m_button_Yes))
      return(false);
   m_button_Yes.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHTQ+CONTROLS_GAP_XQ*2,0);
//--- bem-sucedido
   return(true);
  }





//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool CPanelDialogQ::CreateButton_No(void)
  {
//--- coordenadas
   int x1=INDENT_LEFTQ+CONTROLS_GAP_XQ;
   int y1=INDENT_TOPQ+CONTROLS_GAP_YQ;
   int x2=x1+BUTTON_WIDTHQ;
   int y2=y1+BUTTON_HEIGHTQ;
//--- criar
   if(!m_button_No.Create(m_chart_id,m_name+"NO",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!m_button_No.Text("NO"))
      return(false);
   if(!Add(m_button_No))
      return(false);
   m_button_No.Alignment(WND_ALIGN_RIGHT,0,0,INDENT_RIGHTQ+CONTROLS_GAP_XQ*1,0);
//--- bem-sucedido
   return(true);
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void CPanelDialogQ::OnClick_button_Yes(void)
  {

   Print("OnClick_button_Yes", "Last Error: ",GetLastError());

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void CPanelDialogQ::OnClick_button_No(void)
  {

   Print("OnClick_button_No", "Last Error: ",GetLastError());

m_button_Yes.Hide();
m_button_Yes.Disable();
m_button_Yes.Deactivate();

  }
//+------------------------------------------------------------------+