Autor:
Paul Stringer
O Harami Alert é um indicador que identifica padrões de Harami e oferece alertas, e-mails e notificações push para manter você sempre informado.
Recentemente, foram feitas algumas atualizações no código do indicador para implementar essas funcionalidades. Vamos conferir as principais mudanças:
- Novos parâmetros de entrada foram introduzidos:
input uint NumeroDeBarras=1;// Número de barras para o sinal input bool SomON=true; // Habilitar alertas input uint NumeroDeAlertas=2;// Número de alertas input bool EmailON=false; // Habilitar envio de sinal por e-mail input bool PushON=false; // Habilitar envio de sinal para dispositivos móveis
- Três novas funções foram adicionadas ao final do código do indicador: BuySignal(), SellSignal() e GetStringTimeframe():
//+------------------------------------------------------------------+ //| Função de sinal de compra | //+------------------------------------------------------------------+ void BuySignal(string NomeSinal, // texto do nome do indicador para mensagens de e-mail e push double &SetaCompra[], // buffer do indicador com sinais de compra const int TotalBarras, // número atual de barras const int Prev_calculado, // número de barras no tick anterior const double &Fechamento[], // preço de fechamento const int &Spread[]) // spread { //--- static uint contador=0; if(TotalBarras!=Prev_calculado) contador=0; bool SinalCompra=false; bool TesteSerie=ArrayGetAsSeries(SetaCompra); int indice; if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; if(NormalizeDouble(SetaCompra[indice],_Digits) && SetaCompra[indice]!=EMPTY_VALUE) SinalCompra=true; if(SinalCompra && contador<=NumeroDeAlertas) { contador++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); TesteSerie=ArrayGetAsSeries(Fechamento); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; double Ask=Fechamento[indice]; double Bid=Fechamento[indice]; TesteSerie=ArrayGetAsSeries(Spread); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]*_Point; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SomON) Alert("Sinal de COMPRA Ask=",Ask," Bid=",Bid," hora atual=",texto," Símbolo=",Symbol()," Período=",sPeriodo); if(EmailON) SendMail(NomeSinal+": alerta de sinal de COMPRA","Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); if(PushON) SendNotification(NomeSinal+": Sinal de COMPRA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Função de sinal de venda | //+------------------------------------------------------------------+ void SellSignal(string NomeSinal, // texto do nome do indicador para mensagens de e-mail e push double &SetaVenda[], // buffer do indicador com sinais de venda const int TotalBarras, // número atual de barras const int Prev_calculado, // número de barras no tick anterior const double &Fechamento[], // preço de fechamento const int &Spread[]) // spread { //--- static uint contador=0; if(TotalBarras!=Prev_calculado) contador=0; bool SinalVenda=false; bool TesteSerie=ArrayGetAsSeries(SetaVenda); int indice; if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; if(NormalizeDouble(SetaVenda[indice],_Digits) && SetaVenda[indice]!=EMPTY_VALUE) SinalVenda=true; if(SinalVenda && contador<=NumeroDeAlertas) { contador++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); TesteSerie=ArrayGetAsSeries(Fechamento); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; double Ask=Fechamento[indice]; double Bid=Fechamento[indice]; TesteSerie=ArrayGetAsSeries(Spread); if(TesteSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]*_Point; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SomON) Alert("Sinal de VENDA Ask=",Ask," Bid=",Bid," hora atual=",texto," Símbolo=",Symbol()," Período=",sPeriodo); if(EmailON) SendMail(NomeSinal+": alerta de sinal de VENDA","Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); if(PushON) SendNotification(NomeSinal+": Sinal de VENDA em Ask="+sAsk+", Bid="+sBid+", Data="+texto+" Símbolo="+Symbol()+" Período="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Obtendo o período como uma string | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Chamadas das funções BuySignal() e SellSignal() foram adicionadas após os ciclos de cálculo do indicador no bloco OnCalculate():
//--- BuySignal("Harami_Alert",SetaCompra,total_barras,prev_calculado,fechamento,spread); SellSignal("Harami_Alert",SetaVenda,total_barras,prev_calculado,fechamento,spread); //---
Os buffers SetaCompra e SetaVenda são usados para armazenar os sinais de compra e venda. Os valores vazios nos buffers do indicador devem ser definidos como zeros ou EMPTY_VALUE.
É importante ressaltar que apenas uma chamada para as funções BuySignal() e SellSignal() deve ser utilizada no bloco OnCalculate() do código do indicador.
Esse indicador foi originalmente escrito em MQL4 e foi publicado pela primeira vez na Code Base em 14.06.2016.

Fig. 1. Indicador Harami_Alert no gráfico
Fig. 2. Harami_Alert. Gerando alertas
Publicações relacionadas
- Calendário Econômico: Monitoramento e Cache para Testes de Estratégia no MetaTrader 5
- Buffers Horários para Coleta de Dados no MetaTrader 5
- Oscilador Maravilhoso e Divergências: Um Guia para MetaTrader 5
- Índice de Preferência do Investidor: Um Guia Prático para Traders
- Divergência no Awesome Oscillator: O Guia Completo para Traders
