一个基于新指标和条件长短期记忆网络(LSTM)的实例(基础篇)
用 LSTM 给 MT5 指标做条件预测的思路
在 MT5 里把自编指标和 LSTM 结合,核心不是让网络替你下单,而是用历史指标序列训练一个能识别长短期依赖的模型,再对下一根 K 线的状态做概率判断。这套做法对贵金属和外汇都适用,但两者点差与跳空频率差异大,实盘前必须在对应品种上重训,否则泛化会塌。 作者 Javier Santiago Gaston De Iriarte Cabrera 在 2025 年 5 月 21 日发布的示例帖,截至统计有 1045 次查看、16 条讨论,说明社区对「指标+LSTM」的混合验证路线有真实需求,而不是停留在理论层。 落地时先在 MT5 用 iCustom 把指标缓冲读出来,按时间窗拼成样本,再丢进 LSTM;若直接拿收盘价训,会丢掉指标构造的局部结构,召回率通常掉一截。
「把LSTM塞进MT5:VAM与条件模型的接合点」
想在MT5里跑一套既看动量又看波动率的自动化逻辑,先得弄清两样东西怎么拼:波动率调整动量(VAM)和条件LSTM。VAM的核心理念不复杂——评估动量时把市场波动率拉进来一起算,避免平静市和乱流市用同一把尺子。 具体做法是用当前价与过去价的差(动量)除以波动率乘以动量周期平方根,再乘一个缩放因子,得到经波动调整后的动量强度。相比裸动量指标,它在从低波动到急拉急跌的切换段更不容易假信号。 条件LSTM这边,是一种带额外上下文输入的循环神经网络,喂进去的是历史价格和技术指标(原文以MACD为例),输出未来走势预测。它的价值不在「更玄」,而在于能抓传统公式漏掉的非线性关系,且「条件」部分允许塞更多市场变量,预测更带情境。 EA是两者的接合器:初始化时加载预训练ONNX模型;抓MACD和前价做归一化;算VAM;取模型预测。逻辑很直白——VAM高且模型看多才买,VAM低且模型看空才卖,止损止盈按ATR动态摆。外汇与贵金属杠杆高、滑点突兀,这套动态风控也只是降低极端行情被扫的概率,不消除风险。 原文给出的回测对照了「只用VAM」与「VAM+条件LSTM」两种EA,结论倾向融合模型在样本内表现更稳,但没给具体年化或胜率数字,真要信得自己下MT5跑一遍同周期校验。
◍ 用动量除波动造一个VAM指标
把动量除以「波动率 × 动量周期平方根」再乘 10000,就得到 VAM。乘 10000 只是比例缩放,让数值落在肉眼好读的区间;分母里的 MathSqrt(momentum_period) 负责跨周期标准化,使不同时间窗下的读数有可比性。 正 VAM 代表向上动量,负 VAM 代表向下动量,绝对值大小反映经近期波动调整后的动量强度。它能在欧元兑美元这类高杠杆品种上辅助识别趋势反转或衡量趋势强度,但外汇和贵金属杠杆高、回撤快,信号只是概率倾向,不是方向保证。 下面这段 MT5 代码可直接贴进 EA 的 OnTick 验证。注意 bars 不足时直接 return,避免数组越界;VAMTHRESH 是外部阈值,调小会频繁触发、调大则更挑剔。 别把正态当圣经:波动率用收盘价 SMA 近似,不是真实 ATR,极端行情里分母可能被压扁导致 VAM 虚高,实盘前建议把 volatility 换成 iATR 跑一遍对比。
class=class="str">"cmt">// Calcular Momentum class="type">class="kw">double momentum = close_price - iClose(NULL, class="num">0, momentum_period); class=class="str">"cmt">// Calcular Volatilidad class="type">class="kw">double volatility = iMA(NULL, class="num">0, volatility_period, class="num">0, MODE_SMA, PRICE_CLOSE); class=class="str">"cmt">// Calcular VAM class="type">class="kw">double vam =( momentum / (volatility * MathSqrt(momentum_period)))*class="num">10000; class="type">void OnTick() { class="type">int bars = iBars(NULL, class="num">0); if(bars < MathMax(momentum_period, MathMax(volatility_period, (vam_period))))class=class="str">"cmt">//, MathMax(ma_long_period, rsi_period)))) class="kw">return; class="type">class="kw">double close_price = iClose(NULL, class="num">0, class="num">0); class=class="str">"cmt">// Calcular Momentum class="type">class="kw">double momentum = close_price - iClose(NULL, class="num">0, momentum_period); class=class="str">"cmt">// Calcular Volatilidad class="type">class="kw">double volatility = iMA(NULL, class="num">0, volatility_period, class="num">0, MODE_SMA, PRICE_CLOSE); class=class="str">"cmt">// Calcular VAM class="type">class="kw">double vam =( momentum / (volatility * MathSqrt(momentum_period)))*class="num">10000; class="type">class="kw">double atr = iATR(_Symbol,PERIOD_CURRENT,class="num">14)*_Point; class="type">class="kw">double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); class="type">class="kw">double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); class="type">class="kw">double slPriceBuy = NormalizeDouble(Bid - slmul*atr,_Digits); class="type">class="kw">double tpPriceBuy = NormalizeDouble(Ask + tpmul*atr,_Digits); class="type">class="kw">double slPriceSell = NormalizeDouble(Ask + slmul*atr,_Digits); class="type">class="kw">double tpPriceSell = NormalizeDouble(Bid - tpmul*atr,_Digits); class=class="str">"cmt">// Señales if(vam > VAMTHRESH)class=class="str">"cmt">// && ma_short > ma_long)// && rsi < class="num">70 && ma_short > ma_long ) { class=class="str">"cmt">// Comprar trade.Buy(lot_size,_Symbol, Ask, slPriceBuy, tpPriceBuy, " BUY EA "); } else if(vam < -VAMTHRESH)class=class="str">"cmt">// && ma_short < ma_long)// rsi > class="num">30 && ma_short < ma_long ) { class=class="str">"cmt">// Vender trade.Sell(lot_size,_Symbol, Bid, slPriceSell, tpPriceSell, " SELL EA "); } }
VAM初步跑出来的样子
这套简单策略和单一指标搭起来的 VAM 模型,在快速优化后给出的结果还算能看,谈不上惊艳但也没翻车。注意这里的优化只是草草跑了一轮,远没到收敛完成的状态,所以曲线和统计只能当方向参考。 外汇与贵金属品种上跑这类模型,样本外漂移和滑点吃掉收益的概率很高,别拿未完成的回测当实盘依据。 下一步打算换思路:不继续死磕浅层组合,而是把几个不同指标塞进深度学习框架里交叉训练,比一比哪组特征在 EURUSD 这类品种上更抗过拟合。