const long ExtOutputShape[] = {1,1}; // 模型输出形状
const long ExtInputShape [] = {1,10,4}; // 模型输入形状
#resource "Python/model.onnx" as uchar ExtModel[] // 作为资源的模型
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
int OnStart(void)
{
matrix rates;
//--- 获取10个柱形图
if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
return(-1);
//--- 输入一组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;
//--- 创建模型
long 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);
}
//--- 将标准化输入数据转换为浮点类型
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());
OnnxRelease(handle);
return(-1);
}
//--- 将模型的输出值打印到日志中
Print(y_norm);
//--- 进行反向转换,以获得预测价格
double y_pred=y_norm[0]*s[3]+m[3];
Print("price predicted:",y_pred);
//--- 已完成操作
OnnxRelease(handle);
return(0);
};
|