帮你问了下GPT,他说:
在函数 CalculateAverageDayAmplitude 中,您有一个循环,它从 StartBar-20 开始。如果 StartBar 小于20,循环将尝试访问负数索引的数组,这显然是不可能的。虽然您的代码试图通过检查 StartBar-20<0 来避免这种情况,但这个检查是在循环内部进行的,这意味着在执行到这个检查之前,已经尝试过了非法的数组访问。
为了解决这个问题,您应该在开始循环之前进行检查,以确保不会尝试访问数组的负数索引。此外,由于 pos 在循环中递增,您还应该检查 pos 是否小于 rates_total 。以下是修正后的 CalculateAverageDayAmplitude 函数:
//+------------------------------------------------------------------+
double CalculateAverageDayAmplitude(int StartBar)
{
// 确保没有尝试访问负数索引
if(StartBar<20)
{
return(0);
}
double DayAmplitudeSum=0;
int pos;
// 确保在数组范围内
for(pos=StartBar-20; pos<StartBar && pos>=0; pos++)
{
DayAmplitudeSum += DayAmplitudeBuffer[pos];
}
// 防止除以零的情况
if(pos > 0)
{
return(DayAmplitudeSum / pos);
}
else
{
return(0);
}
}
//+------------------------------------------------------------------+
此外,我注意到您在 OnCalculate 函数中使用了 StringToDouble(IntegerToString(StringToInteger(DoubleToString((DayHigh[i]-DayLow[i])/Point())))) 。这种转换序列非常复杂,并且可能不是必要的。您可以直接计算价差然后赋值给 DayAmplitudeBuffer[i] 。
请注意,如果您的指标是在图表加载时立即计算,您可能还需要处理 CopyHigh 和 CopyLow 函数的返回值,以确保它们成功复制了数据。如果它们没有复制足够的数据,任何尝试访问尚未定义的索引都可能导致数组越界错误。
帮你问了下GPT,他说:
在函数 CalculateAverageDayAmplitude 中,您有一个循环,它从 StartBar-20 开始。如果 StartBar 小于20,循环将尝试访问负数索引的数组,这显然是不可能的。虽然您的代码试图通过检查 StartBar-20<0 来避免这种情况,但这个检查是在循环内部进行的,这意味着在执行到这个检查之前,已经尝试过了非法的数组访问。
为了解决这个问题,您应该在开始循环之前进行检查,以确保不会尝试访问数组的负数索引。此外,由于 pos 在循环中递增,您还应该检查 pos 是否小于 rates_total 。以下是修正后的 CalculateAverageDayAmplitude 函数:
//+------------------------------------------------------------------+
double CalculateAverageDayAmplitude(int StartBar)
{
// 确保没有尝试访问负数索引
if(StartBar<20)
{
return(0);
}
double DayAmplitudeSum=0;
int pos;
// 确保在数组范围内
for(pos=StartBar-20; pos<StartBar && pos>=0; pos++)
{
DayAmplitudeSum += DayAmplitudeBuffer[pos];
}
// 防止除以零的情况
if(pos > 0)
{
return(DayAmplitudeSum / pos);
}
else
{
return(0);
}
}
//+------------------------------------------------------------------+
此外,我注意到您在 OnCalculate 函数中使用了 StringToDouble(IntegerToString(StringToInteger(DoubleToString((DayHigh[i]-DayLow[i])/Point())))) 。这种转换序列非常复杂,并且可能不是必要的。您可以直接计算价差然后赋值给 DayAmplitudeBuffer[i] 。
请注意,如果您的指标是在图表加载时立即计算,您可能还需要处理 CopyHigh 和 CopyLow 函数的返回值,以确保它们成功复制了数据。如果它们没有复制足够的数据,任何尝试访问尚未定义的索引都可能导致数组越界错误。
數組越界(71,55)
具體哪個位置不知道 應該是循環位置
沒仔細研究後面的計算式需要怎樣的前處理
建議你可以嘗試修改
if(prev_calculated>1)
pos=prev_calculated-1;
else
pos=0;
for(int i=pos; i<rates_total; i++) { }