Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 221

 

¿Cuál es la mejor manera de acceder a una propiedad de una clase a otra propiedad de la misma clase?

Es decir, en lugar de "esto", me gustaría utilizar algo como "padre".

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

He utilizado ArraySetAsSeries( array[], false) en el indicador. En el indicador necesito usar iMa(...,i), resulta que la indexación es de otra manera. ¿Puedo también cambiar el orden de indexación de iMa() como ArraySetAsSeries?

Hasta ahora lo he hecho así: rates_total-i (cuenta en el otro extremo), pero no estoy seguro de que sea la solución correcta...
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:

¿Cuál es la mejor manera de acceder a una propiedad de una clase a otra propiedad de la misma clase?

Es decir, en lugar de "esto", me gustaría utilizar algo como "padre".

Aprende las matemáticas)

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

Chicos. ¿Puede darme el código para vincular un indicador a un número de cuenta, y además de vincularlo a una cuenta, podría añadir una clave de licencia?

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

Una pregunta, ¿cómo puedo referirme a un elemento de la estructura sustituyendo su nombre por una cadena?

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"); ?????????
   }
Quien pueda decírmelo, ¡bien hecho!
 
Nauris Zukas:

He utilizado ArraySetAsSeries( array[], false) en el indicador. En el indicador necesito usar iMa(...,i), resulta que la indexación es de otra manera. ¿Puedo también invertir el orden de indexación de iMa() como ArraySetAsSeries?

Hasta ahora he hecho esto: rates_total-i (cuenta desde el otro extremo), pero no estoy seguro de que sea la solución correcta...

Permítanme que me responda a mí mismo (tal vez alguien lo necesite también). Puedes crear (rehacer) el buffer de datos por ejemplo incluye MovingAverages.mqh (SimpleMAOnBuffer) y ni siquiera te molestes con ArraySetAsSeries, porque ya tiene ArrayGetAsSeries en el ejemplo.

//+------------------------------------------------------------------+
//| 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:

Una pregunta, ¿cómo puedo referirme a un elemento de la estructura sustituyendo su nombre por una cadena?

Quién va a avisar, ¡estará bien hecho!

No hay nombres de variables después de la compilación,

Tengo que inventar algo con las macrosustituciones.

No me gusta eltipo de cuerda, siempre espero un montón de sorpresas con ella:

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:

aunque sería más lógico poner un método de trabajo con campos en la estructura, es decir, así:

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:

no habrá nombres de variables después de la compilación,

Ya veo, Igor, supongo que no funcionará con gracia. Pensaba acortar la ruta de acceso a los datos para mayor claridad, pero me saldrán hojas de sustituciones de mayúsculas y min úsculas. Probablemente me conformaré con un disco largo. Pero lo pensaré, es una solución interesante. ¡Gracias!

 
Aleksei Stepanenko:

Una pregunta, ¿cómo puedo referirme a un elemento de la estructura sustituyendo su nombre por una cadena?

Quien pueda decírmelo, ¡bien hecho!
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:
Gracias, pensaba que había una opción de sustitución mágica, sin la lista de coincidencias. Pero supongo que no estaba destinado a ser. Gracias.
Razón de la queja: