MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 869

 
Artyom Trishkin:
ヘルプを見ると、何のためにあるのかがわかります。また、ユーザーが入力したパラメータをプログラムで変更 することはできないというのは、その通りです。少なくとも、何かはユーザーのものであるべきです :)

本当にやりたいなら、できるはず)

 
Vitaly Muzichenko:

本当にやりたいなら、できるはず)

もちろん、再割り当てすれば可能です。しかし、ユーザーが入力した値は変更されない。
 

よく問題に遭遇します。コンパイラは、コードに "variable already defined "というエラーを出して悪態をつく。

if (n<10)
 {
  int a=10;
 }
else
 {
  int a=5;
 }

https://docs.mql4.com/ru/basis/variables/local のリファレンスガイドにはこう書かれている。

ブロック内部(内部レベル)で宣言された 変数は、そのブロックのスコープを持つ

ブロックが入れ子になっており、外部ブロックの識別子が内部ブロックの識別子と同じ名前の場合、内部ブロックが完了するまで外部ブロックの識別子は「不可視」(hidden)となる。

しかし、同じ参考書の例でも「変数がすでに定義されています」というエラーが出て、コンパイルできないのです。

int i=5;      // локальная переменная функции
     {
      int i=10;  // переменная функции 
      Print("В блоке i = ",i); // результат  i = 10;
     }
   Print("Вне блока i = ",i);  // результат  i = 5;

サイクルと同じ問題です。

int i=10;
for (int i=1;i<10;i++) ...

この問題を回避し、"variable already defined" というエラーを出さずにディレクトリサンプルをコンパイルするにはどうしたらよいでしょうか。

 
The_Sheikh:

よく問題に遭遇します。コンパイラは、コードに "variable already defined "というエラーを出して悪態をつく。

https://docs.mql4.com/ru/basis/variables/local のリファレンスガイドにはこう書かれている。

ブロック内部(内部レベル)で宣言された 変数は、そのブロックのスコープを持つ

ブロックが入れ子になっており、外部ブロックの識別子が内部ブロックの識別子と同じ名前の場合、内部ブロックが完了するまで外部ブロックの識別子は「不可視」(hidden)となる。

しかし、同じ参考書の例でも「変数がすでに定義されています」というエラーが出て、コンパイルできないのです。

サイクルと同じ問題です。

この問題を回避し、"variable already defined" というエラーを出さずにディレクトリサンプルをコンパイルするにはどうしたらよいでしょうか。

#プロパティの厳密さ
 
The_Sheikh:

この問題を回避して、"variable already defined" というエラーを出さずにディレクトリサンプルをコンパイルするにはどうしたらよいでしょうか?

リファレンスブックのすべての例が長期間正しく動作するわけではない

というのは、この例では、スコープによって、1つの演算子内の可視性はローカルであり、間違いなくこのように動作するはずだからです。

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      double x=i;
     }

   for(int i=0;i<10;i++)
     {
      double x=i;
     }
  }

i.e.for 文の 中の可視性はローカルであり、i と x 変数は終了時に失われます。

 

Peak Repainterインジケータの最後のピークがEAで処理されるように探してみた。

   GV_trendD1 = StringConcatenate(GVn," дневной тренд");
   if (!GlobalVariableCheck(GV_trendD1))
      {
      double   fUP,fDN;

      for (int f=0; f<=400 && !IsStopped(); f++)
         {
         fUP = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
         if (fUP>=15) {GlobalVariableSet(GV_trendD1,1);break;}
         else {fDN = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",1,f); if (fDN>=15) {GlobalVariableSet(GV_trendD1,-1);break;}}
         }
      }

その結果、実際には-1であるべきなのに、グローバル変数 に1が書き込まれることになります。

どうしたんですか?コードで?インジケーターで?

インジケーターは初期設定のまま使用します。

ファイル:
 
Alexey G. Smolyakov:

Peak Repainterインジケータの最後のピークがEAで処理されるように探してみた。

その結果、実際には-1であるべきなのに、グローバル変数 に1が書き込まれることになります。

どうしたんですか?コードで?インジケーターで?

インジケーターは初期設定のまま使用します。

インジケーターの名称は なぜそうなっているのですか?

iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
 
Artyom Trishkin:

なぜインジケーターの名前 なのですか?

ただ、私は異なるEA用のインジケータを異なるディレクトリに置いているのです。そして、グループ化されるように若干名前を変えています。

名称は何かに影響するのか?

 
Alexey G. Smolyakov:

私は、異なるEA用のインジケータを異なるディレクトリに置いているだけです。そして、グループ化されるように若干名前を変えています。

名称は何かに影響するのか?

МТ4 のファイルへのアクセスはすべて MQL4 フォルダ内で行われ、このフォルダ外の Expert Advisors/Script/Indicators からの終了はセキュリティ上の理由から除外されています。

 
Igor Makanu:

MT4のファイルへのアクセスはすべてMQL4フォルダー内で行われ、このフォルダー外のEA/スクリプト/インジケーターからの終了はセキュリティ上の理由で除外されます。

MQL4 folderIndicatorsUsedのフルパス。フォルダの外には出口がないようです。しかし、これは異常なことです。他のExpert Advisorは、同様のフォルダにあるインジケータを問題なく使用できます。しかし、このインジケータの何が問題なのか、私には理解できない。そのコードに目を通したが、理解するには知識と経験が足りなかった。最後の1小節しかカウントしないとか、そういう疑惑があります。