You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:27:27