OnnxCreate, OnnxRun e Funções MQL5: Referência Completa para IA
Cheat-sheet das funções ONNX nativas no MQL5. Cada função com assinatura, parâmetros, retorno e exemplo mínimo. Fonte: documentação oficial em mql5.com/en/docs/onnx. Se você ainda não tem o panorama, comece pelo guia pillar ONNX no MT5.
Fluxo de uso típico
A sequência canonical em qualquer EA que usa ONNX:
OnnxCreateouOnnxCreateFromBuffer— abre a sessão (noOnInit)OnnxSetInputShape+OnnxSetOutputShape— define dimensõesOnnxRun— executa inferência (noOnTickou novo candle)OnnxRelease— libera recursos (noOnDeinit)
Funções OnnxGet* são para introspecção (ver shape, nome, tipo dos inputs/outputs) — úteis em debug.
Referência das funções
Cria uma sessão ONNX carregando o modelo de um arquivo .onnx. O arquivo deve estar em MQL5\Files\ (ou Common\Files\ se usar a flag ONNX_COMMON_FOLDER).
Parâmetros: filename — caminho relativo à pasta Files. flags — ONNX_DEFAULT (padrão), ONNX_COMMON_FOLDER, ONNX_DEBUG_LOGS.
Retorno: handle da sessão (long), ou INVALID_HANDLE em caso de erro. Use GetLastError() para diagnóstico.
Nota: se o arquivo não for encontrado, o sistema tenta abrir adicionando a extensão .onnx automaticamente.
Alternativa a OnnxCreate: carrega o modelo de um array de bytes em memória. Vantagem clara: você embarca o modelo no próprio EA como #resource e o EA fica self-contained — sem dependência de arquivos externos.
#resource "\\Files\\meu_modelo.onnx" as uchar ExtModel[]
int OnInit()
{
long handle = OnnxCreateFromBuffer(ExtModel, ONNX_DEFAULT);
if(handle == INVALID_HANDLE)
return INIT_FAILED;
// ...
}
Executa a inferência. Parâmetros variádicos: você passa pares de input/output (matrix, vector ou array) na mesma ordem que o modelo espera.
Flags: ONNX_DEFAULT, ONNX_DEBUG_LOGS (loga tipos/shapes), ONNX_NO_CONVERSION (não tenta converter tipos automaticamente).
Retorno: true em sucesso, false em erro. GetLastError() para detalhe.
Importante: shapes dos inputs/outputs precisam bater com o que foi declarado via OnnxSetInputShape / OnnxSetOutputShape, senão retorna false.
Fecha a sessão ONNX e libera memória. Chame sempre no OnDeinit do EA. Esquecer disso causa leak de memória em loops de teste.
Retorno: true em sucesso, false em erro.
Define o shape do tensor de entrada de índice index. Para modelo com batch dinâmico (treinado com dynamic_axes no PyTorch), você precisa fixar o batch antes de rodar.
Exemplo: modelo espera (batch, 10, 4) — você define {1, 10, 4} para inferência um candle por vez.
Análogo a OnnxSetInputShape, mas para outputs.
Retorna quantos tensores de input/output o modelo expõe. Útil pra validar que o modelo carregado é o esperado.
Retorna o nome do tensor — o que foi definido em input_names/output_names no momento do export Python. Ajuda muito em debug quando o modelo tem múltiplas entradas.
Devolve uma estrutura com tipo de dado (float32, int64, etc.), shape esperado e dimensões. Quando o EA não funciona e você não sabe por quê, é a primeira coisa a chamar.
ENUM_ONNX_FLAGS — flags disponíveis
| Flag | Descrição |
|---|---|
| ONNX_DEFAULT | Comportamento padrão (CPU, sem logs verbosos) |
| ONNX_DEBUG_LOGS | Imprime logs detalhados do ONNX Runtime no journal |
| ONNX_COMMON_FOLDER | Procura o arquivo em Common\Files em vez de MQL5\Files |
| ONNX_NO_CONVERSION | Desabilita conversão automática de tipos (mais rápido se você garante tipos corretos) |
| ONNX_GPU_DEVICE_N | Usa GPU CUDA específica (substitua N pelo índice). Útil em sistemas multi-GPU. |
⚠️ GPU não é grátis
O ONNX Runtime padrão do MT5 usa CPU. Para usar GPU CUDA, você precisa ter drivers NVIDIA + CUDA Toolkit instalados. Para modelos pequenos (Random Forest, LSTM compacto), CPU é frequentemente mais rápido devido ao overhead de transferência CPU↔GPU.
Exemplo end-to-end completo
#property strict
#resource "\\Files\\modelo.onnx" as uchar ExtModel[]
long handle = INVALID_HANDLE;
int OnInit()
{
handle = OnnxCreateFromBuffer(ExtModel, ONNX_DEBUG_LOGS);
if(handle == INVALID_HANDLE)
{
Print("OnnxCreate falhou: ", GetLastError());
return INIT_FAILED;
}
// Inspeção do modelo
long n_inputs = OnnxGetInputCount(handle);
long n_outputs = OnnxGetOutputCount(handle);
PrintFormat("Modelo carregado | %d input(s) | %d output(s)", n_inputs, n_outputs);
for(long i = 0; i < n_inputs; i++)
PrintFormat(" Input[%d]: %s", i, OnnxGetInputName(handle, i));
for(long i = 0; i < n_outputs; i++)
PrintFormat(" Output[%d]: %s", i, OnnxGetOutputName(handle, i));
// Fixa shapes
const long input_shape[] = {1, 10};
const long output_shape[] = {1};
if(!OnnxSetInputShape(handle, 0, input_shape))
{
Print("Erro SetInputShape: ", GetLastError());
return INIT_FAILED;
}
if(!OnnxSetOutputShape(handle, 0, output_shape))
{
Print("Erro SetOutputShape: ", GetLastError());
return INIT_FAILED;
}
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
if(handle != INVALID_HANDLE)
{
OnnxRelease(handle);
Print("Sessão ONNX liberada");
}
}
void OnTick()
{
static datetime last = 0;
datetime cur = iTime(_Symbol, PERIOD_CURRENT, 0);
if(cur == last) return;
last = cur;
// Prepara input — 10 retornos percentuais
matrix input(1, 10);
for(int i = 0; i < 10; i++)
{
double c0 = iClose(_Symbol, PERIOD_CURRENT, i + 1);
double c1 = iClose(_Symbol, PERIOD_CURRENT, i + 2);
input[0][i] = (float)((c0 - c1) / c1);
}
vector output(1);
if(!OnnxRun(handle, ONNX_DEFAULT, input, output))
{
Print("OnnxRun falhou: ", GetLastError());
return;
}
int signal = (int)output[0];
PrintFormat("[%s] Predição: %d (%s)",
TimeToString(cur), signal, signal == 1 ? "BUY" : "SELL");
}
Códigos de erro mais comuns
| Erro | Causa provável |
|---|---|
| 5022 | Arquivo .onnx não encontrado em MQL5\Files |
| 5800 | Modelo corrompido ou incompatível |
| 5803 | Shape declarado não bate com modelo |
| 5804 | Tipo de dado incompatível (float vs int) |
| 5805 | Operador ONNX não suportado pelo runtime do MT5 |
✓ Boas práticas
1. Sempre OnnxRelease no OnDeinit
2. Carregue o modelo no OnInit, não no OnTick
3. Use #resource + OnnxCreateFromBuffer para EAs distribuíveis
4. Logue OnnxGet* em ONNX_DEBUG_LOGS na primeira execução
5. Trate falha de OnnxRun com graciosidade — não derrube o EA
🚀 Demo Deriv MT5 ($10.000 virtuais) para testar EAs ONNX:
Abrir Demo Deriv MT5Tópicos relacionados
- Pillar — ONNX no MT5 completo
- Exportar Python para ONNX — tutorial
- ONNX vs Socket vs DLL comparativo
- 5 modelos ONNX práticos
