MetaTrader 5 build 2121: 策略测试器的新设计 - 页 7

 
Roman:

在测试中添加了StringLen,并以不同方式初始化了字符串。文档中说的是一件事,实际行为却不一样。
而在这种情况下,缓冲区显示为0,而不是260。

文件规定了何时返回0,并且适合于指定的情况。

 
A100:

文件表明何时返回0,并适合于所指出的情况

该文件与当前的行为完全不相符!

两种类型的初始化之间有什么区别?

StringInit(str, 1, "_");
string str = "_";
而结果是不同的 ))
而且也不清楚左边的数字260是怎么来的。
 
Roman:

该文件与当前的行为完全不相符!

文档:值为0意味着字符串是一个常量,缓冲区的内容不能被改变。

字符串被初始化为常数"_",编译器认为字符串有条件地(为了提高效率)成为常数--为什么不呢?为什么会有矛盾呢?更重要的是,没有用它进行进一步的操作。

 
Roman:
而一般来说,并不清楚左数260的来历。

主持人已经解释了 从哪里来,以及为什么它在的情况下。

string str = "_";

不出现--检查的理由

 
A100:

主持人澄清说,从哪里

我想我是用数字260得到的,编译器本身分配的StringBufferLen 缓冲区的初始大小为260。
所以,如果字符串的长度小于260,StringBufferLen将打印260,而不是实际的字符串长度。
而如果字符串的长度大于260,那么就会打印出实际的字符串值。

所以,使用StringBufferLen函数,如果字符串长度小于260个字符,我们不会得到实际的字符串长度,而总是得到260。
这一定是一个错误。
只要长度超过260个字符,我们就会得到真正的字符串长度。

p.s.由于文件已经过期,因此非常具有误导性。

 
Roman:

也就是说,使用StringBufferLen函数,在字符串长度小于260个字符时,我们不会得到实际的字符串长度,而总是得到260。
这一定是一个错误。
只要长度超过260个字符,我们就会得到真正的长度。

严格意义上的字符串长度。 StringLen和缓冲区长度:StringBufferLen是相当罕见的函数。而且一般来说,它们可能不一致。

这使得两个至少是有问题的案例。

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软件公司
策略测试器的优化错误尚未修复。
请纠正。
我使用的优化设置是平衡+锐利率,但如截图所示显示了一个异常的优化值,在随后的优化生成中,由于这个异常值而产生了正常的优化。这是不可能的。

策略测试员 优化的错误还没有修复。
请修复它。
我使用的优化是平衡+锐利,但异常的优化值如截图所示,在随后的优化生成中,由于这个异常值而产生的正常优化。这是不可能的
 
字符串的长度 是StringLen。而StringBufferLen显示预分配的内存大小。

预分配的字符串内存大小是编译器的内部事务,不应该对其进行设置。
 
Renat Fatkhullin:
预分配的字符串内存大小是编译器的内部事务,你不能依赖它。

执行结果表明,编译器的行为与逻辑相反。

  • 对于一个恒定的字符串,分配的内存比必要的多(其长度原则上不能增加)。
  • 对于非常量字符串,不分配额外的内存(如果其长度增加,将需要分配新的内存)。
  • 如果用户用StringInitInit初始化一个字符串,分配的内存会比需要的多,因为缓冲区的大小是由用户明确设置的,而且在大多数情况下不会增加(用户已经考虑了他需要的最终缓冲区,并明确设置了其大小)。
 
A100:

执行结果表明,编译器的行为与逻辑相反。

  • 对于一个恒定的字符串,分配的内存比必要的多(其长度原则上不能增加)。
  • 对于非常量字符串,不分配额外的内存(如果其长度增加,将需要新的内存分配)。
  • 如果用户用StringInitInit初始化一个字符串,那么分配的内存就会超过需要,因为缓冲区的大小是由用户明确定义的,而且在大多数情况下,它不会被增加(用户已经考虑了他需要的最终缓冲区,并明确定义了它的大小)。

预先分配字符串缓冲区的大小是编译器的内部事务。

我们还将多次改变对字符串的处理。