Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 159

 
Yurixx:

Können Sie mir bitte sagen, bitte.

Im Indikator wird die Reihenfolge der Reihen, z.B. close[], einmalig durch ArraySetAsSeries() oder auf andere Weise festgelegt?

Erfolgt dies in OnCalculate() oder kann dies in OnInit() erfolgen?

Ich bin auf eine verwirrende Situation gestoßen:

Order in close[], gesetzt durch AS_SERIES bei Eingabe beim ersten Tick, wechselt beim nächsten Tick spontan zu normal, d.h. !AS_SERIES.

Ich habe den Grund dafür im Code nicht gefunden.

in jeder Funktion, die den Skalar &arr[] erhält, kann man sich nicht absolut sicher sein, in welche Richtung das Array indiziert wird :-(

Wenn Sie außerdem die "Serialität" innerhalb der Funktion ändern, bleibt diese Richtung auch nach Beendigung der Funktion erhalten... das ist ein Nebeneffekt, den niemand erwartet.

Wenn Sie ein Array für die Eingabe in eine Funktion erhalten, sollten Sie sich deshalb leider an dessen Serialisierung erinnern, sie auf eine geeignete setzen und IMMER das Original zurückgeben, wenn Sie die Funktion verlassen

Dies ist ein seltener Fall bei OnCalculate, aber in der Praxis wurde es auch von anderem Code aufgerufen.

 
Maxim Kuznetsov:

Wenn Sie außerdem intern die "Serialisierung" ändern, bleibt diese Richtung erhalten, wenn Ihre Funktion endet...

Damit habe ich gerechnet. Deshalb habe ichArraySetAsSeries(close,true) in denOnCalculate()-Block eingefügt, der nur einmal beim ersten Login ausgeführt wird. Und diese "Serialisierung" wurde tatsächlich eingestellt. Doch zu meiner Überraschung war die "Serialität" bereits beim zweiten Tick und darüber hinaus das Gegenteil.

Maxim Kuznetsov:

Bei OnCalculate ist das ein seltener Fall, aber in der Praxis wurde es auch schon von anderem Code aufgerufen.

Ich habe keine solchen Exoten, und außerdem ändere ich die "Serialisierung" von Zeitreihen und Pufferarrays innerhalb des Programms nicht. Daher würde es ausreichen, wenn ich ihn einmal zu Beginn des Indikators setzen würde. Wenn wir jedoch nicht sicher sein können, dass die "Serialität" dieser Arrays gespeichert wird, müssen wir sie zu Beginn jedes Zyklus bei OnCalculate() festlegen. Das scheint etwas völlig Unnatürliches zu sein.

 
input string inStr = NULL; // Входная строка не может быть NULL, но об этом нигде не сообщается.

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{
  string Str = NULL;
  
  PRINT(inStr == NULL); // false
  PRINT(Str == NULL);   // true


  PRINT(inStr == ""); // true
  PRINT(Str == "");   // false
}
Es ist ratsam, bei der Kompilierung eine Warnung zu erzeugen.
 
fxsaber:
Es ist ratsam, bei der Kompilierung eine Warnung zu erzeugen.

Wenn sich seit den alten Zeiten nichts geändert hat, ist NULL != "" Viele Menschen sind schon darauf hereingefallen.

 
Alexey Viktorov:

Wenn sich seit den alten Zeiten nichts geändert hat, ist NULL != "" Viele Menschen sind schon darauf hereingefallen.

Das ist nicht das, worüber wir reden.

 
fxsaber:

Wir sprechen über etwas anderes.

Dann erklären Sie, warum das nicht sein kann. Warum

input string inStr = "";

sein kann, aber

input string inStr = NULL;

kann es nicht sein.

 
Alexey Viktorov:

Dann erklären Sie, warum das nicht sein kann.

Das obige Skript zeigt dies.

 
fxsaber:

Das obige Skript zeigt dies.

Wenn es so wäre, gäbe es keine Fragen. Du denkst immer, dass alle anderen deine Gedanken lesen oder besser programmieren können als du.

 
Alexey Viktorov:

Wenn es so wäre, gäbe es keine Fragen. Sie sind immer der Meinung, dass jeder Ihre Gedanken lesen oder besser programmieren können sollte als Sie selbst.

Ich verstehe die Gründe für diese Reaktion nicht. Der knappe Code demonstriert die Funktion zu 100 %.

 
fxsaber:

Ich verstehe die Gründe für diese Reaktion nicht. Der knappe Code demonstriert die Funktion zu 100 %.

Normale Reaktion. Ich verstehe Ihre Codes nicht, ich habe um eine Erklärung gebeten, und die Antwort lautet...

NULL ist eine derartige Zweideutigkeit, dass man vorsichtig damit umgehen muss. Insbesondere bei der Anwendung auf String-Variablen.

Aus der Dokumentation

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if(some_string==NULL) some_string="empty";

In diesem Beispiel bedeutet NULL also nicht, dass die Länge der Zeichenkette gleich Null ist, sondern dass die Variable nicht initialisiert ist.

In Ihrem Beispiel

input string inStr = NULL;

wird die Variable initialisiert. Es ist mir nicht klar, wie sie initialisiert wird, und ich habe keine Lust, das zu klären.

Folglich,

PRINT(inStr == NULL); // false

Zeigt an, dass die Variable initialisiert ist. Auch hier ist die große Frage, womit. Warum ist es Ihrer Meinung nach unmöglich, eine Variable mit NULL zu initialisieren?

Offensichtlich führt diese Initialisierung dazu, dass die Länge der Zeichenkette gleich Null ist, was diese Prüfung über

PRINT(inStr == ""); // true