Rejoignez notre page de fans
- Vues:
- 6511
- Note:
- Publié:
- 2017.01.26 09:26
- Mise à jour:
- 2023.03.29 13:47
-
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance
The WeightOscillator trend indicator, which features alerts, sending emails and push-notifications to mobile devices.
The following changes have been made to the indicator code in order to implement the alerts, email messages and push-notifications:
- Enumeration for the options of indicator signal generation is declared at the global scope before the input variables are declared.//+----------------------------------------------------+
//| Enumeration for signal generation options |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Breakout signals
MODE_TREND //Breakout and trend signals
}; - Introduced new input parameters//---- Input variables for alerts
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Signal generation mode
input uint NumberofBar=1; //Number of the bar to generate a signal
input bool SoundON=true; //Enable alerts
input uint NumberofAlerts=2; //Number of alerts
input bool EMailON=false; //Enable mailing the signal
input bool PushON=false; //Enable sending the signal to mobile devices - Added three new functions to the end of the indicator code: BuySignal(), SellSignal() and GetStringTimeframe()//+------------------------------------------------------------------+
//| Buy signal function |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// text of the indicator name for email and push messages
double &ColorArray[],// color index buffer
int ColorIndex,// color index in the color index buffer to generate a signal
const int Rates_total, // the current number of bars
const int Prev_calculated, // the number of bars on the previous tick
const double &Close[], // close price
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("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
}
else
{
if(SoundON) Alert("Up Trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Up Trend signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Up Trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Sell signal function |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// text of the indicator name for email and push messages
double &ColorArray[], // color index buffer
int ColorIndex, // color index in the color index buffer to generate a signal
const int Rates_total, // the current number of bars
const int Prev_calculated, // the number of bars on the previous tick
const double &Close[], // close price
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("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
}
else
{
if(SoundON) Alert("Down trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Down trend signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Down trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Getting the timeframe as a string |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Added a couple of calls to BuySignal() and SellSignal() functions after the indicator calculation cycles in the OnCalculate() block //---
BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
//---
Where ColorBuffer is the name of the color index buffer for storing indicator colors. Values 0 and 4 are the numbers of colors in this buffer, at which the oscillator is in the overbought and oversold areas, respectively.
It is assumed that the only one call to the BuySignal() and SellSignal() functions will be used in the OnCalculate() block of the indicator code.
The indicator uses the classes of SmoothAlgorithms.mqh library (copy it to <terminal_data_folder>\MQL5\Include). The use of the classes was thoroughly described in the article "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".
Fig1. The WeightOscillator_Alert indicator on the chart
Fig.2. The WeightOscillator_Alert indicator. Generating alert for breakout signal
Fig.3. The WeightOscillator_Alert indicator. Generating alert for trend signal
Traduit du russe par MetaQuotes Ltd.
Code original : https://www.mql5.com/ru/code/17091
![Fractional_Bands_HTF](https://c.mql5.com/i/code/indicator.png)
The Fractional_Bands indicator with the timeframe selection option available in the input parameters.
![Chart on Chart](https://c.mql5.com/i/code/indicator.png)
The Chart on Chart indicator displays a chart of other symbol on the current chart.
![Fractal_Keltner_x5_Cloud](https://c.mql5.com/i/code/indicator.png)
Two fractal Keltner channels in the form of a cloud.
![eur usd m5](https://c.mql5.com/i/code/expert.png)
The Expert Advisor works in martingale mode based on the signals of iStochastic (Stochastic Oscillator).