Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1174

 
Alexey Viktorov:

La segunda y siguientes dimensiones de un array no pueden ser dinámicas. Por lo tanto, como se declara un array, por ejemplo, int Mas[][7]; debe ser tomado por MyFun(int &Mas[][7])

Sí, lo es.
Gracias. No tenía el cerebro para ello.
 

Hola programadores. Una vez más les pido su ayuda. Tengo un indicador estándar del que quiero obtener un único valor. He conectado el indicador y copiado un array de sus valores en el buffer double buf_atr[] Impreso en el log ArrayPrint(buf_atr) muestra estos valores:

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

¿CÓMO SE APLICA A LA CLAVE MASIVA QUE TIENE EL VALOR 0.00030? Resulta que este valor no está en la vela actual 0 y la anterior ya está formada 1

Parece que funciona, pero cómo acceder al array de celdas para seguir trabajando con él no lo sé ;(

input int InpPeriod=14;  // period
int handleIndicator; //указатель на индикатор


int OnInit()
{  
  
handleIndicator = iCustom(NULL,0,"Examples\\INDICATOR",InpPeriod);

   return(INIT_SUCCEEDED);
}



void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);

ArrayPrint(buf_atr);

}
 
Kolya32:

Hola programadores. Una vez más les pido su ayuda. Tengo un indicador estándar del que quiero obtener un único valor. He conectado el indicador y copiado un array de sus valores en el buffer double buf_atr[] Impreso en el log ArrayPrint(buf_atr) muestra estos valores:

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

¿CÓMO SE APLICA A LA CLAVE MASIVA QUE TIENE EL VALOR 0.00030? Resulta que este valor no está en la vela actual 0 y la anterior ya está formada 1

Parece que funciona, pero cómo acceder al array de celdas para seguir trabajando con él no lo sé ;(

void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}
 
Vitaly Muzichenko:
void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}


¡¡¡FUNCIONA YAY!!! Tengo que pasar abuf_atr[buf_size-1] He intentado todo. Muchas gracias,Vitaly Muzichenko.

 

¿Es obligatorio el estilo mql, la referencia al array?

(
                                     double &value[],// Buffer of values
                                     double& clr[],                                 // Color buffer
                                     const bool asSeries,                           // Numbering flag as in time series
                                     const string label,                           // Series name
                                     const color& colors[],                        // Line colors )
 
Creada la claseCAppDialogPTR- descendiente de CAppDialog - aconsejar cómo anular correctamente m_background, m_caption ... de la clase CDialog para acceder a ellos desde mi clase?
#property strict
#include <Controls\Dialog.mqh>

class CAppDialogPTR : public CAppDialog
{
private:
   int               m_deinit_reason;
public:
   CAppDialogPTR(void){};
   ~CAppDialogPTR(void){};
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
};

bool CAppDialogPTR::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
   m_deinit_reason=WRONG_VALUE;
   bool res = CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);
   return(res);
}

Diálogo.mqh.

***
class CDialog : public CWndContainer
  {
private:
   //--- dependent controls
   CPanel            m_white_border;        // the "white border" object
   CPanel            m_background;          // the background object
   CEdit             m_caption;             // the window title object
   CBmpButton        m_button_close;        // the "Close" button object
   CWndClient        m_client_area;         // the client area object
***
 
Peter Vorobyev:
Creada la claseCAppDialogPTR- descendiente de CAppDialog - aconsejar cómo anular correctamente m_background, m_caption ... de la clase CDialog para acceder a ellos desde mi clase?

Diálogo.mqh.

No se puede. Estos objetos están bloqueados para que no puedan ser modificados directamente en su clase, como indica la palabra clave private. No puedes trabajar con ellos directamente. Utilice los métodos de la clase CDialog que trabajan con estos campos.

 
Vasiliy Sokolov:

No se puede. Estos objetos están bloqueados para que no puedan ser modificados directamente en su clase, como indica la palabra clave private. No puedes trabajar con ellos directamente. Utilice los métodos de su clase CDialog que trabajan con estos campos.

Supongamos.

Una instancia creada de la claseCAppDialogPTR tiene controles (clase CWndContainer-> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); }) a través del cual se puede acceder am_background, m_caption

1) ¿Cuál es la sintaxis para acceder (referirse a la memoria) al objeto creado?

"CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);"
 
Peter Vorobyev:

Supongamos.

Una instancia creada de la claseCAppDialogPTR tiene controles (clase CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); } ) a través del cual se puede acceder am_background, m_caption

1) ¿Cuál es la sintaxis para acceder (referirse a la memoria) al objeto creado?

Sigues sin poder acceder a los contrails de forma direccionable a través de la colección m_controls, porque también está cerrada, además de que no sabes qué índice corresponde a qué control concreto. La idea es que CDialog bloquea el acceso a los elementos que lo componen, pero permite gestionar sus propiedades principales de forma coherente. Por ejemplo, no podemos acceder a m_caption directamente, pero podemos cambiar su texto utilizando el método Caption(const string text).

Lo que quieres es hackear en esencia. En principio cuando se utiliza cualquier herramienta MQ se quiere hacer tal o cual hack, así que no eres el único. Probablemente la forma más fácil es copiar la biblioteca a un directorio separado y mover la sección privada a protegida. Esto es burdo y tonto, pero funcionará. Otras opciones son poco probables: un código demasiado duro.

 
Vasiliy Sokolov:

De todos modos, no podrás acceder a las contrapartes a través de la colección m_controls, porque también está cerrada, además, no sabes qué índice corresponde a qué control. La idea es que CDialog bloquea el acceso a los elementos que lo componen, pero permite gestionar las propiedades principales de forma coherente. Por ejemplo, no podemos acceder a m_caption directamente, pero podemos cambiar su texto utilizando el método Caption(const string text).

Lo que quieres es hackear en esencia. En principio cuando se utiliza cualquier herramienta MQ se quiere hacer tal o cual hack, así que no eres el único. Probablemente la forma más fácil es copiar la biblioteca a un directorio separado y mover la sección privada a protegida. Esto es burdo y tonto, pero funcionará. Es poco probable que las otras opciones funcionen porque el código es demasiado difícil.

Modificar el código fuente de MQ y sacar los métodos a público no es claramente nuestro método :).
Pero puedo referirme a las propiedades de Caption después de la declaración del panel de variables globales:

CAppDialogPTR panel;

            int total=panel.ControlsTotal();
            for(int i=0;i<total;i++)
            {
               CWnd *_control=panel.Control(i);
               string _control_name=_control.Name();

               if(StringFind(_control_name,"Caption")>0)
               {
                  CEdit *_caption=(CEdit*)_control;
                  _caption.Text("test";
                  _caption.Color(clrRed);
                  ChartRedraw();
                  break;
               }
               
             }

Pero no sólo no se ve bien, sino que este código detrás de la claseCAppDialogPTR. ¿Cómo puedo hacer lo mismo dentro de la claseCAppDialogPTR?