MetaTrader 5 빌드 2121: 전략 테스터의 새로운 디자인 - 페이지 8

 
A100 :

실행 결과 상수 string 의 경우 필요 이상으로 많은 메모리가 할당됩니다(원칙적으로 길이를 늘리는 것은 불가능합니다).

  • const가 아닌 문자열에는 추가 메모리가 할당되지 않습니다(길이가 증가하면 새 메모리 할당이 필요함).
  • 사용자가 StringInitInit를 통해 문자열을 초기화하면 버퍼 크기가 사용자에 의해 명시적으로 설정되고 대부분의 경우 증가하지 않기 때문에 필요한 것보다 더 많은 메모리가 할당됩니다(사용자는 이미 최종 버퍼에 대해 생각했습니다. 필요하고 크기를 명시적으로 설정)
  • 순수 상수 문자열의 경우 버퍼 크기는 StringBufferlen=0이며 이는 문자열이 const임을 의미합니다.

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


    "추정된" 상수 문자열의 재배치는 상수와 함께 작동하지 않지만 260자의 사전 할당으로 동적 변수가 생성됩니다.

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

    순수 상수 문자열의 경우 버퍼 크기는 StringBufferlen=0이며 이는 문자열이 const임을 의미합니다.


    "추정되는" 상수 문자열의 재배치는 상수를 사용한 작업이 아니지만 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 ()
      {
      }
    //+------------------------------------------------------------------+
    
    DLLki의 기능은 무엇이든 될 수 있습니다.
     

    다음과 같은 형식으로 MQL 에 StringToTime 함수의 확장 버전을 추가하는 것이 좋습니다.

     bool StringToTime ( string timeString, datetime &time);

    현재 버전에서는 문자열에 가비지가 포함되어 있어도 함수가 항상 유효한 시간을 반환하고 현재 날짜가 반환되기 때문에 특히 이상합니다.

    StringToTime("aaabbbccc")은 "2019.09.05 01:00:00"을 반환합니다. 이것이 정상입니까? 이 공연에서 기능은 일반적으로 건강에 위험합니다. 따라서 정확성을 확인하는 변형이 필요합니다.

    자체 기능을 구문 분석하는 데 필요합니다. 그러나 문제는 시간이 다른 형식으로 주어질 수 있다는 것입니다. 그리고 이미 MQL에 구현되어 있기 때문에 이러한 모든 형식을 코딩하고 바퀴를 재발명하고 싶지는 않습니다.

    원칙적으로 이것은 다른 문자열 변환 함수( StringToInteger, StringToDouble)에도 적용됩니다. 또한 유효성 검사를 제공하지 않습니다.

    ps 흠, 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 :

    예전 스타일리스트 스타일을 되찾아주세요.

    이제 여기서 무엇을 해야 하는지 알 수 없습니다.

    이 조각은 다음과 같았습니다.

    여러 개의 중첩된 if는 정렬로 복구할 수 없습니다. 읽을 수 있도록 코드를 변경해야 합니다.

     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 :

    여러 개의 중첩된 if는 정렬로 복구할 수 없습니다. 읽을 수 있도록 코드를 변경해야 합니다.

    여러 중첩이 없습니다. 최상위 수준에서 if, then 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
    Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...