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:
- 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
- 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)); //---- }
- 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.2. BykovTrendAlert indicator. Meldingen genereren
Reactie 0