English Русский Deutsch 日本語
preview
价格行为分析工具开发(第 31 部分):基于Python的K线识别引擎(一)—— 手动检测

价格行为分析工具开发(第 31 部分):基于Python的K线识别引擎(一)—— 手动检测

MetaTrader 5积分 |
47 0
Christian Benjamin
Christian Benjamin

内容



引言

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 数据采集
每一根新 K 线生成时(OnTick 事件),EA 会将最近 31 根 K 线的时间戳、开盘价、最高价、最低价、收盘价批量存入数组。
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 数据体
EA 通过StringFormat函数,将交易品种、时间周期、时间戳以及开高低收(OHLC)数组整合为单行 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 发送数据
EA 执行WebRequest("POST", …)函数,向本地地址http://127.0.0.1:5000/patterns发送请求。若请求失败,则记录错误日志;若请求成功,则接收 Python 服务端返回的 JSON 响应数据。
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 服务端处理
Python 服务会剔除 JSON 末尾的无效字符,将干净的数据解码为字典,并根据传入的时间戳重建pandas 数据帧(DataFrame)。
@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:手动形态识别

我们自定义的detect_patterns(df)函数会逐行扫描 K 线数据,识别十字星、锤头线、射击之星、吞没形态、孕线、启明星、黄昏星信号,无需依赖任何外部技术分析库。
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:解析数据并执行逻辑
回到 MQL5 端,程序解析读取"patterns"数组,校验数据长度为 31 条,并打印日志信息。识别到有效 K 线形态后,会在对应 K 线上方绘制文字标签,同时触发软件弹窗警报Alert()
// 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 线识别,分享更多进阶技术与实用工具。





   
图表投影仪
分析评论
分析大师
分析预测器 
波动性导航工具
均值回归信号收割器
信号脉冲 
指标看板 
外部资金流
VWAP
Heikin Ashi   FibVWAP  
RSI 背离
抛物线转向与反转 (PSAR) 
四分位绘制脚本
侵入检测器
TrendLoom工具  四分位看板 
ZigZag 分析器  相关性检测器  市场结构反转检测工具
相关性仪表盘  货币强弱指标 
PAQ 分析工具 
双EMA分形突破
长影线,吞没形态和RSI背离
流动性扫盘 开盘区间突破工具 暴涨暴跌拦截器 CCI 零轴线 EA
K线形态识别          

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/18789

附加的文件 |
patterns.py (5.24 KB)
市场模拟(第 16 部分):套接字(十) 市场模拟(第 16 部分):套接字(十)
我们即将完成这项挑战。然而,在我们开始之前,我希望你们试着理解这两篇文章——这篇文章和上一篇文章。这样,你就能真正理解下一篇文章的内容,在那篇文章中,我将专门介绍与 MQL5 编程相关的部分。但我会尽量让它通俗易懂。如果你不理解最后这两篇文章,那么你很难理解下一篇,因为内容是连贯的。要做的事情越多,为了实现目标,你需要创造和理解的东西就越多。
MQL5自优化智能交易系统(第八部分):多策略分析(3)—— 加权投票机制 MQL5自优化智能交易系统(第八部分):多策略分析(3)—— 加权投票机制
本文将探讨如何确定集成策略中最优的策略数量 —— 这是一个复杂问题,而借助MetaTrader 5的遗传算法优化器可以轻松解决。同时,我们也会使用MQL5云端计算作为核心资源,加速回测与优化过程。具体而言,本篇内容将为后续开发统计评估模型奠定基础,用于基于初始集成结果评估并改进交易策略。
从基础到中级:结构(四) 从基础到中级:结构(四)
在本文中,我们将探讨如何创建所谓的结构化代码,即将处理变量和信息的整个上下文和方法都置于一个结构中,从而为任何代码的实现创造一个合适的上下文环境。因此,我们将探讨使用代码私有部分来区分公有部分和非公有部分的必要性,从而遵守封装原则,并保留创建数据结构时的上下文。
MQL5 中的奇异谱分析(SSA) MQL5 中的奇异谱分析(SSA)
本文专为不熟悉奇异谱分析概念、希望充分理解并运用 MQL5 内置相关工具的读者编写。