Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 221

 

Qual è il modo migliore per accedere a una proprietà di una classe a un'altra proprietà della stessa classe?

Cioè, invece di "questo", vorrei usare qualcosa come "genitore".

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

Ho usato ArraySetAsSeries( array[], false) nell'indicatore. In indicatore ho bisogno di usare iMa(...,i), risulta l'indicizzazione in un altro modo. Posso anche cambiare l'ordine di indicizzazione per iMa() come ArraySetAsSeries?

Finora ho fatto così: rates_total-i (count all'altra estremità), ma non sono sicuro che questa sia la soluzione giusta?
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:

Qual è il modo migliore per accedere a una proprietà di una classe a un'altra proprietà della stessa classe?

Cioè, invece di "questo", vorrei usare qualcosa come "genitore".

Imparare la matematica)

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

Ragazzi. Puoi per favore darmi il codice per legare un indicatore a un numero di conto, e oltre a legarlo a un conto, si potrebbe aggiungere una chiave di licenza?

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

Una domanda: come faccio a riferirmi a un elemento della struttura sostituendo il suo nome con una stringa?

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"); ?????????
   }
Chi riesce a dirmelo, ben fatto!
 
Nauris Zukas:

Ho usato ArraySetAsSeries( array[], false) nell'indicatore. In indicatore ho bisogno di usare iMa(...,i), risulta l'indicizzazione in un altro modo. Posso anche invertire l'ordine di indicizzazione per iMa() come ArraySetAsSeries?

Finora ho fatto così: rates_total-i (conta dall'altra parte), ma non sono sicuro che questa sia la soluzione giusta?

Mi rispondo da solo (forse anche qualcuno ne avrà bisogno). Puoi creare (rifare) il buffer di dati per esempio includere MovingAverages.mqh (SimpleMAOnBuffer) e non preoccuparti nemmeno di ArraySetAsSeries, perché ha già ArrayGetAsSeries nell'esempio.

//+------------------------------------------------------------------+
//| 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 domanda: come faccio a riferirmi a un elemento della struttura sostituendo il suo nome con una stringa?

Chi lo richiederà, sarà ben fatto!

Nessun nome di variabile dopo la compilazione,

Devo inventare qualcosa con le macrosostituzioni.

Non mi piace iltipo di stringa, mi aspetto sempre un sacco di cose inaspettate con essa:

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:

anche se sarebbe più logico mettere un metodo di lavoro con i campi nella struttura, cioè così:

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:

non ci saranno nomi di variabili dopo la compilazione,

Capisco, Igor, immagino che non funzionerà con grazia. Ho pensato di accorciare il percorso dei dati per chiarezza, ma avrò fogli di sostituzioni di casi e macro. Probabilmente mi accontenterò di un disco lungo. Ci penserò però, è una soluzione interessante, grazie!

 
Aleksei Stepanenko:

Una domanda: come faccio a riferirmi a un elemento della struttura sostituendo il suo nome con una stringa?

Chi riesce a dirmelo, ben fatto!
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:
Grazie, pensavo ci fosse un'opzione di sostituzione magica, nessuna lista corrispondente. Ma non era destino. Grazie!