Programação de Indicadores e Robôs: MTF - Multi Time Frame / HTF - Higher Time Frame

 

DÚVIDA  TEÓRICA

Ola colegas.... Gostaria muito de uma ajuda da comunidade para enfrentar um desafio que para muitos parece fácil, mas está sendo um desafio para mim.

Gostaria de saber se aguem conhece um tutorial que ensina detalhadamente como converter ou criar um indicador baseado em MTF / HTF?

Analisei abordagens no código de outras pessoas. Mas parece que não existe um padrão para usar a funcionalidade MTF / HTF . 

Pergunto se existiria "melhor prática" ou uma forma recomendada de se fazer isso? Alguém poderia me ajudar indicando um artigo que ensine esta funcionalidade em detalhes na linguagem MQL5?


DESAFIO TÉCNICO QUE ESTOU ENFRENTANDO: AJUDA NECESSÁRIA...

Eu gostaria muito de aplicar esta funcionalidade no indicador TMA Centered. Já pesquisei muito na base de códigos mas não achei ninguém que tenha divulgado um código de "TMA Centered MTF" em mq5. 

Atualmente eu já consegui melhorar alguns aspectos do indicador TMA Centered. Originalmente ele só tem uma banda. Eu consegui incluir mais três. 

Tenho outras modificações para fazer mas estou paralisado nesta questão do MTF. 

Vou incluir os dois indicadores. O original e o modificado por mim. 

Se alguém puder me ajudar e aperfeiçoar o os dois indicadores com a funcionalidade MTF eu agradeço. 

Agradecerei mais ainda se me explicarem como fizeram isso. Até porque o maior intuito deste tópico é o aprendizado. 

Alguém poderia me ajudar a superar esse desafio?

Desde já agradeço pela ajuda.


Como posso eu próprio criar um expert advisor ou um indicador - Trading algorítmico, robôs comerciais - Ajuda para o MetaTrader 5
  • www.metatrader5.com
Para desenvolver sistemas de negociação, a plataforma tem a sua própria linguagem de programação MetaQuotes...
Arquivos anexados:
 
Boris_Esparta:

DÚVIDA  TEÓRICA

Ola colegas.... Gostaria muito de uma ajuda da comunidade para enfrentar um desafio que para muitos parece fácil, mas está sendo um desafio para mim.

Gostaria de saber se aguem conhece um tutorial que ensina detalhadamente como converter ou criar um indicador baseado em MTF / HTF?

Analisei abordagens no código de outras pessoas. Mas parece que não existe um padrão para usar a funcionalidade MTF / HTF . 

Pergunto se existiria "melhor prática" ou uma forma recomendada de se fazer isso? Alguém poderia me ajudar indicando um artigo que ensine esta funcionalidade em detalhes na linguagem MQL5?


DESAFIO TÉCNICO QUE ESTOU ENFRENTANDO: AJUDA NECESSÁRIA...

Eu gostaria muito de aplicar esta funcionalidade no indicador TMA Centered. Já pesquisei muito na base de códigos mas não achei ninguém que tenha divulgado um código de "TMA Centered MTF" em mq5. 

Atualmente eu já consegui melhorar alguns aspectos do indicador TMA Centered. Originalmente ele só tem uma banda. Eu consegui incluir mais três. 

Tenho outras modificações para fazer mas estou paralisado nesta questão do MTF. 

Vou incluir os dois indicadores. O original e o modificado por mim. 

Se alguém puder me ajudar e aperfeiçoar o os dois indicadores com a funcionalidade MTF eu agradeço. 

Agradecerei mais ainda se me explicarem como fizeram isso. Até porque o maior intuito deste tópico é o aprendizado. 

Alguém poderia me ajudar a superar esse desafio?

Desde já agradeço pela ajuda.


O que você quer fazer é muito simples e fácil de fazer. Mas antes de qualquer coisa. Gostaria de entender um detalhe. Pois isto fará toda diferença na forma como irei lhe orientar.

Você deseja colocar, na janela principal, o indicador mostrando o que está acontecendo, em diversos tempos gráficos diferentes ?!?! Ou pretende usar sub janelas para acompanhar tempos gráficos diferentes com o indicador nas sub janelas ?!?!

Caso você não saiba, do que estou falando, ao usar sub janelas. O que você veria seria algo como mostrado abaixo:


Veja que não importa o tempo gráfico na janela principal. O tempo gráfico nas sub janelas não muda. Ou pode mudar dependendo do que você queira fazer. Por isto você tem que ser muito específico no que pretende fazer. Pois dependendo, poderá ter um caminho mais ou menos complicado. Já que você está começando a aprender MQL5.

É importante que você informe, exatamente o que deseja fazer, para que eu possa lhe orientar corretamente. Um detalhe: Para que a resposta venha mais rápido, me envie uma mensagem, como você fez. Assim saberei que você atualizou o post no fórum. Pois não tenho costume de acompanhar o fórum. 😁🙂👍

 
Daniel Jose #:

O que você quer fazer é muito simples e fácil de fazer. Mas antes de qualquer coisa. Gostaria de entender um detalhe. Pois isto fará toda diferença na forma como irei lhe orientar.

Você deseja colocar, na janela principal, o indicador mostrando o que está acontecendo, em diversos tempos gráficos diferentes ?!?! Ou pretende usar sub janelas para acompanhar tempos gráficos diferentes com o indicador nas sub janelas ?!?!

Caso você não saiba, do que estou falando, ao usar sub janelas. O que você veria seria algo como mostrado abaixo:


Veja que não importa o tempo gráfico na janela principal. O tempo gráfico nas sub janelas não muda. Ou pode mudar dependendo do que você queira fazer. Por isto você tem que ser muito específico no que pretende fazer. Pois dependendo, poderá ter um caminho mais ou menos complicado. Já que você está começando a aprender MQL5.

É importante que você informe, exatamente o que deseja fazer, para que eu possa lhe orientar corretamente. Um detalhe: Para que a resposta venha mais rápido, me envie uma mensagem, como você fez. Assim saberei que você atualizou o post no fórum. Pois não tenho costume de acompanhar o fórum. 😁🙂👍

Ola Daniel,

Muito Obrigado por responder. Há muitos detalhes que gostaria de saber, mas vou dar um passo de cada vez. 

Meu próximo objetivo com esse indicador é o seguinte.  

1 - Eu preciso que o indicador apareça na janela principal do gráfico. 

2 - Minha intenção é operar no gráfico M5 com o indicador no Time Frame de M10. Isso me ajudará da seguinte forma:

- Minhas entradas de COMPRA são feitas nas bandas INFERIORES do canal. Sempre em tendência de ALTA (Quando a linha central estiver VERDE).

- As entradas de VENDA serão feitas nas bandas SUPERIORES do canal. Sempre em tendência de BAIXA  (Quando a linha central estiver ROSA)

3-  ENTENDENDO O PROBLEMA:

- Como se sabe o canal de TMA Repinta /recalcula a cada barra. 

- Essa repintura seria facilmente resolvida com a aplicação do HTF, pois em um Time Frame maior a linha central não muda de cor facilmente quando o preço oscila no gráfico de M5.

- Depois que eu conseguir entender como funciona essa dinâmica de MTF/HTF eu pretendo fazer um Expert Advisor usando essa lógica para pendurar ordens nas bandas do TMA. 

- Com a configuração certa eu conseguirei (i) pendurar ordens nas bandas, (ii) operando no gráfico M5, (iii) com o indicador do Time Frame M10 ou maior, sem que a linha central mude e atrapalhe o funcionamento do Expert. 

- Na tela anexa eu explico no gráfico....

Arquivos anexados:
exemplo.PNG  40 kb
 
Boris_Esparta #:

Ola Daniel,

Muito Obrigado por responder. Há muitos detalhes que gostaria de saber, mas vou dar um passo de cada vez. 

Meu próximo objetivo com esse indicador é o seguinte.  

1 - Eu preciso que o indicador apareça na janela principal do gráfico. 

2 - Minha intenção é operar no gráfico M5 com o indicador no Time Frame de M10. Isso me ajudará da seguinte forma:

- Minhas entradas de COMPRA são feitas nas bandas INFERIORES do canal. Sempre em tendência de ALTA (Quando a linha central estiver VERDE).

- As entradas de VENDA serão feitas nas bandas SUPERIORES do canal. Sempre em tendência de BAIXA  (Quando a linha central estiver ROSA)

3-  ENTENDENDO O PROBLEMA:

- Como se sabe o canal de TMA Repinta /recalcula a cada barra. 

- Essa repintura seria facilmente resolvida com a aplicação do HTF, pois em um Time Frame maior a linha central não muda de cor facilmente quando o preço oscila no gráfico de M5.

- Depois que eu conseguir entender como funciona essa dinâmica de MTF/HTF eu pretendo fazer um Expert Advisor usando essa lógica para pendurar ordens nas bandas do TMA. 

- Com a configuração certa eu conseguirei (i) pendurar ordens nas bandas, (ii) operando no gráfico M5, (iii) com o indicador do Time Frame M10 ou maior, sem que a linha central mude e atrapalhe o funcionamento do Expert. 

- Na tela anexa eu explico no gráfico....

Tento ajustar os períodos usados no M5 para ver se consegue uma representação visual parecida com a média do M10? Exemplo, se no M10 esta usando 30 então no M5 poderia começar testando os período 55 e ir aumentando pra ver se se fica próximo visualmente do timeframe que quer. Acho essa abordagem mais fácil de lidar com timeframe maior.

 
Ricardo Rodrigues Lucca #:

Tento ajustar os períodos usados no M5 para ver se consegue uma representação visual parecida com a média do M10? Exemplo, se no M10 esta usando 30 então no M5 poderia começar testando os período 55 e ir aumentando pra ver se se fica próximo visualmente do timeframe que quer. Acho essa abordagem mais fácil de lidar com timeframe maior.

Sim. De fato, a abordagem se baseia exatamente nisto. Só que se você estiver usando M10, e que dados do M5, deve respeita a matemática. Caso contrário, irá ter problemas no longo prazo. Explico: No M10 temos metade do numero de barras. Então você precisa usar exatamente o dobro do valor. Se você usar uma barra a mais ou a menos. Conforme o tempo for passando esta uma barra irá se acumular até que você estará defasado ou adiantado em um periodo inteiro. E quanto mais tempo se passar, maior esta defasagem irá acumular. Até que tudo ficar absolutamente bizarro. Então devemos respeitar a matemática. E não ir tentando ajustar as coisas ...🙂👍

 
Boris_Esparta #:

Ola Daniel,

Muito Obrigado por responder. Há muitos detalhes que gostaria de saber, mas vou dar um passo de cada vez. 

Meu próximo objetivo com esse indicador é o seguinte.  

1 - Eu preciso que o indicador apareça na janela principal do gráfico. 

2 - Minha intenção é operar no gráfico M5 com o indicador no Time Frame de M10. Isso me ajudará da seguinte forma:

- Minhas entradas de COMPRA são feitas nas bandas INFERIORES do canal. Sempre em tendência de ALTA (Quando a linha central estiver VERDE).

- As entradas de VENDA serão feitas nas bandas SUPERIORES do canal. Sempre em tendência de BAIXA  (Quando a linha central estiver ROSA)

3-  ENTENDENDO O PROBLEMA:

- Como se sabe o canal de TMA Repinta /recalcula a cada barra. 

- Essa repintura seria facilmente resolvida com a aplicação do HTF, pois em um Time Frame maior a linha central não muda de cor facilmente quando o preço oscila no gráfico de M5.

- Depois que eu conseguir entender como funciona essa dinâmica de MTF/HTF eu pretendo fazer um Expert Advisor usando essa lógica para pendurar ordens nas bandas do TMA. 

- Com a configuração certa eu conseguirei (i) pendurar ordens nas bandas, (ii) operando no gráfico M5, (iii) com o indicador do Time Frame M10 ou maior, sem que a linha central mude e atrapalhe o funcionamento do Expert. 

- Na tela anexa eu explico no gráfico....

Ok. Você quer que o indicador fique no gráfico, e deseja que ele observe um tempo diferente do que está sendo usado no gráfico. Entendi 🙂👍 ... As demais coisas, não interessam neste momento. Apenas vamos fazer isto que você disse: Colocar o indicador no M10 e usar o gráfico no M5. 😁👍

Seu problema, é muito mais simples do que parece. Olhando agora o código, vejo que existem alguns problemas nele. Isto por que as variáveis globais, estão espalhadas dentro do código. E isto com o tempo, acaba tornando o código completamente instável, ou no minimo dificil de ser corrigido e mantido. Mas, isto é só um alerta que estou lhe dando. Procure agrupar todas as variáveis globais em um ponto do código. De preferencia bem no inicio. Esta coisa de espalhar variáveis globais no código não é uma boa prática de programação. Sendo considerado um erro por alguns programadores.

Mas vamos ao seu problema em si. Existem diversas forma de se fazer o que você deseja. Mas acredito, que para você será mais simples atacar o problema pelo metodo de contagem. Este metodo se baseia no seguinte: Você faz uma contagem de barras. E de tantas em tantas barras você efetua o cálculo para o indicador ser plotado. Supondo que a contagem inicie em um. Então usando apenas os valores pares, já que o MetaTrader 5 abriria uma nova barra a cada 5 minutos. Você faria de fato o cálculo do indicador. Mas tem um detalhe: Não se esqueça de ajustar o valor de HIGH e LOW. Isto para que a barra montada por você usando o M5, possa se parecer com a barra do M10. O valor de OPEN é capturado na abertura da barra IMPAR e o CLOSE será capturado o tempo todo. Mas quando uma nova barra no M10 surgir, você deverá começar a captura do CLOSE novamente. No mesmo instante que faz a captura do OPEN.

Basicamente você estará simulando a criação de um tempo gráfico qualquer. Na série de artigos sobre replay / simulador, eu explico como fazer isto. Depois dê uma estudada naquele material, você com certeza vai aprender muita coisa legal. 😁👍

Muito bem, para que você consiga entender como fazer isto. Estude este indicador que estou deixando aqui. Ele faz exatamente o que você precisa entender. Ou seja. Criar uma simulação para criar a barra de um tempo gráfico maior. No caso duas vezes maior.

//+------------------------------------------------------------------+
#property copyright "Daniel Jose"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
#property indicator_buffers      1
#property indicator_plots        1
#property indicator_type1        DRAW_LINE
//+------------------------------------------------------------------+
input color                      user00 = clrRoyalBlue;  //Cor
//+------------------------------------------------------------------+
double Buff[];
//+------------------------------------------------------------------+
int OnInit()
{
        SetIndexBuffer(0, Buff, INDICATOR_DATA);
        ArrayInitialize(Buff, EMPTY_VALUE);
        PlotIndexSetInteger(0, PLOT_LINE_COLOR, user00);

   return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[],
                const double &open[], const double &high[], const double &low[], const double &close[],
                const long &tick_volume[], const long &volume[], const int &spread[])
{
   for (int c = (prev_calculated > 0 ? prev_calculated - 1 : 0); c < rates_total; c++)
      Buff[c] = (c & 0x1 ? high[c] : low[c]);

   return rates_total;
}
//+------------------------------------------------------------------+

Como o código é muito simples de entender, mesmo para um iniciante. Você entenderá como montar a barra de preço que você quer e precisa para depois calcular o indicador que será plotado no gráfico. Mas comece primeiro entendendo isto que este código faz. Depois dê os próximos passos. 😁👍

 
Daniel Jose #:

Sim. De fato, a abordagem se baseia exatamente nisto. Só que se você estiver usando M10, e que dados do M5, deve respeita a matemática. Caso contrário, irá ter problemas no longo prazo. Explico: No M10 temos metade do numero de barras. Então você precisa usar exatamente o dobro do valor. Se você usar uma barra a mais ou a menos. Conforme o tempo for passando esta uma barra irá se acumular até que você estará defasado ou adiantado em um periodo inteiro. E quanto mais tempo se passar, maior esta defasagem irá acumular. Até que tudo ficar absolutamente bizarro. Então devemos respeitar a matemática. E não ir tentando ajustar as coisas ...🙂👍

Sim, eu entendo a teoria por trás disso. Mas como já há o "erro" ou deveria dizer o "ruído" de dados que não se tem interesse fica que o ajuste visual na minha opinião ainda é o melhor. Mesmo ele tendo de ser feito periodicamente. Fora isso, outras duas abordagens que seriam basicamente pegar o dado propriamente do timeframe mais alto (isso resulta em um desenho mais "reto" que o cliente reclama) e de pegar do timeframe atual somente as velas que se tem interesse, por exemplo queremos 12 velas do M10 no M5 então identificamos a primeira vela que o tempo seja divisivel por 10 e a apartir dai pulamos uma. Igualmente da o problema de desenho não ficando "suave".

Razão: