기고글 토론 "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와 Height로 학습되었으며, 높이는 ((H + L) / 2) - C로 계산됩니다.

2) 이 모델은 이진 분류기로, 다음 캔들을 상승(1) 또는 하락(0)으로 분류하는 것을 목표로 합니다.

모델 학습 데이터

모델 훈련에 사용되는 데이터입니다.

3) 그런 다음 모델을 ONNX 형식으로 내보냈습니다.

ONNX 대표

ONNX 모델 표현.


모델을 작동시키기 위해 튜토리얼의 코드에서 벗어나 계속 코드를 편집하여 ONNX 모델을 작동시키려고 했지만 지금은 제가 무엇을 잘못하고 있는지 정말 모르겠습니다. 모델에 대한 핸들이 유효하지 않다는 오류가 계속 발생합니다.

아래에 MQL5 코드를 첨부했습니다.

이제 튜토리얼의 내용과 다른 코드에서 수행 한 단계를 요약하고 튜토리얼에서 벗어난 이유도 설명하겠습니다.

1) 57줄: 모델 입력 모양 설정.
튜토리얼에서는 입력 및 출력 모양을 설정하는 데 3차원, 즉 {1,SAMPLE_SIZE,1}을 사용했지만 이 방식을 따를 때 계속 오류가 발생했습니다(특히 5808 오류). 일반적인 시행착오 과정을 거친 후 입력의 개수인 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 모델을 사용하는 방법" 문서에 대한 토론

스티안 안드레아센, 2023.12.08 20:51

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

튜토리얼은 하나의 배치 SAMPLE_SIZE 수의 종가 입력을 제공 하므로 하나의 배치 input_count 입력을 원합니다.

또한 모델은 입력으로 부동 소수점이 아닌 정수를 사용합니다,



Sitan을 공유해 주셔서 감사합니다. 지적한 내용을 적용했지만 여전히 오류가 있습니다.


입력 횟수 일괄 처리

입력 횟수 입력 일괄 처리.

입력을 두 배로 설정

입력을 두 배로 설정

오류 메시지

오류 메시지입니다.


파일:
 
아무치라이 조로로 은다와나 #:
이 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로 학습되었으며, 높이는 ((H + L) / 2) - C로 계산됩니다.

2) 이 모델은 이진 분류기로, 다음 캔들을 상승(1) 또는 하락(0)으로 분류하는 것을 목표로 합니다.

모델 훈련에 사용되는 데이터입니다.

3) 그런 다음 모델을 ONNX 형식으로 내보냈습니다.

ONNX 모델 표현.


모델을 작동시키기 위해 튜토리얼의 코드에서 벗어나 코드를 계속 편집하여 ONNX 모델이 작동하도록 만들었지만 지금은 제가 무엇을 잘못하고 있는지 모르겠습니다. 모델에 대한 핸들이 유효하지 않다는 오류가 계속 발생합니다.

아래에 MQL5 코드를 첨부했습니다.

이제 튜토리얼의 내용과 다른 코드에서 수행 한 단계를 요약하고 튜토리얼에서 벗어난 이유도 설명하겠습니다.

1) 57줄: 모델 입력 모양 설정.
튜토리얼에서는 입력 및 출력 모양을 설정하는 데 3차원, 즉 {1,SAMPLE_SIZE,1}을 사용했지만 이 방식을 따를 때 계속 오류가 발생했고, 특히 오류 5808이 발생했습니다. 일반적인 시행착오 과정을 거친 후 입력의 개수인 1차원만 사용하면 오류가 사라진다는 것을 깨달았습니다.

2) 68줄: 모델 출력 모양 설정하기.

위와 동일한 로직입니다.

예를 들어 튜토리얼에서 구현된 로직보다 더 직관적인 로직을 사용하여 시간을 추적하는 등 다른 편차는 모델에 영향을 미치지 않습니다. 트리 기반 모델이기 때문에 입력을 정규화할 필요가 없었습니다.


제가 만든 다른 오류를 발견할 수 있다면 알려주시면 감사하겠습니다.





Sitan을 공유해 주셔서 감사합니다. 지적하신 내용을 적용했지만 여전히 오류가 있습니다.


입력 횟수 입력 일괄 처리.

입력을 두 배로 설정

오류 메시지입니다.


MQL5가 아직 EBM의 ONNX를 지원하지 않는 것 같습니다(또는 오히려 ONNXMLTools가 지원하지 않는 것 같습니다):

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

https://www.mql5.com/ko/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.
 

안녕하세요 여러분,


한 시점에서 11개의 예측자(배치 크기 32)가 있는 케라스 신경망을 사용하여 XauUsd(출력은 0과 1 사이의 단수)에 대한 예측을 수행하려고 합니다. 첫째, OnnxCreate 자체는 작동하지 않기 때문에 OnnxCreatefrombuffer에서로드 한 다음 OnnxRun 단계에서 항상 오류가 발생하며 아래에 두 가지 오류를 모두 첨부했습니다. 입력에 대해 어떤 차원으로 재구성 할 것인지, 예측 벡터를 어떤 형식으로 넣을 것인지 (벡터가 있어야하는 경우) 또는 이러한 오류를 해결하는 데 도움이되는 구문에 대한 도움이나 제안에 대한 도움이 있으면 정말 감사하겠습니다. 32,1,11 벡터의 모든 종류의 조합으로 재구성을 시도했지만 운이 없었고 다음 단계에 대해 전혀 모르겠습니다. 도와주실 수 있는 분들께 정말 감사드립니다! Ben.

' 오류 5808'

' ONNX: 입력 매개변수 #0 텐서의 차원이 잘못되었습니다[0], OnnxSetInputShape를 사용해보십시오'

'ONNX: 잘못된 입력 매개변수 #0 크기, 480 대신 1408 바이트 예상'

 

안녕하세요, 저는

OnnxModelInfo.mq5

파일 스크립트를 사용하려고 하는데 작동하지 않습니다. 제가 뭘 잘못하고 있는 건가요? 이렇게 복잡할 수가 없어요!

OnnxModelInfo 스크립트를 복사하여 파일 폴더에 저장했습니다.

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

안녕하세요 여러분.

파이썬에서 프로세스가 끝날 때 다음과 같은 오류가 발생하기 때문에 누구든지 저를 도와 줄 수 있습니까? 속성 오류 : '순차적'개체에 'output_names'속성이 없습니다. 저는 파이썬이나 프로그래밍에 대해 잘 모릅니다. 그래서 어떤 도움을 주시면 감사하겠습니다! 감사합니다.

 
안녕하세요 여러분.

파이썬에서 프로세스가 끝날 때 다음 오류가 발생하기 때문에 누구든지 저를 도울 수 있습니까? 속성 오류 : '순차적'개체에 '출력_이름'속성이 없습니다. 저는 파이썬이나 프로그래밍에 대해 잘 모릅니다. 그래서 어떤 도움이라도 환영합니다! 고마워요.
 
Alberto Henrique Tacoronte # 안녕하세요 여러분. 파이썬 프로세스가 끝날 때 다음과 같은 오류가 발생하기 때문에 누구든지 저를 도울 수 있습니까? 속성 오류 : '순차적'객체에 '출력 _ 이름'속성이 없습니다. 저는 파이썬이나 프로그래밍에 대해 잘 모릅니다. 그래서 어떤 도움을 주시면 감사하겠습니다! 감사합니다.

안녕하세요 알베르토, 파이썬을 아는 사람이 해결책을 지적 할 수 있도록 오류가 발생하는 코드 부분[코드 버튼(Alt -S) 사용]을 게시하십시오 (파이썬 용 메타 트레이더 | ONNX 모델)...