Análise de barras ao contrário na EA

 

Olá a todos,

Esta poderia ser uma pergunta realmente tola, mas eu realmente não consegui encontrar a maneira de fazer isso. Estou tentando criar um EA. Depois de analisar algumas barras, ele decide abrir e ordenar ou não. Digamos que ele abre uma ordem. de alguma forma, se meu EA parar ou o metatrader fechar, quando eu o reabrir, quero encontrar as barras que causam a abertura da ordem. Então eu procuro as ordens e encontro meu pedido (aquele EA acabou de abrir) e quero começar a analisar as barras de volta. Como vou fazer isso ? como posso encontrar minhas ordens abertas e começar a voltar a analisar as barras.

para ex:

Estou correndo no período H1 e procuro as barras às 12:00, 13:00, 14:00 e 15:00, depois decido abrir um pedido às 16:00. as barras importantes estão entre 12:00 e 15:00 e quero identificar essas barras novamente. assim, quando voltar a executar o EA primeiro, encontrarei o pedido e encontrarei sua data de abertura, detectarei a que barra é esta data e começarei a voltar atrás nas barras antes daquela data.

Pensei em usar a matriz de tempo etc. mas, enquanto tentava encontrar as barras, o que aconteceria se uma nova barra surgisse? os turnos serão mudados e minha busca será ilógica.

Também não quero escrever estas informações em um arquivo. requer muito tempo e muito tratamento de exceções, etc.

obrigado.

 
paranoyakX:

Pensei em usar o Time array etc. mas, enquanto tentava encontrar as barras, o que aconteceria se surgisse uma nova barra? os turnos serão mudados e minha busca será ilógica.


Uma nova barra não deve surgir enquanto um EA estiver executando seu código. Ela funciona com os dados carregados quando o OnTick() é chamado.

No entanto, não tenho certeza do que aconteceria se RefreshRates() fosse usado.

 
GumRai: No entanto, não tenho certeza do que aconteceria se o RefreshRates() fosse usado.

Embora isso não aconteça com freqüência (na verdade, muito raramente), ao utilizar RefreshRates(), tive a experiência de que os dados da barra foram deslocados devido a uma nova formação de barra. Para contornar este problema, tento copiar todos os dados necessários em variáveis, no início, e depois não confiar novamente nas Arrays de dados históricos ou funções equivalentes durante o resto da execução do evento. Desta forma, mesmo que em meu código eu exija o uso do RefreshRates(), eu ainda posso me referir com segurança às condições iniciais.

@paranoyakX: Assim, independentemente do uso ou não do RefreshRates( ), você pode tentar uma abordagem semelhante. De fato, na MQL5, você não tem a mesma capacidade que a MQL4 e TEM de copiar os dados para suas próprias matrizes a fim de processá-los. Assim, ao fazê-lo desta forma, você está de fato a alguns passos mais próximo de ser capaz de tornar seu código compatível tanto com a MQL4 quanto com a MQL5.

Entretanto, a melhor solução, não é codificar tudo isso na EA, mas codificar a maior parte dessa lógica em um Indicador, que não sofre com esse problema, pois a abordagem é totalmente diferente. Tente programar o máximo possível da lógica do Sinal em um Indicador. Isto também é útil porque você pode então usar e testar visualmente o indicador até que ele esteja funcionando exatamente como você deseja. Mais um uso da solução do indicador, é que ele fornecerá a sinalização não apenas para a EA, mas também para o comércio manual. A EA, então, só tem que se concentrar na gestão da comercialização e não na sinalização.

 
paranoyakX:

[...] Pensei em usar o Time array etc., mas, enquanto tentava encontrar as barras, o que aconteceria se surgisse uma nova barra? os turnos serão mudados e minha busca será ilógica.

O que você está perguntando é potencialmente tão simples que eu me pergunto se estou perdendo o objetivo. Dado um OrderSelect() anterior, você pode procurar o deslocamento de barra associado ao seu OrderOpenTime() simplesmente fazendo o seguinte:

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);

Por exemplo:

  • Gráfico H1
  • Ahora atual é 16:32
  • A ordem foi aberta às 14:23
  • O código acima deve retornar BarShiftOfOrderOpen = 2, ou seja, a barra H1 às 14:00, e a hora [BarShiftOfOrderOpen] será às 14:00
 
jjc: O que você está perguntando é potencialmente tão simples que eu me pergunto se estou perdendo o objetivo. Dado um OrderSelect() anterior, você pode consultar o bar-shift associado com seu OrderOpenTime() simplesmente fazendo o seguinte:

Por exemplo:

  • Gráfico H1
  • A hora atual é 16:32
  • A ordem foi aberta às 14:23
  • O código acima deve retornar BarShiftOfOrderOpen = 2, ou seja, a barra H1 às 14:00, e a hora [BarShiftOfOrderOpen] será às 14:00

Sim, isso é exatamente o que OP está dizendo, mas o que ele está questionando, não é como fazê-lo, mas como evitar que ele se torne inválido devido a um deslocamento de barra causado por um novo tick de entrada formando uma nova barra, enquanto ele está processando os dados.

No entanto, isso NÃO deve acontecer, exceto quando se usa RefreshRates(). Para essa possibilidade (que é rara), sugeri os métodos alternativos da mesma forma que a MQL5 o faz.

 
FMIC:

mas como evitar que se torne inválido devido a um deslocamento de barra causado por um novo tick de entrada formando uma nova barra

Onde a OP diz isso? Essa pode ser a pergunta, mas eu acho que você está ouvindo batidas de cascos e pensando em zebras em vez de cavalos. A menção da persistência do estado da EA a um arquivo em todo o MT4 me sugere que a questão é de fato muito, muito mais simples.
 

Olá, pessoal,

muito obrigado pelas respostas,

@FMIC, curiosamente nunca pensei em usar indicadores e, como você diz, isto poderia ser muito mais fácil se eu criasse e usasse um, mas é claro que isto trará novas questões, como, por exemplo, como encontrar o valor do indicador que combina com meu pedido, etc. Também não farei esse processo todas as vezes, apenas uma vez no OnInit(), então talvez usar um EA seja bom para isso.

@jjc, obrigado por sua solução também. Na verdade, eu estava um pouco preocupado com a "nova barra", mas como todos vocês dizem, enquanto o EA rodando lá não haverá mudanças de turno (e eu não estou usando a função RefreshRates()) para que eu possa usar seu código também. Só estou curioso agora depois do que @FMIC disse, seria mais agradável se eu criasse isto como um indicador?

 
jjc:
Onde a OP diz isso? Essa pode ser a pergunta, mas eu acho que você está ouvindo batidas de cascos e pensando em zebras ao invés de cavalos. A menção da persistência do estado da EA em um arquivo através de reinícios do MT4 me sugere que a pergunta é de fato muito, muito mais simples.

Até GumRai pegou isso e citou-o, o que farei novamente aqui:

paranoyakX:

Pensei em usar o Time array etc. mas, enquanto tentava encontrar as barras, o que aconteceria se surgisse uma nova barra? os turnos serão mudados e minha busca será ilógica.

 
paranoyakX:

@FMIC, curiosamente nunca pensei em usar indicadores e, como você diz, isto poderia ser muito mais fácil se eu criasse e usasse um, mas é claro que isto trará novas questões, como, por exemplo, como encontrar o valor do indicador que combina com meu pedido, etc. Também não farei esse processo todas as vezes, apenas uma vez no OnInit(), então talvez usar um EA seja bom para isso.

@jjc, obrigado por sua solução também. Na verdade, eu estava um pouco preocupado com a "nova barra", mas como todos vocês dizem, enquanto o EA rodando lá não haverá mudanças de turno (e eu não estou usando a função RefreshRates()) para que eu possa usar seu código também. Só estou curioso agora depois do que @FMIC disse, seria mais agradável se eu criasse isto como um indicador?

Não se importe com minha sugestão se for muito complicado para você! Faça-o da maneira que for mais fácil para você agora e depois, quando estiver mais confortável com ele, tente a outra maneira também

PS! Você não deve colocar nenhum código lógico em seu OnInit(), que é apenas onde você inicializa as coisas e nunca nada a ver com os dados de uma série de dados históricos. Toda sua lógica e código principal devem estar no OnTick() ou no OnCalculate().

 
FMIC:

Até GumRai pegou isso e citou-o, o que farei novamente aqui:

Você e Gumrai estão fazendo uma suposição maciça sobre o significado de "se um novo bar surgir", o que as provas ainda não justificam. O OP ainda não disse "se um novo bar surgir durante o OnStart".

Eu suspeito que o paranoyakX está armazenando detalhes de comércio/sinal em variáveis globais no EA. A questão, suspeito, não é a formação de novas barras durante uma chamada ao OnStart(), mas sim a formação de novas barrasdurante a vida útil do EA.

 
jjc:

Você e Gumrai estão fazendo uma suposição massiva sobre o significado de "se surgir um novo bar" que as provas ainda não justificam. A OP ainda não disse "se um novo bar surgir durante o OnStart".

Eu suspeito que o paranoyakX está armazenando detalhes de comércio/sinal em variáveis globais no EA. A questão, suspeito, não é a formação de novas barras durante uma chamada ao OnStart(), mas sim a formação de novas barrasdurante a vida útil do EA.

Não há OnStart() nas EA's, mas entendi o que você quis dizer. Entretanto, o OP mesmo em resposta aos seus comentários disse e cito:

Na verdade, eu estava um pouco preocupado com a "nova barra", mas como todos vocês dizem, enquanto o EA em funcionamento não mudará de turno (e eu não estou usando a função RefreshRates()).

Razão: