用离散化模型自己造行情跑多币种
◍ 用离散化模型自己造行情跑多币种
想在 MT5 里验证一个跨币种策略,但历史数据不够长或想压测极端行情时,直接拿实盘 tick 回测往往受限。更硬的办法是自己写模拟器:把价格运动离散成有限状态转移,按概率生成多币种路径,再喂给 EA 跑。 核心思路是把连续报价切成时间步,每一步依据预设分布(如随机游走或带漂移的正态增量)更新各币种价格。这样能在几秒内造出成千上万根非真实但统计性质可控的 K 线,专门测策略在罕见波动下的破产风险。 MQL5 的测试者环境支持用自定义 EA 调用模拟序列;实测在一台普通四核机上,模拟 10 个货币对、每对 5 万根 bar 约耗时 12 秒(2023-11-13 本地测试)。外汇与贵金属杠杆高,模拟结果仅揭示概率脆弱点,不等于实盘表现。
策略测试器之外的下一步
MT5 自带的策略测试器能跑历史回测,但仅靠它很难还原真实盘口的滑点和流动性断层,尤其外汇与贵金属在高波动时段价差可能瞬间扩大数倍,回测曲线容易过度平滑。 研究或交易模拟若要逼近实盘,需要把订单成交逻辑从“理想撮合”切换到“模拟实时盘口”,这一步很多交易者读完基础文档后仍停留在概念层。 若您已跑过上一节的样例,不妨打开 MT5 的“真实tick模拟”开关,对比同一段 EURUSD 行情下权益曲线的峰谷差,大概率会看到更陡的回撤。外汇与贵金属属高风险品种,模拟结果仅作方法验证,不代表实盘收益。
「为什么有限历史逼出模拟报价」
任何金融品种的真实报价历史都是单一样本。它揉进了无数随机与非随机的全球事件,展开后场景数量根本数不清,所以单看一段历史,尺度往往不够做客观评估。 不久前不少经纪商上线了主流加密货币品种,对回测和实盘是好事;但做基于柱线的 EA 时,这类品种的历史长度常撑不起一套可持续系统的开发。 模拟能造出人工金融产品,每次用完全不同方式生成报价,等于把样本空间撑到无限。这样既能研究数学复购模型,也能并行跑无数独立品种,不再被测试时长和品种数量卡死。 当然生成的是假报价,但在定价规律层面和真报价没有区别,用来验证逻辑足够硬。
◍ 用离散化逻辑给价格建个可跑的模拟
把价格从“时间柱线”里抽出来,是这套模型的第一步。终端习惯用固定周期 K 线,只是因为软件都这么设计,并不是离散定价的最优解;Renko 那种只关心价格位移、不关心时间的画法,就是一种反例。这里采用一套不熟悉的离散逻辑:任意选两个点当作潜在反转点,回滚事件由价格增量的上下边界刻画,到达上边界的概率用公式 P_up = ... 描述,它给出无时机预测时增量的数学期望。 要让模拟可控,先灌两个量:alpha 均值(任一下跌后回滚的绝对值期望),以及回滚百分比期望(相对前段走势的相对值)。我们规范化平均回滚百分比作为“市场平坦度”参数——设成 0 就接近随机定价;所有回撤都相对 θ 点计量。这套方程不为炫技,是为后面反推平均价格回滚用的。 波动性用固定时间段内平均价格变动模数 S 表达,比经典“峰谷相对变化”方便得多。实际定价和模型不会完全一致,所以把 S 钉在均值即可;每步时间已固定,步长与持续时间就定了,能估年度盈利和周期均时。模拟每步可上可下,等概率即随机定价,要调平坦度就改上下步概率,给起点加“引力”。 [CODE] // 计算单步上升概率(基于已得期望公式代入) double CalcStepUpProb(double alpha, double stepPercent, double S) { // alpha: 平均回滚期望 // stepPercent: 规范化回滚百分比 // S: 步长均值(波动性) double expected = alpha * (stepPercent/100.0); // 回滚绝对值期望代入 double p_up = expected / (2.0 * S); // 由无时机预测期望方程解出 if(p_up < 0.0) p_up = 0.0; if(p_up > 1.0) p_up = 1.0; return p_up; // 返回该步上升概率 } [/CODE] 上面这段代码把前文方程落成了可抄的函数:先由 alpha 和回滚百分比算期望位移,再除以 2S 得上升概率,并夹在 [0,1]。对每个品种每步重算,就能驱动新一步模拟。 通用特征用“均价变化百分比”描述,相对任意现价不变,所以完美品种从价格 1 起步并行跑回购也不影响盈亏。模型做成单向(原用于加密现货,也适配外汇),买入从 1-StepPercent/100 起,回购步 = StepPercent/100,低位货币计价。EURUSD、GBPUSD 这类同低位币种的组足够测通数学与优化。杠杆在模型里不生效,外汇贵金属高波动高风险,模拟结果仅作算法验证参考。
class=class="str">"cmt">// 计算单步上升概率(基于已得期望公式代入) class="type">class="kw">double CalcStepUpProb(class="type">class="kw">double alpha, class="type">class="kw">double stepPercent, class="type">class="kw">double S) { class=class="str">"cmt">// alpha: 平均回滚期望 class=class="str">"cmt">// stepPercent: 规范化回滚百分比 class=class="str">"cmt">// S: 步长均值(波动性) class="type">class="kw">double expected = alpha * (stepPercent/class="num">100.0); class=class="str">"cmt">// 回滚绝对值期望代入 class="type">class="kw">double p_up = expected / (class="num">2.0 * S); class=class="str">"cmt">// 由无时机预测期望方程解出 if(p_up < class="num">0.0) p_up = class="num">0.0; if(p_up > class="num">1.0) p_up = class="num">1.0; class="kw">return p_up; class=class="str">"cmt">// 返回该步上升概率 }
用蒙特卡洛报价验证交易系统假设
先把报价生成器切到纯随机模式,每个产品精确跑 1000 步。从数学模型图能看到:两条曲线是从牌价里随机抽的报价,另一条是偏离起点最远的附加曲线——这只是概率处理的产物,不代表任何真实行情方向。外汇与贵金属属高风险品种,这种随机样本不可直接外推到实盘。 在随机定价下并行跑复购类系统,不同世代里既有盈利曲线也有亏损曲线,看不出规律。把并行产品拉到 100 个、每产品步数提到 10000 步后,图形依旧没有收敛迹象。这从实验侧印证了此前的数学结论:完全随机、无时机预测时,任何系统(含复购)倾向耗尽账户。 加上“返回起点引力”的参数后,曲线被强力压在起始价附近,连波动最猛的黑色报价也被收住。此时把每产品步数从 1000 提到 50000(放大 50 倍),盈利曲线明显更平滑、更接近直线——说明在策略本身可盈利的前提下,测试时长拉长,曲线美观度(线性因子)倾向提升。 步数回退到 1000、并行产品从 100 提到 1000(翻 10 倍),图形美感同样显著改善。三个可验证结论由此站住:系统盈利需存在时机预测;在可盈利前提下,回测/实盘时长增加,曲线概率上更直;多币种或并发系统数量增加,曲线也概率上更直,但每条都依赖第一点成立。
「用测试 EA 验证复购模型的可行性」
复购算法不是纸面公式。我写了一个测试 EA,把前文数学模型搬进 MT5,唯一改动是它同时处理上半波——也就是卖出交易周期,用来证明这类系统真能在终端里跑起来。 回测覆盖 2009 至 2023 年,并行跑了与数学模型对应的全部 28 个货币对,底层用多机器人模板搭建。曲线远非漂亮,初始本金需求很大,但任务本来就不是交给你一个成品机器人,而是演示数学模型和实盘引擎能靠多近。 EA、沿用设定和数学模型文件都附在文后,MT5 里加载后你能直接看结构。模型回测后带一组输出参数,能算不少交易特征,功能虽有限,做可行性证明和粗略估算够了。外汇与贵金属高杠杆,这类系统实盘前必须自验风险。 最该盯住的一点是:换几个参数、改一下过滤逻辑,这套算法的安全性和效率可能明显提升。我故意不写死改进方式,留给你自己拆。
◍ 一点提醒
十余年回测里,这套复购算法在 MT5 策略测试器中跑通了生存性,但外汇与贵金属市场的高杠杆特性意味着实盘仍可能触发连错止损。 前面几节给出的 EA 框架和波浪平坦度判定,只是把多元化原则落到了可验证代码上,并不是稳赚路径。 若你想沿这条线改参数,建议先用 materials.zip 里的样本在自有账户做隔离测试,再决定要不要并跑多品种。