De WeightOscillator is een krachtige trendindicator die nu ook meldingen biedt via e-mail en push-notificaties naar je mobiele apparaten. Dit is een geweldige aanvulling voor elke trader die zijn strategie naar een hoger niveau wil tillen.
Hier zijn de belangrijkste wijzigingen die zijn doorgevoerd in de code van de indicator om deze meldingen te implementeren:
- Er is een enumeratie toegevoegd voor de opties van de signaalgeneratie, die vóór de invoervariabelen is gedefinieerd.//+----------------------------------------------------+
//| Enumeratie voor signaalgeneratie opties |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, // Breakout signalen
MODE_TREND // Breakout en trend signalen
}; - Nieuwe invoerparameters zijn toegevoegd//---- Invoer variabelen voor meldingen
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; // Signaalgeneratiemodus
input uint NumberofBar=1; // Aantal balken om een signaal te genereren
input bool SoundON=true; // Meldingen inschakelen
input uint NumberofAlerts=2; // Aantal meldingen
input bool EMailON=false; // E-mail meldingen inschakelen
input bool PushON=false; // Meldingen naar mobiele apparaten inschakelen - Drie nieuwe functies zijn toegevoegd aan het einde van de code van de indicator: BuySignal(), SellSignal() en GetStringTimeframe()//+------------------------------------------------------------------+
//| Functie voor koop-signaal |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// tekst van de indicatornaam voor e-mail en pushberichten
double &ColorArray[],// kleurindexbuffer
int ColorIndex,// kleurindex in de kleurindexbuffer om een signaal te genereren
const int Rates_total, // het huidige aantal balken
const int Prev_calculated, // het aantal balken bij de vorige tik
const double &Close[], // sluitprijs
const int &Spread[]) // spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool BuySignal=false;
bool SeriesTest=ArrayGetAsSeries(ColorArray);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
}
else
{
if(ColorArray[index]==ColorIndex) BuySignal=true;
}
if(BuySignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("KOOP signaal Ask=",Ask," Bid=",Bid," currtime=",text," Symbool=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": KOOP signaal melding","KOOP signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": KOOP signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
}
else
{
if(SoundON) Alert("Stijgende Trend signaal Ask=",Ask," Bid=",Bid," currtime=",text," Symbool=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Stijgende Trend signaal melding","KOOP signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Stijgende Trend signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Functie voor verkoop signaal |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// tekst van de indicatornaam voor e-mail en pushberichten
double &ColorArray[], // kleurindexbuffer
int ColorIndex, // kleurindex in de kleurindexbuffer om een signaal te genereren
const int Rates_total, // het huidige aantal balken
const int Prev_calculated, // het aantal balken bij de vorige tik
const double &Close[], // sluitprijs
const int &Spread[]) // spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool SellSignal=false;
bool SeriesTest=ArrayGetAsSeries(ColorArray);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
}
else
{
if(ColorArray[index]==ColorIndex) SellSignal=true;
}
if(SellSignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("VERKOOP signaal Ask=",Ask," Bid=",Bid," currtime=",text," Symbool=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": VERKOOP signaal melding","VERKOOP signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": VERKOOP signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
}
else
{
if(SoundON) Alert("Daaltrend signaal Ask=",Ask," Bid=",Bid," currtime=",text," Symbool=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Daaltrend signaal melding","VERKOOP signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Daaltrend signaal bij Ask="+sAsk+", Bid="+sBid+", Datum="+text+" Symbool="+Symbol()+" Periode="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Tijdframe als string ophalen |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Verschillende aanroepen naar de functies BuySignal() en SellSignal() zijn toegevoegd na de berekeningen van de indicator in het OnCalculate() blok //---
BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
//---
Hierbij is ColorBuffer de naam van de kleurindexbuffer voor het opslaan van de indicator kleuren. De waarden 0 en 4 zijn de nummers van de kleuren in deze buffer, waarbij de oscillator zich in de overgekochte en oververkochte gebieden bevindt.
Er wordt aangenomen dat er slechts één aanroep van de BuySignal() en SellSignal() functies zal worden gebruikt in het OnCalculate() blok van de indicatorcode.
De indicator maakt gebruik van de klassen van de SmoothAlgorithms.mqh bibliotheek (kopieer deze naar <terminal_data_folder>\MQL5\Include). Het gebruik van deze klassen is uitgebreid beschreven in het artikel "Gemiddelden van prijsseries voor tussentijdse berekeningen zonder extra buffers te gebruiken".

Fig1. De WeightOscillator_Alert indicator op de grafiek

Fig.2. De WeightOscillator_Alert indicator. Genereren van alert voor breakout signaal

Fig.3. De WeightOscillator_Alert indicator. Genereren van alert voor trend signaal
Gerelateerde berichten
- Open Range Breakout Indicator voor MetaTrader 5: Ontdek de Kracht van deze Tool
- BykovTrend_HTF_Signal: Dé Indicator voor MetaTrader 5 voor Trendanalyse
- ID Lite Info MA - Indicator voor MetaTrader 5 voor Beleggers
- Economische Kalender Monitor en Cache voor Backtesting in MetaTrader 5
- ColorXdinMA_Alert: Een krachtige indicator voor MetaTrader 5