[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 523

 

Ich danke Ihnen. Das hat geholfen. Ich dachte, es wären nur die iMac*** iStoch***-Indikatoren, die vorinstalliert sind.

 
Lisi4ka330:

Liebe Experten, ist da nicht ein Fehler im Lehrbuch?

Hier ist meine Argumentation:

Am Anfang des Codes wird die Funktionint ArrayCopyRates aufgerufen, die die Daten der Balken des aktuellen Diagramms in ein zweidimensionales Array vom Typ RateInfo[][6] kopiert und die Anzahl der kopierten Balken oder -1 im Falle eines Fehlers gemäß dem Beispiel dieser Funktion zurückgibt:

der aktuelle Balken ist der Balken mit dem Index 0-0 . Um zum ursprünglichen Code zurückzukehren, kopieren wir also das Element mit dem Index 0-0 (den aktuellen Balken) von array1 nach array2 mit dem Index 0-0, erhalten wir die letzten 10 Balken (wobei der letzte Balken der aktuelle Balken ist, der mit dem Index [0]), was im Gegensatz zu dem steht, was wir im Tutorial geschrieben haben... bzw. durch Kopieren des Elements mit dem Index Bars*6-60,60 von array1 in array2 mit dem Startindex des Elements 0 erhalten wir Informationen über Bars aus der Historie.


Ohne große Erklärungen abzugeben, sollten wir das in der Praxis überprüfen:

//+------------------------------------------------------------------+
//|                                                       массив.mq4 |
//|                                                  Copyright 2012, |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012,"
#property link      "https://forum.mql4.com/ru/46980/page525"
#property show_inputs
extern string s=" -----номер бара--------";
extern int a=9;//номер 10 последних баров 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{if(a<10)
{double array1[][6];double array2[10][6];
  ArrayCopyRates(array1);
  ArrayCopy(array2,array1,0,Bars*6-60,60);
// теперь array2 содержит 10 последних баров из истории(имеется в виду,что последний бар-это текущий бар,бар с индексом [0])
Alert("Контрольный бар - ",a," время - ",TimeToStr(array2[a][0]),"  цена открытия - ",array2[a][1]);}return(0);}
 
Roll:


Ohne hochtrabende Behauptungen aufzustellen, sollten wir das auf die Probe stellen:

Ja, in der Praxis stellt sich tatsächlich heraus, dass das Element mit dem Index Bars*6-60,60 der aktuelle Balken ist... Wie erklären Sie das dann in dem Beispiel?

double array1[][6];
ArrayCopyRates(array1,"EURUSD", PERIOD_H1);
Print("Текущий бар ",TimeToStr(array1[0][0]),"цена открытия ", array1[0][1]);
Der aktuelle Balken ist array1[0][0] und nach dem Kopieren des Arrays wird daraus array1[Bars*6-60,60][0]... Es stellt sich heraus, dass es irgendwo eine Umnummerierung gibt... Das Ergebnis ist natürlich klar, wenn man die Funktion in der Praxis anwendet... aber die Logik ist meiner Meinung nach durcheinander gebracht)))
 
Lisi4ka330:

Ja, in der Praxis stellt sich heraus, dass das Element mit dem Index Bars*6-60,60 der aktuelle Balken ist ...


Dies ist Ihre Schlussfolgerung.
 
Roll:


Ohne hochtrabende Behauptungen aufzustellen, sollten wir das auf die Probe stellen:

#property show_inputs
extern string s=" -----номер бара--------";
extern int a=9;//номер 10 последних баров 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{if(a<10)
{double array1[][6];double array2[10][6];
  ArrayCopyRates(array1);
  ArrayCopy(array2,array1,0,Bars*6-60,60);
// теперь array2 содержит 10 последних баров из истории(имеется в виду,что последний бар-это текущий бар,бар с индексом [0])
Alert("Контрольный бар - ",a," время - ",TimeToStr(array2[a][0]),"  цена открытия - ",array2[a][1]);}return(0);}

Hier ist also ein bestimmtes Element des ArraysTimeToStr(array2[a][0]).

Ich stimme zu, dass die Ausgabe korrekt ist. Aber was hat Bars*6-60 damit zu tun? Welcher Wert wird bei der Berechnung für Bar ersetzt? Wenn Takte, wie erhalten Sie die letzten 10 Takte?

Sie werden feststellen, dass ich nicht der Einzige bin, der dies im Forum nicht verstanden hat, sondern viele andere.

Es stellt sich heraus, dass die Anzahl aller Balken mit 6 multipliziert und minus 60 ist. Woher haben wir 6? Das ergibt überhaupt keinen Sinn.

 
hoz:

Hier ist also ein bestimmtes Element des ArraysTimeToStr(array2[a][0]).

Die Ausgabe ist korrekt, da stimme ich zu. Aber was hat Bars*6-60 damit zu tun... Welcher Wert wird bei der Berechnung für Bar ersetzt? Wenn Takte, wie erhalten Sie die letzten 10 Takte?

Wie Sie vielleicht bemerken, bin ich nicht der Einzige im Forum, der das nicht verstanden hat, viele andere haben es auch nicht verstanden.



int Bars -- Anzahl der Balken im aktuellen Diagramm.

 
hoz:

Es stellt sich heraus, dass die Anzahl aller Balken mit 6 und minus 60 multipliziert wird. Woher haben wir 6? Das ergibt überhaupt keinen Sinn.

MQL4 Referenz - Array Operationen - ArrayCopyRates
 
Roll:



int Bars -- Anzahl der Balken im aktuellen Diagramm.


Und woher kamen dann die letzten 10?

int Bars = 10 000;

Dann ist Balken*6 - 60 = 10 000*6 - 60 = 60 000 - 60 = 59 960;

Der Wert von59 960 ist größer als der Wert von Bars. Und das bedeutet bereits, dass es sich außerhalb des Feldes befindet. Und 10 ist nirgends aufzufinden...

 
hoz:

Es stellt sich heraus, dass die Anzahl aller Balken mit 6 und minus 60 multipliziert wird. Woher haben wir 6? Das ergibt überhaupt keinen Sinn.

Um die Verwirrung nicht zu verschlimmern, möchte ich den Fehler korrigieren, den ich in der vorherigen Antwort gemacht habe - die Schreibweise "array1[Bars*6-60,60][0]" ist nicht korrekt, da Bars*6 die Gesamtzahl der Elemente in array1 ist.Jeder Balken hat 6 Eigenschaften, nehmen wir an, wir haben 30 Balken. Multiplizieren wir mit 6, erhalten wir die Anzahl der Elemente im ersten Array - 180. Das zweite Feld hat nur 60 freie "Zellen" (d.h. 10 x 6 Eigenschaften), also müssen wir nur 60 Elemente aus dem ersten Feld zum Kopieren auswählen. Mit dem Ausdruck [Bars*6-60,60] subtrahieren wir 60 von der Gesamtsumme, d.h. 180 - 60 = 120, d.h. 120 Elemente des ersten Arrays werden in das Null-Element des zweiten kopiert, 121 in das erste und so weiter. Eine weitere Frage ist, wie es kommt, dass die Informationen über die zuletzt gebildeten Takte nicht am Anfang des ersten Arrays stehen, sondern am Ende ... Aber anscheinend liegt die Antwort im Funktionscode, und es macht keinen Sinn, noch tiefer zu graben...
 
hoz:


Und woher kamen dann die letzten 10?

int Bars = 10.000;

Dann Balken*6 - 60 = 10 000*6 - 60 = 60 000 - 60 = 59 960 -- Fehler!!!

Der Wert von59 960 ist größer als der Wert von Bars. Und das bedeutet bereits, dass sie die Grenzen des Arrays überschritten hat. Und 10 ist nirgends zu sehen.


Victor, mach dir keine Sorgen, du wirst es schaffen. "Erfahrung ist der Sohn schwerer Fehler..." Gehen Sie vom Einfachen zum Komplexen, nicht andersherum:

"PROGRESS (von lat. progressus - Vorwärtsbewegung), eine Entwicklungsrichtung, die durch einen Übergang vom Niederen zum Höheren, vom weniger Vollkommenen zum Vollkommeneren gekennzeichnet ist. Der Fortschritt kann in Bezug auf das System als Ganzes, seine einzelnen Elemente und die Struktur des sich entwickelnden Objekts betrachtet werden. Der Begriff des Fortschritts ist das Gegenteil des Begriffs des Rückschritts.

REGRESS (von lat. regressus - Rückwärtsbewegung), die Art der Entwicklung, die durch den Übergang von einer höheren zu einer niedrigeren Stufe gekennzeichnet ist. Das Gegenteil von Fortschritt".