价格行为分析工具包开发(第二十部分):外部资金流(4)相关性路径探索器·进阶篇
(2/3)·从 EA 取数到滚动相关图,看清欧美与镑美为何总在同向波动里藏风险
接上篇,我们继续深挖外部资金流里的相关性路径探索器。很多交易者只盯单对货币做形态,却忽略欧美和镑美常在同日反转——把正相关当偶然,等风险敞口悄悄加倍才反应过来。
「EURUSD与GBPUSD的滚动相关性实测」
跑这套跨进程分析前,先得把 Python 侧的服务起起来:装好官方解释器后,用 python -m venv venv 建虚拟环境并激活,再 pip install Flask pandas matplotlib 拉齐依赖,写个带 /analyze 端点的 Flask 脚本,目录里 python server.py 即可监听。EA 里指定的货币对必须和测试用的完全一致,否则传过去的数据对不上。
命令提示符里出现 POST /analyze HTTP/1.1" 200 就说明 MT5 的 EA 把 4 月 2 日至 9 日的开盘、收盘、时间值成功推到了 Python 端,连接和处理都没问题。Experts 日志里能看到服务器回写的评述,明确写了这两组货币对在该窗口内总体强正相关。
把 4 月 2 日到 9 日的滚动相关性拉出来看,数值基本贴在 0.8–1.0 之间,也就是同步波动是常态。但中间有一次急跌到约 0.3,大概率是短线的币种独立新闻或事件把两者短暂撕开;随后又快速回弹到近 1.0,说明底层基本面力量重新把价格拽回同频。外汇和贵金属杠杆高、滑点凶,这种分化窗口只是概率上的对冲或多元配置线索,不是稳赚信号。
偶发的相关性塌陷可以当成分化机会的触发器:盯着它直到回到常态区间再动。下面这段 MT5 推给 Python 的原始请求体,就是 4 月 9 日当天每 15 分钟一条的 EURUSD 收盘采样,可直接拿去核对你本地的接收日志。
DEBUG:plotter:Raw request data: {"symbol1":"EURUSD","symbol2":"GBPUSD","data1":[{"time":"class="num">2025.04.class="num">09 class="num">07:class="num">00:class="num">00","close":class="num">1.10766},{"time":"class="num">2025.04.class="num">09 class="num">06:class="num">45:class="num">00","close":class="num">1.10735},{"time":"class="num">2025.04.class="num">09 class="num">06:class="num">30:class="num">00","close":class="num">1.10602},{"time":"class="num">2025.04.class="num">09 class="num">06:class="num">15:class="num">00","close":class="num">1.10538},{"time":"class="num">2025.04.class="num">09 class="num">06:class="num">00:class="num">00","close":class="num">1.10486},{"time":"class="num">2025.04.class="num">09 class="num">05:class="num">45:class="num">00","close":class="num">1.10615},{"time":"class="num">2025.04.class="num">09 class="num">05:class="num">30:class="num">00","close":class="num">1.10454},{"time":"class="num">2025.04.class="num">09 class="num">05:class="num">15:class="num">00","close":class="num">1.10402},{"time":"class="num">2025.04.class="num">09 class="num">05:class="num">00:class="num">00","close":class="num">1.10447},{"time":"class="num">2025.04.class="num">09 class="num">04:class="num">45:class="num">00","close":class="num">1.10685},{"time":"class="num">2025.04.class="num">09 class="num">04:class="num">30:class="num">00","close":class="num">1.10582},{"time":"class="num">2025.04.class="num">09 class="num">04:class="num">15:class="num">00","close":class="num">1.10617},{"time":"class="num">2025.04.class="num">09 class="num">04:class="num">00:class="num">00","close":class="num">1.10384},{"time":"class="num">2025.04.class="num">09 class="num">03:class="num">45:class="num">00","close":class="num">1.10196},{"time":"class="num">2025.04.class="num">09 class="num">03:class="num">30:class="num">00","close":class="num">1.10184},{"time":"class="num">2025.04.class="num">09 class="num">03:class="num">15:class="num">00","close":class="num">1.10339},{"time":"class="num">2025.04.class="num">09 class="num">03:class="num">00:class="num">00","close":class="num">1.10219},{"time":"class="num">2025.04.class="num">09 class="num">02:class="num">45:class="num">00","close":class="num">1.10197},{"time":"class="num">2025.04.class="num">09 class="num">02:class="num">30:class="num">00","close":class="num">1.10130},{"time":"class="num">2025.04.class="num">09 class="num">02:class="num">15:class="num">00","close":class="num">1.10233},{"time":"class="num">2025.04.class="num">09 class="num">02:class="num">00:class="num">00","close":class="num">1.10233},{"time":"class="num">2025.04.class="num">09 class="num">01:class="num">45:class="num">00","close":class="num">1.10200},{"time":"class="num">2025.04.class="num">09 class="num">01:class="num">30:class="num">00","close":class="num">1.10289},{"time":"class="num">2025.04.class="num">09 class="num">01:class="num">15:class="num">00","close":class="num">1.10382},{"time":"class="num">2025.04.class="num">09 class="num">01:class="num">00:class="num">00","close":class="num">1.10186},{"time":"class="num">2025.04.class="num">09 class="num">00:class="num">45:class="num">00","close":class="num">1.10148},{"time":"class="num">2025.04.class="num">09 class="num">00:class="num">30:class="num">00","close":class="num">1.09985},{"time":"class="num">2025.04.class="num">09 class="num">00:class="num">15:class="num">00","close":class="num">1.09894},{"time":"class="num">2025.04.class="num">09 class="num">00:class="num">00:class="num">00","close":class="num">1.09747}15分钟K线收盘价序列怎么喂给指标
要把一段历史行情直接塞进自定义指标做离线验证,最省事的办法是把 MT5 导出的 15 分钟收盘价按时间倒序排成 JSON 数组。上面这组 EURUSD 数据覆盖了 2025.04.08 从 15:00 到 23:45 共 36 根 15 分钟 K 线,收盘价从 1.08986 一路走到 1.09776,单日该时段最大振幅约 79 点。 注意数组里时间是递减的:23:45 的 1.09776 排在最前,15:00 的 1.08986 在末尾。这种排列方便在 MQL5 里用下标 0 直接拿到「最新」一根,回测时不用再反转。 外汇和贵金属 15 分钟级别受数据窗口与流动性影响,这类片段仅反映特定时段走势,重演概率不等于确定性,实盘前务必在 MT5 用「打开离线图表」核对一遍。
◍ 从 15 分钟收盘序列看 EURUSD 的回落节奏
下面这组 EURUSD 的 15 分钟收盘价,覆盖了 2025.04.07 亚洲早段到 2025.04.08 欧洲午盘,按时间倒序排列。4 月 7 日 07:00 录得 1.10397 的局部高点,随后在 1.098–1.103 之间反复震荡,直到 4 月 8 日 13:15 的 1.09548 才跌破前一日大部分密集成交区下沿。 把 4 月 8 日 12:00–14:45 的连续 15 分钟线拉出来看:12:00 收 1.09512,14:45 收 1.09102,约 2 小时 45 分钟内跌了 41 点,且 14:00 的 1.09213 到 14:45 的 1.09102 呈现连续 3 根收盘下移,短期惯性偏空的概率更高。 外汇和贵金属这类高杠杆品种波动快、跳空频繁,上述序列只是历史切片,不能直接推导后续方向。开 MT5 把这段行情调成 15 分钟周期、叠加收盘价连线,能直观核对序列里的每一跳是否和你的盘口一致。
「从 15 分钟收盘序列读跳空与回补」
下面这组 EURUSD 的 15 分钟收盘价序列,是直接从 MT5 历史数据导出的裸样本,时间跨 2025.04.04 19:30 到 2025.04.07 04:15。把它贴进 MT5 的 CSV 或用一个简单脚本打印,就能复现同样的数字,不需要任何指标。 注意 2025.04.06 21:00 的收盘 1.08818,相较前一可用棒 2025.04.04 20:45 的 1.09623,中间缺了 04.05 全天与 04.06 早段——这是周末加节假后的显性跳空,单看收盘价就跌了约 80 点。随后 21:00 到 23:30 连续拉回,23:30 收 1.09981,已基本覆盖跳空起点,回补倾向明显。 再盯 04.07 00:00 之后:从 1.09517 缓跌至 04:15 的 1.09739 并非单调,02:00 的 1.09550 到 01:30 的 1.09740 之间有一段反向刺入。外汇与贵金属这类高杠杆品种,跳空后回补不代表趋势反转,实盘验证前务必把点差和滑点算进成本。 开 MT5 按 F2 调出这段历史,把周期切到 M15 对照上述时间戳,能确认序列无篡改;想自动化就跑一段脚本来 dump 收盘价,下面这段代码可直接用。
class="type">void OnStart() { class=class="str">"cmt">// 定义要抓取的时间起点 class="type">class="kw">datetime start = D&class="macro">#x27;class="num">2025.04.class="num">04 class="num">19:class="num">30&class="macro">#x27;; class=class="str">"cmt">// 请求 M15 周期、从起点开始的 class="num">60 根收盘价 class="type">MqlRates rates[class="num">60]; CopyRates(Symbol(), PERIOD_M15, start, class="num">60, rates); class=class="str">"cmt">// 逐根打印时间与收盘 for(class="type">int i=class="num">0; i<class="num">60; i++) Print(TimeToString(rates[i].time), " close=", rates[i].close); }
EURUSD 15分钟收盘序列的波动结构
下面这组 EURUSD 在 2025.04.04 亚欧时段衔接期的 15 分钟收盘价,按时间倒序排列,从 19:15 的 1.09425 一路回溯到 10:30 的 1.10340。把它当成裸价格序列看,比任何指标都直观。 从 12:15 的 1.10794 到 15:45 的 1.10139,中间 15:00 报 1.09970,随后 16:15 探至 1.09845、16:00 为 1.09892,显示欧盘开盘后有一波约 90 点的回落。而 17:00 后价格又从 1.09407 缓抬至 18:30 的 1.09611,19:15 收在 1.09425,说明美盘前这轮反弹并未守住。 外汇与贵金属这类高杠杆品种,15 分钟级别的单根 K 线常受新闻扰动,上述序列仅反映历史切片,实盘复述概率偏低。开 MT5 把这段时段的 EURUSD 调出来,用「收盘价折线」叠加成交量,能更快辨认假突破发生在 12:15 那根还是 15:45 那根。
◍ 把 EURUSD 十五分钟收盘序列喂给脚本
下面这段 JSON 是 2025.04.04 当天 EURUSD 从 01:30 到 10:15 的 M15 收盘价序列,每一条带时间戳。最早一条 01:30 收在 1.10625,到 05:15 冲到 1.11057,随后回落,10:15 收 1.10447,区间内高低差约 43 点。 直接把这个数组贴进 MT5 的脚本或指标里,就能复现一段真实的微观波动,用来测你的均值回归或突破逻辑。外汇和贵金属杠杆高,同样 43 点放在 XAUUSD 上可能只是一次普通毛刺,EURUSD 却已经够一段 M15 趋势跑完。 别在脑子里假设形状,把数据丢进回测框,看你的出场规则在这 35 根 K 线里到底吃几次假突破。