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

 

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.
 

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

 

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. 

 

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

 
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. 

 
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.
 
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

 

Olá estou tentando fazer isso em um indicador também com 2 buffers, já tinha feito esse passo de


CopyBuffer(indicador, 0, 0, 3, SellBuffer);

CopyBuffer(indicador, 0, 0, 3, BuyBuffer); 

Mas não consigo criar a execução.. 

depois disso seria: 

if (SellBuffer == true)??


não consigo colocar a lógica em prática.



alguém sabe como ficaria no caso após copiar os buffers?

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Indicador / Tipos de Indicador
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Indicador / Tipos de Indicador
  • www.mql5.com
Tipos de Indicador - Constantes de Indicador - Constantes, Enumeradores e Estruturas - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Estou precisando de um apoio,por gentileza, de jm programador.Estou usando um indicador chamado extreme rsi indicator.ex4, porém, as setas aparecem nos gráficos, mas, nem sempre são geradas as ordens no Terminal.Este indicador utiliza buffer e utilizo um robô que usa apenas buffers.

Estou anexando o indicador.

Quem puder me auxiliar em como editar ele no metaeditor para que envie a ordem assim que a seta aparecer na vela, agradeço muito!!
Arquivos anexados:
Razão: