如何在MQL5中绘制K线收盘价连线?
MQL5绘制收盘价连线的正确方法
你之前的代码用了OBJ_HLINE(水平直线对象),每根K线都生成一条对应收盘价的水平线,所以会出现大量平行直线,这显然不是连接收盘价的正确方式。下面给你两种可行的实现方法:
方法一:用指标缓冲区(推荐,类似Pine Script的plot)
这种方式和Pine Script的plot(close)逻辑最接近,通过指标缓冲区自动绘制连线,无需手动管理图形对象:
// 声明存储收盘价的指标缓冲区 double CloseBuffer[]; int OnInit() { // 设置数组为时间序列模式(最新K线数据在前) ArraySetAsSeries(CloseBuffer, true); // 设置指标名称 IndicatorSetString(INDICATOR_SHORTNAME, "收盘价连线"); // 初始化1个指标缓冲区 IndicatorBuffers(1); // 将缓冲区关联到绘制索引0 SetIndexBuffer(0, CloseBuffer, INDICATOR_DATA); // 设置绘制样式:连线、红色、线宽2 PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE); PlotIndexSetInteger(0, PLOT_COLOR, clrRed); PlotIndexSetInteger(0, PLOT_WIDTH, 2); return(INIT_SUCCEEDED); } void OnTick() { int totalBars = Bars(_Symbol, _Period); // 填充缓冲区的收盘价数据 for(int i = 0; i < totalBars; i++) { CloseBuffer[i] = Close[i]; } }
方法二:用趋势线对象手动连接
如果需要手动控制每一段连线的属性,可以用OBJ_TREND趋势线对象,循环连接相邻K线的收盘价:
void OnTick() { // 先删除之前创建的旧连线,避免重复生成 for(int i = ObjectsTotal() - 1; i >= 0; i--) { string objName = ObjectName(i); if(StringFind(objName, "CloseLink_") == 0) { ObjectDelete(0, objName); } } int totalBars = Bars(_Symbol, _Period); if(totalBars < 2) return; // 至少需要2根K线才能连线 // 循环创建趋势线,连接相邻两根K线的收盘价 for(int i = 0; i < totalBars - 1; i++) { string objName = "CloseLink_" + IntegerToString(i); // 创建趋势线:连接第i+1根K线的收盘价到第i根K线的收盘价 if(ObjectCreate(0, objName, OBJ_TREND, 0, Time[i+1], Close[i+1], Time[i], Close[i])) { // 设置连线颜色和宽度 ObjectSetInteger(0, objName, OBJPROP_COLOR, clrBlue); ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1); } } }
两种方法对比
- 指标缓冲区:代码更简洁,自动处理K线更新,性能更高,适合常规的收盘价连线需求。
- 趋势线对象:需要手动管理对象生命周期,但可以对每一段连线单独修改样式,适合特殊定制场景。
内容的提问来源于stack exchange,提问作者PineEditor22
相关产品推荐
相关产品推荐

