Como gerar ou ler sinal de buy/sell em indicador customizado.

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

Olá a todos, sou novo por aqui, muito prazer.

Estou estudando MQL5..

Já sei emitir ordens, checar posição e etc. utilizando CTrade. Também já utilizei indicadores nativos, como por exemplo o cruzamento de médias móveis, para gerar o sinal de compra/venda e então emitir uma ordem ou fechar uma posição.

Agora a grande questão é, como gerar ou ler sinais de compra/venda de um indicador customizado.

Para início eu baixei um indicador simples, baseado em MACD https://www.mql5.com/pt/code/2015

Mas após muitas (lê-se 10) horas de tentativas e pesquisa decidi apelar para o Fórum, espero que possam me ajudar...

Quero que meu expert emita ou feche ordens baseados nas setas que o indicador que eu peguei como modelo gera.

Agradeço antecipadamente por qualquer ajuda.

Valeu!

Robson

MACD No Gráfico
MACD No Gráfico
  • votos: 23
  • 2014.07.01
  • Nikolay Kositsin
  • www.mql5.com
Um indicador de sinal do tipo semáforo que utiliza um histograma MACD.
Robson Martins
132
Robson Martins  

Complementando...

Eu sei que o indicador contém 2 Buffers: "double SellBuffer[];", "double BuyBuffer[];"

Que retornam o valor 0 ou maior que 0, com a cotação, quando a seta é plotada, isso eu posso ver na janela de dados.

Também consegui adicionar um "Print" quando os valores são gerados no indicador, para ver durante um teste do indicador:

      if(MACD[bar]>SIGN[bar] && MACD[bar+1]<= SIGN[bar+1])
      {
         BuyBuffer[bar]=low[bar]-ATR[bar]*3/8;
         Print("BuyBuffer[0] = ",BuyBuffer[0]);
      }
      if(MACD[bar]<SIGN[bar] && MACD[bar+1]>= SIGN[bar+1])
      {
         SellBuffer[bar]=high[bar]+ATR[bar]*3/8;
         Print("SellBuffer[0] = ",SellBuffer[0]);
      }

Dentre tudo que eu pesquisei, imagino que o caminho seja conseguir ler os buffers dentro do expert advisor, e então, caso o 'buy' seja > 0 eu compro ou encerro venda e caso o 'sell' seja > 0 o contrário.

Eu chamo o indicador no meu expert advisor com: mocHandle=iCustom(_Symbol, _Period, "Downloads/macd_on_chart");

Entretando não tenho a mínima idéia de como leio os buffers dele.

Apenas quis mostrar até onde eu fui embora eu não tenha certeza que fui pelo caminho certo, também aproveito para confirmar que estou usando MT5.

Obrigado pela ajuda,

Robson

Rogerio Figurelli
Moderador
58829
Rogerio Figurelli  

Olá Robson,

Você está muito próximo do seu objetivo, vamos ver se consigo te ajudar. 

Na prática não existe diferença entre o que já fazes lendo buffers de um indicador nativo e de um custom.

Os parâmetros do iCustom, como são genéricos, talvez induzam a essa interpretação de que sejam muito diferentes de um indicador nativo qualquer, mas note que é apenas uma lista dos parâmetros de entrada do indicador.

O que talvez esteja te confundindo, portanto, é que a escolha do buffer não será feita quando você 'chama' o indicador pelo iCustom (como referido), e sim quando copiar os valores dos buffers do indicador para os teus buffers, usando por exemplo a função CopyBuffer().

Nessa função você irá definir o buffer desejado, seja um indicador nativo ou custom (parâmetro buffer_num abaixo):

int  CopyBuffer(
   int       indicator_handle,     // indicator handle
   int       buffer_num,           // indicator buffer number
   int       start_pos,            // start position
   int       count,                // amount to copy
   double    buffer[]              // target array to copy
   );

Recomendo também, para te facilitar o entendimento, a leitura do artigo Como chamar indicadores no MQL5.

Se não ajudar ou tiver qualquer outra dúvida, é só perguntar. 

Robson Martins
132
Robson Martins  

Olá Rogério,

Ontem, durante a tarde, eu descobri sobre o CopyBuffer, mas ainda não tinha tido tempo de trabalhar no código.

Peguei a sua mensagem já um pouco tarde da noite e resolvi finalizar...

O código ficou:

   double SellBuffer[],BuyBuffer[];
   CopyBuffer(MOC_Handle,0,1,1,SellBuffer);
   CopyBuffer(MOC_Handle,1,1,1,BuyBuffer);

Testei e aparentemente resolveu mesmo...

Depois disso, já peguei um outro indicador e da mesma forma consegui as informações que eu precisava, a coisa aqui parece estar caminhando.

Queria te agradecer pela atenção e ajuda, eu já tinha encontrato o método que eu precisava, mas você além de confirmar com mais experiência ainda me ajudou a concluir o que era o buffer_num, que eu não estava entendendo e era exatamente o que faltava para mim.

Muito obrigado.

Robson

Rogerio Figurelli
Moderador
58829
Rogerio Figurelli  
robsoncombr:

Olá Rogério,

Ontem, durante a tarde, eu descobri sobre o CopyBuffer, mas ainda não tinha tido tempo de trabalhar no código.

Peguei a sua mensagem já um pouco tarde da noite e resolvi finalizar...

O código ficou:

   double SellBuffer[],BuyBuffer[];
   CopyBuffer(MOC_Handle,0,1,1,SellBuffer);
   CopyBuffer(MOC_Handle,1,1,1,BuyBuffer);

Testei e aparentemente resolveu mesmo...

Depois disso, já peguei um outro indicador e da mesma forma consegui as informações que eu precisava, a coisa aqui parece estar caminhando.

Queria te agradecer pela atenção e ajuda, eu já tinha encontrato o método que eu precisava, mas você além de confirmar com mais experiência ainda me ajudou a concluir o que era o buffer_num, que eu não estava entendendo e era exatamente o que faltava para mim.

Muito obrigado.

Robson

De nada Robson, desejo sucesso nos teus robôs.

Uma última dica, quando colocar código fonte utiliza o botão SRC no editor, pois facilita a visualização.

Abraço. 

jhonatan.morais
14
jhonatan.morais  
Rogerio Figurelli:

De nada Robson, desejo sucesso nos teus robôs.

Uma última dica, quando colocar código fonte utiliza o botão SRC no editor, pois facilita a visualização.

Abraço. 

Queria agradecer a você também. esse posta acabou de me ajuda. vlw mesmo.
Tortola
32
Tortola  
jhonatan.morais:
Queria agradecer a você também. esse posta acabou de me ajuda. vlw mesmo.

Você pode usar também a função iCustom, assim você nem precisa do arquivo mq4 do indicador basta ter o ex4 dentro da pasta indicators e a função recebe os parametros do indicador.

+ou- assim:

 iCustom(NULL, 0, "indicador", 1, 2)

onde indicador que está entre aspas deve ser o nome do indicador como esta na pasta indicators sem o .ex4 no final

e o numero 1  é o buffer do indicador

o numero 2 é shift (vela)  que apareceu o indicador

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