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...
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.
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
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á,
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) ...
. . .
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
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 ...😁👍
- www.mql5.com
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!
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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!