Diskussion zum Artikel "Wie man ONNX-Modelle in MQL5 verwendet" - Seite 5

 
Schöner Artikel. Das Vorhersagediagramm zu den Testdaten ist enttäuschend. Sie könnten genauso gut die ganze DNN-Modellierung/Training überspringen und einfach eine Vorhersage des nächsten Preises gleich dem letzten bekannten Preis verwenden. Ich wette, die Vorhersagegenauigkeit eines solchen trivialen Modells wird höher sein als die Ihres DNN-Modells. Ich schlage vor, diese beiden Genauigkeiten zu vergleichen und sie hier zu zeigen. Im Allgemeinen ist die Verwendung von DNN zur Preisvorhersage eine schlechte Idee. Sie eignen sich besser für die Klassifizierung von Preismustern (z. B. Kaufen, Verkaufen, Halten). Außerdem ist die Anzahl der Gewichte in Ihrem DNN astronomisch. Das muss eine Überanpassung sein.
 
Vladimir #:
Schöner Artikel. Das Vorhersagediagramm zu den Testdaten ist enttäuschend. Sie könnten genauso gut die ganze DNN-Modellierung/Training überspringen und einfach eine Vorhersage des nächsten Preises gleich dem letzten bekannten Preis verwenden. Ich wette, die Vorhersagegenauigkeit eines solchen trivialen Modells wird höher sein als die Ihres DNN-Modells. Ich schlage vor, diese beiden Genauigkeiten zu vergleichen und sie hier zu zeigen. Im Allgemeinen ist die Verwendung von DNN zur Preisvorhersage eine schlechte Idee. Sie eignen sich besser für die Klassifizierung von Preismustern (z. B. Kaufen, Verkaufen, Halten). Außerdem ist die Anzahl der Gewichte in Ihrem DNN astronomisch. Das muss eine Überanpassung sein.

Danke, Vladimir.
Nur zur Diskussion: Wenn es die Zeit erlaubt, würde ich dieses Modell modifizieren, um eine Klassifizierung zum Vergleich durchzuführen.

Bitte lassen Sie mich wissen, wenn Sie Ideen haben.

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};

Das Tutorial gibt eine Eingabe von einem Stapel SAMPLE_SIZE Anzahl von Eingaben schließen, Sie wollen einen Stapel input_count Eingaben.

Außerdem verwendet Ihr Modell keine Floats als Eingaben, sondern Doubles,

Anmerkung des Moderators: Dieser Beitrag ist nicht mehr in der richtigen Reihenfolge, da die nachfolgenden Beiträge aus einem anderen Thema verschoben wurden. Bitte lesen Sie den folgenden Beitrag.

 
Können wir dieses ONNX-Modell gemeinsam beheben?

Hallo MQL5-Gemeinschaft, Ich habe versucht, dieses Tutorial zu folgen, wie ONNX in Ihre EAs zu verwenden. In dem Tutorial ein neuronales Netzwerk war das Modell der Wahl, ich habe einen Gradient Boosted Baum verwendet.

Ich habe das Modell mit dem InterpretML-Python-Paket erstellt und es mit ebm2onnx in ONNX exportiert.

Ich werde den Prozess zusammenfassen, mit dem das Modell trainiert wurde.

1) Das Modell wurde mit 5 Eingaben trainiert, OHLC und Höhe, Höhe wird berechnet als ((H + L) / 2) - C.

2) Das Modell ist ein binärer Klassifikator, der darauf abzielt, die nächste Kerze entweder als UP (1) oder DOWN (0) zu klassifizieren.

Modell Trainingsdaten

Die zum Trainieren des Modells verwendeten Daten.

3) Das Modell wurde dann in das ONNX-Format exportiert

ONNX-Darstellung

Darstellung des ONNX-Modells.


Um das Modell zum Laufen zu bringen, bin ich vom Code im Tutorial abgewichen und habe den Code weiter bearbeitet, um das ONNX-Modell zum Laufen zu bringen, aber jetzt weiß ich wirklich nicht, was ich falsch mache. Ich erhalte immer eine Fehlermeldung, dass das Handle für das Modell ungültig ist.

Ich habe den MQL5-Code unten angehängt.

Ich fasse nun die Schritte zusammen, die ich in meinem Code unternommen habe und die vom Tutorial abweichen, und ich erkläre auch, warum ich vom Tutorial abgewichen bin

1) Zeile 57: Einstellen der Modell-Eingangsform.
Im Lernprogramm wurden 3 Dimensionen verwendet, um die Eingangs- und Ausgangsform festzulegen, d. h. {1,SAMPLE_SIZE,1}; Als ich diesen Ansatz verfolgte, erhielt ich jedoch immer wieder eine Fehlermeldung, genauer gesagt Fehler 5808. Nach dem üblichen "Trail and Error"-Prozess erkannte ich, dass der Fehler verschwand, wenn ich nur 1 Dimension, die Anzahl der Eingänge, verwendete.

2) ZEILE 68: Einstellen der Form der Modellausgabe.

Dieselbe Logik wie oben.

Die anderen Abweichungen, die ich vorgenommen habe, wirken sich nicht auf das Modell aus, z. B. habe ich die Zeit mit einer Logik verfolgt, die ich intuitiver fand als die im Lernprogramm implementierte Logik. Ich brauchte die Eingaben nicht zu normalisieren, da es sich um ein baumbasiertes Modell handelt.


Wenn Sie andere Fehler finden, die ich gemacht habe, wäre ich Ihnen dankbar für Ihren Hinweis.

//+------------------------------------------------------------------+
//|ONNX.mq5 |
//|Urheberrecht 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//Meta-Eigenschaften
#property copyright "Gamuchirai Zororo Ndawana"
#property link      "https://www.mql5.com"
#property version   "1.00"

//Handelsbibliothek
#include <Trade\Trade.mqh>

//Lesen unseres ONNX-Modells und Speichern in einem Daten-Array
#resource "\\Files\\Python\\Volatility_75_EBM.onnx" as uchar ExtModel[]

//Benutzerdefinierte Schlüsselwortdefinitionen
#define   SAMPLE_SIZE 998
#define   PRICE_UP 1
#define   PRICE_DOWN 0

//Globale Variablen
long     ExtHandle = INVALID_HANDLE;
int      ExtPredictedClass = -1;
datetime ExtNextBar = 0;
datetime ExtNextMinute =0;
float    ExtMin = 0;
float    ExtMax = 0;
double   min_volume;
CTrade   ExtTrade;

//Eingaben
int input lot_mutliple = 1; //Wie viele Male größer als die Mindestanzahl sollten wir eingeben?

int OnInit()
  {
   //Prüfen, ob das Symbol und der Zeitrahmen den Ausbildungsbedingungen entsprechen
   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);
       }
    
    //Erstellen eines ONNX-Modells aus unserem Datenfeld
    ExtHandle = OnnxCreateFromBuffer(ExtModel,ONNX_DEFAULT);
    Print("ONNX Create from buffer status ",ExtHandle);
    
    //Prüfen, ob der Handle gültig ist
    if(ExtHandle == INVALID_HANDLE)
      {
            Comment("ONNX create from buffer error ", GetLastError());
            return(INIT_FAILED);
      }
   
   //Eingabeform festlegen
   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);
      }
      
   //Setzen der Ausgabeform
   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);
      }
    
    //Abfrage des zulässigen Mindesthandelsvolumens 
    min_volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);  
    return(INIT_SUCCEEDED);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(ExtHandle != INVALID_HANDLE)
      {
         OnnxRelease(ExtHandle);
         ExtHandle = INVALID_HANDLE;
      }
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //Zeitmessgeräte
   static datetime time_stamp;
   datetime time = iTime(_Symbol,PERIOD_M1,0);
      
    //Neuer Balken prüfen
     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;
      
      //Signale prüfen
      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);
   }



Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien

Diskussion des Artikels "Wie man ONNX-Modelle in MQL5 verwendet"

Stian Andreassen, 2023.12.08 20:51

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

Das Tutorial gibt eine Eingabe von einem Batch SAMPLE_SIZE Anzahl von Eingaben schließen, Sie wollen eine Charge von input_count Eingaben.

Außerdem verwendet Ihr Modell keine Floats als Eingaben, sondern Doubles,



Vielen Dank für den Hinweis, Sitan, ich habe angewendet, was Sie darauf hingewiesen haben, aber der Fehler ist immer noch da


Eine Charge von input_count

Ein Stapel input_count Eingaben.

Eingang auf doppelt setzen

Eingabe auf double setzen

Fehlermeldung

Fehlermeldung.


Dateien:
 
amuchirai Zororo Ndawana #:
Können wir dieses ONNX-Modell gemeinsam beheben?

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. 

Ich habe das Modell mit dem Python-Paket InterpretML erstellt und es mit ebm2onnx nach ONNX exportiert.

Ich werde den Prozess zusammenfassen, mit dem das Modell trainiert wurde.

1) Das Modell wurde mit 5 Eingaben trainiert, OHLC und Höhe, Höhe wird berechnet als ((H + L) / 2) - C.

2) Das Modell ist ein binärer Klassifikator, der darauf abzielt, die nächste Kerze entweder als UP (1) oder DOWN (0) zu klassifizieren.

Die zum Trainieren des Modells verwendeten Daten.

3) Das Modell wurde dann in das ONNX-Format exportiert

Darstellung des ONNX-Modells.


Um das Modell zum Laufen zu bringen, bin ich vom Code im Tutorial abgewichen und habe den Code weiter bearbeitet, um zu versuchen, das ONNX-Modell zum Laufen zu bringen, aber jetzt weiß ich wirklich nicht, was ich falsch mache. Ich erhalte immer eine Fehlermeldung, dass das Handle für das Modell ungültig ist.

Ich habe den MQL5-Code unten angehängt.

Ich fasse nun die Schritte zusammen, die ich in meinem Code unternommen habe und die vom Tutorial abweichen, und ich erkläre auch, warum ich vom Tutorial abgewichen bin

1) ZEILE 57: Einstellen der Modell-Eingangsform.
Im Lernprogramm wurden 3 Dimensionen verwendet, um die Eingangs- und Ausgangsform festzulegen, d. h. {1,SAMPLE_SIZE,1}; Als ich diesen Ansatz verfolgte, erhielt ich jedoch immer wieder einen Fehler, genauer gesagt den Fehler 5808. Nach dem üblichen "Trail and Error"-Prozess erkannte ich, dass der Fehler verschwand, wenn ich nur 1 Dimension, die Anzahl der Eingänge, verwendete.

2) ZEILE 68: Einstellen der Form der Modellausgabe.

Dieselbe Logik wie oben.

Die anderen Abweichungen, die ich vorgenommen habe, wirken sich nicht auf das Modell aus, z. B. habe ich die Zeit mit einer Logik verfolgt, die ich intuitiver fand als die im Lernprogramm implementierte Logik. Ich brauchte die Eingaben nicht zu normalisieren, da es sich um ein baumbasiertes Modell handelt.


Wenn Sie andere Fehler finden, die ich gemacht habe, wäre ich Ihnen dankbar für Ihren Hinweis.





Vielen Dank für die Mitteilung Sitan, ich habe angewandt, was Sie darauf hingewiesen, aber der Fehler ist immer noch da


Ein Stapel input_count Eingaben.

Eingabe auf double setzen

Fehlermeldung.


Es scheint, dass MQL5 noch nicht (bzw. ONNXMLTools noch nicht) EBM's ONNX unterstützt:

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

Wenn Sie die ONNX-Anhänge (insbesondere model.eurusd.D1.10.class.onnx, das 4 Eingänge verwendet) von https://www.mql5.com/de/articles/12484 heranziehen und Netron(Web-Version) verwenden, um die onnx-Dateien zu visualisieren, werden Sie die Unterschiede sehen.

Ich denke, dass die folgenden zwei Artikel Ihnen helfen werden, die Zusammenhänge besser zu verstehen:

Regressionsmodelle der Scikit-learn Bibliothek und ihr Export nach ONNX

Klassifikationsmodelle der Scikit-Learn Bibliothek und ihr Export nach 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.
 

Hallo zusammen,


Wir versuchen, ein neuronales Netzwerk von Keras mit 11 Prädiktoren zu einem Zeitpunkt (Stapelgröße 32) zu verwenden, um Vorhersagen auf dem XauUsd zu machen (wobei die Ausgabe eine einzelne Zahl zwischen 0 und 1 ist). Zunächst laden wir in von OnnxCreatefrombuffer (weil OnnxCreate selbst nicht für uns arbeiten), dann erhalten wir immer einen Fehler auf der OnnxRun Bühne, wo ich beide Fehler unten angehängt haben. Jede Hilfe, welche Dimension für die Eingabe umzuformen ist, welches Format unser Prädiktorvektor haben sollte (wenn es überhaupt ein Vektor sein sollte?), oder einfach jede Hilfe oder Vorschläge mit Syntax, um diese Fehler zu beheben, wäre fantastisch. Wir haben versucht, um alle Arten von Kombinationen von 32, 1, 11 Vektoren und kein Glück und wirklich keine Idee mit den nächsten Schritten umzuformen. Vielen Dank für jeden, der helfen kann! Ben.

' Fehler 5808'

ONNX: Eingabeparameter #0 Tensor hat falsche Dimension [0], versuche OnnxSetInputShape zu verwenden'

ONNX: Ungültige Größe des Eingabeparameters #0, erwartet wurden 1408 Bytes statt 480'

 

Hallo, ich versuche, das

OnnxModelInfo.mq5

Datei-Skript zu verwenden, aber ich kann es nicht zum Laufen bringen, was mache ich falsch? das kann nicht so kompliziert sein!

Ich habe das OnnxModelInfo-Skript kopiert und in den Ordner Files gespeichert.

Ich habe ein Onnx-Modell (angehängt)

und wenn ich das Skript kompiliere, erscheinen 21 Fehler.

Kann mir jemand bei diesem Problem helfen? Bitte

'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
Dateien:
model.onnx  295 kb
 
MetaQuotes:

Der neue Artikel ONNX-Modelle in MQL5 verwenden wurde veröffentlicht:

Autor: MetaQuotes

Hallo meine Herren.

Kann mir jemand helfen, weil am Ende des Prozesses in Python folgender Fehler auftaucht: AttributeError: 'Sequential' object has no attribute 'output_names'. Ich weiß nicht viel über Python oder Programmierung. Daher wäre ich für jede Hilfe dankbar! Ich danke Ihnen.

 
Hallo meine Herren.

Kann mir jemand helfen, denn am Ende des Prozesses in Python kommt folgender Fehler heraus: AttributeError: 'Sequential' Objekt hat kein Attribut 'output_names'. Ich weiß nicht viel über Python oder Programmierung. Jede Hilfe ist also willkommen! Danke!
 
Alberto Henrique Tacoronte # Hallo meine Herren. Kann mir jemand helfen, denn am Ende des Python-Prozesses kommt folgende Fehlermeldung: AttributeError: 'Sequential' object has no attribute 'output_names'. Ich weiß nicht viel über Python oder Programmierung. Daher wäre ich für jede Hilfe dankbar! Ich danke Ihnen.

Hallo Alberto, bitte posten Sie den Teil Ihres Codes[mit Hilfe derCODE-Taste (Alt -S)], in dem der Fehler auftritt, damit jemand, der sich mit Python auskennt(MetaTrader for Python | ONNX Models), die Lösung aufzeigen kann...