📚 Referência Técnica

OnnxCreate, OnnxRun e Funções MQL5: Referência Completa para IA

Por Dan Machado · 9 min de leitura

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:

  1. OnnxCreate ou OnnxCreateFromBuffer — abre a sessão (no OnInit)
  2. OnnxSetInputShape + OnnxSetOutputShape — define dimensões
  3. OnnxRun — executa inferência (no OnTick ou novo candle)
  4. OnnxRelease — libera recursos (no OnDeinit)

Funções OnnxGet* são para introspecção (ver shape, nome, tipo dos inputs/outputs) — úteis em debug.

Referência das funções

OnnxCreate
long OnnxCreate(string filename, ulong flags);

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. flagsONNX_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.

OnnxCreateFromBuffer
long OnnxCreateFromBuffer(const uchar &buffer[], ulong flags);

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.

▸ MQL5 · Embed model
#resource "\\Files\\meu_modelo.onnx" as uchar ExtModel[]

int OnInit()
{
    long handle = OnnxCreateFromBuffer(ExtModel, ONNX_DEFAULT);
    if(handle == INVALID_HANDLE)
        return INIT_FAILED;
    // ...
}
OnnxRun
bool OnnxRun(long onnx_handle, ulong flags, …);

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.

OnnxRelease
bool OnnxRelease(long onnx_handle);

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.

OnnxSetInputShape
bool OnnxSetInputShape(long handle, long index, const long &shape[]);

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.

OnnxSetOutputShape
bool OnnxSetOutputShape(long handle, long index, const long &shape[]);

Análogo a OnnxSetInputShape, mas para outputs.

OnnxGetInputCount / OnnxGetOutputCount
long OnnxGetInputCount(long handle); long OnnxGetOutputCount(long handle);

Retorna quantos tensores de input/output o modelo expõe. Útil pra validar que o modelo carregado é o esperado.

OnnxGetInputName / OnnxGetOutputName
string OnnxGetInputName(long handle, long index); string OnnxGetOutputName(long handle, long index);

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.

OnnxGetInputTypeInfo / OnnxGetOutputTypeInfo
bool OnnxGetInputTypeInfo(long handle, long index, OnnxTypeInfo &type_info);

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

FlagDescrição
ONNX_DEFAULTComportamento padrão (CPU, sem logs verbosos)
ONNX_DEBUG_LOGSImprime logs detalhados do ONNX Runtime no journal
ONNX_COMMON_FOLDERProcura o arquivo em Common\Files em vez de MQL5\Files
ONNX_NO_CONVERSIONDesabilita conversão automática de tipos (mais rápido se você garante tipos corretos)
ONNX_GPU_DEVICE_NUsa 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

▸ MQL5 · OnnxFullExample.mq5
#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

ErroCausa provável
5022Arquivo .onnx não encontrado em MQL5\Files
5800Modelo corrompido ou incompatível
5803Shape declarado não bate com modelo
5804Tipo de dado incompatível (float vs int)
5805Operador 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 MT5

Tópicos relacionados

DM

Dan Machado

Founder IA Trader Pro · MQL5 desde 2017

⚠️ Disclaimer: Conteúdo educacional, não é recomendação de investimento. Trading envolve risco substancial. Sempre teste em demo. Artigo contém link de afiliado Deriv. Disclaimer completo.