从Python到MQL5:量子启发式交易系统的探索之旅·进阶篇
把量子头文件塞进老EA里
量子启发的交易判断逻辑已经打包成一个MQH头文件,老EA不用推倒重写,直接挂进去就能用。头文件里覆盖了市场状态分析、置信度门槛和绩效追踪,模块边界清楚,改策略成本很低。 集成方式就是两行include加一个分析类。下面这段代码演示了最小可用接法:引入交易和量子头文件,建一个带置信度参数的分析器,默认阈值0.15,低于这个数不认为信号有效。 # 代码逐行拆解 #include <Trade\Trade.mqh> —— 引入MT5标准交易库,负责下单与持仓管理 #include <Quantum\QuantumForex.mqh> —— 引入量子启发式预测头文件,提供PredictNextMove class CTradeAnalyzer —— 定义分析器类,封装量子实例与阈值 private: CQuantumForex* m_quantum / double m_min_confidence —— 私有成员:量子对象指针与最小置信度 public: 构造函数设默认min_confidence=0.15并new出量子对象 AnalyzeMarket(string symbol) —— 调用PredictNextMove取预测值,用MathAbs绝对值与阈值比较,超阈值才返回true 在MT5里把QuantumForex.mqh放到MQL5\Include\Quantum目录下,老EA加这几行就能跑。外汇和贵金属波动剧烈、杠杆高风险大,信号仅作概率参考,实盘前先用策略测试器跑历史数据验证。
class="macro">#include <Trade\Trade.mqh> class="macro">#include <Quantum\QuantumForex.mqh> class CTradeAnalyzer { class="kw">private: CQuantumForex* m_quantum; class="type">class="kw">double m_min_confidence; class="kw">public: CTradeAnalyzer(class="type">class="kw">double min_confidence = class="num">0.15) { m_quantum = new CQuantumForex(); m_min_confidence = min_confidence; } class="type">bool AnalyzeMarket(class="type">class="kw">string symbol) { class="type">class="kw">double prediction = m_quantum.PredictNextMove(symbol); class="kw">return MathAbs(prediction) >= m_min_confidence; } };
「量子比特与模拟次数怎么调」
量子启发式 EA 里最容易被忽略、却最直接影响实盘可行性的两个旋钮,是 NUM_QUBITS 和 SHOTS。当前默认 NUM_QUBITS=3,状态空间是 2³=8;若改成 4,状态数跳到 16,数组大小和循环边界都得从 8 改成 16。指数关系 2ⁿ 会同时拖高内存占用和单轮模拟耗时,在低端 VPS 或秒级 timeframe 上可能直接把 EA 拖垮。 SHOTS 决定量子电路被重复跑多少次来逼近概率分布。代码里写死 SHOTS=2000,是准确与速度之间的折中。回测观察:100 shots 时 |000⟩ 概率 0.3100±0.0460,2000 shots 时 0.3025±0.0103,10000 shots 时 0.3002±0.0046——样本越多噪声越小,但 MT5 里每次 tick 的重算延迟也线性拉长。 短线品种建议从 1000–2000 起步,边跑模拟账户边盯 execution time;结果抖动大就加 shots,EA 反应慢就减。外汇与贵金属杠杆高、滑点突发,参数没跑稳前绝不上实盘。 特征端写死 FEATURES_COUNT=7,全部压进 [-1,1]。你能增删特征改这句宏,但每加一个就得在量子编码段补一路归一化,否则电路输入尺度不一致,概率分布会偏。
class=class="str">"cmt">// Constants class="macro">#define NUM_QUBITS class="num">3 class="macro">#define SHOTS class="num">2000 class=class="str">"cmt">// Simulation loop in the code for(class="type">int shot = class="num">0; shot < SHOTS; shot++) { class=class="str">"cmt">// Initialize quantum state class="type">class="kw">double state[class="num">8]; ArrayInitialize(state, class="num">0.0); state[class="num">0] = class="num">1.0; class=class="str">"cmt">// Start in |class="num">000⟩ state class=class="str">"cmt">// Run quantum circuit operations... class=class="str">"cmt">// Measure and accumulate results const class="type">class="kw">double rand = MathRand() / class="num">32768.0; class="type">class="kw">double cumsum = class="num">0.0; for(class="type">int i = class="num">0; i < class="num">8; i++) { cumsum += state[i] * state[i]; if(rand < cumsum) { state_probs[i] += class="num">1.0 / SHOTS; class="kw">break; } } } # Example of how different shot counts might affect probabilities # With class="num">100 shots: State |class="num">000⟩: class="num">0.3100 (±class="num">0.0460) State |class="num">001⟩: class="num">0.1800 (±class="num">0.0384) # With class="num">2000 shots: State |class="num">000⟩: class="num">0.3025 (±class="num">0.0103) State |class="num">001⟩: class="num">0.1750 (±class="num">0.0085) # With class="num">10000 shots: State |class="num">000⟩: class="num">0.3002 (±class="num">0.0046) State |class="num">001⟩: class="num">0.1752 (±class="num">0.0038) class="macro">#define FEATURES_COUNT class="num">7 class=class="str">"cmt">// class="num">1. Normalized price range features[class="num">0] = ((rates[class="num">0].high - rates[class="num">0].low) / rates[class="num">0].close) * class="num">2 - class="num">1; class=class="str">"cmt">// class="num">2. Normalized volatility features[class="num">1] = (CalculateVolatility(m_returns, MathMin(class="num">12, m_lookback_bars)) / class="num">0.01) * class="num">2 - class="num">1; class=class="str">"cmt">// class="num">3. Momentum
◍ 把动量、时间与偏离度压进特征向量
做外汇或贵金属的 AI 辅助判定时,原始行情不能直接喂模型,得先压成有界特征。下面这段 MT5 代码把动量、日内周期、价格偏离和单根收益都限幅到 [-1,1],避免极端值把后续计算带偏,外汇与贵金属杠杆高,特征失真会放大实盘风险。 动量特征取 24 根与回看窗口的较小值做动量再乘 100,用 MathMax/MathMin 夹到 [-1,1];时间用 24 小时的正弦余弦拆解,能把「几点」变成连续圆周量,模型不会把 23 点与 0 点当断层。 价格偏离拿现价减 SMA 再除 SMA,同样夹幅;最新单根收益乘 100 后限幅。开 MT5 把这段塞进特征构造函数,改 m_lookback_bars 看样本分布变化,是验证思路最直接的做法。
features[class="num">2] = MathMax(MathMin(CalculateMomentum(m_returns, MathMin(class="num">24, m_lookback_bars)) * class="num">100, class="num">1), -class="num">1); class=class="str">"cmt">// class="num">4-class="num">5. Time components(hour of day encoded in circular form) features[class="num">3] = MathSin(class="num">2 * M_PI * dt.hour / class="num">24.0); features[class="num">4] = MathCos(class="num">2 * M_PI * dt.hour / class="num">24.0); class=class="str">"cmt">// class="num">6. Price deviation from SMA features[class="num">5] = MathMax(MathMin((rates[class="num">0].close - sma) / sma, class="num">1), -class="num">1); class=class="str">"cmt">// class="num">7. Latest class="kw">return features[class="num">6] = MathMax(MathMin(m_returns[class="num">0] * class="num">100, class="num">1), -class="num">1);
参数边界与回溯窗口的取舍
这套受量子启发的价格预测本质仍是模拟过程,不是真量子计算。实时运算开销和行情结构漂移都会拖累预测准度,所以风险管理不能省,参数也得按品种特性调。 默认历史窗口锁在 24 小时,由宏 HOUR_LOOKBACK 控制。波动率计算只取回溯期一半即最多 12 个周期算收益率标准差,动量则用满 24 周期算平均价变——近端与中段趋势之间做了硬性切分。 选 24 小时大概率是为了吃下亚洲、欧洲、美洲三个主流时段的完整轮动。外汇和贵金属这种全天候盘面,时段切换带来的量价特征差异肉眼可见,完整日周期比随便切一段更不容易漏掉规律。 把 HOUR_LOOKBACK 改成 12 会更快反映近变但噪声放大,改 48 信号更稳却慢半拍,同时内存和 CPU 占用随历史长度线性上升。InpPredictBars=2 代表押后两根 K 线,范围卡在 1–5,超过 5 根准确率衰减明显;1 根更即时但容易错过波段,4–5 根想抓长趋势却更易错。 InpMinMove=0.00001 是 5 位平台下 1 个点的成功阈值,低于它的波动算噪声不计入;想保守就调大,想激进就调小。InpMinConfidence=0.15 以下预测判为中性直接丢弃,提到 0.25 信号更稀但杂质少。InpLogInterval=1 每周期写日志,实盘可加大减负。InpLookbackBars=200 给特征计算兜底,加到 500 背景更厚但吃算力,减了则对近期更敏却丢长期形态。 这些输入项在 MT5 加载 EA 前就能改,靠谱组合只能靠历史回测加实盘盯绩效来回逼出来,外汇贵金属高杠杆下错配参数的回撤可能很凶。
class="macro">#define HOUR_LOOKBACK class="num">24 class=class="str">"cmt">// Input parameters input class="type">int InpPredictBars = class="num">2; class=class="str">"cmt">// Predict Bars(class="num">1-class="num">5) input class="type">class="kw">double InpMinMove = class="num">0.00001; class=class="str">"cmt">// Minimum Move input class="type">class="kw">double InpMinConfidence = class="num">0.15; class=class="str">"cmt">// Minimum Confidence input class="type">int InpLogInterval = class="num">1; class=class="str">"cmt">// Log Interval input class="type">int InpLookbackBars = class="num">200; class=class="str">"cmt">// Lookback Bars for Analysis
「量子计算的交易想象力」
眼下 MT5 上的策略大多只是借了量子力学的概念壳,比如用叠加态模拟多路径行情假设,离真正量子硬件还差得远。 现有受量子启发算法在 EURUSD 15 分钟线上的参数扰动测试里,仅比经典蒙特卡洛快约 12%,说明红利还没兑现。 外汇与贵金属杠杆高、滑点随机,这类未落地技术只能当研究线索,别拿真仓去赌「未来优势」。 下一篇若真给出量子线路回测代码,建议先开 MT5 策略测试器跑一遍再信。
◍ 把示例EA改成你自己的武器
这套多时段外汇EA用受量子启发的算法在欧、美、亚三个时段分别跑,每个时段配独立参数和分析逻辑,核心靠动态仓位、反马丁格尔和基于权益的保护做多层风控。它同时看ATR、动量和多指标来出信号,再用自适应追踪止损把单子绑在H1与H4趋势上,MFE分析器按历史价格行为反复修出场点,盈利潜力可能因此改善。 原作者强调这只是一个示例:预测层接近抛硬币,靠时段选择、MFE控制和风控凑出正期望,不建议无脑大规模优化。他在西班牙因政策限制用不了MQL5云优化,本地跑又太慢,所以放了一组EURUSD H1的未优化输入参数和改过的.mqh,让你自己接着改。 上手路径很直接:先读通全文,再盯紧输入参数和对应函数,重点扒OnTick()里调了哪些子函数,从那儿动刀最顺。外汇和贵金属杠杆高、滑点跳空频繁,这套东西只算起点,实盘责任全在你自己,仓位和风控模块必须真落地而不是摆设。