MT 4. MathRand() Zufallszahlengenerator in OnTick(). Beim Testen der Eule werden unterschiedliche Ergebnisse erzielt, wenn sie mit denselben Einstellungen erneut ausgeführt wird. Dies ist normal, wenn die erzeugte Zahl den Algorithmus beeinflusst.
Bei der Optimierung erhalte ich aus irgendeinem Grund identische Ergebnisse bei einem zweiten Durchlauf mit denselben Einstellungen. Funktioniert MathRand() also nicht im Optimierungsmodus?
Zweitens (ich habe Angst, hier einen Fehler zu machen, ich hoffe,Alexander Puzanov kann mich korrigieren), wenn der Programmierer aus irgendeinem Grund beschließt, ein Element mit Index 20 zu einem dynamischen Array hinzuzufügen, wird nichts Schlimmes passieren. Das Array nimmt diese Dimension und schreibt dort einen Wert hinein und initialisiert die "fehlenden" Indizes mit Nullwerten.
Ganz genau. Warum "Null"? Vielleicht sollte es EMPTY_VALUE heißen? Oder WRONG_VALUE ?
Das Problem bei solchen impliziten Zuweisungen ist genau ihre implizite Natur - der Compiler führt einen Code ein, den ein Programmierer auf die eine Art denkt, während ein anderer anders denken könnte.
Außerdem ist es ineffektiv - es ist nicht immer notwendig, eine Variable sofort zu initialisieren, und die Initialisierung eines großen Arrays in einer Schleife kann die Geschwindigkeit erheblich verringern.
Und drittens hindert den Programmierer niemand daran, die Dimensionalität und den verwendeten Index zu kontrollieren! Der einzige Unterschied ist, dass er jetzt gezwungen ist, es zu tun! )))
Wenn der Compiler die Dimension eines Arrays selbst verfolgt, ist keine Klasse in der Lage, diesen Code zu bereinigen. Der Wirkungsgrad kann sehr wohl sinken.
Wenn der Compiler sich nicht um diese Aufgabe kümmert, kann der Programmierer eine Klasse schreiben, die diese Aufgabe übernimmt, und dann ein Array verwenden, das expandiert und gegebenenfalls mit Nullen initialisiert wird.
Im zweiten Fall ist die Flexibilität höher.
Was Sie vorschlagen, ist also auch eine gute Lösung für viele Fälle. Aber es kann die Effizienz verringern, was nicht gut ist.
Dies ist im Prinzip ein einfaches Beispiel dafür, wie ein dynamisches Array normalerweise gefüllt werden sollte. Ich habe schon lange nicht mehr in C geschrieben, ich kann mich nicht erinnern, aber so werden Arrays in php gefüllt! Alles ist logisch und verständlich. Wenn ich einem Array ein Element hinzufüge (arr[] = x), wird das Array automatisch erweitert, und das Element wird am Ende des Arrays hinzugefügt. Und wir müssen es nicht selbst strecken, und wir müssen den Index des Elements auch nicht selbst angeben. Aber hier müssen wir absolut unnötige Bewegungen machen:
der Unterschied ist offensichtlich...
Meiner Meinung nach ist das, gelinde gesagt, seltsam ))))
Programmiersprachen werden in streng typisierte und nicht typisierte Sprachen unterteilt. Ihr PHP, R und andere funktionale Sprachen gehören zu den nicht-streng typisierten Sprachen. In streng typisierten Sprachen wie MQL oder C# und Java ist diese Art der zweideutigen Datenmanipulation nicht erlaubt. Und dies geschieht vor allem zur Sicherheit des Programmierers selbst. Strenge Typisierung impliziert, dass jede Ihrer Prozeduren extrem spezifisch ist: "to take an element at index 0 in array array" ist eine spezifische und klare Prozedur, aber Sie schlagen vor, sie durch "take something from array array and add it to whatever the compiler decides to return first" zu ersetzen. - Sie sind sich einig, dass Sie damit nicht weit kommen werden.
Andererseits wollen wir natürlich einfache High-Level-Konstrukte ohne lästige Array-Größenanpassung und ständige Neuanordnung durch den Benutzer. Genau dafür ist die Standardbibliothek gedacht. Anstatt einfache Arrays zu verwenden, wechseln Sie zu den Klassen der Gruppe Array. So sieht zum Beispiel das Hinzufügen von Null bis 16 in das Array CArrayInt aus:
#include <Arrays\ArrayInt.mqh>
voidOnStart()
{
CArrayInt array;
for(int i = 0; i < 16; i++)
array.Add(i);
}
Wie Sie sehen können, ist nichts zu natürlich. Und es ist nicht nötig, sich den Kopf über die aktuelle Array-Größe und andere Umstellungen zu zerbrechen. Alles wird für Sie erledigt, und Sie können sich direkt auf die Benutzeraufgabe konzentrieren. Das ist die Stärke und der Sinn von OOP.
template<typename T>
class A { protected:
A( T t ) : t( t ) {}
T t;
};
class B : A<int> {
B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
Die Aufgabe besteht darin , den maximalen und minimalen Wert in einem Intervall zu finden
voidOnStart()
{
int Kol_Kan=10; //Количество элементов для копированияdouble HI[]; //массив для хранения максимумов на интервалеdouble LO[]; //массив для хранения минимумов на интервалеCopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумовCopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумовArrayResize(HI,Kol_Kan); //устанавливаем размер массиваArrayResize(LO,Kol_Kan);
int in_max=0; //индекс максимального значения в массивеint in_min=0;
in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);
double hi_max; // максимальное значение цены double lo_min; // минимальное значение цены
hi_max=HI[in_max]; //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);
}
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
MT 4. MathRand() Zufallszahlengenerator in OnTick(). Beim Testen der Eule werden unterschiedliche Ergebnisse erzielt, wenn sie mit denselben Einstellungen erneut ausgeführt wird. Dies ist normal, wenn die erzeugte Zahl den Algorithmus beeinflusst.
Bei der Optimierung erhalte ich aus irgendeinem Grund identische Ergebnisse bei einem zweiten Durchlauf mit denselben Einstellungen. Funktioniert MathRand() also nicht im Optimierungsmodus?
Zweitens (ich habe Angst, hier einen Fehler zu machen, ich hoffe,Alexander Puzanov kann mich korrigieren), wenn der Programmierer aus irgendeinem Grund beschließt, ein Element mit Index 20 zu einem dynamischen Array hinzuzufügen, wird nichts Schlimmes passieren. Das Array nimmt diese Dimension und schreibt dort einen Wert hinein und initialisiert die "fehlenden" Indizes mit Nullwerten.
Ganz genau. Warum "Null"? Vielleicht sollte es EMPTY_VALUE heißen? Oder WRONG_VALUE ?
Das Problem bei solchen impliziten Zuweisungen ist genau ihre implizite Natur - der Compiler führt einen Code ein, den ein Programmierer auf die eine Art denkt, während ein anderer anders denken könnte.
Außerdem ist es ineffektiv - es ist nicht immer notwendig, eine Variable sofort zu initialisieren, und die Initialisierung eines großen Arrays in einer Schleife kann die Geschwindigkeit erheblich verringern.
Und drittens hindert den Programmierer niemand daran, die Dimensionalität und den verwendeten Index zu kontrollieren! Der einzige Unterschied ist, dass er jetzt gezwungen ist, es zu tun! )))
Wenn der Compiler die Dimension eines Arrays selbst verfolgt, ist keine Klasse in der Lage, diesen Code zu bereinigen. Der Wirkungsgrad kann sehr wohl sinken.
Wenn der Compiler sich nicht um diese Aufgabe kümmert, kann der Programmierer eine Klasse schreiben, die diese Aufgabe übernimmt, und dann ein Array verwenden, das expandiert und gegebenenfalls mit Nullen initialisiert wird.
Im zweiten Fall ist die Flexibilität höher.
Was Sie vorschlagen, ist also auch eine gute Lösung für viele Fälle. Aber es kann die Effizienz verringern, was nicht gut ist.
Dies ist im Prinzip ein einfaches Beispiel dafür, wie ein dynamisches Array normalerweise gefüllt werden sollte. Ich habe schon lange nicht mehr in C geschrieben, ich kann mich nicht erinnern, aber so werden Arrays in php gefüllt! Alles ist logisch und verständlich. Wenn ich einem Array ein Element hinzufüge (arr[] = x), wird das Array automatisch erweitert, und das Element wird am Ende des Arrays hinzugefügt. Und wir müssen es nicht selbst strecken, und wir müssen den Index des Elements auch nicht selbst angeben. Aber hier müssen wir absolut unnötige Bewegungen machen:
der Unterschied ist offensichtlich...
Meiner Meinung nach ist das, gelinde gesagt, seltsam ))))
Programmiersprachen werden in streng typisierte und nicht typisierte Sprachen unterteilt. Ihr PHP, R und andere funktionale Sprachen gehören zu den nicht-streng typisierten Sprachen. In streng typisierten Sprachen wie MQL oder C# und Java ist diese Art der zweideutigen Datenmanipulation nicht erlaubt. Und dies geschieht vor allem zur Sicherheit des Programmierers selbst. Strenge Typisierung impliziert, dass jede Ihrer Prozeduren extrem spezifisch ist: "to take an element at index 0 in array array" ist eine spezifische und klare Prozedur, aber Sie schlagen vor, sie durch "take something from array array and add it to whatever the compiler decides to return first" zu ersetzen. - Sie sind sich einig, dass Sie damit nicht weit kommen werden.
Andererseits wollen wir natürlich einfache High-Level-Konstrukte ohne lästige Array-Größenanpassung und ständige Neuanordnung durch den Benutzer. Genau dafür ist die Standardbibliothek gedacht. Anstatt einfache Arrays zu verwenden, wechseln Sie zu den Klassen der Gruppe Array. So sieht zum Beispiel das Hinzufügen von Null bis 16 in das Array CArrayInt aus:
Wie Sie sehen können, ist nichts zu natürlich. Und es ist nicht nötig, sich den Kopf über die aktuelle Array-Größe und andere Umstellungen zu zerbrechen. Alles wird für Sie erledigt, und Sie können sich direkt auf die Benutzeraufgabe konzentrieren. Das ist die Stärke und der Sinn von OOP.
Vollständige Aufzeichnung nicht verfügbar. Kompilierungsfehler
Ich kann nicht feststellen, wo ich falsch liege.
Die Aufgabe besteht darin , den maximalen und minimalen Wert in einem Intervall zu finden
Falsche Reihenfolge der Argumente in ArrayMaximum(), ArrayMinimum().
Ich kann nicht feststellen, wo ich falsch liege.
Die Aufgabe besteht darin , den maximalen und minimalen Wert in einem Intervall zu finden
Funktionen
CopyHigh(_Symbol,0,2,Kol_Kan,HI);//Kopieren der Werte der Maxima
CopyLow(_Symbol,0,2,Kol_Kan,LO); //Kopieren der Werte der Minima
bereits die Größe des Arrays ändern.
Dies ist unnötig
ArrayResize(HI,Kol_Kan); //Setzen der Array-Größe
ArrayResize(LO,Kol_Kan);
Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().
Genau)) Und ich dachte schon...
Funktionen
CopyHigh(_Symbol,0,2,Kol_Kan,HI);//Kopieren der Werte der Maxima
CopyLow(_Symbol,0,2,Kol_Kan,LO); //Kopieren der Werte der Minima
bereits die Größe des Arrays ändern.
Dies ist unnötig
ArrayResize(HI,Kol_Kan); //Setzen der Array-Größe
ArrayResize(LO,Kol_Kan);
Ich werde das wissen, danke.
Der Autor hingegen hat es bereits herausgefunden. ))
PabloEs:
Genau.)) Und ich dachte schon...