Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 221

 

Как лучше организовать доступ свойства класса к другому свойству этого же класса? 

То есть вместо "this", хотелось бы использовать что-то типа "parent".

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

Я  в индикаторе использовал  ArraySetAsSeries( array[],  false). В индикаторе мне понадобилось использовать iMa(...,i), получается индексация в другую сторону. Можно для iMa() тоже как-то поменять порядок индексации как ArraySetAsSeries?

Пока сделал так: rates_total-i (с другого конца считать ), только не уверен это ли правильное решение?
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:

Как лучше организовать доступ свойства класса к другому свойству этого же класса? 

То есть вместо "this", хотелось бы использовать что-то типа "parent".

Учи мат.часть)

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

Ребята. Подскажите пожалуйста код, для привязки индикатора к номеру счета, и чтоб помимо привязки к счету, можно было бы добавить лицензионный ключ?) Большое спасибо...  

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

Есть вопрос, как обратиться к элементу структуры подставляя его имя в виде строки?

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"); ?????????
   }
Кто подскажет, будет молодец!
 
Nauris Zukas:

Я  в индикаторе использовал  ArraySetAsSeries( array[],  false). В индикаторе мне понадобилось использовать iMa(...,i), получается индексация в другую сторону. Можно для iMa() тоже как-то поменять порядок индексации как ArraySetAsSeries?

Пока сделал так: rates_total-i (с другого конца считать ), только не уверен это ли правильное решение?

Отвечу сам себе (может кому-то тоже пригодится). Можно сделать (переделать) буфер данных по примеру include MovingAverages.mqh (SimpleMAOnBuffer) и даже не заморачиватся на ArraySetAsSeries, так как в примере уже есть ArrayGetAsSeries.

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

Есть вопрос, как обратиться к элементу структуры подставляя его имя в виде строки?

Кто подскажет, будет молодец!

после компиляции имен переменных не будет,

что то с макроподстановками нужно придумывать

тип string не люблю - много неожиданных вариантов с ним всегда ожидаю, с перечислением набросал пример, может так устроит:

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:

хотя логичнее в структуру метод работы с полями внести, т.е. так:

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:

после компиляции имен переменных не будет,

Понял, Игорь, видать изящно не получится. Думал укоротить путь к данным для наглядности, а получу простыни case и макроподстановок. Смирюсь, наверное, с длинной записью. Хотя подумаю ещё, решение интересное. Спасибо!

 
Aleksei Stepanenko:

Есть вопрос, как обратиться к элементу структуры подставляя его имя в виде строки?

Кто подскажет, будет молодец!
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:
Спасибо, думал есть вариант волшебной подстановки, без списка соответствия. Но видать не судьба. Спасибо!
Причина обращения: