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

 
A100:

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

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

对于一个纯粹的常量字符串,缓冲区的大小由StringBufferlen=0,这意味着该字符串是常量。

        string s1 = "_";            // исходное "чистое" присвоение константной строки
        Print(StringBufferLen(s1)); // показывает 0 верно, не должно быть 260


重新分配一个 "所谓的 "常数字符串,并不是在用常数工作,而恰恰是在创建一个预先分配了260个字符的动态变量。

        const string s2 = s1;       // динамическое создание переменной копированием данных из другой переменной (не константной строки)
        Print(StringBufferLen(s2)); // показывает 260 верно
 
Renat Fatkhullin:

对于一个纯粹的常量字符串,缓冲区的大小由StringBufferlen=0,这意味着该字符串是常量。


重新分配一个 "所谓的 "常数字符串并不是在用常数工作,而是在创建一个预先分配了260个字符的动态变量。

是时候引入分配器了)))。

 

作为提醒,字符串缓冲区有一个错误。

#import "Shlwapi.dll"
int PathFileExistsW(string &pszPath);
#import

class CTest
{
protected:
   string bufstr;

public:
   CTest()
   {
      StringInit(bufstr, 1000111);
   }
   string getString()
   {
      PathFileExistsW(bufstr);
      Print(StringBufferLen(bufstr), " ", StringLen(bufstr));   
      return bufstr;
   }
};

CTest dll;

int OnInit()
{
   dll.getString(); // 1000111 0 - OK
   dll.getString(); // 260 0 - ???
   dll.getString(); // 260 0 - ???
   return INIT_SUCCEEDED;
}
void OnTick()
  {
  }
//+------------------------------------------------------------------+
来自DLL的函数可以是任何东西。
 

我建议在MQL中添加一个扩展版的StringToTime 函数,其形式为:。

bool StringToTime(string timeString, datetime &time);

因为在当前版本中,该函数总是返回有效的时间,即使字符串包含垃圾,也会返回当前日期,这一点特别奇怪。

StringToTime("aaabbbccc")返回 "2019.09.05 01:00:00 "这正常吗? 在这个实现中,该函数对健康来说根本是危险的。 因此,需要一个有正确性检查的版本。

到目前为止,我们必须用自己的函数进行解析,但问题是,时间可以用不同的格式来指定而且,当时间已经在MQL中实现的时候,我真的不想再编码所有这些格式,重新发明车轮。

基本上,这也适用于其他的字符串转换 函数 StringToInteger, StringToDouble。 也没有为它们提供有效性检查。

p.s. 嗯,原来GetLastError() 在这些情况下会产生错误。 我不知道,这些函数的文档没有这样说。 这消除了问题,尽管用bool会更容易。
 
Alexey Navoykov:


我支持Alexey的建议,安全处理字符串是避免隐藏错误的关键。

 
#property tester_no_cache true

错误 "属性已经存在,但其值不同,将被跳过"。

第一次使用它。其他文件都没有。不取决于价值。建2136。

 

请带回老式的造型器

现在我搞不清楚这里应该运行的是什么。

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else
         if(extrema[1]>0.0 && extrema[0]>0.0)
           {
            if(extrema[1]<extrema[0])
               if(prices[1]>prices[0])
                 {
                  int d=0;
                 }
           }
         else
           {
            return(true);
           }
     }
   else
     {
      int d=0;
     }

这幅作品以前是这样的。

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else if(extrema[1]>0.0 && extrema[0]>0.0)
        {
         if(extrema[1]<extrema[0])
            if(prices[1]>prices[0])
              {
               int d=0;
              }
        }
      else
        {
         return(true);
        }
     }
   else
     {
      int d=0;
     }
 
Edgar:
#property tester_no_cache true

错误 "属性已经存在,但其值不同,将被跳过"。

第一次使用它。其他文件都没有。不取决于价值。建2136。

在处理项目时,如果源代码中指定的属性值与项目设置中的值冲突,就会发生这个错误。

项目属性

项目文件中的程序属性优先于源代码中指定的属性。如果你在项目和源代码中都指定了属性,将使用项目中的属性。
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

请带回老式的造型器

现在我搞不清楚这里应该运行的是什么。

这幅作品以前是这样的。

多重嵌套的ifs不能被任何对齐方式所保存。我们需要修改代码,使其具有可读性。

bool Sample()
  {
//---
   double prices[], extrema[];
   int size=ArraySize(prices);
   if(size>2)
      return(true);

   if(size<=1)
     {
      int d=0;
      return(false);
     }

   if(extrema[1]<0.0 && extrema[0]<0.0)
     {
      if(extrema[1]>extrema[0])
         if(prices[1]<prices[0])
           {
            int d=0;
           }
      return(false);
     }

   if(extrema[1]>0.0 && extrema[0]>0.0)
     {
      if(extrema[1]<extrema[0])
         if(prices[1]>prices[0])
           {
            int d=0;
           }
      return(false);
     }
//---     
   return(true);
  }
 
Rashid Umarov:

多重嵌套的ifs不能被任何排列组合所保存。你必须修改代码以使其可读。

没有多重嵌套--最高层是if,然后是if else。

我要求的是以前的风格,那时如果其他地方看起来像这样。

      else if

- 是在单行上,随后的文本没有向右偏移。


下面是一个来自条件性if-else语句 帮助的例子 旧的样式器)。

//--- Вложенные операторы
if(x=='a')
  {
   y=1;
  }
else if(x=='b')
  {
   y=2;
   z=3;
  }
else if(x=='c')
  {   
   y=4;
  }
else Print("ERROR");

而这就是新的造型器的作用。

//--- Вложенные операторы
   if(x=='a')
     {
      y=1;
     }
   else
      if(x=='b')
        {
         y=2;
         z=3;
        }
      else
         if(x=='c')
           {
            y=4;
           }
         else
            Print("ERROR");
Стилизатор - Разработка программ - MetaTrader 5
Стилизатор - Разработка программ - MetaTrader 5
  • www.metatrader5.com
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...