Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 221

 

Wie kann man am besten von einer Eigenschaft einer Klasse auf eine andere Eigenschaft der gleichen Klasse zugreifen?

Das heißt, statt "this" würde ich gerne etwas wie "parent" verwenden.

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

Ich habe ArraySetAsSeries( array[], false) im Indikator verwendet. In Indikator muss ich iMa(...,i) verwenden, es stellt sich heraus, Indizierung in einem anderen Weg. Kann ich auch die Indizierungsreihenfolge für iMa() als ArraySetAsSeries ändern?

Bisher habe ich es so gemacht: rates_total-i (count am anderen Ende), aber ich bin nicht sicher, ob das die richtige Lösung ist.
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:

Wie kann man am besten von einer Eigenschaft einer Klasse auf eine andere Eigenschaft der gleichen Klasse zugreifen?

Das heißt, statt "this" würde ich gerne etwas wie "parent" verwenden.

Lernen Sie das Rechnen)

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

Leute. Können Sie mir bitte den Code geben, um einen Indikator an eine Kontonummer zu binden, und zusätzlich zur Bindung an ein Konto einen Lizenzschlüssel hinzufügen?

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

Eine Frage: Wie kann ich auf ein Strukturelement verweisen, indem ich seinen Namen als String einsetze?

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"); ?????????
   }
Wer es mir sagen kann, gut gemacht!
 
Nauris Zukas:

Ich habe ArraySetAsSeries( array[], false) im Indikator verwendet. In Indikator muss ich iMa(...,i) verwenden, es stellt sich heraus, Indizierung in einem anderen Weg. Kann ich auch die Indexierungsreihenfolge für iMa() als ArraySetAsSeries umkehren?

Bisher habe ich dies getan: rates_total-i (Zählung vom anderen Ende), nur nicht sicher, ob dies die richtige Lösung ist?

Lassen Sie mich selbst antworten (vielleicht braucht es jemand anderes auch). Sie können erstellen (Remake) Datenpuffer durch Beispiel enthalten MovingAverages.mqh (SimpleMAOnBuffer) und nicht einmal die Mühe mit ArraySetAsSeries, weil es bereits ArrayGetAsSeries im Beispiel hat.

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

Eine Frage: Wie kann ich auf ein Strukturelement verweisen, indem ich seinen Namen als String einsetze?

Wer souffliert, wird es gut machen!

Keine Variablennamen nach der Kompilierung,

Ich muss etwas mit Makrosubstitutionen erfinden.

Ich mag denString-Typ nicht, ich erwarte immer eine Menge unerwarteter Dinge damit:

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:

obwohl es logischer wäre, eine Methode für die Arbeit mit Feldern in die Struktur einzubauen, d.h. so:

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:

gibt es nach der Kompilierung keine Variablennamen mehr,

Verstehe, Igor, ich schätze, es wird nicht reibungslos funktionieren. Ich dachte, ich würde den Pfad zu den Daten der Übersichtlichkeit halber kürzen, aber ich werde Blätter mit Groß- und Kleinschreibung und Makro-Substitutionen bekommen. Ich werde mich wahrscheinlich mit einem langen Datensatz zufrieden geben. Ich werde aber darüber nachdenken, das ist eine interessante Lösung. Danke!

 
Aleksei Stepanenko:

Eine Frage: Wie kann ich auf ein Strukturelement verweisen, indem ich seinen Namen als String einsetze?

Wer es mir sagen kann, gut gemacht!
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:
Danke, ich dachte, es gäbe eine magische Ersetzungsoption, ohne die passende Liste. Aber es hat wohl nicht sollen sein. Ich danke Ihnen!