Discusión sobre el artículo "Cómo crear un panel gráfico de cualquier nivel de complejidad" - página 12

 
Vladimir Karputov #:

Está prohibido. El panel está vinculado al gráfico.

Muchas gracias. Ya veo.

¿Puedo hacer una pregunta más, por favor.

Quiero crear un panel para mostrar alguna tabla como esta






















Pero sólo puedo encontrar el control de abajo, es que el panel de medios no puede soportar para crear la tabla, gracias.

CLabel

Control, basado en el objeto gráfico "Text label

CBmpButton

Control, basado en el objeto gráfico "Bitmap label

CButton

Control basado en el objeto gráfico "Button

CEdit

Control basado en el objeto gráfico "Edit field

CPanel

Control basado en el objeto gráfico "Rectangle label

CPicture

Control, basado en "Bitmap label".

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 # :

Muchas gracias. Ya veo.

¿Puedo pedir una pregunta más, por favor.

Quiero crear un panel para mostrar alguna tabla como esta






















Pero sólo puedo encontrar el control de abajo, es que el panel de medios no puede soportar para crear la tabla, gracias.

CLabel

Control, basado en el objeto gráfico "Text label

CBmpButton

Control, basado en el objeto gráfico "Bitmap label

CButton

Control basado en el objeto gráfico "Button

CEdit

Control basado en el objeto gráfico "Edit field

CPanel

Control basado en el objeto gráfico "Rectangle label

CPicture

Control, basado en "Bitmap label".

Necesitas construir la tabla tu mismo. Busca ejemplos en Articles y CodeBase.

 
Vladimir Karputov #:

Tienes que construir la tabla tú mismo. Busca ejemplos en Articles y CodeBase.

Ok, muchas gracias. Creo que si.

Intentaré encontrarlos en Article y codebase.

Gracias de nuevo por tu apoyo .

 
Como
 

Estoy tratando de crear una barra de desplazamiento vertical sin vincular al panel, sólo en el gráfico, pero no funciona por alguna razón.

Por ejemplo, con una casilla de verificación, este código reacciona a un clic del ratón. La marca aparece y 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);
}
//+------------------------------------------------------------------+


Pero con un desplazamiento vertical - no hay reacción a los clics del ratón.

#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);
}
//+------------------------------------------------------------------+

¿Pueden decirme quién sabe cómo hacer que este elemento combinado funcione en un gráfico?

 

¿Puede decirme cómo llamar a un cuadro de diálogo?
Por ejemplo, he creado un panel en el que hay un botón "Cerrar todas las posiciones". Cuando hago clic en este botón, debería aparecer un cuadro "¿Está seguro? Sí/No. ¿Cómo implementar esto?

Actualmente heredando de CAppDialog, he creado un pequeño formulario con botones Ok/Cancel. Al hacer clic en el botón Ok, he añadido una línea

gDialogForm.Destroy();
ChartRedraw();

Pero el formulario de diálogo sigue en la pantalla.
¿Cómo solucionarlo?

 
Nextor cuadro de diálogo?
Por ejemplo, he creado un panel en el que hay un botón "Cerrar todas las posiciones". Cuando hago clic en este botón, debería aparecer un cuadro "¿Está seguro? Sí/No. ¿Cómo implementarlo?

Actualmente heredando de CAppDialog, he creado un pequeño formulario con botones Ok/Cancelar. Al hacer clic en el botón "Ok", he añadido una línea

Pero el formulario de diálogo sigue en la pantalla.
¿Cómo solucionarlo?

void OnChartEvent(const int id,         // ID del evento
                  const long& lparam,   // Parámetro de tipo long event
                  const double& dparam, // Parámetro de tipo double event
                  const string& sparam  // Parámetro de tipo cadena eventos
                 )
{
  // Cerrar todas las cuentas
  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 cuadro de diálogo?
Por ejemplo, he creado un panel en el que hay un botón "Cerrar todas las posiciones". Cuando hago clic en este botón, debería aparecer un cuadro "¿Está seguro? Sí/No. ¿Cómo implementarlo?

Actualmente heredando de CAppDialog, he creado un pequeño formulario con botones Ok/Cancelar. Al hacer clic en el botón "Ok", he añadido una línea

Pero el formulario de diálogo sigue en la pantalla.
¿Cómo solucionarlo?

Tal vez este comentario ayude
 
Nextor cuadro de diálogo?
Por ejemplo, he creado un panel en el que hay un botón "Cerrar todas las posiciones". Cuando hago clic en este botón, debería aparecer un cuadro "¿Está seguro? Sí/No. ¿Cómo implementarlo?

Actualmente heredando de CAppDialog, he creado un pequeño formulario con botones Ok/Cancelar. Al hacer clic en el botón "Ok", he añadido una línea

Pero el formulario de diálogo sigue en la pantalla.
¿Cómo solucionarlo?

Tome el ejemplo de ' Close On Chart Panel' e inserte una llamada a 'MessageBox' en los manejadores de clic.

En el fichero 'Close On Chart Panel Dialog.mqh', haga estos cambios:

//+------------------------------------------------------------------+
//| Manejador 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);
     }
  }
//+------------------------------------------------------------------+
//| Manejador 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);
     }
  }
//+------------------------------------------------------------------+
//| Manejador 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();
     }
  }
//+------------------------------------------------------------------+
//| Manejador 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();
     }
  }


Resultado:


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

Hola gracias por su tutorial increíble

Estoy tratando de hacer mi propio , en mi panel haciendo clic en un botón el otro debe ser desactivar y ocultar , será ocultar cuando hago clic en el área del botón oculto todavía funciona

Pongo mis códigos aquí si usted me podría ayudar que sería genial

Indicador:

//+------------------------------------------------------------------+
//|Indicador_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;
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- asignación de búferes indicadores

   if(!ExtDialog.CreateQ(0,"Question",0,100,100,400,230,"This the test Question?"))
      return(INIT_FAILED);
//--- ejecutar aplicación
   if(!ExtDialog.Run())
      return(INIT_FAILED);
 
      

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada|
//+------------------------------------------------------------------+
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_calculado para la siguiente llamada
   return(rates_total);
  }

//+------------------------------------------------------------------+
//| Función 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);


  }

Clase:

//+------------------------------------------------------------------+
//|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|
//+------------------------------------------------------------------+
//--- sangrías y espacios
#define  INDENT_LEFT_ScrollQ                         (11)      // sangría desde la izquierda (teniendo en cuenta el ancho del borde) (sólo para la barra de desplazamiento)
#define  INDENT_LEFTQ                         (11)      // sangría desde la izquierda (teniendo en cuenta la anchura del borde)
#define  INDENT_TOPQ                          (11)      // sangría desde arriba (teniendo en cuenta la anchura del borde)
#define  INDENT_RIGHTQ                        (11)      // sangría desde la derecha (teniendo en cuenta la anchura del borde)
#define  INDENT_BOTTOMQ                       (11)      // sangría desde abajo (teniendo en cuenta la anchura del borde)
#define  CONTROLS_GAP_XQ                      (80)      // hueco por coordenada X
#define  CONTROLS_GAP_YQ                      (40)      // hueco por coordenada Y
//--- para botones
#define  BUTTON_WIDTHQ                        (60)     // tamaño por coordenada X
#define  BUTTON_HEIGHTQ                       (20)      // tamaño por coordenada Y
//--- para el área de indicación

#define  EDIT_HEIGHTQ                         (20)      // tamaño por coordenada Y
#define  GROUP_WIDTHQ                         (150)     // tamaño por coordenada X
#define  LIST_HEIGHTQ                         (379)     // tamaño por coordenada Y
#define  RADIO_HEIGHTQ                        (56)      // tamaño por coordenada Y
#define  CHECK_HEIGHTQ                        (93)      // tamaño por coordenada Y
//+------------------------------------------------------------------+
//| Clase CPanelDialog|
//| Uso: diálogo principal de la aplicación SimplePanel |
//+------------------------------------------------------------------+
class CPanelDialogQ : public CAppDialog
  {
private:

   CLabel            m_Label_Q_text;


   CButton           m_button_Yes;
   CButton           m_button_No;




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


public:
                     CPanelDialogQ(void);
                    ~CPanelDialogQ(void);
   //--- crear
   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);
   //--- manejador de eventos gráficos
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:

   //--- crear controles dependientes

   bool              CreateLabel_Q_text(string QT);

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


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


  };
//+------------------------------------------------------------------+
//| Manejo 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)
//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CPanelDialogQ::CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor|
//+------------------------------------------------------------------+
CPanelDialogQ::~CPanelDialogQ(void)
  {
  }
//+------------------------------------------------------------------+
//| Crear|
//+------------------------------------------------------------------+
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);
//--- crear controles dependientes

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

//--- tener éxito
   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;

//--- crear
   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);
// if(!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);
//--- tener éxito
   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;
//--- crear
   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);
//--- tener éxito
   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;
//--- crear
   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);
//--- tener éxito
   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();

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