Indicadores: Prior Cote - AJUSTE ( modo calculo local ) para DOL , IND, WDO e WIN - página 2

 
Daniel Jose #:

Dê uma olhada neste artigo : https://www.mql5.com/pt/articles/10329 ele irá lhe ajudar a entender como fazer ... 😁👍

Maravilha, vou dar uma olhada.

Sabes me dizer qual é o parâmetro que tenho que buscar pra pegar o valor calculado?
 

E esqueci de perguntar uma coisa, tanto o indicador da VWAP quanto o do Prior Cote, eles conseguem buscar os dados do dia anterior também?

 
Max Souza #:

E esqueci de perguntar uma coisa, tanto o indicador da VWAP quanto o do Prior Cote, eles conseguem buscar os dados do dia anterior também?

Sim ... é só você fazer o calculo com os dados do dia anterior ... 

 
Daniel Jose #:

Sim ... é só você fazer o calculo com os dados do dia anterior ... 

Daniel, eu juro que tentei entender de todo jeito kkk

Mas acredito que vá além da forma que eu sei programar...


Poderia me dar uma luz do que fazer para pegar o buffer do dia anterior e do atual?

 
Max Souza #:

Daniel, eu juro que tentei entender de todo jeito kkk

Mas acredito que vá além da forma que eu sei programar...


Poderia me dar uma luz do que fazer para pegar o buffer do dia anterior e do atual?

Você não precisa ter este trabalho 😂😁 ... o MetaTrader 5 faz isto para você ...😁👍 ... tudo que você precisa fazer é ler e usar as informações que o MetaTrader estará lhe fornecendo ... Procure estudar sobre a função OnCalculate e os parâmetros que esta função recebe, pois o segredo está ali ... é bem simples uma vez que você entenda como OnCalculate funciona ... Novamente você não precisa procurar os dados, apenas leia e use o que lhe é fornecido via OnCalculate ... se você precisar procurar os dados, será muito mais trabalhoso além de ser mais lento ... 😁👍

Documentação sobre MQL5: Elementos Básicos da Linguagem / Funções / Funções de Manipulação de Evento
Documentação sobre MQL5: Elementos Básicos da Linguagem / Funções / Funções de Manipulação de Evento
  • www.mql5.com
Funções de Manipulação de Evento - Funções - Elementos Básicos da Linguagem - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Daniel Jose #:

Você não precisa ter este trabalho 😂😁 ... o MetaTrader 5 faz isto para você ...😁👍 ... tudo que você precisa fazer é ler e usar as informações que o MetaTrader estará lhe fornecendo ... Procure estudar sobre a função OnCalculate e os parâmetros que esta função recebe, pois o segredo está ali ... é bem simples uma vez que você entenda como OnCalculate funciona ... Novamente você não precisa procurar os dados, apenas leia e use o que lhe é fornecido via OnCalculate ... se você precisar procurar os dados, será muito mais trabalhoso além de ser mais lento ... 😁👍

Kkkkkkkk

Obrigado pela dica, vou estudar aqui e tentar fazer isto.

A estratégia que eu preciso montar precisa do valor do ajuste do dia anterior e do dia atual, e só falta isso pra eu poder colocar em funcionamento, mas to travado a semanas nisso kkkk

Vou tentar aqui!

 
Max Souza #:

Kkkkkkkk

Obrigado pela dica, vou estudar aqui e tentar fazer isto.

A estratégia que eu preciso montar precisa do valor do ajuste do dia anterior e do dia atual, e só falta isso pra eu poder colocar em funcionamento, mas to travado a semanas nisso kkkk

Vou tentar aqui!


Não teve jeito, eu não consigo entender como manipular o rates_total pra pegar os dados do dia em que eu quero.

 

Fala Daniel!

Precisando demais da tua ajuda kkkk

Eu até consegui fazer com que plotasse o prior cote do dia anterior mudando o valor do cálculo aqui

#define macroGetDate(A) (A - (A % (48*60*60)))

Porém, não consegui fazer com que parasse no dia anterior, ele segue sendo executado no dia atual, e não é o que eu quero.

Eu preciso do prior cote do dia passado, e do dia atual de forma separada, e para isso, até tentei fazer dois indicadores para isso kkkk.

E também não consegui mudando o shift desse parte do OnCalculate.

for(int c0 = rates_total - 1; macroGetDate(time[siPos]) != macroGetDatePlot(time[c0]); siPos++);


Tentei mudar essas variáveis de d1 e d2 no CopyRates, mas segue pegando o dia atual também...

E por fim, não sei o que fazer... Poderias me ajudar?

 
Max Souza #:

Fala Daniel!

Precisando demais da tua ajuda kkkk

Eu até consegui fazer com que plotasse o prior cote do dia anterior mudando o valor do cálculo aqui

#define macroGetDate(A) (A - (A % (48*60*60)))

Porém, não consegui fazer com que parasse no dia anterior, ele segue sendo executado no dia atual, e não é o que eu quero.

Eu preciso do prior cote do dia passado, e do dia atual de forma separada, e para isso, até tentei fazer dois indicadores para isso kkkk.

E também não consegui mudando o shift desse parte do OnCalculate.

for(int c0 = rates_total - 1; macroGetDate(time[siPos]) != macroGetDatePlot(time[c0]); siPos++);


Tentei mudar essas variáveis de d1 e d2 no CopyRates, mas segue pegando o dia atual também...

E por fim, não sei o que fazer... Poderias me ajudar?

Você está mexendo nos pontos errados do código ...🤣🤣😂😂... apesar desta versão que disponibilizei estar bem obsoleta, ela ainda assim consegue fazer o seu trabalho ... Mas vamos a questão: Pelo que entendi você deseja o valor do ajuste D - 1 e D - 2, já que D + 0 é o valor que irá sair no final do dia em que o ativo está sendo negociado. Ok ?!?! Se for este o caso, esqueça estas mudanças que você está tentando fazer, ela não irão de fato funcionar. O motivo é que você está imaginando que o calculo é feito de uma forma, sendo que ele é feito de uma forma totalmente diferente. Acredito que você esteja pensando assim, por falta de experiência em programação, principalmente em C / C++. Mas tudo bem, estamos aqui para ajudar...😁👍

Tudo que você precisa fazer é modificar um ponto bem especifico no código. O original está da forma como mostro abaixo:

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[])
  {
   static int   siPos = 0;
   static double  sdValue = 0;
   datetime   dt = TimeLocal();
   int     shift = 0;

   if(rates_total == 0)
      return rates_total;
   if(macroGetDate(dt) != macroGetDate(time[rates_total - 1]))
     {
      shift = 0;
      sdValue = 0;
      siPos = rates_total - 1;
     }
   else

A linha destacada em verde precisa ser modificado, mas o principal é a linha em amarelo. Basta mudar isto ... Se a mudança for feita da forma correta, você pode retornar quantos dias, meses ou anos que desejar. Mas lembre-se de uma coisa. Você terá que ajustar uma outra parte do código. Porém, para evitar fazer tais mudanças, o que apenas iria lhe confundir se eu mostrasse aqui, vamos facilitar a sua vida. Assim sendo, vamos mudar um pouco o código original. Faça as seguintes mudanças:

Primeiro, na lista de parâmetros para ajuste do usuário, adicione a seguinte linha em destaque abaixo:

input color   user01 = clrOrange;  //Cor
input eTypePrior  user02 = PRIOR_COTE;  //Linha indicadora.
input datetime user03; //Data do ajuste.

Isto irá permitir ao usuário indicar qual a data que você deseja saber o ajuste 😁👍 ... agora mude o código no seguintes pontos:

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[])
  {
   static int   siPos = 0;
   static double  sdValue = 0;
   datetime   dt = TimeLocal();
   datetime   dt = user03;
   int     shift = 0;

   if(rates_total == 0)
      return rates_total;
   if(macroGetDate(dt) != macroGetDate(time[rates_total - 1]))
     {
      shift = 0;
      sdValue = 0;
      siPos = rates_total - 1;
      for (siPos = 0; macroGetDate(dt) != macroGetDate(time[siPos]); siPos++);
     }
   else

As linhas riscadas devem ser removidas, veja que eram as mesmas em destaque no original e no lugar delas adicionar a linhas destacadas. Repare onde a data que o usuário informa é usada. Mas o principal é a linha em verde. Ela irá procurar e ajustar o deslocamento em numero de barras para encontrar a data informada pelo usuário. DETALHE: Não estou testando se na data o ativo existe ou não. Então cuidado, pois se você informar uma data que não existe, o indicador poderá entrar em um loop infinito, ou mesmo quebrar. Deixo a solução pra este problema como lição de casa. Mas não é algo complicado de ser feito. A dica é: Basta antes de entrar no laço, você adicionar um teste a fim de evitar usar uma data muito antiga. Ou pode fazer diferente. Testando se o ativo existe em tal data, isto já dentro do laço. De qualquer forma, fique atento a este detalhe.

Uma vez que esta linha verde encontrar o index da data desejada pelo usuário. O laço irá finalizar, e o ajuste daquele dia, desejado será calculado como esperado. Uma outra observação é que dependendo do contrato, a linha de ajuste, pode estar deslocada em relação ao ponto esperado no gráfico. E é isto dai 😎 ... não precisa de toda esta confusão que você estava tendo fazer ...😂😂... mas entendo você, pois no começo eu também fazia as mesmas confusões ... 😂😁👍

Mas não desanime. Estude, e procure entender o código. Não se esqueça, de olhar a seção de ARTIGOS, pois lá posto muita coisa, que pode lhe ajudar nesta questão sobre programação. Inclusive lá explico detalhadamente todo o código que estou utilizando e mostrando como o desenvolvimento do mesmo vai ocorrendo ao longo do tempo...😁👍

 
Daniel Jose #:

Você está mexendo nos pontos errados do código ...🤣🤣😂😂... apesar desta versão que disponibilizei estar bem obsoleta, ela ainda assim consegue fazer o seu trabalho ... Mas vamos a questão: Pelo que entendi você deseja o valor do ajuste D - 1 e D - 2, já que D + 0 é o valor que irá sair no final do dia em que o ativo está sendo negociado. Ok ?!?! Se for este o caso, esqueça estas mudanças que você está tentando fazer, ela não irão de fato funcionar. O motivo é que você está imaginando que o calculo é feito de uma forma, sendo que ele é feito de uma forma totalmente diferente. Acredito que você esteja pensando assim, por falta de experiência em programação, principalmente em C / C++. Mas tudo bem, estamos aqui para ajudar...😁👍

Tudo que você precisa fazer é modificar um ponto bem especifico no código. O original está da forma como mostro abaixo:

A linha destacada em verde precisa ser modificado, mas o principal é a linha em amarelo. Basta mudar isto ... Se a mudança for feita da forma correta, você pode retornar quantos dias, meses ou anos que desejar. Mas lembre-se de uma coisa. Você terá que ajustar uma outra parte do código. Porém, para evitar fazer tais mudanças, o que apenas iria lhe confundir se eu mostrasse aqui, vamos facilitar a sua vida. Assim sendo, vamos mudar um pouco o código original. Faça as seguintes mudanças:

Primeiro, na lista de parâmetros para ajuste do usuário, adicione a seguinte linha em destaque abaixo:

Isto irá permitir ao usuário indicar qual a data que você deseja saber o ajuste 😁👍 ... agora mude o código no seguintes pontos:

As linhas riscadas devem ser removidas, veja que eram as mesmas em destaque no original e no lugar delas adicionar a linhas destacadas. Repare onde a data que o usuário informa é usada. Mas o principal é a linha em verde. Ela irá procurar e ajustar o deslocamento em numero de barras para encontrar a data informada pelo usuário. DETALHE: Não estou testando se na data o ativo existe ou não. Então cuidado, pois se você informar uma data que não existe, o indicador poderá entrar em um loop infinito, ou mesmo quebrar. Deixo a solução pra este problema como lição de casa. Mas não é algo complicado de ser feito. A dica é: Basta antes de entrar no laço, você adicionar um teste a fim de evitar usar uma data muito antiga. Ou pode fazer diferente. Testando se o ativo existe em tal data, isto já dentro do laço. De qualquer forma, fique atento a este detalhe.

Uma vez que esta linha verde encontrar o index da data desejada pelo usuário. O laço irá finalizar, e o ajuste daquele dia, desejado será calculado como esperado. Uma outra observação é que dependendo do contrato, a linha de ajuste, pode estar deslocada em relação ao ponto esperado no gráfico. E é isto dai 😎 ... não precisa de toda esta confusão que você estava tendo fazer ...😂😂... mas entendo você, pois no começo eu também fazia as mesmas confusões ... 😂😁👍

Mas não desanime. Estude, e procure entender o código. Não se esqueça, de olhar a seção de ARTIGOS, pois lá posto muita coisa, que pode lhe ajudar nesta questão sobre programação. Inclusive lá explico detalhadamente todo o código que estou utilizando e mostrando como o desenvolvimento do mesmo vai ocorrendo ao longo do tempo...😁👍

Fala Daniel!

Muitíssimo obrigado, eu vou fazer aqui acredito que eu consiga seguir daqui em diante.

Vi que agora, o input DT busca uma variável datetime, e consegui entender esta parte que ele irá percorrer até a data inputada em user03

Mas para que tu consigas entender o que eu quero fazer, é exatamente isto aqui...


Esse indicador que estou querendo criar em MQL5 eu já criei ele no Profit, são estas duas linhas azul marinho e vermelha que estão no gráfico.

Mas para isso, eu preciso do ajuste utilizado no dia anterior, que está ali em amarelo como Ajuste 1, e o do dia atual, que está ali como Ajuste 2 (que é o que o teu algoritmo calcula), e plotar deste mesmo formato.

Irei tentar fazer aqui com a grande dica que me deu, e ver se consigo chegar neste resultado.

Coloquei em anexo aqui para que consigas entender bem...

Obrigado!!

Arquivos anexados: