价格行为分析工具开发(第 31 部分):基于Python的K线识别引擎(一) 手动检测·综合运用
从零跑通 Python 形态识别微服务
要让 MT5 的 EA 调用 Python 做 K 线形态识别,第一步是把本地环境搭稳。去 Python 官网点黄色按钮下 3.x 安装包,跑安装向导时务必勾 Add Python to PATH,否则后面命令行找不到 python 指令。 装完按 Win+R 输 cmd,敲 python --version,能回显类似 Python 3.10.4 就说明环境到位。接着用 Notepad++ 新建 pattern_server.py,把含 Flask 服务和形态函数的源码贴进去,存到 C:\PatternServer\ 这类目录,后缀必须是 .py。 命令行里 cd 到脚本目录,执行 pip install flask pandas,这步拉起 Web 框架和数据处理库。启动后控制台出现 * Running on http://127.0.0.1:5000/ 代表微服务已在本地 5000 端口监听。 EA 侧要在 MT5 的 Tools→Options→Expert Advisors→WebRequest 放行 http://127.0.0.1:5000/patterns。实测 EURUSD M15 上,EA 日志 2025.07.09 22:25:42.938 收到 HTTP 200,返回 30 根 K 线的 patterns 数组,含 doji=3、bullishengulfing=3、eveningstar=2 等标记,证明两端通信正常。外汇及贵金属波动剧烈,此类信号仅作概率参考,实盘前请充分回测。
python --version cd path\to\your\script\folder pip install flask pandas * Serving Flask app "pattern_server" * Running on http:class=class="str">"cmt">//class="num">127.0.class="num">0.1:class="num">5000/ (Press CTRL+C to quit) class="num">2025.07.class="num">09 class="num">22:class="num">25:class="num">42.248 Candlestick Label(EURUSD,M15) [CSLAB] EA started – allow http:class=class="str">"cmt">//class="num">127.0.class="num">0.1:class="num">5000/patterns in Tools→Options→Expert Advisors→WebRequest class="num">2025.07.class="num">09 class="num">22:class="num">25:class="num">42.790 Candlestick Label(EURUSD,M15) [CSLAB] JSON-OUT: {"symbol":"EURUSD", "timeframe":class="num">0,"time":[class="num">1752064200,class="num">1752065100,class="num">1752066000,class="num">1752066900,class="num">1752067800,class="num">1752068700,class="num">1752069600, class="num">1752070500,class="num">1752071400,class="num">1752072300,class="num">1752073200,class="num">1752074100,class="num">1752075000,class="num">1752075900,class="num">1752076800,class="num">1752077700, class="num">1752078600,class="num">1752079500,class="num">1752080400,class="num">1752081300,class="num">1752082200,class="num">1752083100,class="num">1752084000,class="num">1752084900,class="num">1752085800, class="num">1752086700,class="num">1752087600,class="num">1752088500,class="num">1752089400,class="num">1752090300,class="num">1752091200],"open":[class="num">1.17051,class="num">1.17045,class="num">1.17153, class="num">1.17167,class="num">1.17143,class="num">1.17096,class="num">1.17034,class="num">1.17152,class="num">1.17193,class="num">1.17194,class="num">1.17148,class="num">1.17095,class="num">1.1706 class="num">2025.07.class="num">09 class="num">22:class="num">25:class="num">42.790 Candlestick Label(EURUSD,M15) [CSLAB] POST http:class=class="str">"cmt">//class="num">127.0.class="num">0.1:class="num">5000/patterns class="num">2025.07.class="num">09 class="num">22:class="num">25:class="num">42.938 Candlestick Label(EURUSD,M15) [CSLAB] HTTP class="num">200 RESP: {"patterns": ["doji", "bullishengulfing", "None", "None", "eveningstar", "None", "bullishengulfing", "None", "doji", "bearishengulfing", "None", "None", "None", "None", "None", "bearishengulfing", "None", "None", "bullishengulfing", "doji", "bearishengulfing", "None", "None", "None", "None", "None", "None", "None", "hammer", "eveningstar", "None"], "log": ["doji=class="num">3", "bullishengulfing=class="num">3", "eveningstar=class="num">2"
「从日志看 EURUSD M15 的形态分布」
在 MT5 的 Experts 日志里,Candlestick Label 脚本对 EURUSD 的 M15 图表打出了这样一组统计:doji=3、bullishengulfing=3、eveningstar=2、bearishengulfing=3、hammer=1,合计 total patterns=12,整轮识别耗时 ms=128.25。 这组数字说明,在采样窗口内, EURUSD M15 上多空吞没形态出现频率最高(各 3 次),锤子线仅 1 次,十字星 3 次。若你自己在 MT5 打开同周期同品种,把时间拨到 2025.07.09 22:25 附近,应当能复现近似的形态计数。 RAW BODY 里附带了 30 根 K 线的原始序列,time 从 1752064200 到 1752091200(每根间隔 900 秒即 15 分钟),open 价格介于 1.17015 与 1.17226 之间。外汇与贵金属属高风险品种,形态计数仅描述历史结构,不预示后续方向。 想验证的话,直接把脚本挂到 EURUSD M15,比对日志里的 symbol、timeframe=0(即 PERIOD_M15)与 time 数组,就能确认本地数据和上面这份服务端回传是否一致。
◍ 从K线数组到形态清单的实时回传
这段日志展示了价格行为识别模块把 30 根 K 线的 low 与 close 数组,连同识别出的蜡烛形态一并 POST 给本地服务的过程。low 数组里最低探到 1.17005、最高在 1.17188,close 数组则在 1.17015 到 1.17227 之间,样本来自 EURUSD 的 M1 或 M5 级别概率较高。 识别结果以 patterns 列表回传:doji 出现 3 次、bullishengulfing 3 次、bearishengulfing 3 次、eveningstar 2 次、hammer 1 次,合计 12 个有效形态。注意 eveningstar 在第 5 位和第 30 位出现,中间夹着多组 bullishengulfing 与 bearishengulfing 互搏,说明这段行情多空拉锯密集。 整包处理耗时 ms=128.25,服务端 127.0.0.1 返回 200,说明本地推理闭环通畅。外汇与贵金属属高风险品种,这类形态信号只代表概率倾向,实盘前务必在 MT5 策略测试器用历史 tick 复跑一遍确认延迟与命中率。 想验证这套回传结构,直接开 MT5 用下面代码把最近 30 根 K 线的 low/close 打印出来,比对日志里的数组就能知道你的数据源和识别端是否对齐。
[CODE] "low":[class="num">1.17008,class="num">1.17036,class="num">1.17120,class="num">1.17109,class="num">1.17088,class="num">1.17005,class="num">1.17028,class="num">1.17152,class="num">1.17152,class="num">1.17131,class="num">1.17095,class="num">1.17050,class="num">1.17055,class="num">1.17050,class="num">1.17059,class="num">1.17009,class="num">1.17013, class="num">1.17039,class="num">1.17039,class="num">1.17077,class="num">1.17043,class="num">1.17056,class="num">1.17051,class="num">1.17141,class="num">1.17091,class="num">1.17101,class="num">1.17130,class="num">1.17163,class="num">1.17188,class="num">1.17180,class="num">1.17163],"close":[class="num">1.17045, class="num">1.17153,class="num">1.17170,class="num">1.17143,class="num">1.17096,class="num">1.17034,class="num">1.17152,class="num">1.17193,class="num">1.17194,class="num">1.17149,class="num">1.17096,class="num">1.17066,class="num">1.17086,class="num">1.17061,class="num">1.17072,class="num">1.17015,class="num">1.17067, class="num">1.17050,class="num">1.17087,class="num">1.17088,class="num">1.17058,class="num">1.17087,class="num">1.17175,class="num">1.17160,class="num">1.17104,class="num">1.17133,class="num">1.17165,class="num">1.17216,class="num">1.17227,class="num">1.17189,class="num">1.17177]} class="num">2025-class="num">07-class="num">09 class="num">22:class="num">25:class="num">42,class="num">934 [INFO] SEND: {&class="macro">#x27;patterns&class="macro">#x27;: [&class="macro">#x27;doji&class="macro">#x27;, &class="macro">#x27;bullishengulfing&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;eveningstar&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;bullishengulfing&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;doji&class="macro">#x27;, &class="macro">#x27;bearishengulfing&class="macro">#x27;,&class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;bearishengulfing&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;bullishengulfing&class="macro">#x27;, &class="macro">#x27;doji&class="macro">#x27;, &class="macro">#x27;bearishengulfing&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;,&class="macro">#x27;hammer&class="macro">#x27;, &class="macro">#x27;eveningstar&class="macro">#x27;, &class="macro">#x27;None&class="macro">#x27;], &class="macro">#x27;log&class="macro">#x27;: [&class="macro">#x27;doji=class="num">3&class="macro">#x27;, &class="macro">#x27;bullishengulfing=class="num">3&class="macro">#x27;, &class="macro">#x27;eveningstar=class="num">2&class="macro">#x27;, &class="macro">#x27;bearishengulfing=class="num">3&class="macro">#x27;, &class="macro">#x27;hammer=class="num">1&class="macro">#x27;, &class="macro">#x27;total patterns=class="num">12&class="macro">#x27;], &class="macro">#x27;ms&class="macro">#x27;: class="num">128.25} class="num">2025-class="num">07-class="num">09 class="num">22:class="num">25:class="num">42,class="num">936 [INFO] class="num">127.0.class="num">0.1 - - [class="num">09/Jul/class="num">2025 class="num">22:class="num">25:class="num">42] "POST /patterns HTTP/class="num">1.1" class="num">200 - [/CODE]
一点提醒
这套 MQL5 EA 与 Python 服务端协同的链路,实测新 K 线从生成到图表标注刷新可做到毫秒级延迟,两端各留结构化日志,排查断点不用翻全量打印。 想自己跑通,先把 Candlestick_Label.mq5(15.38 KB)和 patterns.py(5.24 KB)下到同一套环境,EA 负责推 OHLC 的 JSON,Python 跑你写的形态逻辑再回传。 外汇与贵金属波动剧烈、杠杆风险高,实盘前务必在 MT5 策略测试器用历史数据验证形态命中率,再决定是否接真金。 后续可往 patterns.py 里加吞没、长影线等更多形态,也可以等下一篇看 TA-Lib 怎么替你省掉手写识别的活。