MT5 Kagi制图指标开发全解
从算法原理到MQL5多函数指标实现
Kagi图是什么:被遗忘的日本图表
Kagi图(日语“钥匙图”)于19世纪日本东京证券交易所成立后发展起来,1994年Steve Nison的《Beyond Candlesticks》将其引入西方。与K线、柱状图不同,Kagi图完全忽略时间轴,仅保留价格尺度,用粗细线表示阴阳:粗线为阳(上升趋势),细线为阴(下降趋势)。当价格回撤达到预设反转阈值(点数或百分比)时,在新列反向画线。这种结构过滤微小波动,突出趋势实质。
在MT5中,我们通过自定义指标实现Kagi图,可置于独立窗口或主图。原文BKCV.mq5指标支持标准版(仅过滤反转点)和修订版(每步动作都需先移动设定距离再判延续或反转),后者能滤掉更多噪音。
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记录反转次数)串联各模块。
输入参数与缓冲区声明
指标声明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修订版)。时间标签颜色辅助判情绪。