AJUDA - E.A. Bandas de Bollinger

 

Galera, estou com um problema e não consigo resolver.. Quero que o preço atual do ativo quando for menor que a Banda de Bollinger inferior, abra uma compra e vice versa.. Alguém pode me ajudar por favor? O E.A não abre de acordo o comando.. Segue o Código!!


#include  <Trade/Trade.mqh>
CTrade trade;

void OnTick()
  {
  
double ask,bid,last;
double mediaBBArray[];
double upperBBArray[];
double lowerBBArray[];
int bbDefinicao;

      ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
      last = SymbolInfoDouble(_Symbol,SYMBOL_LAST);

      bbDefinicao = iBands (_Symbol,_Period,20,0,2,PRICE_CLOSE);
      ArraySetAsSeries (mediaBBArray,true);
      ArraySetAsSeries (upperBBArray,true);
      ArraySetAsSeries (lowerBBArray,true);
      CopyBuffer (bbDefinicao,0,0,3,mediaBBArray);
      CopyBuffer (bbDefinicao,1,0,3,upperBBArray);
      CopyBuffer (bbDefinicao,2,0,3,lowerBBArray);
      double MediaBBValor = NormalizeDouble (mediaBBArray[0],2);
      double UpperBBValor = NormalizeDouble (upperBBArray[0],2);
      double LowerBBValor = NormalizeDouble (lowerBBArray[0],2);
      
            if(last < LowerBBValor)
               {
                  trade.Buy (1, _Symbol, ask, ask - 50, ask + 100);
               } 
            else if (last > UpperBBValor)
               {
                  trade.Sell (1, _Symbol, bid, bid + 50, bid - 100);
               }   
  }
 
albertojunior91:

Galera, estou com um problema e não consigo resolver.. Quero que o preço atual do ativo quando for menor que a Banda de Bollinger inferior, abra uma compra e vice versa.. Alguém pode me ajudar por favor? O E.A não abre de acordo o comando.. Segue o Código!!


Existem alguns exemplos no CodeBase que voce poderia comparar, e, evidentemente, adequar para a B3 (caso seja seu objetivo). Veja abaixo:

Exemplo 1:

https://www.mql5.com/pt/code/166

Exemplo 2:

https://www.mql5.com/pt/code/17992

 
Joscelino Celso de Oliveira:

Existem alguns exemplos no CodeBase que voce poderia comparar, e, evidentemente, adequar para a B3 (caso seja seu objetivo). Veja abaixo:

Exemplo 1:

https://www.mql5.com/pt/code/166

Exemplo 2:

https://www.mql5.com/pt/code/17992

Grato, Joscelino! Analisei os exemplos que me passou, mas não consegui identificar o Erro.. o EA ainda insiste em não seguir a lógica de Compra somente quando o Preço Atual for menor que a BB inferior e vice versa..
 
albertojunior91:
Grato, Joscelino! Analisei os exemplos que me passou, mas não consegui identificar o Erro.. o EA ainda insiste em não seguir a lógica de Compra somente quando o Preço Atual for menor que a BB inferior e vice versa..

Os códigos não são necessariamente para você encontrar "erros", mas sim para efetuar comparação e promover ajustes em seu robô (se necessário). 

Em seu lugar eu iria retirar as funções CopyBuffer() de OnTick() e inseri-las em OnTimer().

Feito isso, executaria um "Print" de "mediaBBArray", "upperBBArray" e "lowerBBArray" para verificar se estão sendo calculados os valores corretamente. Para isso, insira  o indicador BB no gráfico e compare com os valores impressos, utilizando-se do cursor, observando a janela de dados.

Por fim, sugiro que vá mais devagar. Pouco tempo depois de te colocar as dicas, você já postou que comparou tudo. Eu não conseguiria fazer isso tao rápido e ser criterioso. E pressa em desenvolvimento de EA só prejudica, a meu ver.

 
albertojunior91:

Galera, estou com um problema e não consigo resolver.. Quero que o preço atual do ativo quando for menor que a Banda de Bollinger inferior, abra uma compra e vice versa.. Alguém pode me ajudar por favor? O E.A não abre de acordo o comando.. Segue o Código!!


Boa noite

pode não ser o motivo do erro, mas colocar esses comandos dentro do OnTick() é errado.  São comandos de definição portanto basta executar uma vez, então coloque no OnInit() e use variáveis globais para fazer referencia a elas dentro do OnTick().


      bbDefinicao = iBands (_Symbol,_Period,20,0,2,PRICE_CLOSE);
      ArraySetAsSeries (mediaBBArray,true);
      ArraySetAsSeries (upperBBArray,true);
      ArraySetAsSeries (lowerBBArray,true);


Muito importante, aprende a usar o depurador de programas em menos de 2 min você vai descobrir o erro.

 

Alem das dicas do @Rogerio Giannetti Torres, as variaveis abaixo devem ser GLOBAIS:

double mediaBBArray[];
double upperBBArray[];
double lowerBBArray[];
int bbDefinicao;

Ou seja, não houve comparativo adequado com os códigos exemplo do qual sugeri.

Agindo assim, os problemas serão frequentes e só vai conseguir um EA efetivo na sorte.

Sugiro a LEITURA do ARTIGO a seguir:

Como chamar indicadores no MQL5
Como chamar indicadores no MQL5
  • www.mql5.com
No MQL5 existem diversas formar para chamar indicadores e a maioria destas formas é realizada usando as funções IndicatorCreate() e iCustom(). Além disso, estas funções apenas retornam o handle indicador e o trabalho adicional nos indicadores é feito por ele. Então o que é handle? Como lidar com as funções IndicatorCreate() e iCustom()? E como...
 
Boa noite.. Pessoal, obrigado pela vontade de ajudar. Joscelino, grato pelo seus comentários. Consegui descobrir o problema.. 
      bbDefinicao = iBands (_Symbol,_Period,20,0,2,PRICE_CLOSE);
      ArraySetAsSeries (mediaBBArray,true);
      ArraySetAsSeries (upperBBArray,true);
      ArraySetAsSeries (lowerBBArray,true);

Coloquei a parte desse código acima no OnInit.. O problema que estava me dando era no Examinador de Estratégia e não no código. A execução estava: SOMENTE ABERTURA DE PREÇOS; e eu não percebi.. Quando mudei para: CADA TICK; funcionou perfeitamente.. Começou respeitar os comandos que eu queria executar..

Razão: