Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 263

 
evillive:

int Mas[];


dann füllen Sie die Schleife aus, falls erforderlich, verwenden Sie

ArrayResize(Mas,size);

ArrayInitialize(Mas,0);

"dann Zyklus ausfüllen".
Wenn es nicht zu viel Mühe macht, ein kleines Beispiel, bitte?
 
Leo59:
"then loop fill"
Wenn es nicht zu viel Mühe macht, ein kleines Beispiel, darf ich?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
 double min,max;
 int start(){
    for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
    min=ArrayMinimum(MACDBuffer);
    max=ArrayMaximum(MACDBuffer);
    Print(min,"____",max);
 }

Ihnen wurde gesagt, dass Sie ein dynamisches Array MACDBuffer[] mit ArrayResize() statisch machen sollten, um es zu füllen (andernfalls wird das Ergebnis der Zuweisung die ganze Zeit Nullen sein),

und um Stabilität bei der Angemessenheit der Berechnungen zu gewährleisten, ist es besser, das Array mit ArrayInitialize() zu initialisieren.

 
ALXIMIKS:


Ihnen wurde gesagt, dass Sie ein dynamisches Array MACDBuffer[] mit ArrayResize() statisch machen sollten, um es zu füllen (andernfalls wird das Ergebnis der Zuweisung immer Nullen sein),

und darüber hinaus, um die Stabilität der Angemessenheit der Berechnungen zu gewährleisten, ist es besser, das Array mit ArrayInitialize() zu initialisieren.


Ich danke Ihnen!
Das Problem ist, dass es einen funktionierenden Expert Advisor gibt.
int CD=0; //Ordernummer eines abgeschlossenen Geschäfts
double Balance=0; // Ergebnis eines abgeschlossenen Geschäfts
double Mas[]; // Array von Werten für die Ergebnisse eines abgeschlossenen Geschäfts


Wie füllt man Mas[] mit den Ergebnissen abgeschlossener Transaktionen in int Start()?

Vielleicht muss etwas in init() und deinit() geschrieben werden? Ein Initialisierungsprogramm oder etwas anderes?
Wie würde der korrekte Code aussehen?

 
Leo59:
Der Kern der Sache ist, dass es einen laufenden Expert Advisor gibt.
int CD=0; // Laufende Nummer eines abgeschlossenen Geschäfts
double Balance=0; // Ergebnis eines abgeschlossenen Geschäfts
double Mas[]; // Array von Werten für die Ergebnisse eines abgeschlossenen Geschäfts


Wie wird in int Start() Mas[] mit den Ergebnissen der abgeschlossenen Geschäfte gefüllt?

Vielleicht muss ich in init() und deinit() etwas hinzufügen? Ein Initialisierungsprogramm oder etwas anderes?
Wie würde der korrekte Code aussehen?

Jeder hat eine andere Vorstellung von "Recht".

Vielleicht wollen Sie Mas[CD]=Balance in der Initialisierung und die Zuweisung zu Mas[CD]=Balance beim Start, wenn Sie den CD-Wert ändern?

Oder vielleicht möchten Sie ein zweidimensionales Array haben, in dem alle notwendigen Daten (Saldo, Zeit, Punkte, maximales Eigenkapital, minimales Eigenkapital ....) für jede Transaktion gespeichert werden.

 
ALXIMIKS:


Ihnen wurde gesagt, dass Sie ein dynamisches Array MACDBuffer[] mit ArrayResize() statisch machen sollten, um es zu füllen (andernfalls wird das Ergebnis der Zuweisung immer Nullen sein),

und darüber hinaus, um die Stabilität der Angemessenheit der Berechnungen zu gewährleisten, ist es besser, das Array mit ArrayInitialize() zu initialisieren.

ArrayResize() ändert die Größe des Arrays. In mql4 sind alle Arrays standardmäßig statisch.
 
artmedia70:
ArrayResize() ändert die Größe des Arrays. In mql4 sind alle Arrays standardmäßig statisch.

Ich habe mich geirrt. Das Tutorium bestätigt dies:

Wenn die Größe eines zu initialisierenden eindimensionalen Arrays nicht angegeben ist, wird sie vom Compiler auf der Grundlage der Größe der Initialisierungssequenz bestimmt. Die Initialisierung eines Arrays kann auch mit der Standardfunktion ArrayInitialize() erfolgen. Alle Arrays sind statisch, d.h. sie haben eine statische Form, auch wenn sie bei der Initialisierung nicht explizit angegeben wurden. Das bedeutet, dass alle Elemente des Arrays ihre Werte im Intervall zwischen den Aufrufen der Funktion, in der das Array deklariert ist, behalten.

Aber warum weist ein solches "statisches" Array dann keine Werte zu? Das Ergebnis ist erwartungsgemäß null, da der Compiler ArrayResize(buffer,0) verwendet?

int start(){
   double buffer[];
   for(int i=10;i>=0;i--){
      buffer[i]=i;
      Print ("buffer[i]=",buffer[i]);
   }
}
 
ALXIMIKS:

Ich habe mich geirrt. Das Lehrbuch bestätigt dies:

Aber warum weist ein solches "statisches" Array dann keine Werte zu? Das Ergebnis ist erwartungsgemäß null, weil ArrayResize(buffer,0) vom Compiler?

Denn das Array ist dynamisch. Seine Größe in der ersten Dimension kann mit ArraySize() - für ein eindimensionales Array - und ArrayRange() - für eine bestimmte Dimension eines mehrdimensionalen Arrays - angezeigt werden.

Statisch bedeutet nicht "Standardgröße". Verwechseln Sie nicht die beiden Begriffe "statisch" und "dynamisch". Sie sind keine Antonyme. Dabei handelt es sich um unterschiedliche Anwendungsbereiche. Analogie: Ein statisches Array ist eine "statische Variable". Ein dynamisches Array ist "eine Größe, die programmatisch eingestellt und geändert werden kann".

int start(){
   double buffer[];
   for(int i=0;i<10;i++){
      ArrayResize(buffer,i+1);
      buffer[i]=i;
      Print ("Размер массива = "+(string)ArraySize(buffer)+", Значение в buffer["+(string)i+"] = ",buffer[i]);
   }
   return(0);
}
 
Leo59:

Ich danke Ihnen!
Das Problem ist, dass es einen funktionierenden Expert Advisor gibt.
int CD=0; // Ordnungszahl eines abgeschlossenen Geschäfts
double Balance=0; // Ergebnis eines abgeschlossenen Geschäfts
double Mas[]; // Array der Werte der Ergebnisse eines abgeschlossenen Geschäfts


Wie füllt man Mas[] mit den Ergebnissen abgeschlossener Transaktionen in int Start()?

Vielleicht muss etwas in init() und deinit() geschrieben werden? Ein Initialisierungsprogramm oder etwas anderes?
Wie würde der korrekte Code aussehen?

Alle Ergebnisse von abgeschlossenen Geschäften können in der Kontohistorie eingesehen werden. Mit Software. Aber ist es notwendig, das Feld ständig mit ihnen zu überladen? Es kann viele von ihnen geben. Es ist besser, die notwendige Tiefe der Geschichte zu begrenzen und das Feld zu füllen, wenn man wirklich nicht ohne sie leben kann.
 
Leute, weiß jemand, wie man dem RSI auf Android Hilfsebenen hinzufügen kann?
 
ALXIMIKS:

Ich habe mich geirrt. Das Lehrbuch bestätigt dies:

Aber warum weist ein solches "statisches" Array dann keine Werte zu? Das Ergebnis ist erwartungsgemäß null, weil ArrayResize(buffer,0) vom Compiler?


Denn es handelt sich nicht um ein Array, um genau zu sein. Ich beziehe mich darauf, weil die Entwickler von Anfang an gesagt haben, dass alles, was nicht klar ist oder unvollständig erklärt wird, im C-Standard nachzulesen ist.

Wenn Sie die Variable double buffer[]; deklarieren, wird Speicher für eine Variable zugewiesen, die in C als "Zeiger" bezeichnet wird, vom Typ Ganzzahl ist und die Adresse der Speicherzelle speichert, mit der ein Array beginnt. Wenn Sie die Dimensionalität der Variablen in MCL überprüfen, erhalten Sie den Wert 0. Das bedeutet, dass dem Array selbst kein Speicher zugewiesen wird, und wenn Sie versuchen, einen Wert zuzuweisen, können Sie ihn nirgendwo hinschreiben: In MCL gibt es keine Adressarithmetik und Zeiger können nicht verarbeitet werden. In C kann man es zwar schreiben, aber mit "nicht zugewiesenem" Speicher führt es normalerweise zu einem Systemabsturz. Wenn Sie AreiResize(array,N), (N>0) anwenden, wird Speicher für das Array (mindestens ein Element) zugewiesen und Platz für das Schreiben von Werten geschaffen. Bei der Überprüfung wird die Dimension des Arrays von 0 verschieden sein.

Das Konzept des statischen Arrays in C hat mehrere Bedeutungen:

1. ein statisches Array (sowie eine statische Variable/ein statischer Typ) sind solche Variablen/Arrays, deren Dimensionen in der Kompilierungsphase (Vorkompilierung für MKL4) bekannt sind. Wenn zum Beispiel double buff[10000]; beschrieben wird, erfährt der Compiler die Größe der Variablen und kann sofort Speicher zuweisen. Im Gegensatz zu diesem Konzept gibt es das Konzept eines "dynamischen Arrays", d.h. eines solchen Arrays, dessen Größe zur Kompilierzeit unbekannt ist und erst zur Laufzeit bekannt wird; dies sind alle Arrays mit variabler Größe. Beim Zugriff auf solche Arrays muss zuvor Speicher zugewiesen werden. Der Speicher wird außerhalb des statischen Programmspeichers zugewiesen.

Wenn in C/C++ ein Array in einem Block beschrieben wird, ist seine Sichtbarkeit durch den Block begrenzt - unabhängig davon, ob es sich um ein statisches oder ein dynamisches Array handelt. Fehler in Programmen wie "Speicherlecks" treten bei lokal definierten dynamischen Arrays auf, d.h. wenn ein Speicherzeiger zerstört wird, weil er den Sichtbarkeitsbereich verlässt, der ihm zugewiesene Speicher aber belegt bleibt.

2 Das Konzept des "statischen" Arrays als eine Variable, die mit dem Modifikator static beschrieben wird - solche Variablen werden nicht zerstört, wenn sie den Bereich des Blocks verlassen - sie befinden sich in einem separaten Speicherbereich - daher bleiben die Werte in ihnen erhalten. Das Risiko von Speicherlecks wird reduziert. Ein Array, das als dynamisch im Sinne von p.1 deklariert ist (d.h. die Größe des Arrays ist zum Zeitpunkt der Kompilierung nicht bekannt), kann auch statisch im Sinne von p.2 sein, d.h. mit dem Modifikator "static" deklariert werden.

Beim Beenden von Programmen muss dynamisch zugewiesener Speicher freigegeben werden, um Speicherlecks zu vermeiden. Ich weiß nicht, ob die Entwickler von MKL dies beachten, aber in meinen Programmen gebe ich immer Speicher frei - Gewohnheit aus C - ArreyResize(array,0);

In MKL sind alle Arrays statisch im Sinne von Punkt 2.

Nun zu Ihrer Frage: "Warumkönnen einem statischen Array double buffer[]; keine Werte zugewiesen werden?". Denn es wird kein Speicher dafür zugewiesen (es handelt sich um ein dynamisches Array mit einem statischen Modifikator). Bevor Werte zugewiesen werden, sollte Speicher zugewiesen werden, d.h. ArrayResize mit einer Größe größer als 0 sollte auf dieses Array angewendet werden. Bei Arrays müssen Sie den Speicherüberlauf (außerhalb des Arrays) kontrollieren.

SZ Ich hoffe, ich habe mich klar ausgedrückt. Ich habe versucht, es so einfach wie möglich zu halten.