MQ4转MQ5指标代码改写:咨询MT5绘图缓冲区数量及编译问题
MQ4转MQ5:绘图缓冲区数量说明及代码示例
Hey there! Let's sort out your MQ4 to MQ5 indicator conversion question.
First, looking at your original MQ4 code:
#property version "1.002" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 DeepSkyBlue #property indicator_color2 Red #property indicator_width1 2 #property indicator_width2 2
How many buffers do you need in MQ5?
You'll need 2绘图缓冲区(和原MQ4代码数量一致)——因为你的原指标用两个独立的线条绘图,MQ5需要匹配这个数量来保持原有功能。
修复转换报错的关键差异
转换工具经常报错的原因是MQ5对绘图和缓冲区的设置有更严格的要求,而这些是MQ4不需要强制的。下面是正确的手动重写代码示例:
#property version "1.002" #property indicator_separate_window #property indicator_buffers 2 // 和MQ4保持相同的缓冲区数量 #property indicator_plots 2 // MQ5要求显式声明绘图数量(这里和缓冲区数量对应) // 第一条线的设置(对应MQ4的indicator_color1/width1) #property indicator_color1 DeepSkyBlue #property indicator_width1 2 #property indicator_style1 STYLE_SOLID // 可选但建议显式声明,MQ4默认是实线 // 第二条线的设置(对应MQ4的indicator_color2/width2) #property indicator_color2 Red #property indicator_width2 2 #property indicator_style2 STYLE_SOLID // 声明缓冲区数组(MQ5必须显式声明) double Buffer1[]; double Buffer2[]; int OnInit() { // 将缓冲区关联到对应的绘图项 SetIndexBuffer(0, Buffer1, INDICATOR_DATA); SetIndexBuffer(1, Buffer2, INDICATOR_DATA); // 可选:为绘图项设置名称,方便在MT5中识别 PlotIndexSetString(0, PLOT_NAME, "Line 1"); PlotIndexSetString(1, PLOT_NAME, "Line 2"); return(INIT_SUCCEEDED); }
为什么这样写能解决问题:
- MQ4会自动把每个缓冲区绑定到一个绘图项,但MQ5要求你显式声明
#property indicator_plots来匹配缓冲区数量。 - 你必须在
OnInit()函数里用SetIndexBuffer()初始化每个缓冲区——这个步骤在MQ4里是自动完成的,所以转换工具经常遗漏它,导致编译报错。 - 缓冲区数量保持2个是因为你仍然需要绘制两条独立的线条,和原MQ4指标的逻辑一致。
内容的提问来源于stack exchange,提问作者gilbaO
相关产品推荐
相关产品推荐

