Fehler, Irrtümer, Fragen - Seite 512

 
Neofit:
Legen Siedie Größe des Arrays fest. ArrayResize
 
Neofit:

Bitte sagen Sie mir, wie ich richtig mit einem Array arbeiten kann, dessen Elemente Mqlrates-Strukturen sind.

Das ist genau das, was ich wissen möchte:

MqlRates AdaptedRates[];

ArraySetAsSeries(AdaptedRates,true); 

AdaptedRates[300].open=1;

Der Debugger gibt einen Fehler aus - Ungültiger Array-Zugriff.

Ich habe verstanden, dass wir mit dieser Form der Aufzeichnung nur Elemente einer Struktur lesen können, die ein Element eines Arrays ist.

Die Frage ist, wie man die Strukturelemente richtig schreibt . Ich interessiere mich nicht für alle, wichtig ist der Preis von .open .high .low .close.

Ich entschuldige mich im Voraus für diese Frage wahrscheinlich sehr trivial (ich bin nicht der Programmierer), aber in der Hilfe habe ich nicht die Antwort gefunden. Ich werde für jede Hilfe dankbar sein.

Sie verwenden ein dynamisches Array AdaptedRates[]. Soweit ich mich erinnere, sollte bei der Arbeit mit dynamischen Arrays deren Größe mit der Funktion ArrayResize() festgelegt werden. Aber bisher hat sich der Compiler über den Index 300 in der dritten Zeile beschwert.
 
Swan:
Legen Sie die Größe des Arrays fest. ArrayResize
Soweit ich das verstehe, kann ich, wenn ich die Größe festlege, z. B.
MqlRates AdaptedRates[302];  
, die Art der Indizierung nicht als Serie festlegen.
 
Neofit:
Soweit ich weiß, kann ich bei der Definition der Größe, z. B.
MqlRates AdaptedRates[302];  
, den Indizierungstyp nicht als Serie festlegen.

:) Sie setzen kein statisches Array, sondern setzen die dynamische Array-Größe mit ArrayResize().

Nun, etwa: ArrayResize(AdaptedRates,302); usw.

 
Yedelkin:
Sie verwenden ein dynamisches Array AdaptedRates[]. Soweit ich mich erinnere, sollten Sie bei der Arbeit mit dynamischen Arrays deren Größe mit der Funktion ArrayResize() festlegen. Und bis jetzt stürzt der Compiler bei dem in der dritten Zeile angegebenen Index 300 ab.
Statische Arrays können nicht als Zeitreihen dargestellt werden, d.h. die Funktion ArraySetAsSeries(), die den Zugriff auf Arrayelemente vom Ende eines Arrays zu seinem Anfang setzt, ist auf sie nicht anwendbar. Wenn Sie den Zugriff auf ein Array wie bei Timeseries ermöglichen wollen, verwenden Sie ein dynamisches Array-Objekt.

Dies ist ein Zitat aus der Hilfe.

Swan, Yedelkin, vielen Dank für die schnelle Antwort.

 
Neofit:
Soweit ich das verstanden habe, kann ich, wenn ich eine Größe definiere, z. B.
MqlRates AdaptedRates[302];  
, den Indizierungstyp nicht als Serie festlegen.

ja.

MqlRates AdaptedRates[];//dadurch bleibt das Array dynamisch

ArrayResize(AdaptedRates,302);//und die richtige Größe einstellen

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура исторических данных - Документация по MQL5
 
Yedelkin:

:) Sie setzen kein statisches Array, sondern ein dynamisches Array mit ArrayResize().

Nun, wie ArrayResize(AdaptedRates,302); usw.

Vielen Dank für die beliebte Erklärung, soweit ich verstehe, ist es ratsam,ArrayResize esauf die richtigen Grenzen vor jedem Verweis auf eine dynamische Array-Zelle, ich werde es versuchen.
 
pusheax:

Eine Panne im Strategietestprogramm.

Plötzlich hält er an und alle lokalen und entfernten Agenten sind fertig und bleiben hängen.

Können Sie mir sagen, wie ich wieder anfangen kann, es ist schade, wieder von vorne anzufangen?
Ich mache das regelmäßig :-) Ich kann es nicht wieder starten, ich muss Clouds deaktivieren und dann wieder starten. Noch schlimmer ist es, wenn es nachts passiert, bleibt es an, bis ich aufwache :-)
 
Neofit:
Vielen Dank für die beliebte Erklärung, soweit ich verstehe, ist es wünschenswert, ArrayResize es auf die erforderlichen Grenzen vor jedem Verweis auf eine dynamische Array-Zelle , ich werde es versuchen.

Anmerkung. Nur bei Indikatorpuffern ist dies nicht erforderlich. Das ausführende Subsystem des Terminals erledigt dies selbst.

Anmerkung 2:ArrayResize() sollte vorzugsweise nur dann angewendet werden, wenn es notwendig ist, die Größe eines dynamischen Arrays zu ändern, und nicht vor jedem Zugriff auf dessen Elemente. Es kann durchaus sein, dass einem dynamischen Array einmal eine Größe zugewiesen wird und das Programm dann einfach auf seine Elemente zugreift.

 
Yedelkin:

Anmerkung. Nur bei Indikatorpuffern ist dies nicht erforderlich. Das ausführende Subsystem des Terminals erledigt dies selbst.

Anmerkung 2:ArrayResize() sollte vorzugsweise nur dann angewendet werden, wenn es notwendig ist, die Größe eines dynamischen Arrays zu ändern, und nicht vor jedem Zugriff auf dessen Elemente. Es kann durchaus sein, dass ein dynamisches Array einmal dimensioniert wird und das Programm dann einfach auf seine Elemente zugreift.

Nun, ich bin dumm zu sagen, so, eigentlich verstehe ich, dass, wenn ich bereits ein dynamisches Array auf 302 erweitert, ich kann jedes Element von 0 bis 301 ohne ArrayResize zugreifen.