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からの関数は何でもよい。
 

StringToTime 関数の拡張版をMQLに追加する形で提案します。

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

error "property already exists with different value and will be skipped".

初めて使用しました。他のファイルにはありません。値には依存しない。ビルド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

error "property already exists with different value and will be skipped".

初めて使用しました。他のファイルにはありません。値には依存しない。ビルド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

- は1行で、後続のテキストが右側にオフセットされることはありませんでした。


以下は、Conditional if-else statementの ヘルプ(旧スタイラー)にある例です。

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