Bloco 4 - Gestão de Riscos

A gestão de riscos representa o núcleo de sustentação de qualquer sistema automatizado de trading. Em um robô eficiente, a capacidade de identificar, limitar e responder a exposições adversas é tão importante quanto a própria lógica de entrada e saída de operações. O objetivo deste bloco é criar meios para que cada decisão executada pelo robô esteja subordinada a controles que preservem o capital e mantenham a consistência operacional ao longo do tempo..

Nesta etapa da construção do robô, são implementados mecanismos de monitoramento e resposta que atuam sobre posições abertas e históricos de negociação. Esses mecanismos permitem encerrar posições com segurança, contabilizar a distribuição de operações por Magic Number, bloquear novas entradas após eventos específicos e verificar restrições temporais para retomada de atividades. O conjunto dessas funções busca garantir que o sistema opere dentro de limites definidos, prevenindo sobreposição de sinais, duplicação de posições ou operações indevidas durante períodos de bloqueio.

O propósito principal não é apenas reagir a perdas, mas estruturar defesas preventivas que mantenham a integridade do sistema. Ao automatizar a gestão de riscos, o robô passa a ter autonomia para aplicar políticas de controle em tempo real - encerrando posições comprometidas, suspendendo estratégias específicas e ajustando o comportamento de execução conforme o contexto do mercado..

Em nosso exemplo, o bloco de Gestão de Riscos é composto pelas seguintes funções:

4. GESTÃO DE RISCOS
├──4.1 Fechar_Posicoes()
├──4.2 Contar_Posicoes_por_MagicNumber()
├──4.3 Checar_Historico()
└──4.4 Magic_Bloqueado()

Em conjunto, essas rotinas compõem um subsistema inteligente de segurança operacional, capaz de reduzir riscos sistêmicos e preservar a eficiência estratégica do robô. Assim, o EA se torna não apenas reativo, mas resiliente, capaz de se adaptar dinamicamente às condições do mercado sem comprometer a lógica de decisão central.

4.1 Fechar_Posicoes ( )

A função Fechar_Posicoes() é o componente central de execução da política de encerramento de posições do EA. Seu propósito é garantir que o robô consiga interromper operações de forma seletiva e controlada, preservando tanto a lógica de risco quanto a integridade do sistema de ordens.

Em sua estrutura, a função percorre todas as posições ativas no terminal e aplica filtros específicos para determinar quais delas devem ser encerradas. O processo é orientado por dois parâmetros fundamentais: o tipo de posição (BUY ou SELL) e o Magic Number — identificador exclusivo que associa cada operação a um módulo ou estratégia do robô. Dessa forma, Fechar_posicoes() permite que o sistema realize fechamentos direcionados, sem interferir em estratégias independentes que operam simultaneamente sob diferentes Magic Numbers.

Ao identificar uma posição que atende aos critérios definidos, a função executa o fechamento através do método trade.PositionClose(). Em seguida, atualiza variáveis de controle específicas de cada Magic Number, como lastTradeCloseTimeMagicNumber1 e lastTradeCloseTimeMagicNumber2. Essas variáveis armazenam o momento exato do encerramento, servindo como referência temporal para outras rotinas do EA, como bloqueios temporários de negociação ou verificação de tempo mínimo entre operações.

Além da execução operacional, a função realiza uma auditoria interna em tempo real, registrando no log cada ação de fechamento. O sistema retorna mensagens detalhadas com o ticket da posição e o código de erro obtido via GetLastError(), facilitando o diagnóstico durante depuração e testes.

Essa função é, portanto, o elo entre a lógica de risco e a execução prática das ordens, fornecendo o controle para que o robô possa agir com autonomia e precisão em ambientes de mercado dinâmicos.

4.2 Contar_Posicoes_por_MagicNumber ( )

A função Contar_Posicoes_por_MagicNumber() é o núcleo de monitoramento das posições ativas do robô, responsável por realizar uma varredura sistemática e contabilização das operações abertas, segmentando-as por Magic Number e por direção (compra ou venda).

Seu papel é fornecer ao sistema uma visão em tempo real da exposição atual de cada estratégia, servindo de base para decisões automatizadas de controle, bloqueio, alocação ou reentrada no mercado.

No contexto de sistemas multi-estratégia - em que diferentes módulos do EA podem operar simultaneamente em um mesmo ativo - a identificação independente de posições é essencial.

Essa função busca garantir que o robô diferencie corretamente as operações de cada lógica, impedindo que ordens pertencentes a estratégias distintas sejam contabilizadas em conjunto ou causem interferência mútua.

O funcionamento interno é dividido em três etapas principais:

  1. Inicialização dos contadores – são criadas variáveis específicas para registrar o número de posições de compra e venda associadas a cada Magic Number ativo no sistema (buy1, sell1, buy2, sell2, etc.).

  2. Iteração sobre as posições abertas – o robô percorre a lista completa de operações em execução (PositionsTotal()), selecionando cada uma pelo ticket com PositionSelectByTicket().
    A partir daí, obtém-se o Magic Number (POSITION_MAGIC) e o tipo de posição (POSITION_TYPE), permitindo associar a operação ao contador correspondente.

  3. Registro e exibição dos resultados – após a contagem, são exibidos logs organizados contendo o total de compras e vendas por Magic Number. Esses registros fornecem ao desenvolvedor e ao sistema uma leitura instantânea do cenário atual de exposição.

Além de seu papel de diagnóstico, Contar_Posicoes_Por_MagicNumber() tem uma função estratégica de  suportar a tomada de decisão. Outras rotinas do EA podem consultar esses dados para determinar se há espaço para novas operações, se a exposição já atingiu o limite máximo configurado ou se há desequilíbrio entre posições de compra e venda.

Em síntese, essa função atua como uma camada de controle preventivo dentro da arquitetura do robô. Ela assegura que o robô opere de forma ordenada e consciente da própria estrutura de posições, permitindo:

  • Auditoria instantânea das posições abertas;

  • Controle independente por estratégia (via Magic Number);

  • Prevenção de sobreposição e duplicação de ordens;

  • Fornecimento de dados consistentes para as rotinas de bloqueio e fechamento de risco.

Com essa base, o robô se torna capaz de gerir a exposição de forma granular e autônoma, preservando a coerência entre suas múltiplas estratégias e fortalecendo a resiliência global do sistema.

4.3 Checar_Historico( )

A função Checar_Hitorico() é o elemento de vigilância temporal e comportamental da camada de gestão de riscos do robô. Seu objetivo é monitorar o histórico recente de operações concluídas e aplicar bloqueios temporários de negociação para estratégias específicas - identificadas pelos seus Magic Numbers - de forma a evitar reentradas imediatas após o encerramento de trades.

Essa função atua como um mecanismo automático de contenção e resfriamento operacional, projetado para proteger o robô contra operações excessivas, duplicadas ou em condições de mercado desfavoráveis logo após uma saída.

Estrutura e funcionamento:

  1. Verificação de conectividade e histórico:
    Antes de iniciar o processo, a função certifica-se de que o terminal está conectado (TERMINAL_CONNECTED) e que o histórico recente pode ser consultado com segurança por meio de HistorySelect(). Essa etapa evita que o sistema processe dados incompletos ou corrompidos em situações de desconexão momentânea ou atraso de servidor.

  2. Análise do histórico de negócios:
    Após carregar o período de interesse - normalmente os segundos mais recentes (start_time e end_time) - a função percorre todos os deals registrados (HistoryDealsTotal()). Cada deal é identificado pelo ticket e avaliado quanto ao tipo de entrada (DEAL_ENTRY).
    Apenas operações de saída (DEAL_ENTRY_OUT) são consideradas relevantes, pois indicam o encerramento efetivo de uma posição.

  3. Identificação do Magic Number associado:
    Para cada negócio fechado, o sistema obtém o Magic Number via HistoryDealGetInteger(deal_ticket, DEAL_MAGIC).
    Caso essa informação não esteja disponível diretamente no histórico do deal, a função busca o Magic Number associado ao ticket de posição original, garantindo precisão mesmo em contextos de múltiplas estratégias ou reconexões.

  4. Validação e bloqueio por estratégia:
    Uma vez identificado o Magic Number, o sistema verifica se ele pertence ao conjunto de estratégias controladas pelo robô (magicNumbers[]). Se for um Magic Number válido, a função avalia se já existe um bloqueio ativo.
    Caso não haja, é aplicado um novo bloqueio temporário, com base na constante BLOCK_TIME.
    O tempo de liberação é armazenado em blockTimes[magicIndex], que registra o instante exato até o qual novas operações estarão suspensas.

  5. Registro e auditoria:
    Cada ação de bloqueio é reportada via PrintFormat(), contendo o Magic Number e o horário limite do bloqueio, o que permite rastrear decisões automáticas de contenção no log do EA.

Função estratégica na gestão de risco:

A Checar_Historico() atua como uma barreira inteligente entre eventos passados e decisões futuras. Com esse controle, o robô ganha maturidade operacional, passando a respeitar intervalos obrigatórios de “cooldown” após trades - um comportamento típico de sistemas institucionais de negociação que priorizam consistência sobre volume.

Função integrada no ecossistema do robô:

Dentro do bloco de Gestão de Riscos, a Checar_Historico() trabalha de forma integrada com as funções:

  • Fechar_Posicoes(), que executa o encerramento físico das ordens;

  • Magic_Bloqueado(), que consulta os bloqueios ativos antes de novas aberturas.

Juntas, essas funções compõem um sistema de gestão dinâmica de risco temporal, no qual cada módulo de estratégia é capaz de pausar e retomar as operações de forma autônoma, mais segura e sincronizada com o comportamento do mercado.

A função transforma o histórico recente em uma ferramenta ativa de proteção, adicionando uma camada de inteligência adaptativa ao robô.

4.4 Magic_Bloqueado( )

A função Magic_Bloqueado() é o ponto de verificação final do subsistema de gestão de riscos. Ela atua como um filtro lógico de autorização de operações, determinando se um determinado Magic Number - isto é, uma estratégia específica do EA - está temporariamente impedido de abrir novas posições devido a um bloqueio ativo definido pela função Checar_Historico().

Em essência, Magic Bloqueado() transforma o conceito de tempo de bloqueio em um mecanismo de controle operacional dinâmico, permitindo que o EA identifique, de forma rápida e confiável, quais estratégias estão aptas a negociar e quais devem permanecer inativas até o término do período de restrição.

Estrutura e funcionamento:

  1. Percorrer a lista de estratégias registradas:
    A função inicia examinando o array magicNumbers[], que contém todos os Magic Numbers controlados pelo sistema. Cada elemento do array corresponde a uma lógica ou módulo de operação independente do EA.

  2. Identificação do Magic Number alvo:
    Ao receber um Magic Number como parâmetro, a função busca sua correspondência no array. Essa correspondência é fundamental, pois garante que apenas estratégias reconhecidas sejam submetidas à verificação de bloqueio - preservando a integridade do controle e evitando falsos positivos provenientes de sinais externos ou operações manuais.

  3. Verificação do tempo de bloqueio ativo:
    Para o Magic Number encontrado, é consultado o valor de blockTimes[i], que armazena o instante exato em que o bloqueio expira. Se o horário atual (TimeCurrent()) for menor que o tempo de desbloqueio, significa que a estratégia ainda está sob restrição. Nesse caso, a função retorna o próprio Magic Number bloqueado (ou outro valor de referência, conforme a implementação), informando às demais rotinas do EA que nenhuma nova ordem deve ser aberta.

  4. Retorno condicional:

    • Bloqueio ativo: a função retorna o Magic Number (ou true), sinalizando que a operação deve ser impedida.

    • Sem bloqueio: retorna 0 (ou false), permitindo que o módulo continue com o fluxo normal de execução.

Essa lógica simples e eficiente fornece ao robô uma camada de decisão instantânea, sem necessidade de recorrer ao histórico a cada verificação.

Papel estratégico na arquitetura do EA

A Magic_Bloqueado() funciona como o guardião do ciclo operacional do robô. Enquanto Checar_Historico() é responsável por aplicar os bloqueios com base no histórico de negociações, Magic_Bloqueado() é quem impede proativamente a execução de novas entradas durante o período de restrição.

Essa separação de responsabilidades traz importantes benefícios arquiteturais:

  • Baixa latência: a verificação ocorre em memória, sem chamadas externas ou consultas pesadas;

  • Alta confiabilidade: o controle é totalmente sincronizado com o relógio interno do terminal;

  • Modularidade: cada Magic Number é tratado de forma independente, preservando a autonomia das estratégias simultâneas;

  • Consistência operacional: garante que as regras de cooldown e intervalo mínimo entre trades sejam rigorosamente respeitadas.

A Magic_Bloqueado() representa o mecanismo de autocontenção e disciplina lógica do EA. Ao impedir que estratégias bloqueadas reentrem no mercado antes do tempo apropriado, ela assegura que o robô opere dentro de ciclos temporais controlados e previsíveis - uma importante prática para qualquer sistema automatizado que busca consistência.

Integração do Bloco 4

O Bloco 4, denominado Gestão de Riscos, constitui um dos pilares mais importantes da arquitetura de um sistema automatizado. Sua função é assegurar que todas as operações executadas pelo robô ocorram dentro de parâmetros controlados, equilibrando eficiência operacional e segurança. Esse módulo representa a camada lógica responsável por transformar o comportamento do EA em algo disciplinado, previsível e resistente, atuando como um verdadeiro mecanismo de autoproteção diante das dinâmicas do mercado.

A função Fechar_Operacoes() é o ponto de partida desse controle, encarregando-se de encerrar posições de forma seletiva e ordenada. Com ela, o sistema consegue gerenciar o ciclo de vida de cada operação, garantindo que o encerramento ocorra em condições seguras e rastreáveis. Já a função Contar_Posicoes_Por_MagicNumber() fornece uma visão precisa da exposição atual do EA, contabilizando as ordens abertas por identificador de estratégia. Essa contagem contínua permite que o sistema reconheça quantas posições estão ativas por Magic Number e, a partir disso, evite sobreposição de sinais ou duplicação de entradas.

Complementando esse processo, a função Checar_Historico() desempenha um papel preventivo importante. Ela analisa o histórico recente de operações e, com base em critérios de tempo e resultado, aplica bloqueios temporários a determinadas estratégias. Essa medida cria um intervalo de segurança - conhecido como cooldown - que impede novas operações imediatas após o fechamento de uma posição, dando ao sistema tempo para reavaliar o contexto de mercado e reduzir riscos de entrada impulsiva. A aplicação desses bloqueios é essencial para manter a coerência operacional e preservar a integridade das decisões automatizadas.

Por sua vez, a função Magic_Bloqueado() atua como o filtro lógico que assegura o cumprimento dessas restrições. A cada tentativa de abertura de uma nova operação, ela verifica se o Magic Number correspondente está bloqueado e, caso positivo, impede que o robô prossiga com a execução. Essa verificação rápida e direta, realizada em memória, garante que o sistema respeite rigorosamente os períodos de bloqueio definidos, sem comprometer a performance. Assim, a Magic_Bloqueado() funciona como a instância decisória final, a fronteira entre o sinal e a ação, onde a disciplina se sobrepõe ao impulso de negociação.

O funcionamento conjunto dessas quatro funções cria um ciclo de segurança fechado, no qual o sistema é capaz de detectar eventos, reagir a situações de risco e prevenir novas ocorrências. Trata-se de uma arquitetura baseada na tríade detecção, reação e prevenção, que transforma o robô em um agente autônomo com capacidade de autorregulação. Esse comportamento controlado é o que diferencia um robô meramente operacional de um sistema verdadeiramente inteligente, capaz de reconhecer não apenas oportunidades, mas também momentos de pausa e contenção.

Em nível estrutural, o módulo de Gestão de Riscos deve atuar em sintonia com os demais blocos do projeto. Ele se comunica com as rotinas de análise técnica, gestão de ordens e controle de posições, funcionando como uma camada intermediária que filtra e valida cada ação antes de sua execução. Essa integração modular garante consistência, facilita a manutenção e possibilita a expansão do sistema sem comprometer sua estabilidade. Ao mesmo tempo, preserva a independência de cada estratégia, permitindo que múltiplos Magic Numbers operem de forma simultânea, porém sempre sob regras de segurança próprias.

Em síntese, o Bloco 4 representa o ponto de equilíbrio entre inteligência e prudência. Ele confere ao robô a capacidade de operar com racionalidade, evitando excessos e respeitando ciclos temporais de segurança. Mais do que um conjunto de rotinas, é um verdadeiro sistema de controle comportamental, projetado para manter a coerência das decisões automatizadas e a longevidade do desempenho estratégico.

Vale ressaltar que este bloco pode ser ampliado de acordo com a complexidade do sistema e o perfil de risco desejado. Outras funções de controle podem ser incorporadas, como a verificação da margem de negociação disponível antes da abertura de ordens, a definição de tamanho de lote por Magic Number ou por nível de risco, a limitação de volume máximo exposto por ativo, e até mesmo rotinas de monitoramento de volatilidade e ajuste dinâmico de parâmetros em função das condições de mercado. Essas extensões reforçam o caráter modular e adaptável do bloco, permitindo que a Gestão de Riscos evolua em paralelo com as demais partes do EA, sem comprometer sua arquitetura central.

A seguir, apresenta-se o código do nosso exemplo em MQL5, que materializa a lógica de gestão de riscos e traduz, em termos práticos, os princípios técnicos e conceituais descritos nesta seção.

Para avançar ou retornar para revisar módulos do código, você pode utilizar os botões a seguir: