MetaTrader 5 build 2121: Strateji test cihazının yeni tasarımı - sayfa 8

 
A100 :

Yürütme sonuçları Sabit bir dize için gerekenden daha fazla bellek tahsis edilir (prensipte uzunluğunu artırmak imkansız olacaktır)

  • Const olmayan bir dize için fazladan bellek tahsis edilmez (uzunluğu arttığında, yeni bir bellek tahsisi gerekecektir)
  • Kullanıcı dizeyi StringInitInit aracılığıyla başlatırsa, o zaman gerekenden daha fazla bellek tahsis edilir, çünkü arabellek boyutu kullanıcı tarafından açıkça ayarlanır ve çoğu durumda artırılmaz (kullanıcı zaten hangi son arabelleği alacağını düşünmüştür). ihtiyaçları ve boyutunu açıkça ayarlayın)
  • Saf bir sabit dize için, arabellek boyutu StringBufferlen=0'dır; bu, dizenin const olduğu anlamına gelir:

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


    "Sözde" bir sabit dizenin yeniden konumlandırılması, sabitle yapılan bir çalışma değildir, ancak 260 karakterlik bir ön tahsis ile dinamik bir değişken oluşturulur:

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

    Saf bir sabit dize için, arabellek boyutu StringBufferlen=0'dır; bu, dizenin const olduğu anlamına gelir:


    "Sözde" bir sabit dizenin yeniden konumlandırılması, sabitle yapılan bir çalışma değildir, ancak 260 karakterlik bir ön tahsis ile dinamik bir değişken oluşturulur:

    ayırıcıları tanıtmanın zamanı geldi)))

     

    Dize arabelleğinde bir hata olduğunu hatırlatırım:

     #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'den gelen işlev herhangi biri olabilir.
     

    StringToTime işlevinin genişletilmiş bir sürümünü MQL'ye şu şekilde eklemenizi öneririm:

     bool StringToTime ( string timeString, datetime &time);

    Geçerli sürümde, dize çöp içeriyor olsa ve özellikle garip olan geçerli tarih döndürülse bile işlev her zaman geçerli bir zaman döndürür:

    StringToTime("aabbbbccc"), "2019.09.05 01:00:00" değerini döndürür Bu normal mi? Bu performansta, işlev genellikle sağlık için tehlikelidir. Bu nedenle, doğruluk kontrolü olan bir varyant gereklidir.

    Kendi işlevini ayrıştırmak gerekirken. Ancak sorun, zamanın farklı formatlarda verilebilmesidir. Ve MQL'de zaten uygulanmış olduğundan, tekerleği yeniden icat ederek tüm bu biçimleri gerçekten kodlamak istemiyorum.

    Prensipte bu, diğer dize dönüştürme işlevleri için de geçerlidir: StringToInteger, StringToDouble. Ayrıca doğrulama kontrolleri sağlamazlar.

    ps Hmm, görünüşe göre GetLastError() bu durumlarda hata veriyor. bilmiyordum. Bu işlevlerin belgeleri bu konuda hiçbir şey söylemez. Ardından sorun ortadan kalkar. Bool aracılığıyla olsa daha kolay olurdu.
     
    Alexey Navoykov :


    Alexey'nin önerisini, dizelerle güvenli çalışmayı, gizli hataları ortadan kaldırma garantisini destekliyorum.

     
    #property tester_no_cache true

    "özellik zaten farklı bir değere sahip ve atlanacak" hatası.

    İlk kez kullanıldı. Artık hiçbir dosyada yok. Değere bağlı değildir. 2136 oluşturun.

     

    Lütfen eski stilist stilini geri getirin.

    Şimdi burada ne yapılması gerektiğini çözemiyorum:

       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 ;
         }

    Bu parça eskiden şöyle görünürdü:

       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

    "özellik zaten farklı bir değere sahip ve atlanacak" hatası.

    İlk kez kullanıldı. Artık hiçbir dosyada yok. Değere bağlı değildir. 2136 oluşturun.

    Projelerle çalışırken böyle bir hata oluşur - kaynak kodunda belirtilen özellik değeri proje ayarlarındaki değerle çelişirse.

    Proje Özellikleri

    Proje dosyasındaki program özellikleri, kaynak kodunda belirtilen özelliklere göre önceliklidir. Hem projede hem de kaynak kodunda özellikleri belirtirseniz, projedeki özellikler kullanılacaktır.
    Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
    Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
    • www.metatrader5.com
    MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
     
    Vladimir Karputov :

    Lütfen eski stilist stilini geri getirin.

    Şimdi burada ne yapılması gerektiğini çözemiyorum:

    Bu parça eskiden şöyle görünürdü:

    Birden çok iç içe if, herhangi bir hizalama ile kurtarılamaz. Okunabilmesi için kodu değiştirmeniz gerekir.

     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 :

    Birden çok iç içe if, herhangi bir hizalama ile kurtarılamaz. Okunabilmesi için kodu değiştirmeniz gerekir.

    Birden fazla iç içe yerleştirme yoktur - en üst düzeyde ise, eğer öyleyse.

    Başka böyle görünüyorsa eski stili geri istiyorum:

           else if

    - bir satırdaydı ve sonraki metnin sağa kayması yoktu.


    İşte help Koşullu if-else ifadesinden bir örnek (eski şekillendirici )

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

    ve yeni şekillendiricinin yaptığı da bu:

     //--- Вложенные операторы
       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
    Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...