Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 15
- Avaliação:
- Publicado:
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
Visão geral
Quase tudo no MetaTrader é regido pelo calendário. Uma barra é fechada a cada minuto, a cada hora, a cada dia, e os indicadores e Expert Advisors analisam o mercado nessa grade fixa. Mas o mercado não sabe o que é um minuto. Durante a divulgação de uma notícia, centenas de movimentos significativos podem ocorrer em um minuto, enquanto, em uma sessão tranquila, uma hora quase não traz nenhuma informação. A análise baseada no relógio dedica a mesma atenção a ambos os casos.
O tempo intrínseco é a alternativa formalizada pelo grupo de Olsen, em Zurique: deixar que o preço decida quando o tempo passa. Defina um delta-limiar. O relógio só avança quando o preço se inverte em delta em relação ao seu último extremo — uma mudança de direção. Depois que uma mudança se confirma, o preço geralmente continua se movendo na nova direção por um tempo, e essa continuação é o overshoot. Toda a trajetória do preço se torna uma sequência alternada de seções de mudança direcional e overshoot, que os artigos chamam de “linha costeira”. Uma hora agitada e uma hora tranquila são, então, medidas na mesma unidade: eventos.

Uma trajetória irregular do preço se resolve em seções de mudança de direção (linha contínua) e de overshoot (linha tracejada) em um limiar fixo. O relógio de tempo intrínseco avança apenas nos eventos.
Este Expert Advisor é uma adaptação pura para MQL5 do Alpha Engine, o sistema de negociação “coastline” contra a tendência que Golub, Glattfelder e Olsen desenvolveram com base nesse relógio. Ele abre uma posição contra um movimento em um evento intrínseco, aumenta a posição no evento seguinte se o preço continuar se movendo contra ele (cascata) e fecha as partes adicionadas uma a uma com lucro à medida que o preço reverte (descascata). Como as posições são sempre adicionadas apenas em incrementos fixos, não se trata de uma estratégia martingale. O núcleo de decisão, os algoritmos de limiar logarítmico e o indicador de liquidez baseado na teoria da informação são uma tradução linha por linha do código Java de referência dos autores. Apenas o processamento de ordens foi adaptado ao terminal.

Um agente de posição comprada realiza cascata (adiciona) à medida que o preço cai por meio de eventos intrínsecos sucessivos e, em seguida, des-cascata (encerra com lucro) à medida que o preço se recupera.
Como ele opera
O EA executa o conjunto especificado no artigo: oito agentes independentes, um exclusivamente comprado e outro exclusivamente vendido em cada um dos quatro limites: 0,25%, 0,5%, 1% e 1,5%. Cada agente possui suas próprias ordens e posições por meio de seu próprio número mágico, de modo que os agentes nunca interferem nas negociações uns dos outros.
Todo o ciclo de vida é executado por meio de ordens de limite em uma conta de hedge, onde cada etapa da cascata é, naturalmente, sua própria posição. Um agente de posições compradas mantém uma única ordem de compra com limite (buy-limit) em espera no próximo nível de evento intrínseco descendente, e cada execução abre uma posição com um take-profit exatamente no delta acima de sua entrada. Esse take-profit é a descascata. À medida que o preço cai, a escada de ordens de compra com limite é executada; à medida que se recupera, os take-profits a reduzem uma a uma. Um agente vendido é a imagem espelhada. A ordem em espera só é reposicionada quando algo muda (um evento intrínseco, uma mudança de nível ou uma execução), de modo que o EA não gera ordens a cada tick.
Duas defesas impedem que um operador puramente contrarian se deixe levar por uma tendência. A primeira é um desvio orientado pelo estoque: cada agente avança três ordens em cada tick, e o estoque atual decide qual delas conduz as ordens. À medida que o estoque aumenta, o limiar adverso se amplia em relação ao favorável, de modo que o agente se torna relutante em adicionar e ansioso por reduzir. A segunda é o dimensionamento fracionário: a unidade adicionada diminui à medida que o estoque cresce.
| Estoque (unidades) | Corredor ativo | Limite adverso : limite favorável | Unidade adicionada |
|---|---|---|---|
| abaixo de 15 | Simétrico | 1 : 1 (delta em cada sentido) | 1 |
| 15 a 30 | Primeiro assimétrico | 2 : 1 (delta de 1,5 contra delta de 0,75) | 1/2 |
| 30 e acima | Segunda assimetria | 4 : 1 (2 delta contra 0,5 delta) | 1/4 |
Além disso, a unidade é ponderada pelo indicador de liquidez L, uma medida baseada na teoria da informação que avalia o quão normal é a movimentação recente dos preços. Ele trata cada evento intrínseco como um símbolo, calcula a média da surpresa (autoinformação) da sequência de eventos, padroniza-a e a mapeia por meio da função de distribuição normal. L fica próximo de 1 quando o preço se comporta como um mercado normal e cai em direção a 0 quando a trajetória é excepcionalmente unilateral. O valor é mantido inteiro quando L é igual ou superior a 0,5, reduzido pela metade entre 0,1 e 0,5 e reduzido a um décimo abaixo de 0,1. O indicador opera com seu próprio limiar de overshoot mais amplo, 2,525729 vezes o delta — valor escolhido pelo artigo para que L distinga ações normais das anormais da forma mais nítida possível.
As unidades abstratas são convertidas em lotes por meio da entrada InpLotPerUnit, e InpMaxUnits limita o estoque de cada agente. Esse limite é um elemento de controle de risco que o artigo não menciona: uma vez atingido, o agente cancela sua entrada em espera e não adiciona mais nada, enquanto as ordens de lucro em aberto continuam em vigor.
Configuração recomendada
| Parâmetro | Valor recomendado | Notas |
|---|---|---|
| Símbolo | EURUSD | O instrumento utilizado para desenvolvimento e teste, e aquele no qual as leis de escala do artigo foram verificadas. Os limites são relativos (porcentagem do preço), portanto, outros pares de moedas com alta liquidez funcionam sem a necessidade de reescalonamento. |
| Período | Qualquer | O EA é executado tick a tick no tempo intrínseco, portanto, o período do gráfico não afeta suas decisões. |
| Tipo de conta | Hedging | Obrigatório. Cada etapa da cascata deve ser uma posição independente; portanto, em uma conta de compensação, o EA exibe uma mensagem e retorna INIT_FAILED por padrão. |
| Modelo do testador | Cada tick baseado em ticks reais | Os eventos intrínsecos são definidos no fluxo de ticks; portanto, modelos baseados em barras representam incorretamente tanto os eventos quanto as execuções de ordens com limite. O testador herda o modo de margem da conta na qual você está conectado; portanto, faça login em uma conta de hedge antes de realizar o teste. |
| InpLotPerUnit | 0,02 (padrão), até 0,4 | Com um incremento de 0,01 lote, as meias e quartos de unidade, bem como o haircut de liquidez, só permanecem como tamanhos distintos quando uma unidade está em torno de 0,4 lotes. Abaixo disso, as adições menores são ajustadas para o lote mínimo. O desvio do limite reside nos runners e não é afetado. |
Resultados do backtest
EURUSD, a cada tick com base em ticks reais, de 2 de fevereiro a 31 de julho de 2026, depósito inicial de 10.000 em uma conta de hedge, configurações padrão (InpLotPerUnit = 0,02, InpMaxUnits = 30) com todos os oito agentes ativados. Os limites, as regras de dimensionamento e o take-profit são os do estudo, não ajustados para este símbolo ou período.

Relatório do Strategy Tester para a execução de seis meses do EURUSD.
A simulação apresentou retorno de +10,68%, com um fator de lucro de 2,21 e uma redução máxima do patrimônio líquido de 10,10% em 318 posições. O valor líquido esconde dois fluxos muito diferentes, e dividi-lo de acordo com o fechamento de cada posição é mais esclarecedor do que o total:
| Componentes do resultado de seis meses | Valor |
|---|---|
| 294 posições fechadas no take-profit | +1.934,14 |
| 24 posições fechadas pelo testador ao final da simulação | -823,55 |
| Comissão cobrada nas entradas | -42,14 |
| Lucro líquido | +1.068,45 |
Ambas as linhas de fechamento já incluem o swap, que totalizou -620,38, valor muito superior à comissão. Para um modelo capaz de manter uma cascata por semanas, o custo dominante é o financiamento, e não o spread. As 24 posições que o testador fechou são cascatas que nunca se recuperaram: em negociações reais, elas ainda estariam abertas.

O saldo (azul) aumenta à medida que os take-profits são acionados. O patrimônio líquido (verde) arcar com as cascatas em aberto e só se iguala ao saldo quando o testador as fecha no último dia.
Trata-se de um par de moedas em um período de seis meses; portanto, mostra um mecanismo em funcionamento, e não um número de desempenho de destaque. Qualquer estratégia que feche posições lucrativas e mantenha as perdedoras produz um saldo crescente; é por isso que a linha de patrimônio líquido e o fechamento forçado são os aspectos que valem a pena estudar.
Parâmetros de entrada
| Parâmetro | Padrão | Descrição |
|---|---|---|
| InpLotPerUnit | 0,02 | Lotes por uma unidade abstrata do tamanho do papel. Aumente esse valor até 0,4 para manter o tamanho fracionário exato em um símbolo de 0,01 lote, ou diminua-o para negociar em lotes menores. |
| InpMaxUnits | 30 | Limite máximo de estoque por agente, em unidades. Uma vez atingido, nenhuma nova ordem de compra é inserida e as ordens de lucro em aberto são deixadas para liquidar a posição. O nível de skew mais profundo só é acionado após ultrapassar 30 unidades; portanto, com o limite padrão, ele nunca é atingido. |
| InpMagicBase | 990000 | Número mágico base. Os oito agentes variam de InpMagicBase a InpMagicBase + 7; portanto, altere-o se outro EA na conta utilizar esse intervalo. |
| InpTradeLong | true | Execute os quatro agentes que operam apenas em posições compradas. |
| InpTradeShort | true | Execute os quatro agentes exclusivamente de posições vendidas. Com ambos ativados, o conjunto representa a configuração simétrica completa do artigo. |
Usando as classes em seu próprio código
Um agente é uma classe autônoma, a CAeLiveTrader. Ela não tem conhecimento dos outros agentes; portanto, um EA pode executar um único agente, um conjunto diferente de limites ou vários símbolos, criando quantas instâncias forem necessárias:
#include <IntrinsicTime\AeLiveTrader.mqh> CAeLiveTrader agent; //--- em OnInit: um agente exclusivamente de posições compradas com delta de 0,5%, 0,02 lotes por unidade e limite máximo de 30 unidades agent.Init(_Symbol,990100,1,0.005,0.02,30.0); //--- em OnTick MqlTick t; if(SymbolInfoTick(_Symbol,t)) agent.OnTickUpdate(t.bid,t.ask,t.time); //--- em OnDeinit: cancela a posição em aberto; os níveis de take-profit permanecem inalterados agent.Shutdown();
O executador de tempo intrínseco também pode ser usado sozinho. O CAeRunner aceita limites de alta e de baixa separados em preço logarítmico, retorna um código de evento a cada cotação (mais ou menos 1 para uma mudança de direção, mais ou menos 2 para um passo de ultrapassagem, 0 nos demais casos), e sempre sabe os preços exatos nos quais os próximos eventos seriam acionados, o que o torna uma fonte natural de níveis de ordens limitadas para outras estratégias:
#include <IntrinsicTime\AeRunner.mqh> CAeRunner runner; runner.Init(0.005,0.005,0.005,0.005); // desvio para cima/para baixo, ultrapassagem para cima/para baixo int ev=runner.Run(AeTick(t.bid,t.ask,t.time)); if(ev==AE_EVENT_DC_DOWN) Print("downturn confirmed, next level below: ",runner.ExpectedLowerIE());
O indicador de liquidez, CAeLocalLiquidity, segue o mesmo padrão: inicialize-o com um limite, alimente-o com todas as cotações por meio de Computation e leia o valor atual de L com Liq.
Limitações
É importante saber antes de conectá-lo a qualquer coisa que não seja uma conta de demonstração.
- Não há saída da posição completa. O trader de referência do artigo fecha toda a posição de um agente assim que seu retorno total — realizado mais o em aberto — atinge delta. O agente em produção não reproduz isso. Uma cascata que evolui negativamente e nunca se recupera é interrompida pelo InpMaxUnits, mas não é fechada, e seus take-profits permanecem inativos. Esse é o maior risco do projeto, e o fechamento forçado no backtest acima é o custo disso.
- O swap domina os custos. As cascatas podem permanecer abertas por semanas, de modo que o financiamento overnight pesa muito mais do que o spread ou a comissão. Verifique o swap da sua corretora em ambos os lados antes de executar o backtest.
- Com o tamanho de lote fornecido, o dimensionamento é simplificado. A 0,02 lotes por unidade, uma adição completa é de 0,02 lotes e toda adição menor é elevada ao mínimo de 0,01 lote, de modo que a escala de dimensionamento do backtest se reduz a dois degraus. Aumentar o InpLotPerUnit para 0,4 a restaura, com um tamanho de posição muito maior.
- O lucro realizado não é uma vantagem. Em um passeio aleatório sem desvio, o lucro realizado pelo mecanismo é sempre positivo, enquanto seu lucro total é zero na expectativa. Um par e uma janela de teste não podem estabelecer uma vantagem de forma alguma.
- Os executores entram em pausa fora dos horários de negociação. O EA retorna antecipadamente do OnTick quando a sessão do símbolo é encerrada, o que mantém o diário organizado e o backtest rápido. Isso só importa em um feed que continue fornecendo cotações enquanto o mercado estiver fechado.
Estrutura de arquivos
Um Expert Advisor e quatro cabeçalhos. Os cabeçalhos são incluídos como <IntrinsicTime\...>, portanto, devem ficar em uma subpasta IntrinsicTime dentro da pasta Include.
| Arquivo | Função | Descrição |
|---|---|---|
| Experts\IntrinsicTime\AlphaEngine.mq5 | O EA | Impõe uma conta de hedge, constrói o conjunto de oito agentes nos quatro limiares do artigo, ativa a sessão de negociação e orienta cada agente com a cotação mais recente. |
| Include\IntrinsicTime\AeLiveTrader.mqh | Agente ativo | CAeLiveTrader, um agente de linha de costa que negocia ordens de limite reais: seleção do executor por estoque, dimensionamento fracionário e de liquidez, normalização de lotes e a única entrada em espera com seu take-profit sem cascata. |
| Include\IntrinsicTime\AeRunner.mqh | Runner de tempo intrínseco | CAeRunner, o runner de mudança de direção com limiar logarítmico e limiares separados para alta e baixa, emitindo eventos de mudança de direção e de ultrapassagem, além dos níveis de preço em que os próximos eventos seriam acionados. |
| Incluir\IntrinsicTime\AeLiquidity.mqh | Indicador de liquidez | CAeLocalLiquidity, o indicador L baseado na teoria da informação que pondera cada adição, com seu próprio runner e a função de distribuição normal da referência. |
| Include\IntrinsicTime\AeTypes.mqh | Tipos compartilhados | A estrutura de ticks de compra/venda e os códigos de eventos intrínsecos que o executor, o indicador e o agente trocam entre si. |
Base de pesquisa
A implementação segue:
- Anton Golub, James B. Glattfelder e Richard B. Olsen, The Alpha Engine: Designing an Automated Trading Algorithm, 2017, SSRN 2951348.
- James B. Glattfelder, Alexandre Dupuis e Richard B. Olsen, “Padrões em dados cambiais de alta frequência: descoberta de 12 leis de escala empíricas”, Quantitative Finance, 2011.
- A implementação em Java de referência dos autores, disponível no GitHub. A adaptação mantém suas peculiaridades em vez de corrigi-las silenciosamente.
Um artigo complementar constrói o operador de mudança direcional, reproduz as leis de escala em 17,8 milhões de ticks reais do EURUSD em comparação com um passeio aleatório com volatilidade correspondente, analisa a portabilidade do Alpha Engine classe por classe e testa sua alegação de lucro com o passeio aleatório: Tempo Intrínseco: Das Leis de Escala de Mudança Direcional ao Alpha Engine.
Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/77871
Repaint Inspector
Verifica se um indicador é atualizado, em vez de simplesmente acreditar na afirmação. Ele relê os buffers de qualquer indicador personalizado nas barras que já foram fechadas e conta cada valor que muda, aparece ou desaparece, identificando o ponto mais distante no passado em que isso ainda ocorre. O resultado é exibido por buffer em um painel do gráfico, e cada evento é registrado em um arquivo CSV.
ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city
Mostra onde os stops provavelmente estão posicionados e quais acabaram de ser acionados. Reservatórios de liquidez = máximas e mínimas de oscilação confirmadas que o preço ainda não ultrapassou, máximas/mínimas iguais (um reservatório maior) e a máxima e a mínima de ontem. Quando uma barra ultrapassa um pool, ela é marcada como “varrida” e como “capturada e rejeitada” se a mesma barra fechar novamente dentro do pool. Sem repintura: um swing só é considerado após N barras fechadas de cada lado. O painel é uma cidade de néon desenhada em um CCanvas: o preço é um carro voador, os stops de venda são torres abaixo dele, os stops de compra são plataformas flutuantes acima dele, os níveis de ontem são outdoors dourados, um holofote varre o céu e um ticker exibe as negociações do dia. Dois buffers fornecem o conjunto ativo mais próximo acima e abaixo para uso em um Expert Advisor. Apenas indicador: ele nunca opera.
Mirror Hedge EA (Same terminal and account only)
Espelha as operações abertas, modificadas e fechadas por outro EA na mesma conta de hedge, selecionado pelo número mágico. Por padrão, ele inverte a direção (Compra↔Venda, SL↔TP), para que você possa testar retrospectivamente o inverso de uma estratégia com spreads, slippage e execução reais.
Accelerator Oscillator (AC)
O Indicador Acceleration/Deceleration (Aceleração/Desaceleração ou AC) mede a aceleração e a desaceleração da força motriz atual do mercado.