Pon "Me gusta" y sigue las noticias
Deje un enlace a él, ¡qué los demás también lo valoren!
Evalúe su trabajo en el terminal MetaTrader 5
WeightOscillator_Alert - indicador para MetaTrader 5
- Visualizaciones:
- 1060
- Ranking:
- Publicado:
- 2017.02.08 15:05
- Actualizado:
- 2023.03.27 14:23
- ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa
El indicador tendencial WeightOscillator permite enviar alertas, mensajes de correo y mensajes Push al smartphone.
Para las alertas, mensajes de correo y mensajes Push en el smartphone, el código del indicador ha sufrido las siguientes modificaciones:
- Para la declaración de las variables de entrada a nivel global, ha sido declarada la enumeración para las variantes de las señales transmitidas por el indicador//+----------------------------------------------------+
//| enumeración para las variantes de señales transmitidas |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, // Señales de ruptura
MODE_TREND // Señales de ruptura y de tendencia
}; - En los parámetros de entrada del indicador, fueron añadidas nuevas variables de entrada//---- Variables de entrada para las alertas
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Вариант подачи сигнала
input uint NumberofBar=1; // Número de la barra para enviar la señal
input bool SoundON=true; // Permiso de la alerta
input uint NumberofAlerts=2; //Número de alertas
input bool EMailON=false; // Permiso del envío de la señal vía email
input bool PushON=false; // Permiso del envío de la señal al móvil - Fueron añadidas tres funciones nuevas BuySignal(), SellSignal() y GetStringTimeframe() al final del código del indicador//+------------------------------------------------------------------+
//| Buy signal function |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// texto del nombre del indicador para las señales de correo y Push
double &ColorArray[],// búfer de índice de color
int ColorIndex,// índice del color en el búfer de índice de color para enviar la señal
const int Rates_total, // número actual de las barras
const int Prev_calculated, // número de barras en el tick anterior
const double &Close[], // precio de cierre
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,// texto del nombre del indicador para las señales de correo y Push
double &ColorArray[], // búfer de índice de color
int ColorIndex, // índice del color en el búfer de índice de color para enviar la señal
const int Rates_total, // número actual de las barras
const int Prev_calculated, // número de barras en el tick anterior
const double &Close[], // precio de cierre
const int &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);
}
}
//---
}
//+------------------------------------------------------------------+
//| Obtención del timeframe en forma de una cadena de caracteres |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - En el bloque OnCalculate(), después del cálculo de los ciclos del indicador, fueron añadidas dos llamadas a las funciones BuySignal() y SellSignal() //---
BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
//---
Donde ColorBuffer es el nombre del búfer de índice de colores para almacenar los colores del indicador, y los valores 0 y 4 son los números de colores en este búfer con los cuales el oscilador se encuentra en las zonas de sobrecompra y sobreventa, respectivamente.
Se supone que en el código del indicador, en el bloque OnCalculate(), va a usarse sólo una llamada a cada función BuySignal() y SellSignal()
El indicador utiliza las clases de la librería SmoothAlgorithms.mqh (hay que copiarla en carpeta_ de_datos_del_terminal\MQL5\Include). Cómo trabajar con las clases se describe detalladamente en el artículo «Promedio de las series de precio sin búferes adicionales para cálculos intermedios»
.
Fig. 1. Indicador WeightOscillator_Alert en el gráfico
Fig. 2. Indicador WeightOscillator_Alert. Envío de la alerta para la señal de la ruptura
Fig. 3. Indicador WeightOscillator_Alert. Envío de la alerta para la señal de la tendencia
Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/17091
El indicador Fractional_Bands permite cambiar el período de tiempo del indicador en los parámetros de entrada.
Chart on ChartEl indicador Chart on Chart muestra el gráfico de otro símbolo en el gráfico actual.
Dos canales de fractal de Keltner en implementación de nube.
eur usd m5El Asesor Experto trabaja en modo de mantergale de acuerdo con las señales del indicador iStochastic, Stochastic Oscillator.