Kagi 制图指标(基础篇)
📘

Kagi 制图指标(基础篇)

第 1/3 篇

◍ Kagi 制图在 MT5 里的落地形态

Kagi(卡吉)图把时间轴扔掉,只认价格反向波动幅度,涨破阈值画实线、跌破画虚线,用来滤掉噪音看趋势骨架。在 MT5 里它作为内置制图指标存在,不用自己写解析器就能直接切到对应品种图表观察。 该指标公开示例最早挂在 2014 年 5 月 27 日 15:02,累计被查看 5093 次、被用户标记 3 次,作者署名为 Dmitriy Zabudskiy。这类冷门制图工具下载量不大,但胜在原生支持、零依赖,适合拿来做价格行为学的辅助对照。 外汇与贵金属杠杆高、滑点随机,Kagi 只描述已发生价格结构,不预测方向;用它判断反转倾向时,仍需结合实时流动性与止损位。

Kagi 图是怎么来的

十九世纪日本并没有现代意义的证券交易所,直到 1878 年 5 月东京证券交易所的前身成立,才为 Kagi 图的发明提供了土壤。这种图在日语里是“钥匙”的意思,因为形状像当时用的 L 形钥匙,所以也叫钥匙图。 欧美交易者对 Kagi 图几乎一无所知,直到 1994 年 Steve Nison 出版《Beyond Candlesticks》才把它带出日本。书里还记了几个别名:价格范围图、钩形图、三角或链形排列图,说明这类画法在当时口径并不统一。 Kagi 图最反直觉的一点是直接扔掉时间轴,只保留价格轴。和烛形、柱状、线形不同,它把小幅杂波过滤掉,只画够级别的反转,所以图上看到的都是“像样”的波动。 线有粗细之分:粗线代表当前价格已经突破邻近的极值(阳线倾向),细线代表未破(阴线倾向)。反转触发靠一个预设量,货币对常用点数,股票常用百分比,到了这个数才在新列反向画线。

「EURUSD H1 上的 Kagi 线反转实例」

拿 10 月 8 日至 11 日 EURUSD 的 H1 历史数据看,反向门槛设 15 点时的 Kagi 图很有代表性。 17:00 起价格下跌持续到 21:00;22:00 从 1.3566 向上走,收在 1.3574,只覆盖 11 点,不够逆转也没破前低。随后两小时横盘,01:00(10 月 9 日)强势拉到 1.3591,较 1.3566 涨 25 点,触发逆转。 上升延续一小时到 1.3599 加粗阳线;03:00 急跌收 1.3578,距前高差 21 点,达到逆转条件,线向下但粗阳线形态未变。 16:00 跌破最近低点 1.3566,粗阳转细阴;空头延续至 10 月 10 日 14:00 翻阳,突破 10 月 9 日 23:00 的 1.3524 前高。外汇高波动,Kagi 仅过滤噪声,反转信号可能假突破,开 MT5 调出同期数据可复刻该结构。

◍ 把 Kagi 图从当前周期里剥出来

要让 Kagi 指标脱离当前图表周期的限制,做法是单独复制目标时间表的行情数据,再基于这份副本画图。这样同一张图能叠看多个周期,技术分析边界直接被撑开。 指标默认待在独立窗口,但也能把数据搬上主图。窗口里给的是标准样式或修订样式的主信息;搬上主图后还会补画价格与时间标记,具体看参数开关。 修订版 Kagi 是我没在别处见过的思路:它不只过滤反转点,连每一步走势都先卡一道距离门槛。价格得先挪够设定距离,才判定是延续还是反转,避免把肩、腰的小晃当信号。图 2 里蓝线(修订)对红線(标准)的对比很直白——蓝线反应慢半拍,把多数杂波滤掉了。 除图本身,指标窗口和主图都塞了辅助元素。窗口内可按反转方向(上/下)或阴阳线着色,也能无变色;反转价标记可平铺整个价格区间,也可只钉在每个反转点。主图的反转价标记含临时标记,配色逻辑同上。 代码层用全局变量做函数间通信,拆成 3 主函数 + 11 辅函数。主窗 Kagi 函数扛缓冲区填充与绘图;另两个数据函数分别拷时间和选定周期每根 K 线的价。其余辅函数管删对象、卸载清场、算反转参数、画标记和走势线、侦测新柱启动。

Kagi 指标的内部分层实现

MT5 里这套 Kagi 指标把代码拆成多个靠全局变量互相通信的函数,初看杂乱,但分层后逻辑清楚:先声明 12 个缓冲区和 8 种作图法,再依次处理输入参数、数据复制、反转计算、主绘图与各类标签对象。 输入参数里真正影响结构的是三项:形成周期、重绘周期、起点时间;其余多为作图外观与标签开关。注意 8 种作图法含 2 个柱状图与 6 个线形图——每条水平线实际由 2~3 个线型结构旋转拼出,跳过必要点时必须带上第三个结构,否则相邻线会黏在一起。 初始化函数里有个易踩的坑:指标名必须拼入 magic_numb 幻数,否则同一图表挂多个实例时,ChartWindowFind() 只会把图形对象绑到第一个实例上。缓冲区设 AS_SERIES 索引,意味着填充要倒序写,Kagi 图比主图短,向后画更稳。 数据复制分价格与开盘时间两个函数。价格复制用 switch() 按 price_type 选收盘价/开盘价/最高价/最低价,并用全局变量记录已复制柱数;非首次调用时减一加一修正边界,避免重复或漏柱。时间函数不挑数据类别,故无 switch(),但 datetime 写入双精度缓冲时需强转。 反转参数计算函数只接一个价格参:若 type_doorstep 是点数就走线性方程,是百分比则先算总点数再取比例,返回前把 double 截成 int。主绘图函数靠六个状态变量续算上次位置(line_move、line_gauge、price_1/2、price_down/up),for 循环扫全部复制柱,按「之前方向×之前线型」分 8 种起步情况填 yin_int_1/2、yang_int_1/2、lin_yin/yang 等数组,最后用「a」记录的反转次数做逆序重排,防止水平线纠缠。 主图绘制与标签函数都依赖全局数组,对象名以幻数开头便于按实例删除;指标窗口的价格水平循环硬性限制数目,过多会直接拖垮可读性。想验证结构细节,开 MT5 挂上指标、改 magic_numb 与 levels_number 看对象归属和超载表现即可,外汇贵金属杠杆高,参数误用可能放大滑点风险。

「对象清理与新柱判定如何串起整张 Kagi 图」

两个作图循环都受指标设置里「价格标签数」和「价格水平数」的限制,但实际反转次数可能远少于设定值,所以每次循环都要判断反转是否存在再落笔。唯一不受图表反转影响的是沿整个价格范围等距铺价格水平,而标签和水平线在坐标里倒序生成:当下日期的先放,历史日期的后补。 删除旧图形对象靠一个独立函数,入参是对象初始名称加编号,名称里必须带幻数和服务于哪类对象的标记。调用次数会超出对象可能存在的上限,但对指标运行没有实质影响,属于冗余遍历而非错误。 新柱检测函数只有一个周期参数,返回 bool。核心就是拿当前柱开盘时间和已记录时间比,不同就认新柱并刷新记录,相同则否定。switch 语句虽覆盖全周期,实际常用单一周期就够。 所有计算和作图函数被收进 Func Consolidation,新柱触发 OnCalculate 或按 R 键触发 OnChartEvent 时启动。启动前先删对象——主图加指标窗口的标签、反转竖线、阴阳线合计要调 7 次删除函数,再拷历史数据、建 Kagi、贴标签、重绘。去初始化时 OnDeinit 再清一遍。 下面这段头部声明能直接看出绘图规模:indicator_buffers 12、indicator_plots 8,Yin 系列用 DRAW_HISTOGRAM2 和 DRAW_LINE 混排,颜色全 clrRed。复制进 MT5 编译后,改 indicator_color1 到 4 为 clrGreen 就能把阴线视觉反转,验证多缓冲分绘机制。外汇与贵金属波动剧烈,Kagi 反转阈值设错可能漏画大量结构,实盘前务必在策略测试器跑历史段。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                                 BKCV.mq5 |
class=class="str">"cmt">//|                     Azotskiy Aktiniy ICQ:class="num">695710750 |
class=class="str">"cmt">//|         [MQL5官方文档] |
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//--- Build Kagi Chart Variable
class="macro">#class="kw">property copyright "Azotskiy Aktiniy ICQ:class="num">695710750"
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property description "Build Kagi Chart Variable"
class="macro">#class="kw">property description " "
class="macro">#class="kw">property description "This indicator makes drawing a chart Kagi as a matter of indicator window, and in the main chart window"
class="macro">#class="kw">property indicator_separate_window
class="macro">#class="kw">property indicator_buffers class="num">12
class="macro">#class="kw">property indicator_plots   class="num">8
class=class="str">"cmt">//--- plot Yin
class="macro">#class="kw">property indicator_label1  "Yin"
class="macro">#class="kw">property indicator_type1   DRAW_HISTOGRAM2
class="macro">#class="kw">property indicator_color1  clrRed
class="macro">#class="kw">property indicator_style1  STYLE_SOLID
class="macro">#class="kw">property indicator_width1  class="num">1
class=class="str">"cmt">//--- plot Yin1
class="macro">#class="kw">property indicator_label2  "Yin1"
class="macro">#class="kw">property indicator_type2   DRAW_LINE
class="macro">#class="kw">property indicator_color2  clrRed
class="macro">#class="kw">property indicator_style2  STYLE_SOLID
class="macro">#class="kw">property indicator_width2  class="num">1
class=class="str">"cmt">//--- plot Yin2
class="macro">#class="kw">property indicator_label3  "Yin2"
class="macro">#class="kw">property indicator_type3   DRAW_LINE
class="macro">#class="kw">property indicator_color3  clrRed
class="macro">#class="kw">property indicator_style3  STYLE_SOLID
class="macro">#class="kw">property indicator_width3  class="num">1
class=class="str">"cmt">//--- plot Yin3
class="macro">#class="kw">property indicator_label4  "Yin3"
class="macro">#class="kw">property indicator_type4   DRAW_LINE
class="macro">#class="kw">property indicator_color4  clrRed
class="macro">#class="kw">property indicator_style4  STYLE_SOLID
class="macro">#class="kw">property indicator_width4  class="num">1
class=class="str">"cmt">//--- plot Yang

常见问题

Kagi 图只认价格反向波动达到设定阈值才画新线,不按时间排布;普通图每根 K 线都占等长时间格,容易被横盘噪音带偏。
当价格从极值回撤超过设定点数(如 10 点)就反转画新线;实盘中看到粗线转细线且反向,倾向短期趋势易歇,可结合支撑区验证。
小布可对接品种页加载 Kagi 视图,反转触发时推送提醒,你只需设好阈值,把重复盯图交给它。
指标内通常用对象前缀标记旧线,新柱或周期变更时按前缀删除再重建;手动清就到对象列表搜前缀全删。
靠比较最后已知柱时间或序号,不判新柱会重复追加同一根线导致图形重叠失真,回测也偏。