전략 테스터에서 모델 검증

금융 시장을 위해 생성된 모델은 MetaTrader 5 터미널의 전략 테스터에서 검증할 수 있습니다. 이것은 시장 환경과 거래 조건을 추가로 만들어 사용할 필요가 없는 가장 빠르고 편리한 옵션입니다.

모델을 테스트하기 위해 공개 프로젝트 ONNX.Price.Prediction의 코드를 기반으로 Expert Advisor를 생성해 보겠습니다. 이를 위해서는 약간의 수정이 필요합니다.

모델 생성을OnInit 함수로 이동합니다. onnx 세션이 OnDeinit에서 종료됩니다. 기본 모델 작업 블록을 OnTick 핸들러에 놓습니다.

또한 실제의 종가와 예측을 비교하는 데 필요한 이전 두 바의 종가의 획득을 추가합니다.

Expert Advisor 코드는 작고 읽기 쉽습니다.

 
const long   ExtInputShape [] = {1,10,4}; // 모델의 입력 쉐이프
const long   ExtOutputShape[] = {1,1};    // 모델의 출력 쉐이프
#resource "Python/model.onnx" as uchar ExtModel[];// 자원으로서의 모델
 
long handle;         // 모델 핸들
ulong predictions=0// 예측 카운터
ulong confirmed=0;   // 예측 카운터 성공
/+------------------------------------------------------------------+
//| Expert 초기화 함수                                                |
/+------------------------------------------------------------------+
int OnInit()
  {
//--- 기본 확인
   if(_Symbol!="EURUSD")
     {
      Print("Symbol must be EURUSD, testing aborted");
      return(-1);
     }
   if(_Period!=PERIOD_H1)
     {
      Print("Timeframe must be H1, testing aborted");
      return(-1);
     }
//--- 모델 생성
   handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//--- 입력 데이터의 쉐이프 지정
   if(!OnnxSetInputShape(handle,0,ExtInputShape))
     {
      Print("OnnxSetInputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- 출력 데이터의 쉐이프 지정
   if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
     {
      Print("OnnxSetOutputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//---
   return(INIT_SUCCEEDED);
  }
/+------------------------------------------------------------------+
//| Expert 초기화 해제 함수                                           |
/+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 모델 작업 완료
   OnnxRelease(handle);
//--- 예측 통계 계산 및 출력
   PrintFormat("Successfull predictions = %.2f %%",confirmed*100./double(predictions));
  }
/+------------------------------------------------------------------+
//| Expert 틱 함수                                                   |
/+------------------------------------------------------------------+
void OnTick()
  {
   static datetime open_time=0;
   static double predict;
//--- 현재 바 오픈 시간 확인
   datetime time=iTime(_Symbol,_Period,0);
   if(time==0)
     {
      PrintFormat("Failed to get Time(0), error %d"GetLastError());
      return;
     }
//--- 개장 시간이 변경되지 않은 경우 다음 OnTick 호출까지 종료
   if(time==open_time)
      return;
//--- 마지막 완성된 바 2개의 종가를 가져옵니다.
   double close[];
   int recieved=CopyClose(_Symbol,_Period,1,2,close);
   if(recieved!=2)
     {
      PrintFormat("CopyClose(2 bars) failed, error %d",GetLastError());
      return;
     }
   double delta_predict=predict-close[0]; // 예측한 가격 변경
   double delta_actual=close[1]-close[0]; // 실제 가격 변경
   if((delta_predict>0 && delta_actual>0) || (delta_predict<0 && delta_actual<0))
      confirmed++;
 
//--- 새개 바의 종가를 계산하여 다음 바의 가격을 확인합니다.
   matrix rates;
//--- 10개 바
   if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,1,10))
      return;
//--- OHLC 벡터 세트 입력
   matrix x_norm=rates.Transpose();
   vector m=x_norm.Mean(0);
   vector s=x_norm.Std(0);
   matrix mm(10,4);
   matrix ms(10,4);
//--- 정규화 행렬을 채움
   for(int i=0i<10i++)
     {
      mm.Row(m,i);
      ms.Row(s,i);
     }
//--- 입력 데이터 정규화
   x_norm-=mm;
   x_norm/=ms;
//--- 정규화된 입력 데이터를 부동 소수점 유형으로 변환
   matrixf x_normf;
   x_normf.Assign(x_norm);
//--- 여기에서 모델의 출력 데이터 예를 들어 가격 예측을 얻습니다.
   vectorf y_norm(1);
//--- 모델 실행
   if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
     {
      Print("OnnxRun failed, error ",GetLastError());
     }
//--- 역변환을 수행하여 예상 가격을 얻고 새로운 바에서 유효성을 검사합니다.
   predict=y_norm[0]*s[3]+m[3];
   predictions++;  // 예측 카운터 증대
   Print(predictions,". close prediction = ",predict);
//--- 다음 틱을 확인하기 위해 바 오프닝 시간을 저장
   open_time=time;
  }

Expert Advisor를 컴파일하고 2022년도로 테스트를 실행합니다. 모델이 훈련되는 데이터인 H1 기간으로 EURUSD를 지정하십시오. 틱 모델링 모드는 코드가 새로운 바의 생성을 확인하기 때문에 무시할 수 있습니다.  

백테스트 설정

 

테스팅 저널을 실행하고 결과를 확인하십시오. 결과에 따르면 2022년 예측의 50% 이상이 정확했음을 보여줍니다.

테스팅 저널

 

예비 모델 테스트가 만족스러운 결과를 생성했다면 이 모델을 기반으로 본격적인 거래 전략을 작성하기 시작할 수 있습니다.