我是大家,我想通过脚本在数组中记录一些指标的值。 我想增加数组大小并在满足条件时记录数组中的值。 我已经尝试了几种方法来编写它,但这些都不起作用。 有什么建议吗?
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());
}
答案 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
文件,则可能会出错并在文件末尾添加新行