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

MQL4(MT4)自定义正弦波指标重启后与K线不同步问题求解

问题说明

当前MQL4自定义指标可正常编译运行:平台持续在线时,新K线生成过程中正弦波曲线可同步随K线左移,二者匹配正常。但存在故障:关闭MT4平台一段时间后重启,K线与正弦波会出现失步,副窗口指标曲线会重置到平台关闭时刻的位置,无法和历史K线保持对齐。

该问题已有92次浏览暂未得到有效解决方案,受平台限制无法上传截图辅助说明,可通过以下步骤复现故障:

  • 将代码粘贴到MT4平台编译加载运行,在正弦波的波峰/波谷位置放置固定文本标记,绘制穿过该标记及对应K线的垂直线
  • 平台持续运行时,垂直线随K线同步移动,正弦波跟随垂直线同步位移,文本标记保持固定可作为初始位置对照
  • 保持指标加载状态关闭平台,等待数个K线周期后重启平台,即可观察到正弦波向右重置偏移,垂直线随对应K线正常位移,文本标记也随正弦波波峰/波谷同步右移,二者完全失配
故障根因

代码存在4个核心错误,共同导致重启失步问题:

  1. 循环逻辑完全失效:原代码外层循环判断条件为b<limit,其中b初始值是StartTime对应的K线索引(通常为数千甚至数万的数值),平台运行稳定后limit值仅为1-2,循环根本不会执行。在线时曲线能正常移动,完全依赖MT4引擎在新K线生成时自动平移缓冲区数据的默认行为,但重启后MT4不会自动补偿关闭期间新增K线带来的索引偏移,直接加载上次关闭时保存的缓冲区快照,就会出现固定偏移。
  2. 正弦计算基准错误:原代码直接用MT4动态变化的K线索引i作为正弦计算的自变量,但K线索引规则是「最新K线为0,越老的K线索引值越大」,每新增一根K线,所有历史K线的索引都会+1,同一根K线的索引值是动态变化的,不适合作为固定周期正弦波的计算基准。
  3. 缓冲区注册参数错误:代码定义了8个指标缓冲区,但init()函数中IndicatorBuffers(7)仅注册了7个,最后一个白色曲线的缓冲区不会被MT4正确管理,容易出现绘制异常。
  4. 整数除法逻辑错误:代码中1/2 * Yhigh是整数运算,MQL4中两个整数相除结果取整,1/2实际返回0,作者预期的垂直偏移完全没生效。
修复后完整代码
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Orange
#property indicator_color3 Yellow
#property indicator_color4 Lime
#property indicator_color5 Blue
#property indicator_color6 DodgerBlue
#property indicator_color7 DarkViolet
#property indicator_color8 White

//---- indicator buffers
double ExtBuffer1[], ExtBuffer2[], ExtBuffer3[], ExtBuffer4[], 
ExtBuffer5[],ExtBuffer6[], ExtBuffer7[], ExtBuffer8[];     

extern datetime StartTime=D'1999.11.10 00:00';

//+-------------------------------------------------------------+
//| Custom indicator initialization function |
//+-------------------------------------------------------------+
int init()
{
   IndicatorBuffers(8); // 修复:注册全部8个缓冲区
   // 绑定缓冲区与线条样式
   SetIndexStyle(0,DRAW_LINE,0,3); 
   SetIndexBuffer(0,ExtBuffer1); 
   SetIndexShift(0,295);       
   
   SetIndexStyle(1,DRAW_LINE); 
   SetIndexBuffer(1,ExtBuffer2); 
   SetIndexShift(1,264);     
   
   SetIndexStyle(2,DRAW_LINE,0,3); 
   SetIndexBuffer(2,ExtBuffer3); 
   SetIndexShift(2,203); 
   
   SetIndexStyle(3,DRAW_LINE,0,3); 
   SetIndexBuffer(3,ExtBuffer4); 
   SetIndexShift(3,166);      
   
   SetIndexStyle(4,DRAW_LINE,0,3); 
   SetIndexBuffer(4,ExtBuffer5); 
   SetIndexShift(4,74); 
   
   SetIndexStyle(5,DRAW_LINE,0,3); 
   SetIndexBuffer(5,ExtBuffer6); 
   SetIndexShift(5,102);
   
   SetIndexStyle(6,DRAW_LINE,0,3); 
   SetIndexBuffer(6,ExtBuffer7); 
   SetIndexShift(6,78);
   
   SetIndexStyle(7,DRAW_LINE,0,3); 
   SetIndexBuffer(7,ExtBuffer8); 
   SetIndexShift(7,85);

   SetLevelValue(0,0);

   return(0);
}
//+-------------------------------------------------------------+
//| Custom indicator iteration function |
//+-------------------------------------------------------------+
int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   
   // 获取固定起始时间对应的当前K线索引
   int start_shift = iBarShift(Symbol(),PERIOD_CURRENT,StartTime);
   
   // 修复:直接遍历所有需要计算的K线,移除无效外层循环
   for(int i=0; i<=start_shift; i++)
   {
      // 核心修复:用相对于StartTime的固定K线偏移作为正弦计算基准,同一根K线的偏移值永远不变
      double fixed_offset = (start_shift - i) * 2.5;
      double y_offset = 0.5 * 1; // 修复:原1/2为整数除法,改为0.5浮点运算实现预期偏移
      
      ExtBuffer1[i] = MathSin(M_PI * fixed_offset/298) - y_offset;
      ExtBuffer2[i] = MathSin(M_PI * fixed_offset/149) - y_offset;
      ExtBuffer3[i] = MathSin(M_PI * fixed_offset/98) - y_offset;
      ExtBuffer4[i] = MathSin(M_PI * fixed_offset/75) - y_offset;
      ExtBuffer5[i] = 0.5*MathSin(M_PI * fixed_offset/60) - y_offset;
      ExtBuffer6[i] = 0.5*MathSin(M_PI * fixed_offset/48) - y_offset;
      ExtBuffer7[i] = 0.5*MathSin(M_PI * fixed_offset/42) - y_offset;                                                                      
      ExtBuffer8[i] = 0.5*MathSin(M_PI * fixed_offset/38) - y_offset;
   }

   return(0);
}
修复说明
  • 移除无意义的中间Dgr数组和无效外层循环,每次指标触发计算时,直接用固定偏移量计算所有K线的正弦值,不管是在线运行还是重启,同一根历史K线对应的正弦值永远固定,不会出现偏移
  • 用MQL4内置常量M_PI代替手写的3.14159,计算精度更高
  • 修复整数除法、缓冲区注册参数的低级错误
  • 不再依赖MT4自动平移缓冲区的行为,重启后会自动全量计算所有历史K线的指标值,和K线完全对齐

内容的提问来源于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 17:45:35