2

array out of range尝试在指标缓冲区中显示大量柱(比如说 7000)时,有人知道如何避免错误吗?

4

2 回答 2

4

我有一个类似的问题,我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 隐形更新)

作为一个"New"-MQL4.56789-Build-840,如果 O/S 内存池管理器允许,你的“普通”数组不能有多个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 回答