Questions des débutants MQL5 MT5 MetaTrader 5 - page 1174

 
Alexey Viktorov:

La deuxième dimension et les dimensions suivantes d'un tableau ne peuvent pas être dynamiques. Par conséquent, comme un tableau est déclaré, par exemple, int Mas[][7] ; il doit être pris par MyFun(int &Mas[][7])

Oui, c'est vrai.
Merci. Je n'avais pas le cerveau pour ça.
 

Bonjour les programmeurs. Une fois de plus, je vous demande de m'aider. Il existe un indicateur standard à partir duquel je veux obtenir une seule valeur. J'ai connecté l'indicateur et copié un tableau de ses valeurs dans le tampon double buf_atr[] Imprimé dans le journal ArrayPrint(buf_atr) montre ces valeurs :

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

COMMENT APPLIQUER À LA CLÉ MASSIVE QUI A LA VALEUR 0.00030 ? Il s'avère que cette valeur n'est pas sur la bougie actuelle 0 et la précédente est déjà formée 1

Cela semble fonctionner, mais je ne sais pas comment accéder au tableau de cellules pour continuer à travailler avec lui ;(

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:

Bonjour les programmeurs. Une fois de plus, je vous demande de m'aider. Il existe un indicateur standard à partir duquel je veux obtenir une seule valeur. J'ai connecté l'indicateur et copié un tableau de ses valeurs dans le tampon double buf_atr[] Imprimé dans le journal ArrayPrint(buf_atr) montre ces valeurs :

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

COMMENT APPLIQUER À LA CLÉ MASSIVE QUI A LA VALEUR 0.00030 ? Il s'avère que cette valeur n'est pas sur la bougie actuelle 0 et la précédente est déjà formée 1

Cela semble fonctionner, mais je ne sais pas comment accéder au tableau de cellules pour continuer à travailler avec lui ;(

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

}


ÇA MARCHE ! !! Je dois me tourner versbuf_atr[buf_size-1] J'AI TOUT essayé. Merci beaucoup à vousVitaly Muzichenko.

 

Le style mql est-il obligatoire, la référence au tableau ?

(
                                     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 )
 
Création de la classeCAppDialogPTR- descendante de CAppDialog - conseils sur la manière de remplacer correctement m_background, m_caption ... de la classe CDialog pour y accéder depuis ma 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:
Création de la classeCAppDialogPTR- descendante de CAppDialog - conseils sur la façon de remplacer correctement m_background, m_caption ... de la classe CDialog pour y accéder depuis ma classe ?

Dialog.mqh.

Tu ne peux pas. Ces objets sont verrouillés contre toute modification directe dans votre classe, comme l'indique le mot-clé private. Vous ne pouvez pas travailler avec eux directement. Utilisez les méthodes de la classe CDialog qui fonctionnent avec ces champs.

 
Vasiliy Sokolov:

Tu ne peux pas. Ces objets sont verrouillés contre toute modification directe dans votre classe, comme l'indique le mot-clé private. Vous ne pouvez pas travailler avec eux directement. Utilisez les méthodes de votre classe CDialog qui fonctionnent avec ces champs.

Supposons.

Une instance créée de la classeCAppDialogPTR possède des contrôles (classe CWndContainer-> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)) ; }) qui permet d'accéder àm_background et m_caption.

1) Quelle est la syntaxe pour accéder (se référer à la mémoire) à l'objet créé ?

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

Supposons.

Une instance créée de la classeCAppDialogPTR possède des contrôles (classe CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)) ; } ) par lequel on peut accéder àm_background, m_caption

1) Quelle est la syntaxe pour accéder (se référer à la mémoire) à l'objet créé ?

Vous ne pouvez toujours pas accéder aux contrails de manière adressable via la collection m_controls car elle est également fermée, de plus vous ne savez pas quel index correspond à quel contrôle particulier. L'idée est que CDialog verrouille l'accès aux éléments qui le composent, mais vous permet de gérer ses principales propriétés de manière cohérente. Par exemple, nous ne pouvons pas accéder directement à m_caption mais nous pouvons modifier son texte en utilisant la méthode Caption(const string text).

Ce que vous voulez, c'est du piratage par essence. En principe, lorsqu'on utilise un outil MQ, on veut faire tel ou tel hack, vous n'êtes donc pas le seul. Le plus simple est sans doute de copier la bibliothèque dans un répertoire distinct et de déplacer la section privée vers la section protégée. C'est grossier et stupide, mais ça va marcher. Les autres options sont peu probables - code trop difficile.

 
Vasiliy Sokolov:

Vous ne pourrez pas accéder aux contreparties via la collection m_controls de toute façon, car elle est également fermée, de plus, vous ne savez pas quel index correspond à quel contrôle. L'idée est que CDialog verrouille l'accès aux éléments qui le composent, mais vous permet de gérer ses principales propriétés de manière cohérente. Par exemple, nous ne pouvons pas accéder directement à m_caption mais nous pouvons modifier son texte en utilisant la méthode Caption(const string text).

Ce que vous voulez, c'est du piratage par essence. En principe, lorsqu'on utilise un outil MQ, on veut faire tel ou tel hack, vous n'êtes donc pas le seul. Le plus simple est sans doute de copier la bibliothèque dans un répertoire distinct et de déplacer la section privée vers la section protégée. C'est grossier et stupide, mais ça va marcher. Les autres options ont peu de chances de fonctionner car le code est trop difficile.

Modifier le code source de MQ et rendre les méthodes publiques n'est clairement pas notre méthode :).
Mais je peux faire référence aux propriétés de la légende après la déclaration de la variable globale panel :

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

Non seulement ce n'est pas beau à voir, mais ce code se cache derrière la classeCAppDialogPTR. Comment puis-je faire la même chose dans la classeCAppDialogPTR ?