文章 "如何在 MQL5 中使用 ONNX 模型" - 页 5

 
文章不错。测试数据的预测图令人失望。你还不如跳过所有的 DNN 建模/训练,直接使用与上次已知价格相等的下一个价格预测。我敢打赌,这种微不足道的模型的预测准确率会比你的 DNN 模型高。我建议比较这两个准确率,并在这里展示出来。总的来说,使用 DNN 预测价格是个坏主意。它们更适合价格模式分类(如买入、卖出、持有)。此外,DNN 的权重数量也是一个天文数字。肯定是过度拟合了。
 
Vladimir #:
文章不错。测试数据的预测图令人失望。你还不如跳过所有的 DNN 建模/训练,直接使用与上次已知价格相等的下一个价格预测。我敢打赌,这种微不足道的模型的预测准确率会比你的 DNN 模型高。我建议比较这两个准确率,并在这里展示出来。总的来说,使用 DNN 预测价格是个坏主意。它们更适合价格模式分类(如买入、卖出、持有)。此外,DNN 的权重数量也是一个天文数字。一定是过度拟合了。

谢谢您,弗拉基米尔
只是为了讨论,如果时间允许,我会修改这个模型,进行分类比较。

如果您有想法,请告诉我。

Vladimir
Vladimir
  • 2022.04.30
  • www.mql5.com
Trader's profile
 
const long input_shape[] = {1, input_count};
const long output_shape[] = {1, output_count};

教程给出了一批SAMPLE_SIZE 数量的 输入,您需要的是一批 input_count 输入。

另外,您的模型没有使用浮点数作为输入,而是使用了双倍、

版主注:由于下面的帖子是从另一个主题移过来的,所以本帖顺序不对。请参阅下面的帖子。

 
我们能一起解决 ONNX 模型的问题吗?

您好,MQL5 社区,我一直在尝试学习如何在 EA 中使用 ONNX 的教程。在教程中,神经网络是首选模型,而我使用的是梯度增强树。

我使用InterpretML Python 软件包建立了模型,并使用ebm2onnx 将其导出到 ONNX。

我将总结模型的训练过程。

1) 模型是在 5 个输入、OHLC 和高度(高度的计算公式为 ((H + L) / 2) - C)的基础上训练的。

2) 该模型是一个二元分类器,旨在将下一根蜡烛分为上涨(1)或下跌(0)。

模型训练数据

用于训练模型的数据

3) 然后将模型导出为 ONNX 格式

ONNX 代表

ONNX 模型表示法。


为了让模型正常工作,我偏离了教程中的代码,不断编辑代码,试图让 ONNX 模型正常工作,但现在我真的不知道自己做错了什么。我一直收到模型句柄无效的错误信息。

我在下面附上了 MQL5 代码。

现在我将总结我代码中偏离教程的步骤,并解释我偏离教程的原因

1) 第 57 行:设置模型输入形状。
在教程中,我们使用了 3 个维度来设置输入和输出形状,即 {1,SAMPLE_SIZE,1};然而,当我采用这种方法时,却不断出现错误,特别是错误 5808。经过通常的跟踪和出错过程,我意识到如果只使用一个维度,即输入的数量,错误就会消失。

2) 第 68 行:设置模型输出形状。

逻辑同上。

我所做的其他偏差不会影响模型,例如,我使用了我认为比教程中的逻辑更直观的逻辑来记录时间。我不需要对输入进行归一化处理,因为这是一个基于树的模型。


如果您能指出我犯的其他错误,我将不胜感激。

//+------------------------------------------------------------------+
//|ONNX.mq5
//|2023年,MetaQuotes有限公司版权所有。|
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
//Meta 属性
#property copyright "Gamuchirai Zororo Ndawana"
#property link      "https://www.mql5.com"
#property version   "1.00"

//贸易图书馆
#include <Trade\Trade.mqh>

//读取 ONNX 模型并将其存储到数据数组中
#resource "\\Files\\Python\\Volatility_75_EBM.onnx" as uchar ExtModel[]

//自定义关键字定义
#define   SAMPLE_SIZE 998
#define   PRICE_UP 1
#define   PRICE_DOWN 0

//全局变量
long     ExtHandle = INVALID_HANDLE;
int      ExtPredictedClass = -1;
datetime ExtNextBar = 0;
datetime ExtNextMinute =0;
float    ExtMin = 0;
float    ExtMax = 0;
double   min_volume;
CTrade   ExtTrade;

// 输入
int input lot_mutliple = 1; // 我们应该输入比最小批次大多少倍的时间?

int OnInit()
  {
   /检查符号和时间框架是否符合培训条件
   if(_Symbol != "Volatility 75 Index" || _Period != PERIOD_M1)
       {
            Comment("Model must be used with the Volatility 75 Index on the 1 Minute Chart");
            return(INIT_FAILED);
       }
    
    //根据数据数组创建 ONNX 模型
    ExtHandle = OnnxCreateFromBuffer(ExtModel,ONNX_DEFAULT);
    Print("ONNX Create from buffer status ",ExtHandle);
    
    //检查句柄是否有效
    if(ExtHandle == INVALID_HANDLE)
      {
            Comment("ONNX create from buffer error ", GetLastError());
            return(INIT_FAILED);
      }
   
   //设置输入形状
   long input_count = OnnxGetInputCount(ExtHandle);   
   const long input_shape[] = {input_count};
   Print("Total model inputs : ",input_count);
   if(!OnnxSetInputShape(ExtHandle,0,input_shape))
      {
            Comment("ONNX set input shape error ", GetLastError());
            OnnxRelease(ExtHandle);
            return(INIT_FAILED);
      }
      
   //设置输出形状
   long output_count = OnnxGetOutputCount(ExtHandle);
   const long output_shape[] = {output_count};
   Print("Total model outputs : ",output_count);
   if(!OnnxSetOutputShape(ExtHandle,0,output_shape))
      {
            Comment("ONNX set output shape error ", GetLastError());
            OnnxRelease(ExtHandle);
            return(INIT_FAILED);
      }
    
    //获取允许的最小交易量 
    min_volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);  
    return(INIT_SUCCEEDED);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(ExtHandle != INVALID_HANDLE)
      {
         OnnxRelease(ExtHandle);
         ExtHandle = INVALID_HANDLE;
      }
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //时间跟踪器
   static datetime time_stamp;
   datetime time = iTime(_Symbol,PERIOD_M1,0);
      
    //检查新栏
     if(time_stamp != time)
      {
         time_stamp = time;
         
         PredictedPrice();
         Print("Predicted class: ",ExtPredictedClass);
         
         if(ExtPredictedClass == PRICE_UP || ExtPredictedClass == PRICE_DOWN)
            if(PositionSelect(_Symbol))
               CheckForClose();
            if(PositionsTotal() == 0)
               CheckForOpen();
      }
   
  }
//+------------------------------------------------------------------+

void CheckForOpen(void)
   {
      ENUM_ORDER_TYPE signal = WRONG_VALUE;
      
      //检查信号
      if(ExtPredictedClass == PRICE_DOWN)
         {
            signal = ORDER_TYPE_SELL;
         }
         
      else if(ExtPredictedClass == PRICE_UP)
         {
            signal = ORDER_TYPE_BUY;
         }
         
      if(signal != WRONG_VALUE && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         {
            double price, sl = 0 , tp = 0;
            double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            
            if(signal == ORDER_TYPE_SELL)
               {
                  price = bid;
               }
               
           else
               {
                  price = ask;
               }
               
            Print("Opening a new position: ",signal);  
            ExtTrade.PositionOpen(_Symbol,signal,min_volume,price,0,0);
         }
   }
   
void CheckForClose(void)
   {
      bool bsignal = false;
      
      long type = PositionGetInteger(POSITION_TYPE);
      
      if(type == POSITION_TYPE_BUY && ExtPredictedClass == PRICE_DOWN)
         bsignal = true;
         
      if(type == POSITION_TYPE_SELL && ExtPredictedClass == PRICE_UP)
         bsignal = true;
         
         if(bsignal && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
            {
                  ExtTrade.PositionClose(_Symbol,3);
                  CheckForOpen();
            }
   }
   
 void PredictedPrice(void)
   {
      vectorf output_data(1);
      float   open  = float(iOpen(_Symbol,PERIOD_M1,1));
      float   high  = float(iHigh(_Symbol,PERIOD_M1,1));
      float   low   = float(iLow(_Symbol,PERIOD_M1,1));
      float   close = float(iClose(_Symbol,PERIOD_M1,1));
      float   height =  float((((high + low) / 2) - close));
      Print("Current open ",open);
      Print("Current high ",high);
      Print("Current low ",low);
      Print("Current close ",close);
      Print("Current height ",height);
      vectorf input_data = {open,high,low,close,height};
      
      Print("Input vector: ",input_data);
      
       if(!OnnxRun(ExtHandle,ONNX_NO_CONVERSION,input_data,output_data))
         {
            Print("ONNX run error : ",GetLastError());
            OnnxRelease(ExtHandle);
         }
        
       int predicted = int(output_data[0]);
       
       Print("Model prediction: ",predicted);
       Print(output_data);
       
       if(predicted == 1)
         {
            ExtPredictedClass = PRICE_UP;
         }
         
       else if(predicted == 0)
         {
            ExtPredictedClass = PRICE_DOWN;
         }
         
         Comment("Model Prediction: ", ExtPredictedClass);
   }



关于交易、自动交易系统和测试交易策略的论坛

文章 "如何在 MQL5 中使用 ONNX 模型 "的讨论

Stian Andreassen, 2023.12.08 20:51

const long input_shape[] = {1, input_count};
const long output_shape[] = {1, output_count};

教程给出了一批SAMPLE_SIZE 关闭输入的数量,您需要的是一批 input_count 输入。

另外,您的模型没有使用浮点数作为输入,而是使用了双倍、



感谢您的分享,我已经应用了您指出的方法,但错误仍然存在。


一批输入数

一批 input_count 输入。

将输入设置为双倍

将输入设置为双

错误信息

错误信息。


附加的文件:
 
amuchirai Zororo Ndawana#
我们能一起解决 ONNX 模型的问题吗?

Hello MQL5 community, I've been trying to follow this tutorial on how to use ONNX in your EA's. In the tutorial a neural network was the model of choice, I've used a gradient boosted tree. 

我使用InterpretML Python 软件包建立了模型,并使用ebm2onnx 将其导出到 ONNX。

我将总结一下模型的训练过程。

1) 模型是在 5 个输入、OHLC 和高度(高度的计算公式为 ((H + L) / 2) - C)的基础上训练的。

2) 该模型是一个二元分类器,旨在将下一根蜡烛分为上涨(1)或下跌(0)。

用于训练模型的数据

3) 然后将模型导出为 ONNX 格式

ONNX 模型表示法。


为了让模型正常工作,我偏离了教程中的代码,不断编辑代码,试图让 ONNX 模型正常工作,但现在我真的不知道自己做错了什么。我一直收到模型句柄无效的错误信息。

我在下面附上了 MQL5 代码。

现在我将总结我代码中偏离教程的步骤,并解释我偏离教程的原因

1) 第 57 行:设置模型输入形状。
在教程中,我们使用了 3 个维度来设置输入和输出形状,即 {1,SAMPLE_SIZE,1};然而,当我采用这种方法时,却不断出现错误,特别是错误 5808。经过通常的跟踪和出错过程,我意识到如果只使用一个维度,即输入的数量,错误就会消失。

2) 第 68 行:设置模型输出形状。

逻辑同上。

我所做的其他偏差不会影响模型,例如,我使用了我认为比教程中的逻辑更直观的逻辑来记录时间。我不需要对输入进行归一化处理,因为这是一个基于树的模型。


如果您能指出我犯的其他错误,我将不胜感激。





感谢您的分享,我已经应用了您指出的方法,但错误仍然存在。


一批 input_count 输入。

将输入设置为双

错误信息。


似乎 MQL5 还不支持(或者说ONNXMLTools 还不支持)EBM 的 ONNX:

https://www.mql5.com/zh/docs/onnx/onnx_conversion

如果您参考 https://www.mql5.com/zh/articles/12484 上的 ONNX 附件(尤其是使用 4 个输入的model.eurusd.D1.10.class.onnx),并使用Netron(网络版)将 onnx 文件可视化,您就会发现其中的差异。

我认为以下两篇文章也有助于您进一步理解:

Scikit-learn 库的回归模型及其向 ONNX 的导出

Scikit-learn 库中的分类模型及其向 ONNX 的导出

Wrapping ONNX models in classes
Wrapping ONNX models in classes
  • www.mql5.com
Object-oriented programming enables creation of a more compact code that is easy to read and modify. Here we will have a look at the example for three ONNX models.
 

大家好、


我们正试图在一个时间点(批量大小为 32)使用带有 11 个预测器的 keras神经网络 对 XauUsd 进行预测(输出为介于 0 和 1 之间的单数)。首先,我们从 OnnxCreatefrombuffer 加载(因为 OnnxCreate 本身对我们不起作用),然后在 OnnxRun 阶段总是出错,我将这两个错误都附在下面。如果能帮助我们确定输入要重塑到什么维度,预测矢量要采用什么格式(如果它应该是矢量的话),或者提供语法方面的帮助或建议以帮助解决这些错误,那就太好了。我们已经尝试过重塑 32、1、11 向量的各种组合,但都不成功,而且真的不知道下一步该怎么做。非常感谢任何可以提供帮助的人!本。

错误 5808

ONNX:输入参数 #0 张量的维度 [0] 不正确,尝试使用 OnnxSetInputShape。

ONNX:输入参数 #0 的大小无效,预计为 1408 字节,而不是 480 字节

 

你好,我尝试使用

OnnxModelInfo.mq5

文件脚本,但无法正常工作,我做错了什么?

我复制粘贴了 OnnxModelInfo 脚本,并保存到了 de Files 文件夹。

我有一个 onnx 模型(附后)

当我编译脚本时,出现了 21 个错误。

谁能帮帮我?请

'element_type' - undeclared identifier  onnx read file.mq5      60      49
'element_type' - parameter for EnumToString must be an enumeration      onnx read file.mq5      60      49
'dimensions' - undeclared identifier    onnx read file.mq5      62      17
'dimensions' - undeclared identifier    onnx read file.mq5      64      37
'[' - array required    onnx read file.mq5      64      47
'dimensions' - undeclared identifier    onnx read file.mq5      65      51
'[' - array required    onnx read file.mq5      65      61
'dimensions' - undeclared identifier    onnx read file.mq5      66      33
'dimensions' - undeclared identifier    onnx read file.mq5      68      23
'[' - array required    onnx read file.mq5      68      33
'dimensions' - undeclared identifier    onnx read file.mq5      71      48
'[' - array required    onnx read file.mq5      71      58
'dimensions' - undeclared identifier    onnx read file.mq5      80      33
'dimensions' - undeclared identifier    onnx read file.mq5      82      35
'[' - array required    onnx read file.mq5      82      45
'dimensions' - undeclared identifier    onnx read file.mq5      100     28
';' - unexpected token  onnx read file.mq5      102     45
'<' - l-value required  onnx read file.mq5      100     17
cannot implicitly convert type 'string' to 'bool'       onnx read file.mq5      102     21
l-value required        onnx read file.mq5      102     20
'(' - unbalanced left parenthesis       onnx read file.mq5      100     9
empty controlled statement found        onnx read file.mq5      102     45
附加的文件:
model.onnx  295 kb
 
MetaQuotes:

新文章《在 MQL5 中使用 ONNX 模型》已发布:

作者:MetaQuotes

先生们,你们好。

有人能帮助我吗,因为在使用 python 的过程结束时,出现了以下错误:AttributeError: 'Sequential' object has no attribute 'output_names'(属性错误:'Sequential'对象没有属性 'output_names')。我对 python 或编程知之甚少。因此希望得到任何帮助!谢谢。

 
先生们,你们好。

谁能帮帮我,因为在使用 python 的过程结束时,会出现以下错误:AttributeError: 'Sequential' object has no attribute 'output_names'.我对 Python 或编程知之甚少。因此欢迎任何帮助!谢谢。
 
Alberto Henrique Tacoronte # 先生们,你们好。谁能帮帮我,因为在 python 进程结束时,出现了以下错误:AttributeError: 'Sequential' object has no attribute 'output_names'(属性错误:'Sequential'对象没有属性'output_names')。我对 python 或编程知之甚少。因此希望得到任何帮助!谢谢。

你好,Alberto,请发布您代码中出现错误的部分[使用CODE 按钮(Alt -S)],以便了解Python(MetaTrader for Python|ONNX Models) 的人指出解决方案...