2

array out of range指標バッファに長いバー数 (たとえば 7000) を表示しようとしたときのエラーを回避する方法を知っている人はいますか?

4

2 に答える 2

4

同様の問題があり、バッファの 1 つで常に " Array out of range" エラーが発生しました。で確認したところArraySize()、 が返され0ました。最後に、インジケーターでこのバッファー配列

を呼び出すのを忘れていました。SetIndexBuffer(...)onInit() {...}

線を引かずに内部バッファを使っていたので、IndicatorBuffers()関数でバッファ量を増やしてから、 で追加バッファを登録しSetIndexBuffer(...)ました。

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   IndicatorBuffers(5);

//buffers with #properties settings
   SetIndexBuffer(0,Buffer1);
   SetIndexBuffer(1,Buffer2);
   SetIndexBuffer(2,Buffer3);
   SetIndexBuffer(3,Buffer4);

//additional buffer without #properties 
   SetIndexBuffer(4,AdditionalBuffer);
于 2015-10-13T22:19:04.093 に答える
3

配列 (問題) は似ていますが、大きな違いがあります。

MQL4 インディケータは、配列を処理するために「通常の」配列よりも「他の」メカニズムを使用します。

...  Testing pass stopped due to a critical error in the EA
...  array out of range in '!2015-09-08___!EA 2xAMA 01 2015-09-08_msMOD_0.00.mq4' (519,39)

はい、MT4間違ったものを処理しようとすると致命的なエラーがスローされ、そのようなケースを回避するか、(低レイテンシの循環バッファーのシナリオと同様に) 配列の境界を超えないようにトリムする (アンダーフロー/オーバーフロー)ように細心の注意を払う必要があります。または、ダイナミックとして宣言された配列でptrの成長に合わせて(メモリが許可するまで)ビアを拡張しますが、まったく別の状況があります。ptr->array[aStaticSIZE] ptrarray[]ArrayResize()double Array[];MQL4 Technical Indicators


限界?はい。. . . . . (そして、New-MQL4.56789 ステルス アップデートごとにレビューする必要があります)

の時点で、 O/S メモリ プール マネージャーが許可する場合"New"-MQL4.56789-Build-840、「通常の」配列は より多くの2.147.483.647要素を持つことはできないため、より高い次元のマッピングを使用する場合でも、十分なスペースが必要です{ 2D | 3D | 4D }

何年も前に、高速で (安全にカプセル化された) ヒープ/スタック ハンドラーに多くの並列 2D / 3D 配列を使用してprivate、100k 以上の行 / 2D プレーンのスケールで非常に動的なエンティティを維持し、すべてが古いものでうまく機能しましたMQL4

したがって、一部の 7k+ 要素については心配する必要はありません。


インジケーターは、自動化されたバッファー ハンドラーを介して間接的に配列を使用します。

この意味で、コードはこれらの問題を気にする必要はありません。

/*
#property "pragmas" help MQL4-compiler decide about setup of internal handlers
          so this part of code "speaks" to MetaLang.exe at compile-time*/

#property indicator_buffers      3             // .DEF N-Buffs

#property indicator_color1       White         // .SET Buf[0].color
#property indicator_color2       SeaGreen      // .SET Buf[1].color
#property indicator_color3       FireBrick     // .SET Buf[2].color

#property indicator_width1       1             // .SET Buf[0].width
#property indicator_width2       2             // .SET Buf[1].width
#property indicator_width3       2             // .SET Buf[2].width

         double   buffer_line_up[],            // .DEF Arrays as dynamic ...[]
                  buffer_line_dn[],            //      with human-readable-names
                  buffer_line_ax[];            //      and MT4 will take care

int   init()   {

      SetIndexBuffer(   0, buffer_line_ax );   // .ASSOC IndexBuffer.0<-array[]
      SetIndexLabel(    0, "SuperTrend"     );

      SetIndexBuffer(   1, buffer_line_up   ); // .ASSOC IndexBuffer.0<-array[]
      SetIndexLabel(    1, "Up Trend"       );
      SetIndexStyle(    1, DRAW_LINE,
                           STYLE_SOLID,
                           1 + int( ATR_Multiplier / 5 ),
                           SeaGreen
                           );

      SetIndexBuffer(   2, buffer_line_dn );   // .ASSOC IndexBuffer.0<-array[]
      SetIndexLabel(    2, "Down Trend"     );
      SetIndexStyle(    2, DRAW_LINE,
                           STYLE_SOLID,
                           1 + int( ATR_Multiplier / 5 ),
                           FireBrick
                           );

      SetIndexDrawBegin(0, ATR_Period );       // .DEF initial depth of Buffer before 1st GUI output

      IndicatorShortName( "xxxx[" + ATR_Period + "," + ATR_Multiplier + "]" );

      IndicatorDigits( MarketInfo( Symbol(), MODE_DIGITS ) );
于 2015-09-17T00:27:10.637 に答える