价格行为分析工具开发(第 31 部分):基于Python的K线识别引擎(一)—— 手动检测
内容
引言
K线图是金融分析师与交易者用于可视化、解读价格随时间走势的基础工具。K线图起源于数百年前的日本米商,如今已发展成为股票、外汇、期货等各类金融市场技术分析的核心组成部分。
单根K线通过呈现特定周期内的开盘价、收盘价、最高价、最低价等关键数据,提供关于市场情绪的核心信息。每根K线的独特结构都传递着市场心理信号,可作为潜在的交易依据。
本文将讲解一套基于MQL5与Python联合开发的完整K线图识别系统。我们将从手动检测方法入手,编写脚本从 MQL5 提取价格指标,并按预设规则判定形态名称。尽管相关识别功能可完全在 MQL5 内实现,但我们选择MQL5 与 Python 分工协作,充分发挥两者优势,让系统更灵活、更稳健。
在下一篇文章中,我们将引入 Python 专业库实现高级K线图形态识别,进一步提升检测准确率与形态覆盖范围。欢迎跟随我们深入K线图识别细节,体验这套融合方案如何提升交易分析效率。以下是本文讲解步骤:
- 逐一分析形态:详细拆解每种K线图形态,以及在 Python 中如何实现识别逻辑。
- MQL5-Python 交互:讲解 MQL5 智能交易系统(EA)与 Python 服务端的通信机制、数据交互流程。
- 结果评估与总结:对系统效果进行测评,讨论有效性并给出性能结论与优化方向。
K线形态分析
K线图中间的实体部分称为实体,代表同一周期内开盘价与收盘价的价差。实体被填充或着色通常表示收盘价低于开盘价,即看跌(空头)走势。反之,空心或异色的实体表示收盘价高于开盘价,即看涨(多头)趋势。
从实体延伸出的细线称为影线,显示该交易时段内的最高价与最低价。影线的长度与位置能反映市场波动强度与投资者情绪,揭示价格相对开盘、收盘价的波动过程。
K线图形态集中体现了市场参与者的整体心理,反映其情绪反应与预期。技术分析师借助这些视觉信号判断潜在的入场与出场点位。K线图技术最早可追溯至 18 世纪的日本,当时米商用于追踪稻米价格。如今,它仍是分析股票、外汇、期货等高流动性资产的通用工具。
看涨 K 线与看跌 K 线
- 看涨 K 线:
当收盘价高于开盘价时,该 K 线为看涨 K 线。通常显示为白色或绿色,代表上涨动能。这类 K 线表明该时段内买方占据主导。若长阳线出现在关键支撑位附近,信号强度会显著提升,代表买盘力量强劲。
- 看跌 K 线:
反之,收盘价低于开盘价时为看跌 K 线。通常显示为黑色或红色,代表卖压与价格下行趋势。长阴线往往代表抛售力度大,跌势可能延续。
- 颜色规范
多数交易平台传统上用白色 / 绿色表示看涨 K 线,黑色或红色表示看跌 K 线,但颜色方案可灵活设置。核心是理解开盘价与收盘价的相对关系,而非严格拘泥于颜色。判断市场情绪的关键始终是开盘价与收盘价的位置关系。
由于K线图形态种类繁多,本系统聚焦于一组精选的关键形态。下文将逐一讲解每种形态的视觉特征,以及如何用 Python 实现识别:
锤头线
锤头线形态形成时,开盘价、最高价、收盘价三者非常接近,形成小实体。其典型特征是一根明显较长的下影线,表明价格曾被卖方打压,但最终被买方拉回。这预示着动能可能转向上涨,隐含看涨情绪。以下是在 Python 脚本中识别锤头线的代码片段。
# inside detect_patterns(df: pd.DataFrame) for i, _ in enumerate(df.index): o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]] body = abs(c - o) lower = min(o,c) - l upper = h - max(o,c) if lower >= 2*body and upper <= body: pats[i] = "hammer" continue
- 实体指 K 线的真实实体,计算公式为收盘价与开盘价的绝对差值(abs (close - open))。
- 下影线长度至少为实体长度的 2 倍。
- 上影线必须很短(不超过实体长度)。
- 满足该条件时,在pats[]数组中标记为“锤头线”。
射击之星
射击之星形态形成时,开盘价、最低价、收盘价三者非常接近。由此形成一根实体极小、上影线极长的 K 线。射击之星通常被视为锤头线的看跌对应形态,预示上涨动能可能出现反转或滞涨。技术分析专家通常建议:上影线长度至少为实体的 2 倍,才能确认该形态有效。
# inside detect_patterns(df: pd.DataFrame) for i, _ in enumerate(df.index): o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]] body = abs(c - o) lower = min(o,c) - l upper = h - max(o,c) if upper >= 2*body and lower <= body: pats[i] = "shootingstar" continue
- 实体长度 = 开盘价与收盘价的差值。
- 上影线长度至少为实体的 2 倍;下影线必须很短(小于或等于实体长度)。
- 满足这些条件时,该形态标记为 “射击之星”。
吞没形态(看涨吞没 & 看跌吞没)
看涨吞没形态的特征:前一根小阴线(看跌 K 线),后一根大阳线(看涨 K 线),且阳线实体完全包裹前一根阴线的实体。该形态预示下跌趋势可能反转上涨,代表买盘力量已彻底压倒卖盘。
# Bullish Engulfing: small red followed by large green that engulfs it if i >= 1: prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]] curr_o, curr_c = o, c if (prev_c < prev_o and curr_c > curr_o and # red candle then green curr_o < prev_c and curr_c > prev_o): # body engulfs previous pats[i] = "bullishengulfing" continue
看跌吞没形态则与之相反。该形态表现为:一根小阳线(看涨 K 线)之后,出现一根大阴线(看跌 K 线),且阴线实体完全包裹前一根阳线的实体。该形态预示上涨趋势可能反转下跌,反映市场抛售压力显著增强。
# Bearish Engulfing: small green followed by large red that engulfs it if i >= 1: prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]] curr_o, curr_c = o, c if (prev_c > prev_o and curr_c < curr_o and # green candle then red curr_o > prev_c and curr_c < prev_o): # body engulfs previous pats[i] = "bearishengulfing" continue
十字星
十字星是一种开盘价与收盘价几乎完全相同的 K 线,其实体极小或几乎不存在。该形态代表市场多空力量僵持、方向不明,多空双方在该时段均未占据主导。
# Doji: very small or no real body if abs(c - o) <= (h - l) * 0.1: pats[i] = "doji" continue
- abs(c - o):K 线实体长度(收盘价与开盘价的差值)。
- (h - l):K 线总波动范围(最高价减最低价)。如果实体长度小于等于 K 线总波动范围的 10%,即判定为十字星。
孕线(看涨孕线 & 看跌孕线)
孕线(Harami)源自日语,意为 “怀孕”,是技术分析中经典的形态,预示趋势可能反转或休整。该形态由两根 K 线组成:第一根为较大的母 K 线,随后是一根较小的子 K 线,且子 K 线完全包含在母 K 线实体范围内。有效孕线要求第二根 K 线收盘价落在第一根 K 线实体内部,代表市场动能出现停顿或潜在反转。
孕线出现在上涨趋势后,构成看跌孕线,预示买盘动能衰减,价格可能回落;反之,出现在下跌趋势后,构成看涨孕线,预示价格可能反弹或趋势反转。
if i >= 1: prev_o, prev_c = df.iloc[i-1][["OPEN", "CLOSE"]] curr_o, curr_c = o, c # Previous candle: large body (engulfing candle) prev_body = abs(prev_c - prev_o) curr_body = abs(curr_c - curr_o) if prev_body > 0 and curr_body > 0: # Bullish Harami if prev_o > prev_c and curr_o < curr_c: # bearish → bullish if curr_o > prev_c and curr_c < prev_o: pats[i] = "bullishharami" continue # Bearish Harami if prev_o < prev_c and curr_o > curr_c: # bullish → bearish if curr_o < prev_c and curr_c > prev_o: pats[i] = "bearishharami" continue
启明星
启明星是强烈的看涨反转形态,通常出现在下跌趋势之后,标志市场情绪由看跌转为看涨。该形态由三根 K 线组成:第一根为大阴线,代表卖盘力量强劲;第二根为小实体 K 线(阴阳均可),且与前一根 K 线形成跳空缺口,代表市场犹豫、动能停顿;第三根为大阳线,收盘价大幅收复至第一根阴线实体内部,确认上涨动能回归。
该形态表明卖方力量衰竭、买方开始主导,形态确认后往往会出现持续性上涨。交易者广泛使用启明星捕捉多头入场信号,尤其在长期下跌后出现时信号可靠性更高。
if i >= 2: o1, c1 = df.iloc[i-2][["OPEN", "CLOSE"]] # First candle o2, c2 = df.iloc[i-1][["OPEN", "CLOSE"]] # Second (small) candle o3, c3 = df.iloc[i][["OPEN", "CLOSE"]] # Third candle # Candle directions is_bearish1 = c1 < o1 is_small2 = abs(c2 - o2) < abs(c1 - o1) * 0.5 is_bullish3 = c3 > o3 # Morning Star Logic if is_bearish1 and is_small2 and c3 > ((o1 + c1) / 2) and c3 > o3: if min(o2, c2) < c1 and max(o2, c2) > c1: # small gap pats[i] = "morningstar" continue
- 第一根 K 线:长阴线(实体向下)。
- 第二根 K 线:小实体 K 线(阴阳皆可)。
- 第三根 K 线:强势阳线,收盘价突破第一根 K 线的中点上方。
该形态为三根 K 线组合的反转形态,通常预示下跌行情结束。
黄昏之星
黄昏之星是经典的看跌反转形态,一般出现在上涨趋势末端,预示市场情绪由看涨转为看跌。该形态由三根 K 线构成:第一根为大阳线,代表买盘力量强劲;第二根为小实体 K 线(阴阳不限),与前一根 K 线形成跳空,体现市场多空纠结、上涨动能停滞;第三根为大阴线,收盘价深度刺入第一根阳线实体内部,最终确认行情反转。
该形态意味着买方动能衰竭、空头开始掌控盘面,后续往往开启下跌趋势或阶段性回调。交易者常将黄昏之星作为做空入场、或是多头止盈离场的信号,在长期持续上涨行情后出现时,参考价值更高。
if i >= 2: o1, c1 = df.iloc[i-2][["OPEN", "CLOSE"]] # First candle o2, c2 = df.iloc[i-1][["OPEN", "CLOSE"]] # Second (small) candle o3, c3 = df.iloc[i][["OPEN", "CLOSE"]] # Third candle is_bullish1 = c1 > o1 is_small2 = abs(c2 - o2) < abs(c1 - o1) * 0.5 is_bearish3 = c3 < o3 if is_bullish1 and is_small2 and c3 < ((o1 + c1) / 2) and c3 < o3: if max(o2, c2) > c1 and min(o2, c2) < c1: # small gap possible pats[i] = "eveningstar" continue
- 第一根 K 线:长阳线实体。
- 第二根 K 线:小实体 K 线(代表多空僵持)。
- 第三根 K 线:强势阴线,收盘价大幅跌破第一根 K 线的中点。
此三根 K 线组合形态,预示行情大概率由涨转跌、趋势反转。

MQL5 与 Python 交互机制
在本方案架构中,复杂的K线图形态识别逻辑交由Python 微服务承载;而 MQL5 智能交易系统(EA)专注于数据采集、图表标注与信号提醒功能。每当一根新 K 线收盘,EA 会提取最新 31 根 K 线的 OHLC 行情数据,以 JSON 格式发送至本地 Flask 服务端,再将服务端返回的所有识别形态绘制到图表,全程近乎实时运行。分步运行逻辑如下:- MQL5 智能交易端:MQL5 数据采集
void OnTick() { static datetime lastBar = 0; datetime bar = iTime(_Symbol, InpTF, 0); if(bar == lastBar) return; lastBar = bar; double o[ BARS ], h[ BARS ], l[ BARS ], c[ BARS ]; long t[ BARS ]; for(int i=0; i<BARS; i++) { o[i] = iOpen(_Symbol, InpTF, i+1); h[i] = iHigh(_Symbol, InpTF, i+1); l[i] = iLow (_Symbol, InpTF, i+1); c[i] = iClose(_Symbol, InpTF, i+1); t[i] = (long)iTime(_Symbol, InpTF, i+1); } // …then build JSON… }
- MQL5 EA:构建 JSON 数据体
string json = StringFormat( "{\"symbol\":\"%s\",\"timeframe\":%d," "\"time\":[%s],\"open\":[%s],\"high\":[%s]," "\"low\":[%s],\"close\":[%s]}", _Symbol, InpTF, CSVInt(t), CSV(o), CSV(h), CSV(l), CSV(c) );
- MQL5 EA:通过 HTTP POST 发送数据
char body[]; StringToCharArray(json, body); char reply[]; string hdr="Content-Type: application/json\r\n", respHdr; int code = WebRequest("POST", InpURL, hdr, InpTimeout, body, reply, respHdr); if(code == -1) Print("[CSLAB] WebRequest failed: ", GetLastError()); else string resp = CharArrayToString(reply, 0, -1, CP_UTF8);
- Python:Flask 服务端处理
@app.route("/patterns", methods=["POST"]) def patterns(): raw = request.get_data(as_text=True) idx = raw.rfind("}") clean = raw[:idx+1] if idx != -1 else raw payload = json.loads(clean) # may raise JSONDecodeError # …build DataFrame…
- Python:构建数据帧
build_dataframe函数的作用是:将原始 JSON 格式的时间戳、开盘价、最高价、最低价、收盘价数组,转换为时间索引的数据框(DataFrame),方便形态识别模块直接调用。
def build_dataframe(payload): times = [ datetime.fromtimestamp(int(t), timezone.utc) for t in payload["time"] ] df = pd.DataFrame({ "OPEN": payload["open"], "HIGH": payload["high"], "LOW": payload["low"], "CLOSE": payload["close"] }, index=times) df.index.name = "datetime" return df
- Python:手动形态识别
def detect_patterns(df): pats = ["None"]*len(df) for i in range(len(df)): o,h,l,c = df.iloc[i][["OPEN","HIGH","LOW","CLOSE"]] body = abs(c-o); rng = max(h-l,1e-6) lower = min(o,c)-l; upper = h-max(o,c) # doji if body/rng <= 0.1: pats[i] = "doji"; continue # hammer if lower>=2*body and upper<=body: pats[i] = "hammer"; continue # shooting star if upper>=2*body and lower<=body: pats[i] = "shootingstar"; continue # bullish engulfing if i>0: po,pc = df.iloc[i-1][["OPEN","CLOSE"]] if pc<po and c>o and o<=pc and c>=po: pats[i] = "bullishengulfing"; continue # bearish engulfing if i>0: po,pc = df.iloc[i-1][["OPEN","CLOSE"]] if pc>po and c<o and o>=pc and c<=po: pats[i] = "bearishengulfing"; continue # harami if i>0: po,pc = df.iloc[i-1][["OPEN","CLOSE"]] if pc<po and o<c and o>pc and c<po: pats[i] = "bullishharami"; continue if pc>po and o>c and o<pc and c>po: pats[i] = "bearishharami"; continue # morning star if i>1: o1,c1 = df.iloc[i-2][["OPEN","CLOSE"]] o2,c2 = df.iloc[i-1][["OPEN","CLOSE"]] if c1<o1 and abs(c2-o2)<(df.iloc[i-1]["HIGH"]-df.iloc[i-1]["LOW"])*0.3 \ and c>o2 and c>(o1+c1)/2: pats[i] = "morningstar"; continue # evening star if i>1: o1,c1 = df.iloc[i-2][["OPEN","CLOSE"]] o2,c2 = df.iloc[i-1][["OPEN","CLOSE"]] if c1>o1 and abs(c2-o2)<(df.iloc[i-1]["HIGH"]-df.iloc[i-1]["LOW"])*0.3 \ and c<o2 and c<(o1+c1)/2: pats[i] = "eveningstar"; continue return pats
- Python:构造响应数据
服务端统计所有非空 K 线形态,最终返回结构精简的 JSON 数据包:
pats = detect_patterns(df) counts = Counter(pats) log_lines = [f"{k}={v}" for k,v in counts.items() if k!="None"] resp = {"patterns": pats, "log": log_lines, "ms": round((datetime.now(timezone.utc)-start).total_seconds()*1000,2)} return make_response(json.dumps(resp), 200, {"Content-Type":"application/json"})
- MQL5 EA:解析数据并执行逻辑
// extract patterns array string patTxt; ExtractArray(resp, "patterns", patTxt); string patt[]; ParseArray(patTxt, patt); // draw+alert for(int i=0;i<BARS;i++) if(patt[i]!="None") { datetime tm=iTime(_Symbol,InpTF,i+1); ObjectCreate(0,"CS_"+i,OBJ_TEXT,0,tm,iHigh(_Symbol,InpTF,i+1)); ObjectSetString(0,"CS_"+i,OBJPROP_TEXT,patt[i]); Alert(_Symbol, " ", patt[i], " at ", TimeToString(tm,TIME_DATE|TIME_MINUTES)); }
测试及结果
本章节将重点介绍系统测试流程,并对运行结果进行分析。开始测试前,我们先完整讲解 Python 环境部署与服务端配置,保障程序稳定运行。
下载
第一步:前往Python 官网下载安装包,点击页面黄色醒目按钮: “下载 Python 3.x.x”。
运行安装程序
双击打开安装文件。点击“立即安装”前,务必勾选Add Python to PATH(添加至系统环境变量),后续即可在命令行任意位置直接调用 Python 指令。完成安装后关闭安装窗口。
环境校验
按下 Win+R,输入 cmd 回车,打开命令提示符窗口。在控制台输入以下指令:
python --version
若正常输出版本号(例如 Python 3.10.4),代表 Python 安装配置成功。
Python 安装完成后,下一步创建并编写 Python 服务脚本。
打开文本编辑器
启动 Notepad++ 或任意纯文本编辑工具。
新建文件
点击「文件 - 新建」,可手动设置语言为 Python 语法高亮(非必需)。
粘贴服务端代码
复制完整的 pattern_server.py 源码(包含 Flask 服务、K 线形态识别函数),粘贴至编辑窗口。
保存文件
- 点击文件-另存为,
- 自定义存放目录(示例路径:C:\PatternServer\)。
- 文件名填写:pattern_server.py,必须保留 .py 后缀。
- 点击“保存”。
安装依赖库
打开命令提示符窗口
首先,同时按下 Win+R 组合键,打开系统运行对话框。在输入框中输入 cmd,按下回车键或点击 “确定”,即可打开命令提示符窗口。你将在此窗口中执行系统操作指令、切换目录并运行脚本程序。
切换工作目录
接下来,需要将 Windows 命令行定位到存放 Python 脚本的文件夹。在命令提示符中,使用 cd(切换目录)命令,后跟脚本所在文件夹路径。例如:
cd path\to\your\script\folder请将path\to\your\script\folder 替换为你电脑上的实际文件夹路径。该操作可确保当前终端工作目录与脚本所在目录一致,顺畅运行代码。 安装 Flask 与 pandas
pip install flask pandas
该指令会自动下载安装轻量 Web 框架 Flask、以及用于数据处理的 pandas 库,运行成功后,控制台将输出类似信息:
* Serving Flask app "pattern_server" * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
以上输出代表微服务已成功启动,持续监听本地请求。随后编译 MQL5 智能交易 EA,并将其挂载至行情图表。至此即可建立 EA 与 Python 服务端的通信连接。下文将展示整套系统的实际运行结果与实测总结。
在EURUSD上测试

MetaTrader 5 专家选项卡日志
2025.07.09 22:25:42.248 Candlestick Label (EURUSD,M15) [CSLAB] EA started – allow http://127.0.0.1:5000/patterns in Tools→Options→Expert Advisors→WebRequest 2025.07.09 22:25:42.790 Candlestick Label (EURUSD,M15) [CSLAB] JSON-OUT: {"symbol":"EURUSD", "timeframe":0,"time":[1752064200,1752065100,1752066000,1752066900,1752067800,1752068700,1752069600, 1752070500,1752071400,1752072300,1752073200,1752074100,1752075000,1752075900,1752076800,1752077700, 1752078600,1752079500,1752080400,1752081300,1752082200,1752083100,1752084000,1752084900,1752085800, 1752086700,1752087600,1752088500,1752089400,1752090300,1752091200],"open":[1.17051,1.17045,1.17153, 1.17167,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17148,1.17095,1.1706 2025.07.09 22:25:42.790 Candlestick Label (EURUSD,M15) [CSLAB] POST http://127.0.0.1:5000/patterns 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] HTTP 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=3", "bullishengulfing=3", "eveningstar=2", "bearishengulfing=3", "hammer=1", "total patterns=12"], "ms": 128.25} 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] SERVER: doji=3 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] SERVER: bullishengulfing=3 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] SERVER: eveningstar=2 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] SERVER: bearishengulfing=3 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] SERVER: hammer=1 2025.07.09 22:25:42.938 Candlestick Label (EURUSD,M15) [CSLAB] SERVER: total patterns=12
CMD Python 日志
2025-07-09 22:25:42,806 [INFO] RAW BODY: {"symbol":"EURUSD","timeframe":0,"time":[1752064200,1752065100,1752066000,1752066900,1752067800, 1752068700,1752069600,1752070500,1752071400,1752072300,1752073200,1752074100,1752075000,1752075900,1752076800,1752077700,1752078600, 1752079500,1752080400,1752081300,1752082200,1752083100,1752084000,1752084900,1752085800,1752086700,1752087600,1752088500,1752089400, 1752090300,1752091200],"open":[1.17051,1.17045,1.17153,1.17167,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17148,1.17095,1.17066, 1.17085,1.17060,1.17072,1.17015,1.17066,1.17050,1.17087,1.17088,1.17059,1.17086,1.17174,1.17160,1.17105,1.17134,1.17166,1.17216,1.17226, 1.17189],"high":[1.17091,1.17170,1.17206,1.17225,1.17186,1.17098,1.17160,1.17246,1.17223,1.17194,1.17163,1.17112,1.17098,1.17103,1.17091, 1.17088,1.17071,1.17073,1.17109,1.17104,1.17092,1.17102,1.17179,1.17176,1.17164,1.17147,1.17170,1.17222,1.17232,1.17232,1.17199], "low":[1.17008,1.17036,1.17120,1.17109,1.17088,1.17005,1.17028,1.17152,1.17152,1.17131,1.17095,1.17050,1.17055,1.17050,1.17059,1.17009,1.17013, 1.17039,1.17039,1.17077,1.17043,1.17056,1.17051,1.17141,1.17091,1.17101,1.17130,1.17163,1.17188,1.17180,1.17163],"close":[1.17045, 1.17153,1.17170,1.17143,1.17096,1.17034,1.17152,1.17193,1.17194,1.17149,1.17096,1.17066,1.17086,1.17061,1.17072,1.17015,1.17067, 1.17050,1.17087,1.17088,1.17058,1.17087,1.17175,1.17160,1.17104,1.17133,1.17165,1.17216,1.17227,1.17189,1.17177]} 2025-07-09 22:25:42,934 [INFO] SEND: {'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=3', 'bullishengulfing=3', 'eveningstar=2', 'bearishengulfing=3', 'hammer=1', 'total patterns=12'], 'ms': 128.25} 2025-07-09 22:25:42,936 [INFO] 127.0.0.1 - - [09/Jul/2025 22:25:42] "POST /patterns HTTP/1.1" 200 -
在Crash 1000上测试
结论
综上,这套双层架构—— 一端为 MQL5 智能交易系统,另一端为 Python 形态识别服务端 —— 兼具稳定性与响应速度。EA 会规整打包每一根新 K 线的开高低收行情数据并向外发送,随后在行情图表上精准渲染服务端返回的 K 线形态标注。与此同时,Python 服务端接收 JSON 数据,运行自主编写的形态识别逻辑,并完整记录每一次请求与运算结果,全程流程透明可查。两者协同搭建起一套流畅、低延迟的数据处理链路:新 K 线生成后,形态即时识别,图表同步刷新,近乎毫秒响应。两端规范、结构化的日志记录,可实时反馈运行状态,大幅简化故障排查工作。
整体而言,该架构整合稳定、运行性能可靠,能够严格按照设计目标,实时输出精准的K线图分析信号。你还可根据自身交易需求,自行拓展添加更多 K 线形态。后续文章中,我们将进一步讲解如何借助 Python 专业函数库实现高级 K 线识别,分享更多进阶技术与实用工具。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/18789
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
市场模拟(第 16 部分):套接字(十)
MQL5自优化智能交易系统(第八部分):多策略分析(3)—— 加权投票机制
从基础到中级:结构(四)