"MQL5'te ONNX modelleri nasıl kullanılır?" makalesi için tartışma - sayfa 5

 
Güzel makale. Test Verilerindeki Tahmin Grafiği hayal kırıklığı yaratıyor. Tüm bu DNN modelleme/eğitimini atlayabilir ve sadece son bilinen fiyata eşit bir sonraki fiyat tahminini kullanabilirsiniz. Bahse girerim böyle önemsiz bir modelin tahmin doğruluğu DNN modelinizi kullanmaktan daha yüksek olacaktır. Bu iki doğruluğu karşılaştırmanızı ve burada göstermenizi öneririm. Genel olarak, fiyatları tahmin etmek için DNN kullanmak kötü bir fikirdir. Fiyat modellerinin sınıflandırılması için daha uygundurlar (örneğin, al, sat, tut). Ayrıca, DNN'nizdeki ağırlık sayısı astronomiktir. Aşırı uyum sağlamış olmalı.
 
Vladimir #:
Güzel makale. Test Verilerindeki Tahmin Grafiği hayal kırıklığı yaratıyor. Tüm bu DNN modelleme/eğitimini atlayabilir ve sadece son bilinen fiyata eşit bir sonraki fiyat tahminini kullanabilirsiniz. Bahse girerim böyle önemsiz bir modelin tahmin doğruluğu DNN modelinizi kullanmaktan daha yüksek olacaktır. Bu iki doğruluğu karşılaştırmanızı ve burada göstermenizi öneririm. Genel olarak, fiyatları tahmin etmek için DNN kullanmak kötü bir fikirdir. Fiyat modellerinin sınıflandırılması için daha uygundurlar (örneğin, al, sat, tut). Ayrıca, DNN'nizdeki ağırlık sayısı astronomiktir. Aşırı uyum sağlamış olmalı.

Teşekkürler Vladimir.
Sadece tartışma için, zamanım olduğunda, bu modeli karşılaştırma için sınıflandırma yapacak şekilde değiştirebilirim.

Fikriniz varsa lütfen bana bildirin.

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

Öğretici, bir parti SAMPLE_SIZE sayıda yakın girdi verir , siz bir parti input_count girdisi istiyorsunuz.

Ayrıca modeliniz girdi olarak float değil, double kullanıyor,

Moderatörün notu: Bu gönderi, aşağıdaki gönderilerin başka bir konudan taşınması nedeniyle sıra dışıdır. Lütfen aşağıdaki gönderiye bakın.

 
Bu ONNX Modelinde Birlikte Sorun Giderme Yapabilir miyiz?

Merhaba MQL5 topluluğu, EA'larınızda ONNX'in nasıl kullanılacağına dair bu öğreticiyi takip etmeye çalışıyorum. Eğitimde tercih edilen model bir sinir ağıydı, ben degrade destekli bir ağaç kullandım.

Modeli InterpretML Python paketini kullanarak oluşturdum ve ebm2onnx kullanarak ONNX'e aktardım.

Modelin eğitildiği süreci özetleyeceğim.

1) Model 5 girdi üzerinde eğitilmiştir, OHLC ve Yükseklik, Yükseklik ((H + L) / 2) - C olarak hesaplanır.

2) Model, bir sonraki mumu YUKARI (1) veya AŞAĞI (0) olarak sınıflandırmayı amaçlayan ikili bir sınıflandırıcıdır.

Model Eğitim Verileri

Modeli eğitmek için kullanılan veriler.

3) Model daha sonra ONNX formatına aktarıldı

ONNX Temsilciliği

ONNX model gösterimi.


Modelin çalışmasını sağlamak için öğreticideki koddan saptım ve ONNX modelinin çalışmasını sağlamak için kodu düzenlemeye devam ettim, ancak şimdi neyi yanlış yaptığımı gerçekten bilmiyorum. Model için tutamacın geçersiz olduğuna dair bir hata almaya devam ediyorum.

MQL5 kodunu aşağıya ekledim.

Şimdi kodumda öğreticiden farklı olarak attığım adımları özetleyeceğim ve neden öğreticiden saptığımı da açıklayacağım

1) SATIR 57: Model Giriş Şeklini Ayarlama.
Eğitimde giriş ve çıkış şeklini ayarlamak için 3 boyut kullanıldı, yani {1,SAMPLE_SIZE,1}; Ancak bu yaklaşımı izlediğimde bir hata almaya devam ettim, özellikle 5808 hatası. Her zamanki iz sürme ve yanılma sürecinden sonra, yalnızca 1 boyut, yani girdi sayısı kullandığımda hatanın ortadan kalktığını fark ettim.

2) HAT 68: Model Çıkış Şeklinin Ayarlanması.

Yukarıdaki ile aynı mantık.

Yaptığım diğer sapmalar modeli etkilemiyor, örneğin zamanı öğreticide uygulanan mantıktan daha sezgisel bulduğum bir mantık kullanarak takip ettim. Ağaç tabanlı bir model olduğu için girdileri normalleştirmem gerekmedi.


Eğer yaptığım başka hataları da tespit edebilirseniz, görüşleriniz için minnettar olurum.

//+------------------------------------------------------------------+
//|ONNX.mq5 |
//|Telif Hakkı 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//Meta özellikleri
#property copyright "Gamuchirai Zororo Ndawana"
#property link      "https://www.mql5.com"
#property version   "1.00"

//Ticaret Kütüphanesi
#include <Trade\Trade.mqh>

/ / ONNX modelimizi okumak ve bir veri dizisine depolamak
#resource "\\Files\\Python\\Volatility_75_EBM.onnx" as uchar ExtModel[]

//Özel anahtar sözcük tanımları
#define   SAMPLE_SIZE 998
#define   PRICE_UP 1
#define   PRICE_DOWN 0

//Global değişkenler
long     ExtHandle = INVALID_HANDLE;
int      ExtPredictedClass = -1;
datetime ExtNextBar = 0;
datetime ExtNextMinute =0;
float    ExtMin = 0;
float    ExtMax = 0;
double   min_volume;
CTrade   ExtTrade;

//Girişler
int input lot_mutliple = 1; //Minimum lottan kaç kat büyük girmeliyiz?

int OnInit()
  {
   //Sembol ve zaman çerçevesinin eğitim koşullarına uygun olup olmadığını kontrol edin
   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);
       }
    
    //Veri dizimizden bir ONNX modeli oluşturun
    ExtHandle = OnnxCreateFromBuffer(ExtModel,ONNX_DEFAULT);
    Print("ONNX Create from buffer status ",ExtHandle);
    
    //Tutamacın geçerli olup olmadığını kontrol etme
    if(ExtHandle == INVALID_HANDLE)
      {
            Comment("ONNX create from buffer error ", GetLastError());
            return(INIT_FAILED);
      }
   
   //Giriş şeklini ayarla
   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);
      }
      
   //Çıktı şeklini ayarla
   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);
      }
    
    //İzin verilen minimum işlem hacmini alın 
    min_volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);  
    return(INIT_SUCCEEDED);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(ExtHandle != INVALID_HANDLE)
      {
         OnnxRelease(ExtHandle);
         ExtHandle = INVALID_HANDLE;
      }
  }
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //Zaman izleyiciler
   static datetime time_stamp;
   datetime time = iTime(_Symbol,PERIOD_M1,0);
      
    //Yeni çubuğu kontrol et
     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;
      
      /Sinyalleri kontrol edin
      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);
   }



Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

"MQL5'te ONNX modelleri nasıl kullanılır" makalesinin tartışılması

Stian Andreassen, 2023.12.08 20:51

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

Öğretici, bir parti SAMPLE_SIZE sayıda yakın girdi verir , siz bir parti input_count girdisi istiyorsunuz.

Ayrıca modeliniz girdi olarak kayan sayıları değil, çift sayıları kullanıyor,



Paylaşımınız için teşekkürler Sitan, belirttiklerinizi uyguladım ancak hata hala devam ediyor


Bir yığın input_count

Bir grup input_count girdisi.

Girişi çift olarak ayarlayın

Girişi çift olarak ayarlayın

Hata mesajı

Hata mesajı.


Dosyalar:
 
amuchirai Zororo Ndawana #:
Bu ONNX Modelinde Birlikte Sorun Giderme Çalışması Yapabilir miyiz?

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. 

Modeli InterpretML Python paketini kullanarak oluşturdum ve ebm2onnx kullanarak ONNX'e aktardım.

Modelin eğitildiği süreci özetleyeceğim.

1) Model 5 girdi üzerinde eğitilmiştir, OHLC ve Yükseklik, Yükseklik ((H + L) / 2) - C olarak hesaplanır.

2) Model, bir sonraki mumu YUKARI (1) veya AŞAĞI (0) olarak sınıflandırmayı amaçlayan ikili bir sınıflandırıcıdır.

Modeli eğitmek için kullanılan veriler.

3) Model daha sonra ONNX formatına aktarıldı

ONNX model gösterimi.


Modelin çalışmasını sağlamak için öğreticideki koddan saptım ve ONNX modelinin çalışmasını sağlamak için kodu düzenlemeye devam ettim, ancak şimdi neyi yanlış yaptığımı gerçekten bilmiyorum. Model için tutamacın geçersiz olduğuna dair bir hata almaya devam ediyorum.

MQL5 kodunu aşağıya ekledim.

Şimdi kodumda öğreticiden farklı olarak attığım adımları özetleyeceğim ve neden öğreticiden saptığımı da açıklayacağım

1) SATIR 57: Model Giriş Şeklini Ayarlama.
Eğitimde giriş ve çıkış şeklini ayarlamak için 3 boyut kullanıldı, yani {1,SAMPLE_SIZE,1}; Ancak bu yaklaşımı izlediğimde bir hata almaya devam ettim, özellikle 5808 hatası. Her zamanki iz sürme ve yanılma sürecinden sonra, yalnızca 1 boyut, yani girdi sayısı kullandığımda hatanın ortadan kalktığını fark ettim.

2) HAT 68: Model Çıkış Şeklinin Ayarlanması.

Yukarıdaki ile aynı mantık.

Yaptığım diğer sapmalar modeli etkilemiyor, örneğin zamanı öğreticide uygulanan mantıktan daha sezgisel bulduğum bir mantık kullanarak takip ettim. Ağaç tabanlı bir model olduğu için girdileri normalleştirmem gerekmedi.


Eğer yaptığım başka hataları da tespit edebilirseniz, görüşleriniz için minnettar olurum.





Paylaşımınız için teşekkürler Sitan, belirttiklerinizi uyguladım ancak hata hala devam ediyor


Bir grup input_count girdisi.

Girişi çift olarak ayarlayın

Hata mesajı.


Görünüşe göre MQL5 henüz EBM'nin ONNX'ini desteklemiyor (ya da daha doğrusu ONNXMLTools desteklemiyor):

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

ONNX eklerine (özellikle 4 girdi kullanan model.eurusd.D1.10.class.onnx ) https://www.mql5.com/tr/articles/12484 adresinden bakarsanız; ve onnx dosyalarını görselleştirmek için Netron 'u(web sürümü) kullanırsanız farklılıkları göreceksiniz.

Aşağıdaki iki makalenin de daha iyi anlamanıza yardımcı olacağını düşünüyorum:

Scikit-learn Kütüphanesinin regresyon modelleri ve bunların ONNX'e aktarılması

Scikit-Learn kütüphanesindeki sınıflandırma modelleri ve bunların ONNX'e aktarılması

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.
 

Herkese merhaba,


XauUsd'de (çıktının 0 ile 1 arasında tekil bir sayı olduğu) tahminler yapmak için tek seferde 11 tahmincili bir keras sinir ağı kullanmaya çalışıyoruz (toplu iş boyutu 32). İlk olarak, OnnxCreatefrombuffer'dan yüklüyoruz (çünkü OnnxCreate'in kendisi bizim için çalışmıyor), ardından OnnxRun aşamasında her zaman bir hata alıyoruz, burada her iki hatayı da aşağıya ekledim. Girdi için hangi boyutun yeniden şekillendirileceği, tahmin edici vektörümüzü hangi formata koyacağımız (eğer bir vektör olması gerekiyorsa?) veya bu hataların üstesinden gelmeye yardımcı olacak sözdizimi ile ilgili herhangi bir yardım veya öneri harika olurdu. 32,1,11 vektörlerinin her türlü kombinasyonuna yeniden şekillendirmeyi denedik ve şansımız yok ve sonraki adımlarla ilgili gerçekten hiçbir fikrimiz yok ... Yardım edebilecek herkese çok teşekkürler! Ben.

' hata 5808'

' ONNX: giriş parametresi #0 tensörü yanlış boyuta sahip [0], OnnxSetInputShape kullanmayı deneyin'

'ONNX: geçersiz giriş parametresi #0 boyutu, 480 yerine 1408 bayt bekleniyor'

 

Merhaba, kullanmayı deniyorum

OnnxModelInfo.mq5

dosya betiği, ancak çalışmasını sağlayamıyorum, neyi yanlış yapıyorum? bu kadar karmaşık olamaz!

OnnxModelInfo betiğini kopyalayıp yapıştırdım ve de Files klasörüne kaydettim

Bir onnx modelim var (ekte)

ve betiği derlediğimde 21 hata görünüyor.

Biri bana bu konuda yardımcı olabilir mi? Lütfen

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

Yeni makale MQL5'te ONNX modellerini kullanma yayınlandı:

Yazar: MetaQuotes

Merhaba beyler.

Biri bana yardımcı olabilir mi, çünkü python'da işlemin sonunda şu hata çıkıyor: AttributeError: 'Sequential' object has no attribute 'output_names'. Python veya programlama hakkında fazla bilgim yok. Bu yüzden herhangi bir yardım takdir edilecektir! Teşekkür ederim.

 
Merhaba beyler.

Biri bana yardımcı olabilir mi, çünkü python'da işlemin sonunda aşağıdaki hata çıkıyor: AttributeError: 'Sequential' nesnesinin 'output_names' özniteliği yok. Python veya programlama hakkında fazla bilgim yok. Bu yüzden herhangi bir yardım memnuniyetle karşılanacaktır! Teşekkürler.
 
Alberto Henrique Tacoronte # Merhaba beyler. Biri bana yardımcı olabilir mi, çünkü python işleminin sonunda şu hata çıkıyor: AttributeError: 'Sequential' nesnesinin 'output_names' özniteliği yok. Python veya programlama hakkında fazla bilgim yok. Bu yüzden herhangi bir yardım takdir edilecektir! Teşekkür ederim.

Merhaba Alberto, Python bilen birinin( Pythoniçin MetaTrader | ONNX Modelleri) çözümü gösterebilmesi için lütfen kodunuzun[KOD düğmesini(Alt -S) kullanarak] hatanın oluştuğu bölümünü gönderin ...