Обсуждение статьи "Использование ONNX-моделей в MQL5" - страница 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, я пытался следовать этому руководству по использованию ONNX в ваших советниках. В учебнике в качестве модели была выбрана нейронная сеть, я же использовал дерево с градиентным усилением.

Я построил модель с помощью пакета InterpretML Python и экспортировал ее в ONNX с помощью ebm2onnx.

Я кратко опишу процесс обучения модели.

1) Модель была обучена на 5 входах, OHLC и высоте, высота рассчитывается как ((H + L) / 2) - C.

2) Модель представляет собой бинарный классификатор, цель которого - классифицировать следующую свечу как UP (1) или DOWN (0).

Модель Обучающие данные

Данные, используемые для обучения модели.

3) Затем модель была экспортирована в формат ONNX.

Представительство ONNX

Представление модели в формате ONNX.


Чтобы заставить модель работать, я отклонился от кода в учебнике и продолжал редактировать код, пытаясь заставить модель ONNX работать, но теперь я действительно не знаю, что я делаю неправильно. Я продолжаю получать ошибку о том, что хэндл модели недействителен.

Я прикрепил MQL5-код ниже.

Теперь я кратко опишу шаги, которые я предпринял в своем коде и которые отличаются от того, что описано в учебнике, а также объясню, почему я отклонился от учебника

1) Строка 57: Установка входной формы модели.
В учебнике для установки входной и выходной формы использовались 3 измерения, т.е. {1,SAMPLE_SIZE,1}; однако когда я следовал этому подходу, я продолжал получать ошибку, а именно ошибку 5808. После обычного процесса проб и ошибок я понял, что если использовать только 1 измерение, количество входов, то ошибка исчезнет.

2) Строка 68: Установка выходной формы модели.

Логика та же, что и выше.

Другие отклонения, которые я сделал, не влияют на модель, например, я вел учет времени, используя логику, которая показалась мне более интуитивной, чем логика, реализованная в учебнике. Мне не нужно было нормализовать входные данные, потому что это древовидная модель.


Если вы можете заметить другие ошибки, которые я допустил, я буду признателен за ваше понимание.

//+------------------------------------------------------------------+
//|ONNX.mq5 |
//|Copyright 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);
   }



Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

Обсуждение статьи "Как использовать модели ONNX в MQL5"

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

Одна партия входных данных input_count.

Установите вход на двойной

Установите входное значение на 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, и экспортировал ее в ONNX с помощью ebm2onnx.

Я кратко опишу процесс обучения модели.

1) Модель была обучена на 5 входах, OHLC и высоте, высота рассчитывается как ((H + L) / 2) - C.

2) Модель представляет собой бинарный классификатор, цель которого - классифицировать следующую свечу как UP (1) или DOWN (0).

Данные, используемые для обучения модели.

3) Затем модель была экспортирована в формат ONNX.

Представление модели в формате ONNX.


Чтобы заставить модель работать, я отклонился от кода в учебнике и продолжал редактировать код, пытаясь заставить модель ONNX работать, но теперь я действительно не знаю, что я делаю неправильно. Я продолжаю получать ошибку о том, что хэндл модели недействителен.

Я прикрепил MQL5-код ниже.

Теперь я кратко опишу шаги, которые я предпринял в своем коде и которые отличаются от того, что описано в учебнике, а также объясню, почему я отклонился от учебника

1) Строка 57: Установка входной формы модели.
В учебнике для установки входной и выходной формы использовались 3 измерения, т.е. {1,SAMPLE_SIZE,1}; однако когда я следовал этому подходу, я продолжал получать ошибку, а именно ошибку 5808. После обычного процесса проб и ошибок я понял, что если использовать только 1 измерение, количество входов, то ошибка исчезнет.

2) Строка 68: Установка выходной формы модели.

Логика та же, что и выше.

Другие отклонения, которые я сделал, не влияют на модель, например, я вел учет времени, используя логику, которая показалась мне более интуитивной, чем логика, реализованная в учебнике. Мне не нужно было нормализовать входные данные, потому что это древовидная модель.


Если вы можете заметить другие ошибки, которые я допустил, я буду признателен за ваше понимание.





Спасибо, что поделились с нами, Ситан, я применил то, что вы указали, но ошибка все равно осталась.


Одна партия входных данных input_count.

Установите входной сигнал на двойное значение

Сообщение об ошибке.


Похоже, что MQL5 пока не поддерживает (точнее, ONNXMLTools не поддерживает) EBM's ONNX:

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

Если вы обратитесь к вложениям ONNX (особенно к model.eurusd.D1.10.class.onnx, который использует 4 входа) с сайта https://www.mql5.com/ru/articles/12484; и воспользуетесь 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.
 

Всем привет,


Мы пытаемся использовать нейронную сеть keras с 11 предикторами в один момент времени (размер партии 32) для предсказаний на XauUsd (где выход - сингулярное число между 0 и 1). Сначала мы загружаемся из OnnxCreatefrombuffer (потому что сам OnnxCreate у нас не работает), затем мы всегда получаем ошибку на этапе OnnxRun, где я прикрепил обе ошибки ниже. Любая помощь по поводу того, в какую размерность переформировать входные данные, в какой формат поместить наш вектор-предсказатель (если это вообще должен быть вектор?), или просто любая помощь или предложения по синтаксису, чтобы помочь справиться с этими ошибками, была бы потрясающей. Мы пробовали перестраивать на всевозможные комбинации векторов 32,1,11, но не повезло, и мы не знаем, что делать дальше. Огромное спасибо всем, кто может помочь!!! Бен.

' error 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:

Опубликована новая статья Использование моделей ONNX в MQL5:

Автор: 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'. Я не очень хорошо разбираюсь в питоне и программировании. Поэтому любая помощь будет оценена по достоинству! Спасибо.

Здравствуйте, Альберто, пожалуйста, опубликуйте часть вашего кода[используя кнопкуCODE (Alt -S)], где происходит ошибка, чтобы кто-то, кто знает Python(MetaTrader for Python | ONNX Models), мог указать на решение...