MT5 Kagi制图指标开发全解
📐

MT5 Kagi制图指标开发全解

从算法原理到MQL5多函数指标实现

技术分析基础 难度 · 高级 2026-02-02 6 分钟阅读
#Kagi图#MQL5指标#图表绘制#非时间尺度

Kagi图是什么:被遗忘的日本图表

Kagi图(日语“钥匙图”)于19世纪日本东京证券交易所成立后发展起来,1994年Steve Nison的《Beyond Candlesticks》将其引入西方。与K线、柱状图不同,Kagi图完全忽略时间轴,仅保留价格尺度,用粗细线表示阴阳:粗线为阳(上升趋势),细线为阴(下降趋势)。当价格回撤达到预设反转阈值(点数或百分比)时,在新列反向画线。这种结构过滤微小波动,突出趋势实质。

在MT5中,我们通过自定义指标实现Kagi图,可置于独立窗口或主图。原文BKCV.mq5指标支持标准版(仅过滤反转点)和修订版(每步动作都需先移动设定距离再判延续或反转),后者能滤掉更多噪音。

✦ 适用场景
Kagi图适合趋势跟随与突破交易,尤其在股票(用百分比阈值)和外汇(用点数阈值)中表现各异。

Kagi指标制图核心原则

为使指标独立于当前图表周期,代码先复制目标周期数据至计算缓冲区,再绘图。这样同一图表可叠加多周期Kagi,拓展分析边界。指标默认在独立窗口,也可设kagi_main_chart=true在主图绘制价格与时间标记。

标准版与修订版区别:标准版仅在反转点判断阈值;修订版对每个价格变动都要求先移动doorstep距离,再判定趋势延续或反转,因此对价格反应更慢,过滤小信号(图2蓝线为修订、红线为标准)。

除Kagi线外,指标还提供:反转价格标签(指标窗口/主图)、价格水平线(均匀或反转点分布)、反转时间线(主图垂直线,可随阴阳变色)。这些通过全局变量在多个函数间传递数据。

指标架构:3主函数+11辅助函数

BKCV.mq5由OnInit、OnCalculate、OnChartEvent、OnDeinit及系列func_函数构成。核心三函数:func_copy_history(复制价格)、func_copy_time(复制时间)、func_draw_kagi(填充缓冲区绘Kagi)。辅助函数负责对象创建、标签、删除、新柱检测等。全局变量(如a记录反转次数)串联各模块。

⚠ 新手注意
代码使用大量全局变量与数组索引反转,初学者易混乱。建议先读懂func_draw_kagi主循环再扩展。

输入参数与缓冲区声明

指标声明12缓冲区、8作图法(2直方图作阴阳垂直线,6线型作肩/腰延伸)。输入含周期、重绘周期、起点时间、kagi_type(标准/修订)、price_type、type_doorstep(点/百分比)、doorstep值、颜色宽度、标签与水平线设置、magic_numb(区分多实例)。以下为部分声明代码:

#property indicator_separate_window
#property indicator_buffers 12
#property indicator_plots   8
input ENUM_TIMEFRAMES period=PERIOD_CURRENT;
input double   doorstep=25;
input kagi_type_enum kagi_type=classic;

数据复制与反转计算函数

func_copy_history根据price_type选CopyClose/Open/High/Low,用静态数组增量复制,避免重读历史。func_copy_time类似但处理datetime转double。func_calc_dorstep按类型返回反转点数:点模式直接取doorstep;百分比模式用price/_Point*doorstep/100并转int。

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

增量复制逻辑:首次全量,后续仅复制新柱(bars_copied全局计数),保证效率。

主函数func_draw_kagi算法剖析

该函数接收价格、时间数组与作图缓冲区。初始化a=0(反转计数),line_move(前方向)、line_gauge(前阴阳)等。数组以AS_SERIES倒序填充,先赋-1空值。主循环遍历每根柱:price_2=当前价,对比price_1与前值,依8种情况(阴阳×上下×首线)更新yin_int/yang_int/lin数组及time_change等。循环后小循环将数组反序填入缓冲区,完成绘图。

for(int z=0; z<bars_copied; z++)
  {
   price_2=array_input[z];
   if(((price_1-price_2)/_Point>func_calc_dorstep(price_2)) && line_move==0)
     {
      yin_int_1[a]=price_1;
      yin_int_2[a]=price_2;
      line_move=-1; line_gauge=-1; price_1=price_2;
     }
  }

主图绘制与标签函数

func_kagi_main_chart用OBJ_TREND对象在主图连线,名称含magic_numb防冲突。func_label_main_chart绘时间线(OBJ_VLINE)与价格标签(OBJ_ARROW_RIGHT_PRICE);func_label_indicator_window在子窗口绘反转标签与水平线,数目受限防过载。func_create_trend_line封装对象属性设置。

void func_create_trend_line(string name,double price1,double price2,datetime time1,datetime time2,int width,color color_line)
  {
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_line);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
  }

对象管理与事件驱动

func_delete_objects按前缀+序号删对象。func_new_bar用switch映射周期至静态数组,比对新柱时间。OnCalculate在新柱(period_to_redraw)触发func_consolidation;OnChartEvent按R键重绘;OnDeinit清对象。func_consolidation统合:删旧对象→复制数据→绘Kagi→标签→主图→ChartRedraw。

int OnCalculate(const int rates_total,...)
  {
   if(func_new_bar(period_to_redraw)==true) func_consolidation();
   return(rates_total);
  }

实战交易策略示例

1) 阴阳转换信号:阳转阴卖、阴转阳买(图4 EURUSD M30 5点),实测多次捕获42~157点行情。2) 趋势线/通道突破:沿Kagi肩腰画通道,跌破跟空。3) 连续7-10次抬肩/降腰后反转概率高(图7 GBPUSD H4)。4) 价格标签突破:价超前标签买入,破则卖(图8修订版)。时间标签颜色辅助判情绪。

✦ 参数建议
外汇用点数门阶(如15-25点),股票用百分比(如1%)。M30/H1周期信号较稳。

常见问题

使用自定义指标复制目标周期价格与时间至缓冲区,在func_draw_kagi中按反转阈值(点/百分比)生成阴阳线数组,用DRAW_HISTOGRAM2与DRAW_LINE绘制,参考BKCV.mq5架构。
标准版仅在价格回撤达doorstep时反转;修订版要求每个价格变动先移动doorstep距离再判趋势,过滤更多小波动,反应更慢,需在kagi_type输入选classic或modified。
支持。设输入参数kagi_main_chart=true,指标会调用func_kagi_main_chart用OBJ_TREND对象在主图绘制阴阳垂直线与水平反转线,并可用magic_numb避免多实例冲突。
外汇货币对常用点数(如EURUSD设15-25点),股票因价差大用百分比(如1%)。可在type_doorstep与doorstep参数中调整,函数func_calc_dorstep自动换算。
OnCalculate调用func_new_bar(period_to_redraw),该函数比对新旧柱时间,返回true时执行func_consolidation重算并ChartRedraw;也可按R键经OnChartEvent手动重绘。