本帖最后由 华兰先生 于 2025-4-12 19:49 编辑
原代码存在莫名闪退。咱给修改了一下。
#property indicator_chart_window
#property indicator_buffers 5 // 修正缓冲区声明为5个(原值为2)
#property indicator_color1 Red
#property indicator_color2 Lime
double g_ibuf_76[];
double g_ibuf_80[];
double g_ibuf_84[];
double g_ibuf_88[];
double g_ibuf_92[];
extern int Pe = 5;
int init() {
IndicatorBuffers(5);
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(0, g_ibuf_76);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(1, g_ibuf_80);
SetIndexBuffer(2, g_ibuf_84); // 非图形缓冲区需声明为5个
SetIndexBuffer(3, g_ibuf_88);
SetIndexBuffer(4, g_ibuf_92);
return (0);
}
int start() {
int li_4 = 0;
int li_8 = IndicatorCounted();
if (li_8 < 0) return (-1);
if (li_8 > 0) li_8--;
int li_0 = Bars - li_8;
// 增加数组边界保护
int array_size = MathMin(Bars, ArraySize(g_ibuf_84));
for (li_4 = 0; li_4 < li_0 && li_4 < array_size; li_4++) {
g_ibuf_84[li_4] = iMA(NULL, 0, Pe, 0, MODE_EMA, PRICE_CLOSE, li_4);
}
array_size = MathMin(Bars, ArraySize(g_ibuf_88));
for (li_4 = 0; li_4 < li_0 && li_4 < array_size; li_4++) {
g_ibuf_88[li_4] = iMAOnArray(g_ibuf_84, array_size, Pe, 0, MODE_EMA, li_4);
}
array_size = MathMin(Bars, ArraySize(g_ibuf_92));
for (li_4 = 0; li_4 < li_0 && li_4 < array_size; li_4++) {
g_ibuf_92[li_4] = iMAOnArray(g_ibuf_88, array_size, Pe, 0, MODE_EMA, li_4);
}
// 防止越界访问:限制li_4+1的范围
for (li_4 = 0; li_4 < li_0 - 1; li_4++) { // 修改循环终止条件
g_ibuf_76[li_4] = 6.0 * MathMax(g_ibuf_92[li_4 + 1], g_ibuf_92[li_4]) - 5.0 * g_ibuf_92[li_4];
g_ibuf_80[li_4] = 2.0 * g_ibuf_92[li_4] - g_ibuf_76[li_4];
}
return (0);
} |