MQL4独立窗口正弦波指标添加第二/第三波代码实现求助
问题定位
你修改后的版本无法显示第二条正弦波,核心是两个低级错误:
start()函数里的for循环未添加花括号包裹多行循环体。MQL4语法规定,无花括号时for循环仅执行紧接的第一行代码,你写的ExtBuffer2[i]=Dgr2[i];完全在循环外执行,循环结束后i值已经变为-1,这行赋值完全无效,第二个绘图缓冲区从头到尾没拿到有效K线对应的数据,自然画不出线。- 缓冲区配置未按多波形要求对齐。如果要扩展到3条正弦波,需要同步更新缓冲区计数、颜色配置、缓冲区绑定关系、计算逻辑,缺任何一个环节都会导致波形显示异常。
修复后完整可运行代码(支持3条独立正弦波)
//---- indicator settings #property indicator_separate_window #property indicator_buffers 3 // 3条绘图线对应3个绘图缓冲区 #property indicator_color1 Red #property indicator_color2 Orange #property indicator_color3 Lime // 第三条波默认设为绿色 //---- indicator buffers // 绘图缓冲区 double ExtBuffer1[]; double ExtBuffer2[]; double ExtBuffer3[]; // 临时计算缓冲区 double Dgr[]; double Dgr2[]; double Dgr3[]; extern datetime StartTime=D'1999.11.10 00:00'; // 外部可调参数:三条波的垂直偏移,避免波形重叠 extern int Wave1_Offset = 1; extern int Wave2_Offset = 0; extern int Wave3_Offset = -1; // 外部可调参数:三条波的周期(除数越小频率越高,波形越密) extern int Wave1_Period = 149; extern int Wave2_Period = 49; extern int Wave3_Period = 90; //+---------------------------------------------------------------+ //| Custom indicator initialization function | //+---------------------------------------------------------------+ int init() { IndicatorBuffers(6); // 3个绘图缓冲区+3个临时计算缓冲区,总数必须匹配 // 绑定3条线的绘图样式 SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetLevelValue(0,0); // 绑定绘图缓冲区对应关系 SetIndexBuffer(0,ExtBuffer1); SetIndexBuffer(1,ExtBuffer2); SetIndexBuffer(2,ExtBuffer3); // 统一设置波形偏移 SetIndexShift(0,25); SetIndexShift(1,25); SetIndexShift(2,25); return(0); } //+---------------------------------------------------------------+ //| Custom indicator iteration function | //+---------------------------------------------------------------+ int start() { int Shift; int i; Shift=iBarShift(Symbol(),PERIOD_D1,StartTime); // 给所有临时缓冲区分配对应长度 ArrayResize(Dgr,Shift+1); ArrayResize(Dgr2,Shift+1); ArrayResize(Dgr3,Shift+1); MyCalc(Shift); // 必须加花括号,把三个缓冲区赋值逻辑全部包进for循环 for(i=Shift; i>=0; i--) { ExtBuffer1[i]=Dgr[i]; ExtBuffer2[i]=Dgr2[i]; ExtBuffer3[i]=Dgr3[i]; } return(0); } //+---------------------------------------------------------------+ void MyCalc(int Shift) { int i; double pi = 3.14159; for(i=Shift;i>=0;i--) { double val=i*2.5; // 分别计算三条不同参数的正弦波 Dgr[i]=MathSin(pi*val/Wave1_Period)+Wave1_Offset; Dgr2[i]=MathSin(pi*val/Wave2_Period)+Wave2_Offset; Dgr3[i]=MathSin(pi*val/Wave3_Period)+Wave3_Offset; } }
使用说明
- 三条波的垂直偏移、周期参数都已经设为外部可调参数,加载指标后直接在属性面板就能修改,不用改代码重新编译
- 周期参数的除数越小,正弦波频率越高、波形越密;垂直偏移用来把三条波上下错开,避免完全叠在一起看不清,可以根据自己的观察需求调整数值
- 已经删掉原代码里重复赋值的冗余逻辑,计算效率更高
内容的提问来源于stack exchange,提问作者Robert H.
相关产品推荐
相关产品推荐

