MetaTrader 5 build 2121 : Nouveau design du testeur de stratégie - page 7

 
Roman:

Ajouté StringLen au test, et initialisé la chaîne différemment. La documentation dit une chose, le comportement réel est différent.
Et dans ce cas, la mémoire tampon affiche 0 au lieu de 260.

La documentation spécifie quand 0 est retourné et c'est approprié pour le cas spécifié

 
A100:

La documentation indique quand 0 est retourné et est appropriée pour le cas indiqué

La documentation ne correspond pas du tout au comportement actuel !

Quelle est la différence entre les deux types d'initialisation ?

StringInit(str, 1, "_");
string str = "_";
Et les résultats sont différents ;)
Et on ne sait pas très bien d'où vient le chiffre 260 de la gauche.
 
Roman:

La documentation ne correspond pas du tout au comportement actuel !

Documentation : Une valeur de 0 signifie que la chaîne est une constante et que le contenu du tampon ne peut pas être modifié.

La chaîne est initialisée avec une constante "_" et le compilateur considère la chaîne conditionnellement (pour des raisons d'efficacité) comme une constante - pourquoi pas ? Pourquoi y a-t-il une contradiction ? D'autant plus qu'aucune autre opération n'est effectuée avec elle.

 
Roman:
Et en général, on ne sait pas très bien d'où vient le chiffre 260 de la gauche.

Le modérateur a expliqué d'où et pourquoi dans le cas de

string str = "_";

n'apparaît pas - raison de vérifier

 
A100:

Le modérateur a précisé d'où venait

Je pense que je l'ai eu avec le numéro 260, le compilateur lui-même alloue la taille initiale du tamponStringBufferLen à 260.
Si la longueur de la chaîne est inférieure à 260, le StringBufferLen imprimera 260, et non la longueur réelle de la chaîne !
Et si la longueur de la chaîne est supérieure à 260, alors la valeur réelle de la chaîne est imprimée.

Ainsi, en utilisant la fonction StringBufferLen, avec une longueur de chaîne inférieure à 260 caractères, nous n'obtiendrons pas la longueur réelle de la chaîne, mais toujours 260.
Il doit s'agir d'une erreur.
Dès que la longueur dépasse 260 caractères, nous obtenons la longueur réelle de la chaîne.

p.s. La documentation étant obsolète, elle est très trompeuse.

 
Roman:

C'est-à-dire qu'en utilisant la fonction StringBufferLen, avec une longueur de chaîne inférieure à 260 caractères, nous n'obtiendrons pas la longueur réelle de la chaîne, mais toujours 260.
Il doit s'agir d'une erreur.
Dès que la longueur dépasse 260 caractères, nous obtenons la longueur réelle.

Longueur de la chaîne de caractères à proprement parler : StringLen et longueur du tampon : StringBufferLen sont des fonctions plutôt rares. Et en général, elles peuvent ne pas coïncider.

Cela fait deux cas au moins douteux :

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 константная и не может быть далее увеличена
}
 
まだ、ストラテジーテスターのオプティマイズの不具合が修正されていません。
修正してください。
私が使っている最適化設定は、バランス+シャープレシオですが、スクリーンショットの画像のように、異常な最適化数値が表示され、以降の最適化のジェネレーションにこの異常値による正常な最適化が不可能になっています。

À MetaQuotes Software Corp.
Le bug d'optimisation du testeur de stratégie n'a pas encore été corrigé.
Veuillez corriger.
Le paramètre d'optimisation que j'utilise est balance + sharp ratio, mais une valeur d'optimisation anormale s'affiche comme dans la capture d'écran, et une optimisation normale due à cette valeur anormale est générée dans la génération d'optimisation suivante. C'est impossible.

L'erreur dans l'optimisation du testeur de stratégie n'est pas encore corrigée.
S'il vous plaît, réparez-le.
L'optimisation que j'utilise est balance + sharp, mais la valeur d'optimisation anormale est affichée comme dans la capture d'écran et l'optimisation normale due à cette valeur anormale est générée dans la génération d'optimisation suivante. Ce n'est pas possible
 
La longueur de la chaîne est StringLen. Et StringBufferLen montre la taille de la mémoire pré-allouée.

La taille de la mémoire préallouée d'une chaîne est une question interne au compilateur et vous ne pouvez pas vous y fier.
 
Renat Fatkhullin:
La taille de la mémoire préallouée des chaînes de caractères est une question interne au compilateur et vous ne pouvez pas vous y fier.

Lesrésultats de l'exécution montrent que le compilateur agit contrairement à la logique :

  • Pour une chaîne constante, plus de mémoire est allouée que nécessaire (sa longueur ne peut en principe pas être augmentée).
  • Pour une chaîne non constante, aucune mémoire supplémentaire n'est allouée (si sa longueur est augmentée, une nouvelle allocation de mémoire sera nécessaire)
  • Si un utilisateur initialise une chaîne de caractères avec StringInitInit, plus de mémoire est allouée que nécessaire, car la taille du tampon est explicitement fixée par l'utilisateur et dans la plupart des cas, elle ne sera pas augmentée (l'utilisateur a déjà réfléchi au tampon final dont il a besoin et a fixé sa taille explicitement).
 
A100:

Lesrésultats de l'exécution montrent que le compilateur agit contrairement à la logique :

  • Pour une chaîne constante, plus de mémoire est allouée que nécessaire (sa longueur ne peut en principe pas être augmentée).
  • Pour une chaîne non constante, aucune mémoire supplémentaire n'est allouée (si sa longueur est augmentée, une nouvelle allocation de mémoire sera nécessaire).
  • Si un utilisateur initialise une chaîne de caractères avec StringInitInit, plus de mémoire est allouée que nécessaire, car la taille du tampon est définie explicitement par l'utilisateur, et dans la plupart des cas, elle ne sera pas augmentée (l'utilisateur a déjà pensé au tampon final dont il a besoin et a défini sa taille explicitement)

La pré-allocation de la taille des tampons pour les chaînes de caractères est une question interne au compilateur.

Nous changerons encore de nombreuses fois la manipulation des chaînes de caractères.

Raison: