Valores high e low do primeiro candle do dia

Para adicionar comentários, por favor Faça o login ou registrar
Ruy Christian Hoffmann
713
Ruy Christian Hoffmann  

Olá amigos, 

Desta vez to precisando de uma ajudinha....

No gráfico de 6 minutos, consigo pegar com meu EA os valores high e low do primeiro candle do dia atual sem problema algum quando inicio o EA antes de abrir o pregão.

O problema está quando ativo o EA no decorrer do dia, dai não estou conseguindo pegar o valor do primeiro candle do dia de forma simples. Fiz uma instrução enorme e nada funcional: converto em segundos, dai comparo a hora atual com 9:00h (abertura), subtraio, multiplico por minutos, divido por qtd de candles, para depois saber quantos candles para usar no CopyRates e contar para trás ... enfim... ficou um negócio complexo e nada funcional.

Deve ter alguma forma mais simples de pegar os valores high e low do primeiro candle independente da hora que o EA foi ativado, mas eu não consegui.

Se alguém tiver ai alguma dica ou código para me ajudar, agradeço muito.

Joscelino
907
Joscelino  
Ruy Christian Hoffmann:

Olá amigos, 

Desta vez to precisando de uma ajudinha....

No gráfico de 6 minutos, consigo pegar com meu EA os valores high e low do primeiro candle do dia atual sem problema algum quando inicio o EA antes de abrir o pregão.

O problema está quando ativo o EA no decorrer do dia, dai não estou conseguindo pegar o valor do primeiro candle do dia de forma simples. Fiz uma instrução enorme e nada funcional: converto em segundos, dai comparo a hora atual com 9:00h (abertura), subtraio, multiplico por minutos, divido por qtd de candles, para depois saber quantos candles para usar no CopyRates e contar para trás ... enfim... ficou um negócio complexo e nada funcional.

Deve ter alguma forma mais simples de pegar os valores high e low do primeiro candle independente da hora que o EA foi ativado, mas eu não consegui.

Se alguém tiver ai alguma dica ou código para me ajudar, agradeço muito.

Como eu faria:

- Usaria a estutura MqlRates;

MqlRates                candle[];

- utilizaria o ArraySetAsSeries na variavel candle[];

- Criaria uma variável int para contar o numero de barras (conta_barras);

- Criaria variáveis do tipo static para armazenar os valores OHLC do primeiro candle;

- Apos verificar a formação do 2o candle, eu armazenaria os dados do 1o candle nas variaveis static. Dai poderia utiliza-las a qualquer momento.

- A logica ficaria mais ou menos assim:

if(conta_barras==2){variavel_static_1=candle[1].open;variavel_static_2=candle[1].high;variavel_static_3=candle[1].low;variavel_static_4=candle[1].close;}

OBSERVAÇÃO: Pensei isto em face do que escreveu. Precisa testar. De qualquer forma, acredito que ocupe um numero menor de linhas de código e que vai funcionar.

Para verificar a formação de nova barra, caso você não conheça, pode utilizar este artigo.

Handler de evento "nova barra"
Handler de evento "nova barra"
  • www.mql5.com
Os autores dos indicadores e especialistas sempre estiveram interessados em escrever o código compacto em termos de tempo de execução. Você pode resolver este problema a partir de diferentes ângulos. A partir deste amplo tópico neste artigo, cobriremos o problema, que aparentemente foi solucionado: verifique por uma nova barra. Este é um meio...
Ruy Christian Hoffmann
713
Ruy Christian Hoffmann  
Joscelino Celso de Oliveira:

Como eu faria:

- Usaria a estutura MqlRates;

- utilizaria o ArraySetAsSeries na variavel candle[];

- Criaria uma variável int para contar o numero de barras (conta_barras);

- Criaria variáveis do tipo static para armazenar os valores OHLC do primeiro candle;

- Apos verificar a formação do 2o candle, eu armazenaria os dados do 1o candle nas variaveis static. Dai poderia utiliza-las a qualquer momento.

- A logica ficaria mais ou menos assim:

if(conta_barras==2){variavel_static_1=candle[1].open;variavel_static_2=candle[1].high;variavel_static_3=candle[1].low;variavel_static_4=candle[1].close;}

OBSERVAÇÃO: Pensei isto em face do que escreveu. Precisa testar. De qualquer forma, acredito que ocupe um numero menor de linhas de código e que vai funcionar.

Para verificar a formação de nova barra, caso você não conheça, pode utilizar este artigo.

Olá Joscelino,

Achei legal sua solução. Agora estou com a cabeça cansada demais, preciso de uma pausa. Mas à noite faço e te falo se deu certo ou não.

Obrigado amigo e grande abraço.

Vinicius de Oliveira
2724
Vinicius de Oliveira  
Ruy Christian Hoffmann:


Ruy, depois de identificar o horário de abertura (time), você pode utilizar a função abaixo para localizar a barra que deseja:

int  iBarShift( 
   const string        symbol,          // Symbol 
   ENUM_TIMEFRAMES     timeframe,       // Period 
   datetime            time,            // Time 
   bool                exact=false      // Mode 
   );



//--- Exemplos:

HighOpenBar = iHigh(NULL, PERIOD_CURRENT, iBarShift(NULL, PERIOD_CURRENT, OpenTime, true));
LowOpenBar  = iLow (NULL, PERIOD_CURRENT, iBarShift(NULL, PERIOD_CURRENT, OpenTime, true));



//--- Verificar se a barra foi realmente localizada:

if(HighOpenBar > 0) ...

if(LowOpenBar > 0) ...
Ruy Christian Hoffmann
713
Ruy Christian Hoffmann  
Ruy Christian Hoffmann:

Olá Joscelino,

Achei legal sua solução. Agora estou com a cabeça cansada demais, preciso de uma pausa. Mas à noite faço e te falo se deu certo ou não.

Obrigado amigo e grande abraço.

Bom dia Joscelino,

Rapaz... nada como um descanso + dica do amigo para aparecer uma solução. 

Inspirado na sua ideia eu fiz o código abaixo, pode não ter ficado tão bonito quanto a função do Vinícius, mas está funcionando, veja:

   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(_Symbol,_Period,0,81,rates);

   int HoraLimite=480;
   MqlDateTime RelogioBarra;
   TimeToStruct(rates[0].time,RelogioBarra);
   int Minutos=RelogioBarra.hour-9;
   if(Minutos!=0)
      Minutos = Minutos*60;
   
   Minutos=Minutos+RelogioBarra.min;
   int BarrasQtd=Minutos/Period();
   
   B1High=rates[BarrasQtd].high;
   B1Low=rates[BarrasQtd].low;
   B1Close=rates[BarrasQtd].close;

... e antes de ler o acima coloquei condicional que precisa ser entre 9-17h no M6.

E Vinícius, quando eu vi sua mensagem já tinha feito o código acima, mas o seu parece que ficou mais bem feito que o meu, profissional! Vou testar e usá-lo.

Obrigado Joscelino,

Obrigado Vinícius.

Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
Alugar um servidor virtual diretamente dos terminais MetaTrader 4 e MetaTrader 5 é a melhor maneira de garantir um trabalho ininterrupto de seus robôs de negociação e das assinaturas de Sinais. Essencialmente, ele é análogo a um VPS, no entanto, ele é melhor e mais adequado para atender às necessidades e desafios que um trader se depara. O...
Joscelino
907
Joscelino  
Ruy Christian Hoffmann:

Bom dia Joscelino,

Rapaz... nada como um descanso + dica do amigo para aparecer uma solução. 

Inspirado na sua ideia eu fiz o código abaixo, pode não ter ficado tão bonito quanto a função do Vinícius, mas está funcionando, veja:

... e antes de ler o acima coloquei condicional que precisa ser entre 9-17h no M6.

E Vinícius, quando eu vi sua mensagem já tinha feito o código acima, mas o seu parece que ficou mais bem feito que o meu, profissional! Vou testar e usá-lo.

Obrigado Joscelino,

Obrigado Vinícius.

#Tmj @Ruy Christian Hoffmann!

$uce$$o!

Vinicius de Oliveira
2724
Vinicius de Oliveira  
Ruy Christian Hoffmann:


Feliz em colaborar.

Abraço.

Para adicionar comentários, por favor Faça o login ou registrar