MT5 Renko指标构建全解析
🧱

MT5 Renko指标构建全解析

从原理到MQL5代码实现与实战策略

技术分析基础 难度 · 进阶 2026-07-10 7 分钟阅读
#Renko#MT5指标#MQL5开发#价格走势

什么是Renko图表

Renko一词源自日语“红砖”,意为一种砖块,也含有“步调缓慢”的意思。Renko图表由一系列根据价格波动确定的砖块构建,完全忽略时间线,只关注价格走势。当价格上涨超过设定尺寸,便在图表上加一块向上砖块;下跌超过设定尺寸则加一块向下砖块。白色或空心砖代表上升趋势,黑色或实心砖代表下降趋势。该图表大约在19世纪出现在日本,1994年由Steve Nison在《Beyond Candlesticks》中介绍到西方。

不同于点数图(Point and Figure)将多个X或O放在同一列,Renko每块新砖都放在新的垂直平面(即新柱线),这与Kagi图表有相似的构造哲学:砖块尺寸固定,价格分析和内在轮廓以同样方式制作。正因过滤了时间噪音,Renko能更清晰地展示趋势方向与持续力度。

✦ 核心特征
Renko图表的首块砖依据前一块砖的最大最小值绘制开盘价;之后每根砖的实体底部或顶部由收盘价与开盘价相对位置决定。若收盘价高于开盘价,绘空心砖;低于则绘实心砖。

Renko绘图原理与示例

标准Renko基于收盘价绘制。以EURUSD的H4周期、30点箱体为例:从2014年1月3日至31日,左侧为原H4蜡烛图,右侧为Renko结果。红色水平线标识每块砖的30点尺寸,蓝色指示实际日期。若某H4蜡烛收盘低于前砖下边界30点,则生成下行砖;横盘不突破则不绘砖;突破上边界则生成上行砖。这种机制使价格必须真正移动“步长”才记录,极大平滑了小幅震荡。

在指标开发中,计算并非在当前加载时间帧进行,而是通过Copy系列函数将设定周期数据复制到分离数组,再填充指标输出缓冲。这样无论指标加载于哪个周期,都显示设定周期(time_frame参数)的Renko。同时,开盘、最高、最低价被用于改进分析,例如砖块内显示小垂直影线表示原周期柱线的高低范围,便于识别强烈价格行为。

指标输入参数详解

该Renko指标拥有约25个输入参数,分为多组。step为砖块尺寸;type_step选择点数或百分比;magic_numb为对象魔幻数;levels_number与levels_color用于在副图窗口画水平参考线;time_frame设定分析周期;time_redraw设定指标重算周期(如M1代表每分钟检查新柱);first_date_start为计算起点;type_price可选收盘、开盘、最高、最低价之一作为砖块判定基准;shadow_print控制是否显示影线;filter_number为反转所需砖块数过滤器;zig_zag系列控制主图ZigZag绘制;square与frame系列控制主图砖块与边框绘制。

指标使用5个DRAW_COLOR_CANDLES缓冲(开高低收与颜色索引)在副图绘砖,另用4个计算缓冲保存价格、日期、最高、最低数据。这种分离使逻辑清晰且易于扩展。

input double step=10; // Step
input type_step_renko type_step=point; // Type of step
input long magic_numb=65758473787389; // Magic number
input ENUM_TIMEFRAMES time_frame=PERIOD_CURRENT; // Calculation period
input type_price_renko type_price=close; // Price for construction
input bool shadow_print=true; // Show shadows
input int filter_number=0; // Bricks number needed to reversal

初始化与数据准备函数

在OnInit中,指标将9个缓冲绑定,前5个为INDICATOR_DATA且按时间序列寻址,后4个为INDICATOR_CALCULATIONS仅用于保存数据。设置短名称、精度并禁止显示当前值。开始日期先取用户输入,后续若超出缓冲容量则由func_calc_date_start校正。

int OnInit()
  {
   SetIndexBuffer(0,RENKO_open,INDICATOR_DATA);
   ArraySetAsSeries(RENKO_open,true);
   SetIndexBuffer(4,RENKO_color,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,Price,INDICATOR_CALCULATIONS);
   IndicatorSetString(INDICATOR_SHORTNAME,"ABCR "+IntegerToString(magic_numb));
   return(INIT_SUCCEEDED);
  }

func_calc_date_start通过循环比较Bars数与数组尺寸,若柱线过多则将起点每次推后10天(864000秒),直到能容纳。func_copy_price与func_copy_date负责将指定周期的开收高低与时间复制到数组,利用静态变量避免重复复制,并通过date_change标记重置。

datetime func_calc_date_start(datetime input_data_start, datetime data_stop)
  {
   int Array_Size=ArraySize(Price);
   int Bars_Size=Bars(_Symbol,time_frame,input_data_start,data_stop);
   for(;Bars_Size>Array_Size;input_data_start+=864000)
     Bars_Size=Bars(_Symbol,time_frame,input_data_start,data_stop);
   return(input_data_start);
  }

砖块计算与主绘图逻辑

func_calc_dorstep根据类型将点或百分比转为整数点数。若是百分比,用price/_Point*doorstep/100计算。主函数func_draw_renko是核心:它先清空缓冲,然后循环所有复制价格,动态计算步长(百分比时每柱不同),判断价格相对上/下边界越过几个步长,依据前砖类型与filter_number决定是否反转,逐块累加并填充计算数组与图形缓冲。

int func_calc_dorstep(double price, char type_doorstep, double doorstep)
  {
   double x=0;
   if(type_doorstep==0) x=doorstep;
   if(type_doorstep==1) x=price/_Point*doorstep/100;
   return((int)x);
  }

该函数分离为两部分:先计算砖数,再填缓冲。若显示柱数少于砖数,会报警并限制。最终副图显示彩色砖块,主图可通过func_draw_renko_main_chart用OBJ_RECTANGLE画砖,用func_create_trend_line与func_create_square_or_rectangle封装对象创建。

void func_draw_renko(double &price[], double &date[], int number_filter, bool draw_shadow, char type_doorstep, double doorstep)
  {
   ZeroMemory(RENKO_close);
   int doorstep_now;
   for(int z=0; z<bars; z++)
     {
      doorstep_now=func_calc_dorstep(price[z],type_doorstep,doorstep);
      if((price[z]-up_price_calc)/_Point>=doorstep_now)
        {
         point_go=int((price[z]-up_price_calc)/_Point);
         if(type_box_calc==1 || type_box_calc==0)
           for(int y=point_go; y>=doorstep_now; y-=doorstep_now)
             { a++; down_price_calc=up_price_calc; up_price_calc=down_price_calc+(doorstep_now*_Point); type_box_calc=1; }
        }
     }
  }

ZigZag与主图对象管理

func_draw_zig_zag依据砖块类型变化连接趋势线。若zig_zag_shadow为true,则取Price_high/low数组最近极值作端点;否则用砖块上下价。所有对象名含magic_numb前缀,便于func_delete_objects与func_all_delete按名清除。OnChartEvent支持按R重绘、按C清对象;OnDeinit退出时清理。这种对象管理使多实例共存无冲突。

void func_draw_zig_zag(bool price_shadow, int line_width, color line_color_up, color line_color_down)
  {
   for(int z=2; z<=a; z++)
     {
      if(type_box[z]!=type_box[z-1])
        {
         name_line=IntegerToString(magic_numb)+"_Line_"+IntegerToString(n++);
         if(type_box[z]==1 && price_shadow==true) { price_2=Price_low[id]; date_2=(datetime)Date[id]; }
         func_create_trend_line(name_line,price_1,price_2,date_1,date_2,line_width,line_color_down);
        }
     }
  }

实战交易策略应用

Renko常用于价格走势策略。基础法:上行砖转下行砖时考虑卖出,反之时买入。但更安全的入场是反转砖伴随同方向影线(说明原周期内有强烈推动),若连续两块同方向砖且影线在同级别,则入场不安全。附加ZigZag可识别支撑阻力、头肩形。等距通道可跨周期:如在H1设指标看信号,H4过滤,D1确认趋势。

另一规则:在最接近的红砖间画上行线(之间至少一块蓝砖),当创建低于线的砖后卖;反之蓝砖间画下行线,创建高于线的砖后买。由于Renko去除了时间,信号更干净,但需注意最后两块砖与阴影可能重绘(社区反馈),因此不宜用于极精准自动化 without confirmation。

⚠ 常见坑
指标有时不显示砖块,按R键重绘即可;级别颜色不支持clrNONE,需改代码;旧数据可能导致异常,可重开图表;阴影与末砖重绘风险需在策略中规避。

与其他制图指标对比及总结

相较Kagi与点数图,Renko每砖新列、视觉直观,适合趋势跟随;点数图更紧凑但需习惯X/O。该MQL5实现通过分离函数达到高可维护性,虽900行但模块清晰。对于中文交易者,理解其时间帧复制与缓冲机制,是移植或优化(如加警报、EA化)的基础。Renko历经百年仍有效,关键在于用它过滤噪音而非预测拐点。

常见问题

将ABCR.mq5编译后拖入图表,若未显示砖块,按键盘R键触发重绘;确保time_frame等参数正确,旧数据问题可关闭重开图表。
固定点数适合稳定品种如EURUSD,百分比随价格浮动适合高价或通胀品种;代码中type_step=point用固定,=percent按price/_Point*doorstep/100算。
因基于收盘价且复制数据动态更新,末砖与阴影在实时柱未关时可能随价变;社区已确认此行为,交易应等砖定型或用更高滤镜filter_number。
原版不支持clrNONE,需改func_create_levels中IndicatorSetInteger(INDICATOR_LEVELCOLOR,z,level_color)为具体色,或设levels_number=0关级别。
原文指标为MQ5仅MT5;MT4需找MT4版或重写,因MT4无INDICATOR_CALCULATIONS等MQL5特性。