在for循环中增加数组大小

时间:2018-03-01 16:14:16

标签: mql4

我是大家,我想通过脚本在数组中记录一些指标的值。  我想增加数组大小并在满足条件时记录数组中的值。 我已经尝试了几种方法来编写它,但这些都不起作用。 有什么建议吗?

void OnStart()
  {

   double   max[]; // array of indicator values
   ArrayResize(max,0);

   int copied= 50000;

//--- copy the values of main line of the iCustom indicator
   for(int i=1;i<copied;i++)
     {
      if(Buy_M15(i))

      ArrayResize(max,ArraySize(max)+1);
      max[ArraySize(max)]=maxM1(i);
     }

//--- open the file for writing the indicator values (if the file is absent, it will be created automatically)
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s file is available for writing",InpFileName);
      PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- first, write the number of signals
      FileWrite(file_handle,"best perf");
      //--- write the time and values of signals to the file
      for(int i=1;i<ArraySize(max);i++)
         FileWrite(file_handle,max[i]);
      //--- close the file
      FileClose(file_handle);
      PrintFormat("Data is written, %s file is closed",InpFileName);
     }
   else
      PrintFormat("Failed to open %s file, Error code = %d",InpFileName,GetLastError());
  }

1 个答案:

答案 0 :(得分:1)

首先,建议在数据缓冲区之后调整一些额外的空间,以防您怀疑需要增加它。每次程序执行ArrayResize(arrayName,newSize,extraSpace=0)时,它都会将整个数组复制到一个新位置,并添加一个(在您的情况下)额外值。这意味着如果以1,000个元素数组结束,则必须使用1个元素复制数组,然后使用2个元素复制数组,然后使用999复制数据。不好 - 使用extraSpace参数,在这种情况下,数组调整大小而不复制,它有很大的帮助。

其次,当您键入max[ArraySize(max)]=maxM1(i);时,您应该收到错误,因为N个元素的数组有0到N-1的指针,并且您尝试将一些值分配给N + 1位置。 max[ArraySize(max)-1]=maxM1(i);应该提供帮助

此外,当您使用FILE_READ打开/创建文件时 - 您可能希望阅读它,但是你呢?删除FILE_READ以便在下次调试时节省一些时间(如果在打开文件后删除FILE_READ文件,则可能会出错并在文件末尾添加新行