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=0; i<10; i++)
{
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;
}
|