Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 05.08.21
Benutzerbild von Indikator-Trading
Indikator-Trading Indikator-Trading ist offline
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
Das ursprüngliche Problem (ich habe bisher noch nicht versucht, die Ursache herauszufinden):
Sämtliche Orders werden in einem Struct Array festgehalten.
Dieses Array bekommt seine Größe von einer Benutzereingabe MaxOrders, z.B. 5.
Das heißt das Array zählt von 0-4, rein theoretisch sollte es also 5 Orders festhalten können.
Konnte es aber nicht, die 5. Order legte den EA lahm (Array out of range).
Wie gesagt, die Ursache dafür muß ich noch finden, das steht aber auf einem anderen Blatt.
Hierbei kann ich dir nur helfen, wenn du den entsprechenden Code teilen würdest.

Zitat:
Zitat von AVT Beitrag anzeigen
Frage: Wenn ich bei ArrayResize(ArrayName,MaxOrders) den 3.Parameter verwenden will, bekomme ich dann automatisch eine Reserve, falls ich mehr als 5 Orders habe? Also im Beispielfall, wenn vorher nur MaxOrders=5 war, ich aber ArrayResize(ArrayName,MaxOrders,MaxOrders) setze, heißt das dann, ich kann das Array um weitere 5 Orders überschreiten, bevor gemeckert wird?
(Diese ganze Memory allocation Sache finde ich mehr als verwirrend.)
Danke. AVT
Für diesen Fall, finde ich ausnahmsweise mal die Doku gar nicht so schlecht.
Die Reserve macht nur Sinn, wenn du ein großes Array häufig in der Größe über ArrayResize verändern willst.
Also du hast ein Array mit der Größe von 1000 und setzt die Reserve auch auf 1000.
Jetzt kannst du die Größe des Arrays auf irgend etwas <=1000 setzen, es wird aber kein neuer Speicherplatz für das Array herangezogen. Das Initialisieren ist somit viel schneller.

Z.B.


Ansprechen kannst du diesen Reservierten Bereich allerdings nicht, da das ja jetzt nur freigehaltener Speicherplatz ist.

double MyArray[];
ArrayResize(MyArray,1000,1000); // Erster Resize mit Reserve
ArrayResize(MyArray,10,1000); // dieser ArrayResize würde schneller ausgeführt werden!
MyArray[9] = 10; // Kein Problem, da die Größe ja 10 beträgt!
MyArray[10] = 0; // Dies würde zu einem Compilerfehler führen!

Ohne Reserve wird halt immer wieder ein neuer Speicherbereich gesucht und belegt, was halt Zeit beansprucht. Schau die das Beispielscript einmal an und lasse es mal laufen, dann ist das kein Problem mehr den Vorteil zu verstehen.

Gruß Timo