記事「MQL5でONNXモデルを使用する方法」についてのディスカッション - ページ 5

 
いい記事だ。テストデータの予測グラフには失望した。DNNのモデリングやトレーニングをすべてスキップして、単純に直近の価格と同じ次の価格を予測したほうがいい。そのような些細なモデルの予測精度は、あなたのDNNモデルを使うよりも高くなるに違いない。この2つの精度を比較し、ここに示すことを提案する。一般的に、DNNを使って価格を予測するのは悪い考えです。DNNは価格パターン(買い、売り、ホールドなど)の分類に適しています。また、DNNの重みの数は天文学的です。オーバーフィッティングに違いない。
 
Vladimir #:
いい記事だ。テストデータの予測グラフには失望した。DNNのモデリングやトレーニングをすべてスキップして、単純に直近の価格と同じ次の価格を予測したほうがいい。そのような些細なモデルの予測精度は、あなたのDNNモデルを使うよりも高くなるに違いない。この2つの精度を比較し、ここに示すことを提案する。一般的に、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};

チュートリアルでは、1バッチSAMPLE_SIZE数のクローズ入力が与えられて います

また、あなたのモデルは入力として浮動小数点数ではなく倍数を使用しています、

モデレーター注:この投稿は、以下の投稿が別のトピックから移動されたため、順番が前後しています。以下の投稿をご覧ください。

 
ONNXモデルのトラブルシューティングは可能ですか?

MQL5コミュニティの皆さん、こんにちは。EAでONNXを使用する方法について、この チュートリアルに従おうとしています。チュートリアルではニューラルネットワークが選択されましたが、私は勾配ブーストツリーを使用しました。

InterpretML Pythonパッケージを使ってモデルを構築し、ebm2onnxを使って ONNXにエクスポートしました。

モデルの学習過程を要約する。

1) モデルは5つの入力、OHLCとHeightで学習され、Heightは((H + L) / 2) - Cとして計算される。

2) モデルは二値分類器で、次のローソク足を上昇(1)か下降(0)のいずれかに分類することを目指す。

モデル・トレーニング・データ

モデルの学習に使用したデータ

3) モデルは ONNX フォーマットにエクスポートされる。

ONNXの表現

ONNXモデルの表現。


モデルを動作させるために、チュートリアルのコードから逸脱し、ONNXモデルを動作させるためにコードを編集し続けました。モデルのハンドルが無効だというエラーが出続けます。

以下にMQL5のコードを添付します。

私のコードでチュートリアルの内容から逸脱したステップを要約し、なぜチュートリアルから逸脱したのかも説明します。

1) LINE 57: Setting Model Input Shape.
チュートリアルでは、入力と出力の形状を設定するために3次元が使用されていました。通常のトレイル・アンド・エラー・プロセスの後、1次元(入力数)のみを使用するとエラーがなくなることに気づきました。

2) 68行目:モデル出力形状の設定。

上記と同じロジック。

例えば、チュートリアルで実装されているロジックよりも直感的に理解できるロジックを使って時間を記録した。ツリーベースのモデルなので、入力を正規化する必要はありませんでした。


もし私が犯した他のミスを発見することができれば、あなたの洞察に感謝します。

//+------------------------------------------------------------------+
//|ONNX.mq5
//|著作権 2023, MetaQuotes Ltd.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
//メタ・プロパティ
#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};

チュートリアルでは、1バッチSAMPLE_SIZE数のクローズ入力が与えられて います。

また、あなたのモデルは入力として浮動小数点数ではなく倍数を使用しています、



ご指摘の内容を適用しましたが、エラーはまだ残っています。


input_countの1バッチ

input_countの入力が1バッチ。

入力をダブルに設定

入力をdoubleに設定

エラーメッセージ

エラーメッセージ


ファイル:
 
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とHeightで学習され、Heightは((H + L) / 2) - Cとして計算される。

2) モデルは二値分類器で、次のローソク足を上昇(1)か下降(0)のいずれかに分類することを目指す。

モデルの学習に使用したデータ

3) モデルは ONNX フォーマットにエクスポートされる。

ONNXモデルの表現。


モデルを動作させるために、チュートリアルのコードから逸脱し、ONNXモデルを動作させるためにコードを編集し続けました。モデルのハンドルが無効だというエラーが出続けます。

以下にMQL5のコードを添付します。

私のコードでチュートリアルの内容から逸脱したステップを要約し、なぜチュートリアルから逸脱したのかも説明します。

1) LINE 57: Setting Model Input Shape.
チュートリアルでは、入力と出力の形状を設定するために3次元が使用されていました。通常のトレイル・アンド・エラー・プロセスの後、1次元(入力数)のみを使用するとエラーがなくなることに気づきました。

2) 68行目:モデル出力形状の設定。

上記と同じロジック。

例えば、チュートリアルで実装されているロジックよりも直感的に理解できるロジックを使って時間を記録した。ツリーベースのモデルなので、入力を正規化する必要はありませんでした。


もし私が犯した他のミスを発見することができれば、あなたの洞察に感謝します。





ご指摘いただいたことを適用しましたが、エラーはまだ残っています。




入力をダブルに設定

エラーメッセージ。


MQL5はまだ(というかONNXMLToolsは まだ)EBMのONNXをサポートしていないようです:

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

https://www.mql5.com/ja/articles/12484、ONNXの添付ファイル(特に4つの入力を使用するmodel.eurusd.D1.10.class.onnx)を参照し、Netron(ウェブ版)を使用してonnxファイルを視覚化すると、違いがわかります。

以下の2つの記事も理解を深めるのに役立つと思う:

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.
 

皆さんこんにちは、


私たちは、ある時点で11の予測子を持つkerasニューラルネットワーク(バッチサイズ32)を使用して、XauUsd(出力は0と1の間の特異数)の予測をしようとしています。まず、OnnxCreatefrombufferからロードし(OnnxCreate自体が動作しないため)、次にOnnxRunステージで常にエラーが発生します。入力のためにどの次元にリシェイプするか、予測ベクトルをどのようなフォーマットで置くか(もしベクトルであるべきなら)、あるいはこれらのエラーに対処するためのシンタックスに関するヘルプや提案があれば教えてください。私たちは32,1,11のベクトルのあらゆる組み合わせにリシェイプを試みましたが、うまくいかず、次のステップもわかりませんでした。助けてくださる方、本当にありがとうございます!ベン

エラー 5808'

' ONNX: 入力パラメータ #0 のテンソルの次元 [0] が間違っています。

'ONNX: invalid input parameter #0 size, expected 1408 bytes instead of 480'.

 

こんにちは。

OnnxModelInfo.mq5

ファイルスクリプトを使おうとしたのですが、うまくいきません!

OnnxModelInfoスクリプトをコピーペーストして、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'。私はpythonやプログラミングについてあまり知りません。ですから、どんな助けでもありがたいです!ありがとうございました。

 
こんにちは。

pythonでの処理の最後に以下のようなエラーが出ます:AttributeError: 'Sequential' object has no attribute 'output_names'。私はPythonやプログラミングについてあまり知りません。ですから、どんな助けでも歓迎します!ありがとうございます。
 
Alberto Henrique Tacoronte # こんにちは。pythonの処理の最後に、次のようなエラーが出ます: AttributeError: 'Sequential' object has no attribute 'output_names'。私はpythonやプログラミングについてあまり知りません。だから、どんな助けでもありがたいです!ありがとうございます。

Python(MetaTrader for Python|ONNX Models)に詳しい方が解決策を指摘してくれるかもしれません。