|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Zeilenweise mit Arrays sortiern
Wie packe ich so etwas in Arrays:
string,double,double,int => erste zusammenhängende Zeile Code:
Beispiel: Index Range Spread Trades Dax 60.5 2.0 3 Dow 120.0 2.9 1 Wenn ich nun z.B. nach Trades sortiere, müssen ja die anderen Werte trotzdem noch zu dem betreffenden Index gehören, das heißt, die gesamte Zeile rückt an eine andere Stelle. Ich krieg das nicht gebacken. Geht schon damit los, daß MT meckert, weil ich einen string dabei habe. Kann jemand helfen? AVT |
|
|||
In C++ gibts doch Klassen mit denen sowas möglich sein sollte. Obs die bei mql auch gibt, weiß ich nicht. Da jedes Array soviel ich weiß nur einen Daten-Typ aufnehmen kann, wird das so wohl nix werden.
Man könnte vielleicht versuchen ne Tabelle mit den Daten zu füllen. |
|
|||
Vielleicht kann man alle Daten als string in einem string Array konvertieren und speichern.
|
|
|||
Einfach die Sachen in ein struct packen und ein Array damit erstellen:
struct s_tabelle { string Index double Range double Spread int Trades }; s_tabelle tabelle[2]; // für jeden index ein eintrag |
|
|||
Zwischenstand
Danke für Eure Antworten. Dummerweise kann MT keine string arrays sortieren, dazu kommt, daß nur die erste Dimension sortiert wird.
Erst mal habe ich rausfinden müssen, wie man die x-te Dimension sortieren kann, das sieht bis jetzt so aus: Code:
void OnStart() { // === an array can ONLY be sorted IN FIRST DIMENSION // === the 1st dimension is free (in output its value is Zero) int SeondDataArray[5][3]={{,7,3}, {,3,1}, {,57,14}, {,12,4}, {,11,1} }; int NoOfElements=ArrayRange(SeondDataArray,0); //GetTheNumberForLoop for(int i=0; i<NoOfElements; i++) { Print("i=",IntegerToString(i), " {",IntegerToString(SeondDataArray[i][0]), //1stDimension ",",IntegerToString(SeondDataArray[i][1]), //2ndDimension ",",IntegerToString(SeondDataArray[i][2]),"}" //3rdDimension ); } Print("===================="); for(int i=0; i<NoOfElements; i++) { int NeededVal=SeondDataArray[i][2]; //GetValueOfLastDimension SeondDataArray[i][0]=NeededVal; //PutFoundValueIntoFirstDimension } ArraySort(SeondDataArray,WHOLE_ARRAY,0,MODE_ASCEND); //SortArrayByFirstDimension for(int i=0; i<NoOfElements; i++) //Security:EmptyTheFirstDimensionForNextUse { SeondDataArray[i][0]=0; //PutEmptyIntoFirstDimension Print("i=",IntegerToString(i), " {",IntegerToString(SeondDataArray[i][0]), ",",IntegerToString(SeondDataArray[i][1]), ",",IntegerToString(SeondDataArray[i][2]),"}" ); } } Nun habe ich noch den Beschreibungsstring drin. Den kann man ja als enum nehmen (damit hat man sowohl einen integer Wert als auch dessen string). Also hab ich erst mal versucht, eine enum nachher in die Tabelle zu schreiben - da gibt es schon wieder Gemecker (obwohl die Ausgabe korrekt ist): Code:
enum PairNamesInt { AUDCAD, //0 EURUSD, //1 TRYJPY, //2 USDJPY, //3 GBPAUD //4 }; void OnStart() { for(int i=0; i<4; i++) { PairNamesInt Number=i; //=> i: implicit enum conversion Print(" Pair ",IntegerToString(i),"= ",EnumToString(Number) ); } } Wenn ich z.B. als Benutzer bei einem Auswahlmenü in enum-Format den Text sehe und auwähle, dann nimmt MT doch intern dessen Nummernwert zur Erkennung (der wird ja wohl kaum mit Buchstaben rumhantieren). In der Hilfe wird nur mit dem String gearbeitet, also probier ich es so und kriege eine andere Warnung: Code:
PairNamesInt Word; //=> Word: possible use of uninitialized variable 'Word' Print(" Pair ",IntegerToString(i),"= ",(string)EnumToString(Word) ); AVT |
|
|||
Zitat:
AVT |
|
|||
Kannst Du mir ein Beispiel geben, bitte, ich hab keine Ahnung wie ich das machen soll. Danke, AVT
|
|
|||
Habe ich zuerst gedacht, aber MT kann keine Strings sortieren, im Endeffekt wird alles sozusagen "sichtbar" sowieso ein String, zum Sortieren muß ich aber Zahlen haben und ich weiß nicht, ob mir dabei nicht der Beschreibungsstring verloren geht. AVT
|
|
|||
Mich wundert schon mal, dass das der Compiler nicht moniert:
int SeondDataArray[5][3]={{,7,3}, {,3,1}, {,57,14}, {,12,4}, {,11,1} }; Da werden einem zweidimensionelen Array Wertepaare einer dreidimensionalen Struktur zugewiesen. Das sollt eigentlich nicht gehen. Um es mal auszuschreiben, welche Array-Variablen es tatsächlich gibt: SeondDataArray[0][0] SeondDataArray[0][1] SeondDataArray[0][2] SeondDataArray[1][0] SeondDataArray[1][1] SeondDataArray[1][2] SeondDataArray[2][0] SeondDataArray[2][1] SeondDataArray[2][2] SeondDataArray[3][0] SeondDataArray[3][1] SeondDataArray[3][2] SeondDataArray[4][0] SeondDataArray[4][1] SeondDataArray[4][2] Das sind insgesamt 15 Variablen, denen Werte zugewiesen werden sollten. Was wird da eigentlich bei Deiner Schreibweise in das Array geschrieben? Print("i=",IntegerToString(i), " {",IntegerToString(SeondDataArray[i][0]), //1stDimension ",",IntegerToString(SeondDataArray[i][1]), //2ndDimension ",",IntegerToString(SeondDataArray[i][2]),"}" //3rdDimension ); Das ist nicht die 1. - 3. Dimension, sondern das 1. - 3. Element der 2. Dimension. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
|
|