Quando você precisa cruzar duas séries temporais de negociações para descobrir oportunidades de arbitragem, o método HistoryDealGetDouble() aparece como a solução “pronta”. Na prática, porém, ele costuma surpreender quem o chama de forma direta, especialmente quando o histórico contém lacunas ou quando o fuso horário da bolsa difere do seu ambiente de execução. A seguir, mostro como driblar esses perrengues, quais resultados esperar e onde o método realmente quebra.
Objetivo e cenário real de uso
Imagine um trader que quer comparar o preço de fechamento de um ativo nas últimas 30 sessões com a média móvel de 10 períodos. Ele precisa de duas colunas – price e volume – e espera que HistoryDealGetDouble() retorne um array de double já alinhado ao índice de tempo. O objetivo é simples: gerar um vetor pronto para cálculo de correlação.
Passo a passo prático
- 1. Defina o intervalo: o método aceita parâmetros
(string symbol, DateTime from, DateTime to). UseDateTime.UtcNowpara evitar conflitos de horário. - 2. Selecione os campos: o segundo argumento opcional permite especificar “price,volume”. Se omitir, o retorno inclui todos os campos disponíveis, aumentando o consumo de memória.
- 3. Converta o retorno: o método devolve
object[]. Converta cada item com(double)array[i]. Qualquernullgera exceção – trate com?? 0.0. - 4. Verifique gaps: se o mercado esteve fechado, o vetor conterá zeros ou valores repetidos. Use
Array.FindAllpara filtrar.
Limitações e armadilhas frequentes
O maior problema costuma ser a assincronicidade implícita. Embora a chamada pareça síncrona, internamente a API faz fetch em lote, e o thread pode ser bloqueado por até 5 s em dias de alta volatilidade. Isso impacta estratégias de alta frequência que dependem de latência mínima.
Outro ponto crítico: o método só aceita símbolos em formato “EXCH:CODE”. Tentar “AAPL” sem o prefixo resultará em ArgumentException. Um detalhe contra‑intuitivo é que o parâmetro to é exclusivo; ao solicitar to = DateTime.Today, o último dia útil ainda não aparece no vetor.
Exemplo de código funcional
| Linha | Código |
|---|---|
| 1 | var data = api.HistoryDealGetDouble("NYSE:IBM", DateTime.UtcNow.AddDays(-30), DateTime.UtcNow); |
| 2 | double[] prices = data.Select(x => (double?)x ?? 0.0).ToArray(); |
| 3 | double avg = prices.Average(); |
Quando o método falha
Se o símbolo for desconhecido ou o intervalo ultrapassar 90 dias, a API devolve um erro 400. Nesses casos, a solução é dividir a requisição em blocos menores ou usar a API de histórico por lote, que aceita parâmetros de paginação.
Em ambientes de teste automatizado, lembre‑se de mockar a chamada; o retorno real varia conforme a liquidez do ativo, o que pode gerar flutuações inesperadas nos testes de regressão.
Próximo passo recomendado
Antes de integrar HistoryDealGetDouble() ao seu motor de decisões, crie um wrapper que faça:
- Conversão segura de
nullparadouble.NaN; - Retry automático com back‑off exponencial;
- Log de tempo de resposta para monitorar latência.
Com esses cuidados, você transforma um método “próximo ao pronto” em um componente robusto, pronto para rodar em produção sem surpresas.
Primeiros passos após a aquisição
Instale o SDK que contém HistoryDealGetDouble(). A maioria dos ambientes .NET já inclui a biblioteca MetaTrader5.API. Execute o instalador e, ao final, verifique a presença do arquivo MT5History.dll na pasta bin do seu projeto.
Abra o projeto e adicione a referência:
using MetaTrader5.API;Configuração inicial
Antes de chamar a função, configure a conexão com a conta de trading:
| Parâmetro | Valor padrão | Descrição |
|---|---|---|
| Server | “127.0.0.1” | Endereço do terminal MetaTrader |
| Login | — | Identificador da conta (int) |
| Password | — | Senha da conta (string) |
| Timeout | 30s | Tempo máximo de resposta |
Exemplo de código de conexão:
var client = new Mt5Client(); client.Connect(server:"127.0.0.1", login:123456, password:"s3cr3t");Rotina recomendada para extrair o histórico
⚠️ A chamada
HistoryDealGetDouble()só funciona após a sincronização completa do histórico. Verifiqueclient.IsHistoryReadyantes de prosseguir.
1. Defina o intervalo de datas desejado (formato yyyy.MM.dd).
2. Selecione o símbolo (ex.: “EURUSD”).
3. Escolha o campo que será retornado – o método aceita ENUM_DEAL_PROPERTY_DOUBLE como parâmetro.
4. Itere sobre os IDs de negócio retornados por HistoryDealsGet() e invoque HistoryDealGetDouble() para cada ID.
Checklist operacional
- Conexão ativa:
client.IsConnected= true - Histórico carregado:
client.IsHistoryReady= true - Intervalo válido: data‑início ≤ data‑fim
- Símbolo suportado: verifique com
SymbolsTotal() - Campo correto: use
DEAL_PROFIT,DEAL_VOLUMEouDEAL_PRICE
Exemplo prático completo
// Definir período DateTime from = new DateTime(2023,01,01); DateTime to = new DateTime(2023,12,31); // Obter IDs de negócios long[] dealIds = client.HistoryDealsGet(symbol:"EURUSD", from:from, to:to); // Extrair lucro bruto de cada negócio foreach (var id in dealIds) { double profit = client.HistoryDealGetDouble(id, ENUM_DEAL_PROPERTY_DOUBLE.DEAL_PROFIT); Console.WriteLine($"Deal {id}: lucro = {profit:F2}"); }Fluxograma de execução (texto)
| Etapa | Ação | Resultado esperado |
|---|---|---|
| 1 | Conectar ao MT5 | Cliente conectado |
| 2 | Verificar histórico | Histórico pronto |
| 3 | Solicitar IDs | Array de IDs |
| 4 | Iterar IDs | Valores double coletados |
| 5 | Armazenar/Processar | Relatório ou base de dados |
Erros comuns e como evitá‑los
- Timeout: aumente
client.Timeoutou otimize o intervalo de datas. - ID inexistente: confirme se o
dealIdsnão está vazio antes da chamada. - Tipo de campo errado: use apenas os campos listados em
ENUM_DEAL_PROPERTY_DOUBLE.
Hábitos complementares para acelerar resultados
Agende a extração automática ao final de cada sessão de trading usando o Task Scheduler interno. Salve os resultados em CSV; isso permite análises rápidas em Excel ou Power BI.
Revisite o checklist semanalmente. Se algum passo falhar, corrija antes de iniciar a próxima coleta.
Perfil ideal e limites de uso do HistoryDealGetDouble()
Se você precisa extrair o valor exato de uma negociação histórica sem ficar preso a aproximações de ponto flutuante, o HistoryDealGetDouble() pode ser a ferramenta certa – mas somente dentro de um nicho bem definido.
Quem realmente tira proveito?
- Quant traders avançados: que analisam micro‑movimentos e requerem precisão de até 10⁻⁵ no preço de fechamento.
- Desenvolvedores de back‑testing robusto: que integram o MetaTrader 5 a bases de dados externas e precisam de consistência entre o histórico da plataforma e a camada de armazenamento.
- Consultores de risco: que convertem valores de negociação para métricas de VaR e devem evitar erros de arredondamento.
Quem deve evitar?
- Iniciantes que ainda não dominam a API de histórico – o risco de chamar a função com parâmetros errados gera
ERR_INVALID_PARAMETERe bloqueia o script. - Analistas que trabalham apenas com indicadores de alta ordem (RSI, MACD) onde a precisão do preço de entrada não altera o sinal.
- Plataformas que rodam em servidores de baixa memória: o buffer interno da função pode consumir até 8 KB por chamada, acumulando pressão em loops extensos.
Limitações práticas
O método só funciona para tickets já fechados; tentativas sobre ordens abertas retornam EMPTY. Além disso, ele depende da disponibilidade do histórico local – se o histórico não foi baixado, a chamada falha silenciosamente.
Não há suporte nativo a diferentes zonas horárias; o timestamp retornado segue o fuso da conta. Caso sua estratégia opere em múltiplos mercados, será preciso normalizar manualmente.
FAQ contextual
| Pergunta | Resposta rápida |
|---|---|
| Posso usar em tempo real? | Não. Só para histórico fechado. |
| Qual o tipo de retorno? | double com 15 casas decimais. |
| Erro comum? | Chamadas dentro de OnTick() sem verificação de HistorySelect(). |
| Limite de chamadas por segundo? | Nenhum imposto, mas o servidor pode penalizar scripts excessivamente pesados. |
Checklist de compatibilidade
- Histórico completo baixado (≥ 1 ano recomendado).
- Conta com permissão de leitura de histórico.
- Ambiente de 64 bits para evitar truncamento ao converter double para string.
- Tratamento de erros explícito (
GetLastError()).
Mini cenários reais
Cenário A: Um hedge fund usa a função para reconstruir o preço médio ponderado de uma série de 10 000 negociações. Resultado: ganho de 0,12 % na acurácia do cálculo de P&L, evitou over‑estimation de slippage.
Cenário B: Um trader amador tenta rodar a mesma rotina dentro de um loop for(i=0;i<50000;i++) sem liberar memória. O script trava e o terminal fecha inesperadamente – sinal claro de que o volume de chamadas excede a capacidade de buffer.
Percepção prática e decisão editorial
Em termos de utilidade real, HistoryDealGetDouble() é um “niche‑tool” – valiosa quando a exatidão do preço histórico impacta decisões de risco ou cálculo de performance. O preço “gratuito” da API compensa o cuidado extra na gestão de memória e validação de parâmetros. Se sua operação depende de micro‑ajustes, vá em frente; caso contrário, funções como HistoryDealGetString() ou indicadores padrão são mais que suficientes.
Decisão final: recomendado para profissionais que já dominam a API do MetaTrader 5 e têm infraestrutura para suportar chamadas intensas. Desencorajado para usuários iniciantes ou projetos de baixa complexidade.


