Como obter o preço no segundo X do candle de 1M?

 

Olá,

Sou iniciante na programação de EAs e estou trabalhando em um projeto que analisa a diferença de preços entre dois pontos no tempo, em segundos.
Meu objetivo é identificar esticada de preços em curtos períodos de tempo. 

Já tenho um robô que analisa essa "esticada" em segundos, utilizando-se isso:

TimeCurrent() <= (iTime(NULL, PERIOD_M1, 0) + 5)

O problema é que o parâmetro que utilizo para obter o primeiro preço é o iOpen e este, obviamente, é o preço da abertura da barra... Ou seja, não consigo pegar a diferença de preço entre o segundo 5 e 10 da barra, pois o iOpen sempre se baseia no início da barra.
Agradeceria muito se alguém me desse uma ideia de como obter o preço em determinado segundo da barra (segundo 5, por exemplo)... 
Grande abraço a todos!

 
Marcelo Peres:

Olá,

Sou iniciante na programação de EAs e estou trabalhando em um projeto que analisa a diferença de preços entre dois pontos no tempo, em segundos.
Meu objetivo é identificar esticada de preços em curtos períodos de tempo. 

Já tenho um robô que analisa essa "esticada" em segundos, utilizando-se isso:

TimeCurrent() <= (iTime(NULL, PERIOD_M1, 0) + 5)

O problema é que o parâmetro que utilizo para obter o primeiro preço é o iOpen e este, obviamente, é o preço da abertura da barra... Ou seja, não consigo pegar a diferença de preço entre o segundo 5 e 10 da barra, pois o iOpen sempre se baseia no início da barra.
Agradeceria muito se alguém me desse uma ideia de como obter o preço em determinado segundo da barra (segundo 5, por exemplo)... 
Grande abraço a todos!

Olá. Se a barra está em formação, o iClose vai trazer o preço atual, veja se te atende...
 
Ricardo Branco #:
Olá. Se a barra está em formação, o iClose vai trazer o preço atual, veja se te atende...

Olá, Ricardo! Obrigado pela ajuda. 
Utilizo a diferença entre iClose e iOpen... o problema disso é que apenas consigo obter a diferença do preço atual em relação ao inicial da barra... Gostaria de obter a diferença do preço atual (iClose) com aquele que ocorreu no 5º segundo da barra, por exemplo. 

 
Marcelo Peres #:

Olá, Ricardo! Obrigado pela ajuda. 
Utilizo a diferença entre iClose e iOpen... o problema disso é que apenas consigo obter a diferença do preço atual em relação ao inicial da barra... Gostaria de obter a diferença do preço atual (iClose) com aquele que ocorreu no 5º segundo da barra, por exemplo. 

Usa o OnTimer() e pega o preço no periodo que vc quer e coloca numa variável

 
Rodrigo Pagani #:

Usa o OnTimer() e pega o preço no periodo que vc quer e coloca numa variável

Olá, obrigado Rodrigo. 
POr causa de outras funções do robô que usa o OnTick(), eu preferiria manter assim.
Vou insistir, por enquanto, no OnTick().
De qualquer forma, muito obrigado pela dica!

 
Marcelo Peres:

Olá,

Sou iniciante na programação de EAs e estou trabalhando em um projeto que analisa a diferença de preços entre dois pontos no tempo, em segundos.
Meu objetivo é identificar esticada de preços em curtos períodos de tempo. 

Já tenho um robô que analisa essa "esticada" em segundos, utilizando-se isso:

TimeCurrent() <= (iTime(NULL, PERIOD_M1, 0) + 5)

O problema é que o parâmetro que utilizo para obter o primeiro preço é o iOpen e este, obviamente, é o preço da abertura da barra... Ou seja, não consigo pegar a diferença de preço entre o segundo 5 e 10 da barra, pois o iOpen sempre se baseia no início da barra.
Agradeceria muito se alguém me desse uma ideia de como obter o preço em determinado segundo da barra (segundo 5, por exemplo)... 
Grande abraço a todos!

Provavelmente, voce está procurando ao inves de iOpen() a função CopyTicks(), voce pode pegar os negocios fechados anteriormente com isso voce vai conseguir fazer as operações que quiser entre os segundos 5 e 10 de cada vela... só recomendaria para usar CopyTicks() trocar do OnTick() para o OnTimer(). Tem também uma função SymbolInfoTick() que retorna só os dados do último tick...
 
Marcelo Peres:

Olá,

Sou iniciante na programação de EAs e estou trabalhando em um projeto que analisa a diferença de preços entre dois pontos no tempo, em segundos.
Meu objetivo é identificar esticada de preços em curtos períodos de tempo. 

Já tenho um robô que analisa essa "esticada" em segundos, utilizando-se isso:

TimeCurrent() <= (iTime(NULL, PERIOD_M1, 0) + 5)

O problema é que o parâmetro que utilizo para obter o primeiro preço é o iOpen e este, obviamente, é o preço da abertura da barra... Ou seja, não consigo pegar a diferença de preço entre o segundo 5 e 10 da barra, pois o iOpen sempre se baseia no início da barra.
Agradeceria muito se alguém me desse uma ideia de como obter o preço em determinado segundo da barra (segundo 5, por exemplo)... 
Grande abraço a todos!


Olá,


Este é um exemplo (a ser trabalhado) pra ajudar a clarear as ideias aí:

//+------------------------------------------------------------------+
//| Price per second function (current bar M1)                       |
//+------------------------------------------------------------------+
double PricePerSecond(int sec)
  {
   MqlTick tick_array[];
   ulong from = iTime(_Symbol, PERIOD_M1, 0) * 1000;
   int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_INFO, from, 1000000);
   if(received < 0)
     {
      Print("Error getting tick history...");
      return(EMPTY_VALUE);
     }
   int ticks = ArraySize(tick_array);
   for(int i = 0; i < ticks; i ++)
     {
      if(sec <= int((tick_array[i].time_msc - from) / 1000))
        {
         return(tick_array[i].bid);
        }
     }
   return(EMPTY_VALUE);
  }


Em 1 segundo podem ocorrer várias mudanças no preço. A função está retornando o primeiro preço.

Não sei como ficará a questão de desempenho do código. Tem que ver isso também. Veja se é interessante utilizar também ArrayFree.



EDIT.1: Outra forma seria utilizar variáveis para ir guardando os valores que lhe interessam (não sei como, em que momento, você pretende utilizar esses valores) ...

. . .

 
Vinicius de Oliveira #:


Olá,


Este é um exemplo (a ser trabalhado) pra ajudar a clarear as ideias aí:


Em 1 segundo podem ocorrer várias mudanças no preço. A função está retornando o primeiro preço.

Não sei como ficará a questão de desempenho do código. Tem que ver isso também. Veja se é interessante utilizar também ArrayFree.



EDIT.1: Outra forma seria utilizar variáveis para ir guardando os valores que lhe interessam (não sei como, em que momento, você pretende utilizar esses valores) ...

. . .

Obrigado Ricardo e Vinicius pelo tempo e ajuda de vocês! 
Estudarei as opções!

Abraço

 
Marcelo Peres #:

Olá, obrigado Rodrigo. 
POr causa de outras funções do robô que usa o OnTick(), eu preferiria manter assim.
Vou insistir, por enquanto, no OnTick().
De qualquer forma, muito obrigado pela dica!

A solução para o seu problema, é simples. Não é usar o EA ... esqueça o EA. Você deve usar um indicador para fazer esta analise para você. Depois você usar a função CopyBuffer no EA a fim de ler os dados que estarão vindo do indicador. Será bem mais simples fazer assim. Uma outra forma um pouco mais complicada seria usar um script para substituir o indicador. Mas ao fazer uso do script você iria precisar lançar os dados para o EA de outra forma.

Bem, seria necessário saber mais detalhes a fim de lhe ajudar realmente. Mas considerando que você queira saber 2 valores, de tempos em tempos. A solução mais simples, para você que é iniciante é de fato fazer uso do indicador. Se você conhece-se mais de programação, a solução mais simples seria usar as variáveis globais de terminal. Mas sendo iniciante, vamos usar o indicador.

Antes deixe-me dizer uma coisa: NÃO USE A FUNÇÃO ONTICK NO EA. Salvo isto seja extremamente necessário. Estou postando uma serie de artigos sobre como criar um EA 100% automático, e lá explico melhor sobre esta questão. O artigo 3 pode ser visto neste link: https://www.mql5.com/pt/articles/11226, esta semana deverá sair o artigo 4. E toda semana irá sair um artigo, num total de 15. Leia estes artigos, pois eles vão lhe ajudar.

Agora o indicador seria como mostrado abaixo. Claro você terá que providenciar a leitura do mesmo via CopyBuffer no EA. Ele irá ter no buffer os dois ultimos preços ... com um retardo de 5 segundos mais ou menos entre eles.

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property indicator_chart_window
04. #property indicator_plots 0
05. #property indicator_buffers 1
06. #property indicator_applied_price PRICE_CLOSE
07. //+------------------------------------------------------------------+
08. double Buff[];
09. //+------------------------------------------------------------------+
10. int OnInit()
11. {
12.     IndicatorSetString(INDICATOR_SHORTNAME, "Ultimo Preço");
13.     SetIndexBuffer(0, Buff, INDICATOR_DATA);
14.     ArrayInitialize(Buff, EMPTY_VALUE);
15.     
16.     return INIT_SUCCEEDED;
17. }
18. //+------------------------------------------------------------------+
19. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
20. {
21.     static datetime sdt = 0;
22.     static double p = 0;
23.     datetime dt = (TimeCurrent() % 86400);
24. 
25.     if ((sdt + 5) > dt) return rates_total; else sdt = dt;
26.     if (p == 0) p = price[rates_total - 1]; else
27.     {
28.             Buff[rates_total - 2] = p;
29.             p = Buff[rates_total - 1] = price[rates_total - 1];
30.     }
31.     
32.     return rates_total;
33. }
34. //+------------------------------------------------------------------+

Espero que ele lhe dê alguma direção, mas independente disto. Não deixe de ler os artigos. Se você tiver duvidas em como usar a função CopyBuffer. Leia os meus artigos mais antigos, lá tem uma vasta explicação de como ler o Buffer do indicador.

Já que o código é bastante simples, acredito que mesmo sendo iniciante você não terá problemas em compreender o mesmo ...😁👍

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.
 
Daniel Jose #:

A solução para o seu problema, é simples. Não é usar o EA ... esqueça o EA. Você deve usar um indicador para fazer esta analise para você. Depois você usar a função CopyBuffer no EA a fim de ler os dados que estarão vindo do indicador. Será bem mais simples fazer assim. Uma outra forma um pouco mais complicada seria usar um script para substituir o indicador. Mas ao fazer uso do script você iria precisar lançar os dados para o EA de outra forma.

Bem, seria necessário saber mais detalhes a fim de lhe ajudar realmente. Mas considerando que você queira saber 2 valores, de tempos em tempos. A solução mais simples, para você que é iniciante é de fato fazer uso do indicador. Se você conhece-se mais de programação, a solução mais simples seria usar as variáveis globais de terminal. Mas sendo iniciante, vamos usar o indicador.

Antes deixe-me dizer uma coisa: NÃO USE A FUNÇÃO ONTICK NO EA. Salvo isto seja extremamente necessário. Estou postando uma serie de artigos sobre como criar um EA 100% automático, e lá explico melhor sobre esta questão. O artigo 3 pode ser visto neste link: https://www.mql5.com/pt/articles/11226, esta semana deverá sair o artigo 4. E toda semana irá sair um artigo, num total de 15. Leia estes artigos, pois eles vão lhe ajudar.

Agora o indicador seria como mostrado abaixo. Claro você terá que providenciar a leitura do mesmo via CopyBuffer no EA. Ele irá ter no buffer os dois ultimos preços ... com um retardo de 5 segundos mais ou menos entre eles.

Espero que ele lhe dê alguma direção, mas independente disto. Não deixe de ler os artigos. Se você tiver duvidas em como usar a função CopyBuffer. Leia os meus artigos mais antigos, lá tem uma vasta explicação de como ler o Buffer do indicador.

Já que o código é bastante simples, acredito que mesmo sendo iniciante você não terá problemas em compreender o mesmo ...😁👍

Daniel, muito obrigado pela imensa ajuda! 
Abraço!