Questions des débutants MQL4 MT4 MetaTrader 4 - page 221

 

Quelle est la meilleure façon d'accéder à une propriété d'une classe vers une autre propriété de la même classe ?

C'est-à-dire qu'au lieu de "this", je voudrais utiliser quelque chose comme "parent".

struct _Seeker {
        int holder;
        void Get(){holder = parent.prize;};
};
class Map {
        _Seeker seekerForPrize;
        int prize;
};
 

J'ai utilisé ArraySetAsSeries( array[], false) dans l'indicateur. Dans l'indicateur j'ai besoin d'utiliser iMa(...,i), il s'avère indexer d'une autre manière. Puis-je également modifier l'ordre d'indexation pour iMa() en tant que ArraySetAsSeries ?

Jusqu'à présent, j'ai procédé comme suit : rates_total-i (comptage à l'autre extrémité), mais je ne suis pas sûr que ce soit la bonne solution ?
.
ArraySetAsSeries(ExtMapBuffer4,Series);      
...
while(i<rates_total-1)
        {
         double maf=iMA(NULL,Used_Period,FAST_MA,0,Fmode,Fprice,i); // rates_total-i
         ExtMapBuffer4[i]=maf; // test 
...
 
Evgeny Potapov:

Quelle est la meilleure façon d'accéder à une propriété d'une classe vers une autre propriété de la même classe ?

C'est-à-dire qu'au lieu de "this", je voudrais utiliser quelque chose comme "parent".

Apprenez les mathématiques)

class Map;

struct _Seeker {
        Map* parent;
        int holder;
        _Seeker(Map* _parent):parent(_parent){}
        void Get(){holder = parent.prize;};
};

class Map {
        _Seeker seekerForPrize;
public:
        int prize;
        Map():seekerForPrize(&this){}
};
 

Les gars. Pouvez-vous me donner le code pour lier un indicateur à un numéro de compte, et en plus de la liaison à un compte, vous pourriez ajouter une clé de licence ?

Форум трейдеров - MQL5.community
Форум трейдеров - MQL5.community
  • www.mql5.com
MQL5: форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
 

Une question : comment puis-je faire référence à un élément de structure en substituant son nom par une chaîne de caractères ?

struct My
   {
   datetime time1;
   datetime time2;
   datetime time3;
   datetime time4;
   } my;

datetime val=GetValue(my,"time3");


datetime GetValue(My &my, string name)
   {
   return(my."name"); ?????????
   }
Celui qui peut me le dire, bravo !
 
Nauris Zukas:

J'ai utilisé ArraySetAsSeries( array[], false) dans l'indicateur. Dans l'indicateur j'ai besoin d'utiliser iMa(...,i), il s'avère indexer d'une autre manière. Puis-je également inverser l'ordre d'indexation pour iMa() comme ArraySetAsSeries ?

Jusqu'à présent, j'ai fait ceci : rates_total-i (compter à partir de l'autre extrémité), mais je ne suis pas sûr que ce soit la bonne solution ?

Je vais répondre moi-même (peut-être que quelqu'un en aura besoin aussi). Vous pouvez créer (refaire) un tampon de données en incluant par exemple MovingAverages.mqh (SimpleMAOnBuffer) et ne vous embêtez même pas avec ArraySetAsSeries, car il y a déjà ArrayGetAsSeries dans l'exemple.

//+------------------------------------------------------------------+
//| Data on array                                              |
//+------------------------------------------------------------------+
int DataBuffer(const int rates_total,const int prev_calculated,const int begin,
               const double& data[],double& buffer[])
  {
   int i,limit;
//--- check for data
//--- save as_series flags
   bool as_series_data=ArrayGetAsSeries(data);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
   if(as_series_data)
      ArraySetAsSeries(data,false);
   if(as_series_buffer)
      ArraySetAsSeries(buffer,false);
//--- first calculation or number of bars was changed
   if(prev_calculated==0) // first calculation
     {
      limit=begin+1;
      //--- set empty value for first bars
      for(i=0; i<limit-1; i++)
         buffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin; i<limit; i++)
         firstValue=data[i];
      buffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total-1; i++)
      buffer[i]=data[i];
//--- restore as_series flags
   if(as_series_data)
      ArraySetAsSeries(data,true);
   if(as_series_buffer)
      ArraySetAsSeries(buffer,true);
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Aleksei Stepanenko:

Une question : comment puis-je faire référence à un élément de structure en substituant son nom par une chaîne de caractères ?

Qui sait, ce sera bien fait !

Pas de noms de variables après la compilation,

Je dois inventer quelque chose avec les macrosubstitutions.

Je n'aime pas letype de chaîne, je m'attends toujours à beaucoup de choses inattendues avec elle :

struct My
{
   datetime time1;
   datetime time2;
   datetime time3;
   datetime time4;
   enum ENUM_FILDS {TIME_1, TIME_2, TIME_3, TIME_4};
} my;
#define  TIME_1 My::TIME_1
#define  TIME_2 My::TIME_2
#define  TIME_3 My::TIME_3
#define  TIME_4 My::TIME_4
datetime GetValue(My &MyStruct, My::ENUM_FILDS name)
{
   datetime result = 0;
   switch(name)
   {
      case TIME_1: result = MyStruct.time1; break;
      case TIME_2: result = MyStruct.time2; break;
      case TIME_3: result = MyStruct.time3; break;
      case TIME_4: result = MyStruct.time4; break;
   }
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   GetValue(my,TIME_1);
}
//+------------------------------------------------------------------+


UPD :

bien qu'il serait plus logique de mettre une méthode de travail avec les champs dans la structure, c'est-à-dire ainsi :

struct My
{
   datetime time1;
   datetime time2;
   datetime time3;
   datetime time4;
   enum ENUM_FILDS {TIME_1, TIME_2, TIME_3, TIME_4};
   datetime GetValue(ENUM_FILDS name)
   {
      datetime result = 0;
      switch(name)
      {
         case TIME_1: result = time1; break;
         case TIME_2: result = time2; break;
         case TIME_3: result = time3; break;
         case TIME_4: result = time4; break;
      }
   return(result);
   }
} my;
#define  TIME_1 My::TIME_1
#define  TIME_2 My::TIME_2
#define  TIME_3 My::TIME_3
#define  TIME_4 My::TIME_4

//+------------------------------------------------------------------+
void OnStart()
{
   my.GetValue(TIME_1);
}
//+------------------------------------------------------------------+
 
Igor Makanu:

il n'y aura pas de noms de variables après la compilation,

Je vois, Igor, je suppose que ça ne fonctionnera pas de manière élégante. Je pensais raccourcir le chemin vers les données pour plus de clarté, mais je vais avoir des feuilles de substitutions de cas et de macros. Je vais probablement me contenter d'un long enregistrement. Je vais y réfléchir, c'est une solution intéressante. Merci !

 
Aleksei Stepanenko:

Une question : comment puis-je faire référence à un élément de structure en substituant son nom par une chaîne de caractères ?

Celui qui peut me le dire, bravo !
struct My
{
   datetime time1;
   datetime time2;
   datetime time3;
   datetime time4;
   
   datetime operator[]( const string name )
   {
      if( name == "time1" )
         return time1;
      if( name == "time2" )
         return time2;
      if( name == "time3" )
         return time3;
      if( name == "time4" )
         return time4;
      return datetime( 0 );
   }
};

datetime GetValue( My& my, const string name )
{
   return my[name];
}

void OnStart()
{
   My my;
   datetime val = GetValue( my, "time3" );
}
 
Koldun Zloy:
Merci, je pensais qu'il y avait une option de substitution magique, sans la liste correspondante. Mais ça ne devait pas se faire. Merci !