ASCtrendAlert: De Nieuwe Indicator voor MetaTrader 5

Mike 2017.01.20 01:38 14 0 0
Bijlage

ASCtrend is een handige semaphore signaalindicator die nu ook meldingen, e-mails en push-notificaties ondersteunt.

Om deze nieuwe functies te implementeren, zijn de volgende veranderingen in de indicatorcode aangebracht:

  1. Nieuwe invoerparameters toegevoegd:
    input uint AantalBars=1;//Aantal bars voor het signaal
    input bool GeluidAan=true; //Meldingen inschakelen
    input uint AantalMeldingen=2;//Aantal meldingen
    input bool EMailAan=false; //Melden via e-mail inschakelen
    input bool PushAan=false; //Melden naar mobiele apparaten inschakelen
    
  2. Drie nieuwe functies toegevoegd aan het einde van de indicatorcode: BuySignal(), SellSignal() en GetStringTimeframe():
    //+------------------------------------------------------------------+
    //| Functie voor koop signalen           |
    //+------------------------------------------------------------------+
    void BuySignal(string SignaalNaam,      // Tekst van de indicatornaam voor e-mail en pushberichten
                   double &KoopPijl[],        // Buffer voor koop signalen
                   const int TotaalBars,     // Het huidige aantal bars
                   const int VorigeBerekening,// Aantal bars op de vorige tick
                   const double &Sluiten[],     // Sluitprijs
                   const int &Spread[])       // spread
      {
    //---
       static uint teller=0;
       if(TotaalBars!=VorigeBerekening) teller=0;
    
       bool KoopSignaal=false;
       bool SerieTest=ArrayGetAsSeries(KoopPijl);
       int index;
       if(SerieTest) index=int(AantalBars);
       else index=TotaalBars-int(AantalBars)-1;
       if(NormalizeDouble(KoopPijl[index],_Digits) && KoopPijl[index]!=EMPTY_VALUE) KoopSignaal=true;
       if(KoopSignaal && teller<=AantalMeldingen)
         {
          teller++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string tekst=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SerieTest=ArrayGetAsSeries(Sluiten);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          double Vraag=Sluiten[index];
          double Bod=Sluiten[index];
          SerieTest=ArrayGetAsSeries(Spread);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          Bod+=Spread[index];
          string sVraag=DoubleToString(Vraag,_Digits);
          string sBod=DoubleToString(Bod,_Digits);
          string sPeriode=GetStringTimeframe(ChartPeriod());
          if(GeluidAan) Alert("KOOP signaal \n Vraag=",Vraag,"\n Bod=",Bod,"\n huidige tijd=",tekst,"\n Symbool=",Symbol()," Periode=",sPeriode);
          if(EMailAan) SendMail(SignaalNaam+": KOOP signaal melding","KOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
          if(PushAan) SendNotification(SignaalNaam+": KOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Functie voor verkoop signalen          |
    //+------------------------------------------------------------------+
    void SellSignal(string SignaalNaam,      // Tekst van de indicatornaam voor e-mail en pushberichten
                    double &VerkoopPijl[],       // Buffer voor verkoop signalen
                    const int TotaalBars,     // Het huidige aantal bars
                    const int VorigeBerekening, // Aantal bars op de vorige tick
                    const double &Sluiten[],     // Sluitprijs
                    const int &Spread[])       // spread
      {
    //---
       static uint teller=0;
       if(TotaalBars!=VorigeBerekening) teller=0;
    
       bool VerkoopSignaal=false;
       bool SerieTest=ArrayGetAsSeries(VerkoopPijl);
       int index;
       if(SerieTest) index=int(AantalBars);
       else index=TotaalBars-int(AantalBars)-1;
       if(NormalizeDouble(VerkoopPijl[index],_Digits) && VerkoopPijl[index]!=EMPTY_VALUE) VerkoopSignaal=true;
       if(VerkoopSignaal && teller<=AantalMeldingen)
         {
          teller++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string tekst=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SerieTest=ArrayGetAsSeries(Sluiten);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          double Vraag=Sluiten[index];
          double Bod=Sluiten[index];
          SerieTest=ArrayGetAsSeries(Spread);
          if(SerieTest) index=int(AantalBars);
          else index=TotaalBars-int(AantalBars)-1;
          Bod+=Spread[index];
          string sVraag=DoubleToString(Vraag,_Digits);
          string sBod=DoubleToString(Bod,_Digits);
          string sPeriode=GetStringTimeframe(ChartPeriod());
          if(GeluidAan) Alert("VERKOOP signaal \n Vraag=",Vraag,"\n Bod=",Bod,"\n huidige tijd=",tekst,"\n Symbool=",Symbol()," Periode=",sPeriode);
          if(EMailAan) SendMail(SignaalNaam+": VERKOOP signaal melding","VERKOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
          if(PushAan) SendNotification(SignaalNaam+": VERKOOP signaal bij Vraag="+sVraag+", Bod="+sBod+", Datum="+tekst+" Symbool="+Symbol()+" Periode="+sPeriode);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Verkrijgen van de tijdsperiode als een string                     |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES tijdsperiode)
      {
    //----
       return(StringSubstr(EnumToString(tijdsperiode),7,-1));
    //----
      }
    
  3. Een paar aanroepen van de functies BuySignal() en SellSignal() toegevoegd na de berekeningen van de indicator in het OnCalculate() blok:
    //---
    BuySignal("ASCtrend",KoopBuffer,totaal_bars,vorige_berekening,sluiten,spread);
    SellSignal("ASCtrend",VerkoopBuffer,totaal_bars,vorige_berekening,sluiten,spread);
    //---

Hierbij zijn KoopBuffer en VerkoopBuffer de namen van de indicatorbuffers voor het opslaan van de koop- en verkoop signalen. In de indicatorbuffers moeten ofwel nullen of EMPTY_VALUE worden ingesteld als lege waarden.

Het is de bedoeling dat er slechts één aanroep van de BuySignal() en SellSignal() functies wordt gebruikt in het OnCalculate() blok van de indicatorcode.

Fig.1. ASCtrendAlert indicator op de grafiek

Fig.1. ASCtrendAlert indicator op de grafiek


Fig.2. BykovTrendAlert indicator. Meldingen genereren

Fig.2. BykovTrendAlert indicator. Meldingen genereren

Lijst
Reactie 0