手动翻图表找K线形态这事,我早就受够了。盯着屏幕看几个小时,眼睛花了不说,还经常漏信号或者把不存在的形态硬看出来。后来我决定干脆用MQL5自己写个识别工具。真动手做了才发现,网上那些"标准"定义搬到实际市场里,要么检测不出东西,要么假信号满天飞。
教科书里的定义为什么不好使
几乎所有交易网站对十字星的定义都是"开盘价等于收盘价"。但实际交易中,这种完美等号出现的频率有多高?EURUSD这种五位报价的品种,可能几个月才出现一次教科书级别的十字星。MQL5官方文档里说可以用
Open[]、High[]、Low[]、Close[]这些数组来调用历史K线数据,但文档不会告诉你"差不多等于"这种情况该怎么处理。我摸索出的实用方案是这样的:
``
cpp
double atrValue = iATR(_Symbol, PERIOD_CURRENT, 14, 0);
double dojiThreshold = atrValue * 0.1;
if(MathAbs(Close[1] - Open[1]) <= dojiThreshold)
{
// 判定为十字星
Print("检测到十字星");
}
`
<strong>吞没形态的索引要搞清楚</strong>。 [0]代表当前K线(最新的),[1]是前一根,以此类推。看涨吞没的代码逻辑:
`cpp
// 看涨吞没:前一根阴线,当前阳线并吞没前一根实体
if(Close[1] < Open[1] && // 前一根是阴线
Close[0] > Open[0] && // 当前是阳线
Open[0] <= Close[1] && // 当前开盘低于前一根收盘
Close[0] >= Open[1]) // 当前收盘高于前一根开盘
{
Print("检测到看涨吞没");
}
`
反复试错之后我发现一个关键问题:图表上肉眼看着像的形态,按严格定义写出来的代码经常检测不到。比如看涨吞没,如果第二根阳线收盘价没有完美超过第一根阴线的开盘价,但已经很接近了——这种在日线图上其实照样有效,尤其是存在点差或跳空的时候。
AT R动态阈值才是真正的干货
跟网上那些教程最大的区别在于,我把每个形态的判定阈值都跟当前波动率挂钩了。亚洲盘1分钟图上的"小实体"可能是2个点,但伦敦/纽约重叠时段同样的2个点实体根本不算什么。
我的形态检测里用了ATR乘数:
`cpp
double atr = iATR(_Symbol, PERIOD_CURRENT, 14, 0);
double minBodySize = atr 0.15; // 最小实体尺寸
double maxBodySize = atr 0.35; // 十字星/锤子的最大实体
// 用动态阈值检测锤子线
if(MathAbs(Close[0] - Open[0]) <= maxBodySize &&
(Low[0] - MathMin(Open[0], Close[0])) >= 2 MathAbs(Close[0] - Open[0]) &&
(High[0] - MathMax(Open[0], Close[0])) <= minBodySize)
{
Print("检测到锤子线(ATR自适应阈值)");
}
`
在图表上标记检测结果
光检测出来还不够,我想让这些形态直接标在图表上方便肉眼验证。用图表对象创建文字标签就行:
`cpp
string labelName = "Pattern_" + TimeToString(Time[0]);
ObjectCreate(0, labelName, OBJ_TEXT, 0, Time[0], High[0] + (10 _Point));
ObjectSetText(labelName, "锤子线", 10, "Arial", clrGreen);
ObjectSetInteger(0, labelName, OBJPROP_ANCHOR, ANCHOR_BOTTOM);
`
这招挺管用的。以前我老是自己琢磨"这到底算不算一个有效形态",现在让代码去做硬性判断,我只需要结合市场背景做最后筛选就行了。
回测里容易踩的坑
讲一个我交过学费才明白的事:所有不考虑形态确认的回测数据都不要信。形态在K线收盘时看起来很好,但得等下一根K线确认才能用。我加了个简单过滤:
`cpp
// 只在确认后触发
if(Close[1] > Open[1] && // 确认K线收阳
Close[0] < Open[0]) // 形态K线收阴
{
// 不在形态出现的当根触发,等下一根确认
// 这里再执行交易逻辑
}
``如果不加这层过滤,回测胜率会虚高,实盘就原形毕露了。
参考来源:MQL5官方文档关于时间序列和K线数据的说明(docs.mql5.com);MQL5社区K线形态编程文章(mql5.com)。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。