Indicador faz comparação de 2 Timeframes Diferentes (m1 e M5), porém o gráfico é operado em M5

dogao1987  

Estou montando um indicador que precisa verificar informações de 2 timeframes diferentes ( M1 e M5).

Estou usando o indicador iMA e colocando a informação para M1. 

Tenho uma função "for" para os 2 timeframes, porém a informação de M1 fica repetindo e somente informação de m5 atualiza, LEMBRANDO QUE O GRAFICO ESTÀ ABERTO EM M5. Alguem sabe como ajudar? Fico Grato"

Segue um pedaço do código para exemplo:

No caso do codigo abaixo os resultados de SMA1 para a posição j são iguais. Por exemplo:

Na função print:   Print(SMA1 + "- posicão" +j + "-posição"+i); Para todas as posições 0 de os resultados são o mesmo


 0.9858959966857704- posicão0-posição01

 0.9858959966857704- posicão0-posição02

 0.9858959966857704- posicão0-posição03

0.9858959966857704- posicão0-posição04


O memso é valido para as demais posisções j (0,1,2,3,4,5,6)


//INICIO DO CODIGO EXEMPLO

#property copyright "Copyright 2022, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

double SMA1;

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[])

  {

if(prev_calculated== 0)

    {                

     for( int i=0;i< rates_total;i++)

      {

   //-----------------------------ANÁLISE DO M1----------------------------                 

        for( int j=6;j>-1;j--)

          {

          SMA1 = iMA(Symbol(),1,4,0,MODE_EMA,PRICE_MEDIAN,j+1);                  

          Print(SMA1 + "- posicão" +j + "-posição"+i);

           }                                       

            }

}

//--- return value of prev_calculated for next call

   return(rates_total);

  }
Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2022.10.30
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
Ricardo Almeida Branco  
dogao1987:

Estou montando um indicador que precisa verificar informações de 2 timeframes diferentes ( M1 e M5).

Estou usando o indicador iMA e colocando a informação para M1. 

Tenho uma função "for" para os 2 timeframes, porém a informação de M1 fica repetindo e somente informação de m5 atualiza, LEMBRANDO QUE O GRAFICO ESTÀ ABERTO EM M5. Alguem sabe como ajudar? Fico Grato"

Segue um pedaço do código para exemplo:

No caso do codigo abaixo os resultados de SMA1 para a posição j são iguais. Por exemplo:

Na função print:   Print(SMA1 + "- posicão" +j + "-posição"+i); Para todas as posições 0 de os resultados são o mesmo


 0.9858959966857704- posicão0-posição01

 0.9858959966857704- posicão0-posição02

 0.9858959966857704- posicão0-posição03

0.9858959966857704- posicão0-posição04


O memso é valido para as demais posisções j (0,1,2,3,4,5,6)


Trabalhar em mais de um TF é chato no mql5. Você precisa desenhar o histórico? Senão, sugiro abordar como é feito em EAs: muda a ordem do array, cópia apenas alguns buffers (5 talvez) mas só leia o buffer [0].

Uhm, notei que vc não está fazendo copybuffer.... Vc conferiu se este resultado printado é o resultado correto? Ou o indicador está trazendo um valor aleatório pq vc não preencheu o array com o copybuffer?

dogao1987  
Ricardo Branco #:
Trabalhar em mais de um TF é chato no mql5. Você precisa desenhar o histórico? Senão, sugiro abordar como é feito em EAs: muda a ordem do array, cópia apenas alguns buffers (5 talvez) mas só leia o buffer [0].

Uhm, notei que vc não está fazendo copybuffer.... Vc conferiu se este resultado printado é o resultado correto? Ou o indicador está trazendo um valor aleatório pq vc não preencheu o array com o copybuffer?

Ricardo agradeço a resposta,

Mas sendo sincero, sou bem iniciante na programação, não sei o que o copybuffer.

Se puder me orientar agradeço. Caso tenha uma solução para compartilhar agradeço.  A ideia é que os valores referentes a M1 se atualizem quando M5 for atualizado, o que não está ocorrendo.

Ricardo Almeida Branco  
dogao1987 #:

Ricardo agradeço a resposta,

Mas sendo sincero, sou bem iniciante na programação, não sei o que o copybuffer.

Se puder me orientar agradeço. Caso tenha uma solução para compartilhar agradeço.  A ideia é que os valores referentes a M1 se atualizem quando M5 for atualizado, o que não está ocorrendo.

Olha, você pode procurar os exemplos de indicadores na pasta do mql5/indicadores/examples ou mesmo na codebase.

Mas se você não tem familiaridade com o mql5, uma sugestão é contratar alguém no freelancer para fazer para você. Sei que a gente tenta não pagar mas... As vezes o tempo para aprender e fazer o que você quer fica mais caro do que alguém cobraria para fazer.

Abs.
Daniel Jose  
dogao1987:

Estou montando um indicador que precisa verificar informações de 2 timeframes diferentes ( M1 e M5).

Estou usando o indicador iMA e colocando a informação para M1. 

Tenho uma função "for" para os 2 timeframes, porém a informação de M1 fica repetindo e somente informação de m5 atualiza, LEMBRANDO QUE O GRAFICO ESTÀ ABERTO EM M5. Alguem sabe como ajudar? Fico Grato"

Segue um pedaço do código para exemplo:

No caso do codigo abaixo os resultados de SMA1 para a posição j são iguais. Por exemplo:

Na função print:   Print(SMA1 + "- posicão" +j + "-posição"+i); Para todas as posições 0 de os resultados são o mesmo


 0.9858959966857704- posicão0-posição01

 0.9858959966857704- posicão0-posição02

 0.9858959966857704- posicão0-posição03

0.9858959966857704- posicão0-posição04


O memso é valido para as demais posisções j (0,1,2,3,4,5,6)


😂😂 ... TUDO bem para um iniciante sua falha é compreensível ... Não quero te desmotivar, pelo contrário: QUERO lhe motivar a estudar ainda mais. 😁👍 .... Mas vamos por partes ... ao usar a função iMA, que é uma função de indicador padrão, você não está de fato obtendo o valor calculado ... o que esta função retorna é um handle ( manipulador ) ... Este handle, não contem nenhuma informação além de um ponteiro, para você conseguir ler o buffer do indicador, que no caso é o iMA. Esta a primeira parte. A parte que você de fato irá ter que fazer, é definir melhor o que você deseja e quer obter. Se você deseja obter um sistema de cruzamento de media, você precisará fazer uma coisa. Se deseja apenas obter valores da media, teria que fazer outra coisa. Então definir isto é o primeiro passo.

Uma vez definido isto, você poderá começar a programação em si. Mas independente disto você deverá usar não uma, mais duas chamadas a função iMA. E por que DUAS 🤔 ?!?! O motivo é que uma irá lhe dizer o que está acontecendo no M1 e a outra no M5. Isto lhe deixa livre para poder mudar o timeframe do gráfico. Abaixo lhe mostro o código corrigido com base no que você mostrou ... Acredito que você esteja querendo usar a media exponencial de 8 por conta disto nas linhas 11 e 12 estou usando o valor 8, mas se você quer usar outra média basta trocar o valor 8 pelo desejado ... fazendo assim você irá conseguir trabalhar com o indicador em um gráfico de 15 minutos por exemplo, porém ele estará sempre lhe informando o que esta acontecendo no 1 minuto e no 5 minutos.

A parte que você de fato terá que ajustar no código, além das linhas 11 e 12. É na linha 19, ali estou dizendo que quero saber os dois ultimos valores calculados pelo iMA. Se você desejar saber mais valores, bastará mudar o tamanho do array, de 2 para outro desejado ...

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property indicator_chart_window
04. #property indicator_plots 0
05. //+------------------------------------------------------------------+
06. int handleM1, handleM5;
07. //+------------------------------------------------------------------+
08. int OnInit()
09. {
10.     IndicatorSetString(INDICATOR_SHORTNAME, "Comparação");
11.     handleM1 = iMA(NULL, PERIOD_M1, 8, 0, MODE_EMA, PRICE_CLOSE);
12.     handleM5 = iMA(NULL, PERIOD_M5, 8, 0, MODE_EMA, PRICE_CLOSE);
13.     
14.     return INIT_SUCCEEDED;
15. }
16. //+------------------------------------------------------------------+
17. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
18. {
19.     double Buff_M1[2], Buff_M5[2];
20.     int i0;
21.     
22.     if (CopyBuffer(handleM1, 0, 0, i0 = ArraySize(Buff_M1), Buff_M1) < i0) return rates_total;
23.     if (CopyBuffer(handleM5, 0, 0, i0 = ArraySize(Buff_M5), Buff_M5) < i0) return rates_total;
24.     
25. // ... USO dos valores dos buffers.
26.     
27.     return rates_total;
28. }
29. //+------------------------------------------------------------------+

Acredito que você irá precisar de mais informações ao longo do tempo. Que tal então ler estas serie de artigos que estou postando. É sobre como criar um EA 100% automático. Serão 15 artigos, um por semana. Esta semana deve sair o artigo 4, mas você pode ver o artigo 3 neste link:https://www.mql5.com/pt/articles/11226, Além deste, dê uma olhada nos meus outros artigos, eles poderão lhe ajudar bastante ... E não desista pois no começo parece complicado, mas se você tiver de fato interesse em aprender irá ver que o MetaTrader 5 tem muito a oferecer ... 😁👍

Aprendendo a construindo um EA que opera de forma automática (Parte 03): Novas funções
Aprendendo a construindo um EA que opera de forma automática (Parte 03): Novas funções
  • www.mql5.com
Aprenda como criar um EA que opera de forma automática, isto de forma simples e o mais seguro possível. No artigo anterior começamos o desenvolvimento do sistema de ordens, para ser utilizado no EA automático, no entanto, ali montamos apenas e somente uma das funções.
dogao1987  
Daniel Jose #:

😂😂 ... TUDO bem para um iniciante sua falha é compreensível ... Não quero te desmotivar, pelo contrário: QUERO lhe motivar a estudar ainda mais. 😁👍 .... Mas vamos por partes ... ao usar a função iMA, que é uma função de indicador padrão, você não está de fato obtendo o valor calculado ... o que esta função retorna é um handle ( manipulador ) ... Este handle, não contem nenhuma informação além de um ponteiro, para você conseguir ler o buffer do indicador, que no caso é o iMA. Esta a primeira parte. A parte que você de fato irá ter que fazer, é definir melhor o que você deseja e quer obter. Se você deseja obter um sistema de cruzamento de media, você precisará fazer uma coisa. Se deseja apenas obter valores da media, teria que fazer outra coisa. Então definir isto é o primeiro passo.

Uma vez definido isto, você poderá começar a programação em si. Mas independente disto você deverá usar não uma, mais duas chamadas a função iMA. E por que DUAS 🤔 ?!?! O motivo é que uma irá lhe dizer o que está acontecendo no M1 e a outra no M5. Isto lhe deixa livre para poder mudar o timeframe do gráfico. Abaixo lhe mostro o código corrigido com base no que você mostrou ... Acredito que você esteja querendo usar a media exponencial de 8 por conta disto nas linhas 11 e 12 estou usando o valor 8, mas se você quer usar outra média basta trocar o valor 8 pelo desejado ... fazendo assim você irá conseguir trabalhar com o indicador em um gráfico de 15 minutos por exemplo, porém ele estará sempre lhe informando o que esta acontecendo no 1 minuto e no 5 minutos.

A parte que você de fato terá que ajustar no código, além das linhas 11 e 12. É na linha 19, ali estou dizendo que quero saber os dois ultimos valores calculados pelo iMA. Se você desejar saber mais valores, bastará mudar o tamanho do array, de 2 para outro desejado ...

Acredito que você irá precisar de mais informações ao longo do tempo. Que tal então ler estas serie de artigos que estou postando. É sobre como criar um EA 100% automático. Serão 15 artigos, um por semana. Esta semana deve sair o artigo 4, mas você pode ver o artigo 3 neste link:https://www.mql5.com/pt/articles/11226, Além deste, dê uma olhada nos meus outros artigos, eles poderão lhe ajudar bastante ... E não desista pois no começo parece complicado, mas se você tiver de fato interesse em aprender irá ver que o MetaTrader 5 tem muito a oferecer ... 😁👍

Valeu DANIEL!!! CARA SHOW D+ Ter dado essa moral! Vou estudar aqui e verificar as melhorias! Daniel uma coisa que eu percebi,  que estou usando o MQL4 e não achei o COPYBUFER nele....alguma dica.

Muito obrigado! Precisando estou a disposição!

Abraço
Ricardo Rodrigues Lucca  
dogao1987 #:
Valeu DANIEL!!! CARA SHOW D+ Ter dado essa moral! Vou estudar aqui e verificar as melhorias! Daniel uma coisa que eu percebi,  que estou usando o MQL4 e não achei o COPYBUFER nele....alguma dica.

Muito obrigado! Precisando estou a disposição!

Abraço

Uma dica minha se vai usar o MQL4, olha a documentação de migração para MQL5 que as vezes a gente assumi que é MQL5 e dai tu pode ver lá a função equivalente em MQL4. Um dos exemplos que lembro é que o MQL5 trabalha com indicadores de maneira diferente, nele é criado um handle e depois copiado os dados de tempos em tempos via copybuffer. Já no MQL4 isso não é feito assim, se voce usar iMA o que vai ser devolvido é o valor da média e não um handler já que não existe copybuffer.

Razão: