Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1174

 
Alexey Viktorov:

A segunda e subsequentes dimensões de uma matriz não podem ser dinâmicas. Portanto, como um array é declarado, por exemplo, int Mas[][7]; deve ser tomado por MyFun(int & Mas[][7])

Sim.
Obrigado. Eu não tinha cérebro para isso.
 

Olá programadores. Mais uma vez peço a vossa ajuda. Existe um indicador padrão do qual quero obter um único valor. Liguei o indicador e copiei uma matriz dos seus valores no buffer duplo buf_atr[] Impresso no log ArrayPrint(buf_atr) mostra estes 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

COMO APLICAR A CHAVE MASSIVA QUE TEM O VALOR 0.00030? Acontece que este valor não está na vela actual 0 e a anterior já está formada 1

Parece funcionar, mas não sei como aceder à matriz de células para continuar a trabalhar com ela;(

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:

Olá programadores. Mais uma vez peço a vossa ajuda. Existe um indicador padrão do qual quero obter um único valor. Liguei o indicador e copiei uma matriz dos seus valores no buffer duplo buf_atr[] Impresso no log ArrayPrint(buf_atr) mostra estes 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

COMO APLICAR A CHAVE MASSIVA QUE TEM O VALOR 0.00030? Acontece que este valor não está na vela actual 0 e a anterior já formou 1

Parece funcionar, mas não sei como aceder à matriz de células para continuar a trabalhar com ela;(

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 SIM!!!! Preciso de recorrer abuf_atr[buf_size-1] Tentei TUDO. Muito obrigado a siVitaly Muzichenko.

 

O estilo mql é obrigatório, referência de matriz?

(
                                     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 )
 
Criada a classeCAppDialogPTR- descendente de CAppDialog - aconselha a sobreposição adequada de m_background, m_caption ... da classe CDialog para aceder a eles da minha classe?
#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);
}

Dialog.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:
Criada a classeCAppDialogPTR- descendente de CAppDialog - aconselha a sobreposição adequada de m_background, m_caption ... da classe CDialog para aceder a eles da minha classe?

Dialog.mqh.

Não pode. Estes objectos são bloqueados contra modificações directas na sua classe, como indicado pela palavra-chave privada. Não se pode trabalhar directamente com eles. Utilizar métodos da classe CDialog que funcionam com estes campos.

 
Vasiliy Sokolov:

Não pode. Estes objectos são bloqueados contra modificações directas na sua classe, como indicado pela palavra-chave privada. Não se pode trabalhar directamente com eles. Use métodos da sua classe de CDialog que funcionam com estes campos.

Vamos supor.

Uma instância criada da classeCAppDialogPTR tem controlos (classe CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); }) através do qualm_background, m_caption pode ser acedido

1) Qual é a sintaxe para aceder (referindo-se à memória) ao objecto criado?

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

Suponha-se.

Uma instância criada da classeCAppDialogPTR tem controlos (classe CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); } ) através do qualm_background, m_caption pode ser acedido

1) Qual é a sintaxe para aceder (referindo-se à memória) ao objecto criado?

Ainda não se pode aceder aos contrails endereçados através da colecção m_controls, porque também está fechada, além de não se saber que índice corresponde a que controlo em particular. A ideia é que o CDialog bloqueia o acesso aos elementos que o compõem, mas permite gerir as suas principais propriedades de forma consistente. Por exemplo, não podemos aceder directamente a m_caption mas podemos alterar o seu texto usando o método Caption(const string text).

O que se quer é hackear na essência. Em princípio, ao utilizar qualquer ferramenta MQ que queira fazer este ou aquele hack, não está sozinho. Provavelmente a forma mais fácil é copiar a biblioteca para um directório separado e mover a secção privada para protegida. Isto é rude e estúpido, mas vai funcionar. Outras opções são improváveis - código demasiado duro.

 
Vasiliy Sokolov:

De qualquer modo, não poderá aceder às contrapartidas através da colecção m_controlos, porque também está fechada, além disso, não sabe que índice corresponde a que controlo. A ideia é que o CDialog bloqueia o acesso aos elementos que o compõem, mas permite gerir as suas principais propriedades de forma consistente. Por exemplo, não podemos aceder directamente a m_caption mas podemos alterar o seu texto usando o método Caption(const string text).

O que se quer é hackear na essência. Em princípio, ao utilizar qualquer ferramenta MQ que queira fazer este ou aquele hack, não está sozinho. Provavelmente a forma mais fácil é copiar a biblioteca para um directório separado e mover a secção privada para protegida. Isto é rude e estúpido, mas vai funcionar. As outras opções são pouco prováveis de funcionar porque o código é demasiado duro.

Modificar o código fonte MQ e os métodos de puxar para o público não é claramente o nosso método :).
Mas posso referir-me às propriedades de legenda após declaração de painel variável global:

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;
               }
               
             }

Mas não só não parece agradável, como também este código por detrás da classeCAppDialogPTR. Como posso fazer o mesmo dentro da classeCAppDialogPTR ?