mql4 - 自定义平均函数中的数组超出范围
问题描述
所以我写了一个带有乘数的自定义atr指标(显示2行,第一行是原始atr值,第二行是atr * 1.5),但由于某种原因它说“数组超出范围(66,28)”,我计算我的真实范围的平均值。我确实在我的数组上使用了 SetIndexBuffer,所以问题应该出在 OnCalculate() 中。
这就是我的 OnCalculate 函数中的内容:
for(int i=0;i<rates_total-prev_calculated;i++){
TRBuffer[i] = MathMax(MathMax(high[i]-low[i], MathAbs(high[i]-close[i+1])),MathAbs(low[i]-close[i+1]));
if(prev_calculated-1<=ATRLength){
double sumTR=0;
for(int j=0;j<ATRLength;j++){
sumTR+=TRBuffer[i+j];
}
double atr = sumTR/ATRLength;
TRBuffer[i] = atr*TPMultiplier;
SLBuffer[i] = atr*SLMultiplier;
}
}
解决方案
找到了答案,这是最终代码。
if(rates_total<=ATRLength)
return 0;
int limit = rates_total-prev_calculated;
if(prev_calculated>0)
limit++;
double ATRVal;
for(int i=limit-2; i>1; i--){
TRBuffer[i] = MathMax(MathMax(high[i]-low[i], MathAbs(high[i]-close[i+1])),MathAbs(low[i]-close[i+1]));
ATRVal = iMAOnArray(TRBuffer, 0, ATRLength, 0, MODE_SMA, i);
TPBuffer[i] = ATRVal*TPMultiplier;
SLBuffer[i] = ATRVal*SLMultiplier;
}
推荐阅读
- airflow - 关于气流 initdb 的问题
- python-3.x - 如何用以前的行替换当前行
- java - 如何检查Java中的ArrayList中是否存在某个索引
- ios - 如何修改附加到导航栏按钮的 UIMenu 的 UIAction?
- javascript - javascript .click() 在 Mozilla 中不起作用
- jbpm - 在 JBPM 中转换自定义任务
- oracle - IN ODI12c 映射表达式在 LKM 中的源上执行,而没有“在源提示上执行”
- windows-installer - 当用户删除文件时,自定义操作会导致 msi 失败
- python-3.x - 3D卷积神经网络中的滤波器大小和输出层
- swift - 在 iOS 14 上的一半屏幕上呈现 UIViewController