初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1466

 

こんにちは。Mql5でExpert Advisorを作成する際、問題が発生しました。その年のローソク足の始値の配列があります。この配列の各ローソク足で、高値と安値をチェックするために、n本のローソク足の配列を作成する必要があります。ジグザグ・インディケーターのようなものだ。

このコードを書いてみたのですが、「配列が範囲外」というエラーが出たり、配列全体の最大値と最小値の値が、必要な30キャンドルの期間内でなかったりします。

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

おそらく、ArrayMaximum()関数と ArrayMinimum()関数で チェックするために別の配列を作成する必要があるのでしょうが、入れ子ループと配列のサイズで混乱しています。

ヒントをください。

 
Dmitry Ivanushko #:
if(i+30<=ArraySize(opens))
if(i+30<ArraySize(opens))

以下は 配列の外側の出力である。

 
if(i+30<ArraySize(opens))

このエラーは不注意によるものです。修正しても問題は解決しません。

ー ローソク足のー30本のー始値のー終値のー高値・安値のー終値。

 
Dmitry Ivanushko #:
配列の最大値
ArrayMaximum

戻り値 インデックス を返します。

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

未確認ですが、ローソク足のオープン(始値)の最小値と最大値のインデックスを 取得する方法のようです。

価格も一度に取得できるが、インデックスは取得できない。

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

ステップのあるmqlループの例はどこにも見つからなかった。これは問題を単純化します。

ChatGPTだけがこのように書くようにアドバイスしてくれました:

for(int i = n; i < sizeArray; i += n)

さらに実験してみます。コードは動作します。ありがとうございました。

ArrayResizeを しないと "array out of range "エラーが発生します。

 
Dmitry Ivanushko #:

このエラーは不注意によるものです。修正しても問題は解決しません。

30本のローソク足の始値の配列を作成し、その中の高値と安値を検索するにはどうすればよいでしょうか?

何が問題なのでしょうか?配列temp[]を宣言し、そこに30個の要素をコピーし、最小値/最大値のインデックスを探します。そして最後に30より小さければ、残りいくつかをコピーする。そしてこの場合、私はwhile()ループを使いたい。

 
Alexey Viktorov #:
何が問題なのか?配列temp[]を宣言して、そこに30個の要素をコピーし、最小値/最大値のインデックスを探します。そして最後に30より小さければ、残りいくつかをコピーする。そしてこの場合、while()ループを使う方がいいですね。

はい、できます。考えがまとまらないので、アドバイスをお願いします。

 
Dmitry Ivanushko #:

ああ、そうすればいい。考えがまとまらないから、アドバイスを求めているんだ。

静的配列では、サイズは一定に設定され、変更することはできません。動的配列では、変更することはできますが、配列のサイズは設定されています!つまり、配列のサイズは既知で、0から最後までの要素のインデックスが設定されています。<=は、0からの要素のインデックスと最後の要素のインデックスが、配列のサイズの1単位分小さいというだけで、範囲外です。

すべてはあなたの手の中です)))

 
Valeriy Yastremskiy #:

静的配列では、サイズは一定に設定され、変更することはできません。動的配列では、サイズは変更できますが、 配列のサイズは設定されています! つまり、配列のサイズは既知であり、要素のインデックスは0から末尾までです。要素のインデックスが0からで、最後の要素のインデックスが配列のサイズの1単位分小さいというだけで、<=は範囲外です。

すべてはあなたの手の中にあります)))

どういう意味ですか ある配列から別の配列temp[]に要素数をコピーするには、コピーする前に配列サイズを設定する必要があると思いますか?

 
Dmitry Ivanushko #:

ああ、そうすればいい。考えがまとまらないから、アドバイスを求めているんだ。

一時配列も必要ない。

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

このコード

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

は、20個の要素を検索するように設定されているにもかかわらず、最大15個の残りの要素を検索する。

だから、while()ループを使って配列の残数を気にしない方がいい。

理由: