Gemischtes Array

 

Hallo,


mal da eine Frage, hab ja noch nie globale Arrays verwendet

ich will ein Array definieren, das würde ich im globalen Bereich machen

string TestArray[][];		// muss ich hier schon eine große definieren?????

dann würde ich das Array über eine Funktion in der OnInit füllen

void FillArray()
{
   int total = SymbolsTotal(true);
   
   ArrayResize(GridArray,total,0);
   
   for(int i = 0; i<total;i++)
   {
   ArrayFill(GridArray,0,0,"EURUSD");   // 1 Dimension
   bool test FileLesen(......);                 
   ArrayFill(...                        // 2 Dimension
   }

}

jetzt ist mir schon klar, ich kann kein gemischtes Array befallen, aber den Bool Wert, dann ich auch als string speichern

nur wie spreche ich den 2ten Wert beim befüllen an?


das Ergebnis des Arrays sollte dann ja so sein

EURUSD 1

GBPUSD 0

DAX     1

US30    1

...


danke

amando

 

Steht alles in den Doks:

ArrayResize

Verändert die Größe der ersten Dimension des Arrays

Für gemischte Arrays kannst Du struct verwenden und ein Array 'daraus' machen:

struct mix {
        double a;
        int b;
        bool c;
};
mix ArrMix[];

Bei mehrdimensionalen Arrays brauchts Du für jede Dimension Schleife und Index und die musst die niedrigeren Schleifenindices immer neu auf 0 setzen.

Dokumentation zu MQL5: Operationen mit Arrays / ArrayResize
Dokumentation zu MQL5: Operationen mit Arrays / ArrayResize
  • www.mql5.com
ArrayResize - Operationen mit Arrays - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Carl Schreiber:

Steht alles in den Doks:

ArrayResize

Verändert die Größe der ersten Dimension des Arrays

Für gemischte Arrays kannst Du struct verwenden und ein Array 'daraus' machen:

Bei mehrdimensionalen Arrays brauchts Du für jede Dimension Schleife und Index und die musst die niedrigeren Schleifenindices immer neu auf 0 setzen.

was meinst Du mit die niedrigeren Schleifenindices immer neu auf 0 setzten?

 
amando:

was meinst Du mit die niedrigeren Schleifenindices immer neu auf 0 setzten?

Kurz gesagt die Funktionen hier sind nur mit eindimensionalen Arrays nutzbar.

https://www.mql5.com/de/docs/array

Dokumentation zu MQL5: Operationen mit Arrays
Dokumentation zu MQL5: Operationen mit Arrays
  • www.mql5.com
Operationen mit Arrays - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
amando:

was meinst Du mit die niedrigeren Schleifenindices immer neu auf 0 setzten?

ungetstet!!:

#define sz1=9
#define sz2=5
struct s { double d; int i; bool b; };
s a[][sz1][sz2];
...
ArrayResize(a,7);
...
// e.g. set all 
int i0=ArrayRange(a,0),i1,i2;
while(i0-->0){
        i0=sz0; // oder ArrayRange(a,1)
        while(i1-->0){
                i2=sz2; // oder ArrayRange(a,2)
                while(i2-->>0) {
                      a[i0][i1][i2] = 0.1; 
                      ...
                }
        }
}

so etwa.

 
Carl Schreiber:

ungetstet!!:

so etwa.

ich hab das jetzt so gelöst, das funktioniert mit dem befüllen mal gut

struct States
  {
   string            symbol;
   bool              ATRGridState;
   bool              GridState;
   int               GridPoint;
   bool              TP0SymbolState;
  };
States states[];


void FillArray()
  {
   int total = SymbolsTotal(true);

   ArrayFree(states);
   ArrayResize(states,total,0);

   for(int i = 0; i<total; i++)
     {
      string sym = SymbolName(i, true);
      SymbolSelect(sym,true);
      states[i].symbol = sym;
      states[i].ATRGridState = FileLesen("ATRGrid"+sym+".csv",__FUNCTION__);
      states[i].GridState = FileLesen("Grid"+sym+".csv",__FUNCTION__);
      states[i].GridPoint = FileLesen("GridPoint"+sym+".csv",__FUNCTION__);
      states[i].TP0SymbolState = FileLesen("TP0"+sym+".csv",__FUNCTION__);

     }

  }

das funktioniert soweit super, jetzt hab ich nur noch das Problem, 


wie suche ich einen String im Array

ArrayBSerach funktioniert ja nur mit Zahlen.

 
amando:

ich hab das jetzt so gelöst, das funktioniert mit dem befüllen mal gut


das funktioniert soweit super, jetzt hab ich nur noch das Problem, 


wie suche ich einen String im Array

ArrayBSerach funktioniert ja nur mit Zahlen.

Schleife über alles, für Bsearch muss das Array sortiert sein, ginge aber auch. Ist halt immer nur de erste Dimension.

Dokumentation zu MQL5: Operationen mit Arrays / ArraySort
Dokumentation zu MQL5: Operationen mit Arrays / ArraySort
  • www.mql5.com
ArraySort - Operationen mit Arrays - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Carl Schreiber:

Schleife über alles, für Bsearch muss das Array sortiert sein, ginge aber auch. Ist halt immer nur de erste Dimension.

Ja aber der BSerach kann ich den auch auf String machen?

lt doku nicht

 
amando:

Ja aber der BSerach kann ich den auch auf String machen?

lt doku nicht

Ja schon, auch ein String ist eine Bit-Kombination wie eine Zahl, nur ist vielleicht die Reihung - wenn sie wichtig ist - nicht wie gewünscht oder gedacht.

BSearch braucht halt eine eindeutige Sortierung, egal welche. Versuch's halt.

 
Carl Schreiber:

Ja schon, auch ein String ist eine Bit-Kombination wie eine Zahl, nur ist vielleicht die Reihung - wenn sie wichtig ist - nicht wie gewünscht oder gedacht.

Versuch's halt.

ok, das geht so auch, mit StringFind kann ich Arrays auch durchsuchen und vergleichen, dann brauch ich nicht vorher noch sortieren


      for(int i=0;i<ArraySize(states);i++)
      {
      if(StringFind(states[i].symbol,"US30") != -1)
        {
         Print("Position ",i," = ",states[i].symbol);
        }
     }
ps: hab ich im englischen Forum gefunden über Dr. Google
Dokumentation zu MQL5: Stringfunktionen / StringFind
Dokumentation zu MQL5: Stringfunktionen / StringFind
  • www.mql5.com
StringFind - Stringfunktionen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5