使用Python和MQL5进行特征工程(第四部分):基于UMAP回归的K线模式识别·综合运用
用 ONNX 把 K 线差分喂给 UMAP 预测器
这段逻辑把当前图表最近 10 根 K 线的价格结构差分,拼成向量直接丢进本地 ONNX 模型跑两阶段推理。先在 MT5 里把 umap_onnx_model 和 umap_forecast_onnx_model 两个网络权重准备好,EURUSD 的回归预测才有可能出数。 GetUmapModelInputs 固定返回长度为 10 的 vectorf:前 4 维是第 1 根与第 11 根 K 线的开高低收各自相减,后 6 维是第 1 根 K 线内部的开-高、开-低、开-收、高-低、高-收、低-收价差。这种构造只依赖 PERIOD_CURRENT,换周期会自动跟着变。 GetModelForecast 先跑 UMAP 投影再跑 forecast 头,Print 出三层结果方便在专家日志里核对。外汇与贵金属杠杆高,模型输出只是概率倾向,实盘前务必用策略测试器回放验证数值是否合理。
class="type">void GetModelForecast(class="type">void) { vectorf model_inputs = GetUmapModelInputs(); OnnxRun(umap_onnx_model,ONNX_DATA_TYPE_FLOAT,model_inputs,umap_onnx_output); OnnxRun(umap_forecast_onnx_model,ONNX_DATA_TYPE_FLOAT,umap_onnx_output,umap_forecast_onnx_output); Print("Model Inputs: \n",model_inputs); Print("Umap Transformer Forecast: \n",umap_onnx_output); Print("EURUSD Return UMAP Forecast: \n",umap_forecast_onnx_output); } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Get our model&class="macro">#x27;s input data | class=class="str">"cmt">//+------------------------------------------------------------------+ vectorf GetUmapModelInputs(class="type">void) { vectorf umap_model_inputs(class="num">10); umap_model_inputs[class="num">0] = (class="type">class="kw">float)(iOpen(_Symbol,PERIOD_CURRENT,class="num">1) - iOpen(_Symbol,PERIOD_CURRENT,class="num">11)); umap_model_inputs[class="num">1] = (class="type">class="kw">float)(iHigh(_Symbol,PERIOD_CURRENT,class="num">1) - iHigh(_Symbol,PERIOD_CURRENT,class="num">11)); umap_model_inputs[class="num">2] = (class="type">class="kw">float)(iLow(_Symbol,PERIOD_CURRENT,class="num">1) - iLow(_Symbol,PERIOD_CURRENT,class="num">11)); umap_model_inputs[class="num">3] = (class="type">class="kw">float)(iClose(_Symbol,PERIOD_CURRENT,class="num">1) - iClose(_Symbol,PERIOD_CURRENT,class="num">11)); umap_model_inputs[class="num">4] = (class="type">class="kw">float)(iOpen(_Symbol,PERIOD_CURRENT,class="num">1) - iHigh(_Symbol,PERIOD_CURRENT,class="num">1)); umap_model_inputs[class="num">5] = (class="type">class="kw">float)(iOpen(_Symbol,PERIOD_CURRENT,class="num">1) - iLow(_Symbol,PERIOD_CURRENT,class="num">1)); umap_model_inputs[class="num">6] = (class="type">class="kw">float)(iOpen(_Symbol,PERIOD_CURRENT,class="num">1) - iClose(_Symbol,PERIOD_CURRENT,class="num">1)); umap_model_inputs[class="num">7] = (class="type">class="kw">float)(iHigh(_Symbol,PERIOD_CURRENT,class="num">1) - iLow(_Symbol,PERIOD_CURRENT,class="num">1)); umap_model_inputs[class="num">8] = (class="type">class="kw">float)(iHigh(_Symbol,PERIOD_CURRENT,class="num">1) - iClose(_Symbol,PERIOD_CURRENT,class="num">1)); umap_model_inputs[class="num">9] = (class="type">class="kw">float)(iLow(_Symbol,PERIOD_CURRENT,class="num">1) - iClose(_Symbol,PERIOD_CURRENT,class="num">1)); class="kw">return(umap_model_inputs); }
◍ 空小节无内容可提炼
本小节原文仅含一段被截断的 MQL5 注释标记,未提供任何技术描述、参数或价格现象,无法生成可验证的技术内容块。 若需补全,请返回包含完整正文与代码的源小节,蒸馏引擎方可按价格行为学视角做中文重写与逐行拆解。
「画得少,看得清」
把 EURGBP 的裸价格序列丢进 UMAP 做降维,再喂给统计模型,错误率比直接在原始数据上训练最多低 40%。这不是魔法,是让模型少看噪声、多看主干。 配套给了两个 ONNX:EURGBP UMAP.onnx 吃行情吐嵌入,EURGBP UMAP Forecast.onnx 吃嵌入吐回报预测;MQ5 端有 UMAP_Candlestick_Recognition.mq5 抓数据、UMAP_Regression.mq5 跑双模型交易。 外汇和贵金属杠杆高、经纪商点差切分不同,同一套近似在 Exness 和别家结果可能差很远。开 MT5 挂上脚本跑一遍,比看结论实在。