MetaTrader 5 build 2121: Neues Design des Strategietesters - Seite 7

 
Roman:

Dem Test wurde StringLen hinzugefügt, und die Zeichenkette wurde anders initialisiert. In der Dokumentation steht das eine, das tatsächliche Verhalten ist anders.
Und der Puffer zeigt in diesem Fall 0 statt 260 an.

In der Dokumentation ist angegeben, wann 0 zurückgegeben wird, und es ist für den angegebenen Fall angemessen

 
A100:

Die Dokumentation gibt an, wann 0 zurückgegeben wird, und ist für den angegebenen Fall angemessen

Die Dokumentation stimmt überhaupt nicht mit dem aktuellen Verhalten überein!

Was ist der Unterschied zwischen den beiden Arten der Initialisierung?

StringInit(str, 1, "_");
string str = "_";
Und die Ergebnisse sind unterschiedlich ))
Und es ist nicht klar, woher die linke Zahl 260 kommt.
 
Roman:

Die Dokumentation stimmt überhaupt nicht mit dem aktuellen Verhalten überein!

Dokumentation: Ein Wert von 0 bedeutet, dass die Zeichenfolge eine Konstante ist und der Inhalt des Puffers nicht geändert werden kann.

Die Zeichenkette wird mit der Konstante "_" initialisiert, und der Compiler betrachtet die Zeichenkette bedingt (aus Effizienzgründen) als Konstante - warum nicht? Warum ist das ein Widerspruch? Dies gilt umso mehr, als mit ihm keine weiteren Operationen durchgeführt werden.

 
Roman:
Und im Allgemeinen ist nicht klar, woher die linke Zahl 260 kommt.

Der Moderator erläuterte, woher sie stammt und warum sie im Falle von

string str = "_";

erscheint nicht - Grund zur Überprüfung

 
A100:

Der Moderator erläuterte, woher

Ich denke, ich habe es mit Nummer 260, der Compiler selbst weist die anfängliche Größe desStringBufferLen Puffers zu 260.
Wenn die Länge der Zeichenkette kleiner als 260 ist, wird StringBufferLen 260 ausgeben, nicht die tatsächliche Länge der Zeichenkette!
Wenn die Länge der Zeichenkette größer als 260 ist, wird der tatsächliche Wert der Zeichenkette gedruckt.

Wenn wir also die Funktion StringBufferLen mit einer Stringlänge von weniger als 260 Zeichen verwenden, erhalten wir nicht die tatsächliche Stringlänge, sondern immer 260.
Dies muss ein Fehler sein.
Sobald die Länge 260 Zeichen überschreitet, erhalten wir die tatsächliche Länge der Zeichenfolge.

p.s. Da die Dokumentation nicht mehr aktuell ist, ist sie sehr irreführend.

 
Roman:

Das heißt, dass wir bei Verwendung der Funktion StringBufferLen bei einer Stringlänge von weniger als 260 Zeichen nicht die tatsächliche Stringlänge erhalten, sondern immer 260.
Dies muss ein Fehler sein.
Sobald die Länge 260 Zeichen überschreitet, wird die tatsächliche Länge angezeigt.

Streng genommen die Länge der Zeichenkette: StringLen und Pufferlänge: StringBufferLen sind eher seltene Funktionen. Und im Allgemeinen dürfen sie nicht übereinstimmen.

Das sind zwei zumindest fragwürdige Fälle:

void OnStart() 
{ 
        string s1 = "_";
        Print(StringBufferLen(s1)); //(1)//Ожидалось 260 вместо 0 - строка s1 далее может быть увеличена
        StringInit(s1,1,'_');
        const string s2 = s1;
        Print(StringBufferLen(s2)); //(2)//Ожидалось 0\1 вместо 260 - строка s2 константная и не может быть далее увеличена
}
 
まだ、ストラテジーテスターのオプティマイズの不具合が修正されていません。
修正してください。
私が使っている最適化設定は、バランス+シャープレシオですが、スクリーンショットの画像のように、異常な最適化数値が表示され、以降の最適化のジェネレーションにこの異常値による正常な最適化が不可能になっています。

An MetaQuotes Software Corp.
Der Fehler bei der Optimierung des Strategietesters wurde noch nicht behoben.
Bitte korrigieren.
Die Optimierungseinstellung, die ich verwende, ist Gleichgewicht + Schärfeverhältnis, aber es wird ein anormaler Optimierungswert angezeigt, wie auf dem Screenshot zu sehen ist, und eine normale Optimierung aufgrund dieses anormalen Wertes wird bei der nachfolgenden Optimierungsgenerierung erzeugt. Das ist unmöglich.

Der Fehler in der Optimierung des Strategietesters ist noch nicht behoben.
Bitte reparieren Sie das.
Die Optimierung, die ich verwende, ist Gleichgewicht + Schärfe, aber der anormale Optimierungswert wird wie im Screenshot angezeigt und die normale Optimierung aufgrund dieses anormalen Wertes wird bei der nachfolgenden Optimierungsgenerierung erzeugt. Dies ist nicht möglich
 
Die Länge der Zeichenkette ist StringLen. Und StringBufferLen zeigt die Größe des vorab zugewiesenen Speichers an.

Die Größe des vorab zugewiesenen Stringspeichers ist eine interne Angelegenheit des Compilers und sollte von diesem nicht festgelegt werden.
 
Renat Fatkhullin:
Die Größe des vorab zugewiesenen Stringspeichers ist eine interne Angelegenheit des Compilers und Sie können sich nicht darauf verlassen.

Die Ausführungsergebnisse zeigen, dass der Compiler entgegen der Logik handelt:

  • Für eine konstante Zeichenkette wird mehr Speicher als nötig zugewiesen (ihre Länge kann im Prinzip nicht erhöht werden)
  • Für eine nicht konstante Zeichenkette wird kein zusätzlicher Speicherplatz zugewiesen (wenn die Länge erhöht wird, ist eine neue Speicherzuweisung erforderlich)
  • Wenn ein Benutzer eine Zeichenkette mit StringInitInit initialisiert, wird mehr Speicher zugewiesen als benötigt, da die Puffergröße explizit vom Benutzer festgelegt wird und in den meisten Fällen nicht erhöht wird (der Benutzer hat bereits darüber nachgedacht, welchen endgültigen Puffer er benötigt und dessen Größe explizit festgelegt)
 
A100:

Die Ausführungsergebnisse zeigen, dass der Compiler entgegen der Logik handelt:

  • Für eine konstante Zeichenkette wird mehr Speicher als nötig zugewiesen (ihre Länge kann im Prinzip nicht erhöht werden)
  • Für eine nicht konstante Zeichenkette wird kein zusätzlicher Speicher zugewiesen (wenn ihre Länge erhöht wird, ist eine neue Speicherzuweisung erforderlich).
  • Wenn ein Benutzer eine Zeichenkette mit StringInitInit initialisiert, wird mehr Speicher als nötig zugewiesen, da die Größe des Puffers explizit vom Benutzer angegeben wird und in den meisten Fällen nicht vergrößert wird (der Benutzer hat bereits darüber nachgedacht, welchen Endpuffer er benötigt und hat dessen Größe explizit angegeben)

Die Vorabzuweisung der Größe von Puffern für Strings ist eine interne Angelegenheit des Compilers.

Wir werden die Handhabung von Zeichenketten noch viele Male ändern.