array out of range
指標バッファに長いバー数 (たとえば 7000) を表示しようとしたときのエラーを回避する方法を知っている人はいますか?
2 に答える
同様の問題があり、バッファの 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);
配列 (問題) は似ていますが、大きな違いがあります。
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]
ptr
array[]
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 ) );