Hola,
Tengo un indicador cruzado de promedios móviles que produce una alerta cada vez que los promedios móviles se cruzan.
Que disfrutaría el indicador para crear una alerta solo cuando haya ocurrido una cruz (es decir, en la barra actual). Sin embargo, con este indicador, cada vez que abro MT4 o cambio entre marcos de tiempo recibo alertas aunque la cruz haya ocurrido hace 2-3 barras.
Aquí hay una copia del código debajo. Muchas gracias.
#property indior_chart_window
#property indior_buffers 2
#property indior_color1 DarkGoldenrod
#property indior_color2 FireBrick
doble CrossUp [];
double CrossDown [];
extern int FasterEMA = 1;
extern int SlowerEMA = 50;
extern bool SoundON = verdadero;
alerta doble;
doble control = 2147483647;
// ----------------------------------------------- -------------------
//| Función de inicialización del indicador personalizado |
// ----------------------------------------------- -------------------
int init ()
//- indicadores
SetIndexStyle (0, DRAW_ARROW, VACÍO, 1);
SetIndexArrow (0, 233);
SetIndexBuffer (0, CrossUp);
SetIndexStyle (1, DRAW_ARROW, VACÍO, 1);
SetIndexArrow (1, 234);
SetIndexBuffer (1, CrossDown);
//-
return (0);
// ----------------------------------------------- -------------------
//| Función de desinitialización del indicador personalizado |
// ----------------------------------------------- -------------------
int deinit ()
//-
//-
return (0);
// ----------------------------------------------- -------------------
//| Función de iteración del indicador personalizado |
// ----------------------------------------------- -------------------
int start ()
int límite, i, contador;
doble más rápido, ahora, lento, ahora, más rápido, anterior, lento, anterior, más rápido, después, más lento, después;
doble Rango, Promedio de Rango;
int counted_bars = IndiorCounted ();
//- verificar posibles errores
if (counted_barslt; 0) return (-1);
//- la última barra contada será contada
if (counted_barsgt; 0) counted_bars--;
limit = Bars-counted_bars;
para (i = 0; i lt; = limit; i )
contador = i;
Rango = 0;
AvgRange = 0;
for (counter = i; counterlt; = i 9; counter )
AvgRange = AvgRange MathAbs (High [contador] -Low [contador]);
Rango = Promedio de Rango10;
fasterEMAnow = iMA (NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i);
fasterEMAprevious = iMA (NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i 1);
fasterEMAafter = iMA (NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);
slowerEMAnow = iMA (NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i);
slowerEMAprevious = iMA (NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i 1);
slowerEMAafter = iMA (NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);
if ((fasterLINEnowgt; slowerEMAnow) (fasterEMAprevious lt; slowerEMAprevious) (fasterEMAafter gt; slowerEMAafter))
CrossUp [i] = Low [i] - Rango * 0.5;
de lo contrario, si ((fasterEMAnowlt lt; slowerEMAnow) (fasterEMAprevious gt; slowerEMAprevious) (fasterEMAafter lt; slowerEMAafter))
CrossDown [i] = Alto [i] Rango * 0.5;
if (SoundON == verdadero i == 1 CrossUp [i] gt; CrossDown [i] alertTag! = Tiempo [0])
Alerta (MACD 0 cruce ABAJO, Símbolo (),, Período ());
alertTag = Tiempo [0];
SendNotifiion (MACD 0 cruz abajo en _Symbol);
if (SoundON == exacto I == 1 CrossUp [I] lt; CrossDown [I] alertTag! = Tiempo [0])
Alerta (MACD 0 cruz arriba, Símbolo (),, Período ());
alertTag = Tiempo [0];
SendNotifiion (MACD 0 cross UP en _Symbol);
return (0);