PDA

Ver la versión completa : Indicador MT4 Manipular un indicador para mostrar un alert



boysinhaus
11-12-2024 06:52,
Hola, estoy probando ha hacer cositas manipulando un indicador mq4, se algo de c pero se me esta haciendo complicado, os queria preguntar a ver si podriais ayudar.

El caso es que el indicador lo que hacer es segun las ondas de elliot pone imprime en el grafico una flecha hacia arriba y otra hacia abajo, la cosa es que me gustaria que en el momento en el que la imprima me muestre una alerta en la pantalla. Aparente parece facil pero no doy con la forma a ver si podeis ayudar, he conseguido que segun el buffer me vaya imprimiendo la ultima que me ha mostrado pero no quiero eso.

os pongo el código q no es mucho, porque no se como subir el archivo.

Un saludo y a ver si es posible o no hacerlo.


#property copyright "[email protected]"#property link ""


#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue


extern int Fast.MA.Period = 5;
extern int Slow.MA.Period = 34;
extern int Signal.period = 5;


//---- buffers
double Buffer1[],
Buffer2[],
b2[],
b3[];
extern int x;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators


// two additional buffers used for counting


IndicatorBuffers(4);


IndicatorShortName("Elliott_Arrow");

SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(0,234); // down 226 234 242
SetIndexBuffer(0,b2);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(1,233); //UP 225 233 241
SetIndexBuffer(1,b3);

// These buffers are not plotted, just used to determine arrows


SetIndexBuffer (2,Buffer1);
SetIndexBuffer (3,Buffer2);
//Alert(b2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, counted_bars=IndicatorCounted();
double MA5,MA34;
int limit=Bars-counted_bars;
Print(" print limit = ", limit);
if(counted_bars>0) limit++;
//---- TODO: add your code here

// Main line
for(i=0; i<limit; i++)
{
MA5=iMA(NULL,0,Fast.MA.Period,0,MODE_SMA,PRICE_MED IAN,i);
MA34=iMA(NULL,0,Slow.MA.Period,0,MODE_SMA,PRICE_ME DIAN,i);

Buffer1[i]=MA5-MA34;
}


// Signal line


for(i=0; i<limit; i++)
{
Buffer2[i]=iMAOnArray(Buffer1,Bars,Signal.period,0,MODE_LWMA ,i);
}

// Arrows


for(i=0; i<limit; i++)
{
if(Buffer1[i] > Buffer2[i] && Buffer1[i-1] < Buffer2[i-1]){
b2[i] = High[i]+10*Point;
}
if(Buffer1[i] < Buffer2[i] && Buffer1[i-1] > Buffer2[i-1]){
b3[i] = Low[i]-10*Point;
}
}
return(0);
}

riscking, si quieres una alerta en pantalla debes utilizar la función Alert. Podría ser algo como esto:

"Alert (Symbol()+" "+Period()+" comentario");

Esto te sacaría una alerta en pantalla con la información del PAR, TimeFrame y el comentario que tu quieras poner.
Espero que esto te ayude. Saludos.

Wolfman
14-12-2024 14:21,
Después de revisar el código, espero haber dado con la solución.

Espero te sirva, lo testeas y nos avisas cualquier situación.

http://www.tradingunited.es/foro/trading-automatico-eas-herramientas-indicadores-y-scripts/6156-indicador-ondas-de-elliott-alerta.html#post59282


Saludos y Exitos.

riscking
14-12-2024 22:50,
Ok, lu subo.

http://menu-graphics.net/mipc/Elliott_Wave_Oscillator-Arrows.mq4


//+------------------------------------------------------------------+//| Elliott Wave Oscillator.mq4 |
//| [email protected] |
//| |
//+------------------------------------------------------------------+
#property copyright "[email protected]"
#property link ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue

extern int Fast.MA.Period = 5;
extern int Slow.MA.Period = 34;
extern int Signal.period = 5;

//---- buffers
double Buffer1[],
Buffer2[],
b2[],
b3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators

// two additional buffers used for counting

IndicatorBuffers(4);


IndicatorShortName("Elliott Wave Oscillator");

SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(0,234); // down 226 234 242
SetIndexBuffer(0,b2);

SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(1,233); //UP 225 233 241
SetIndexBuffer(1,b3);

// These buffers are not plotted, just used to determine arrows

SetIndexBuffer (2,Buffer1);
SetIndexBuffer (3,Buffer2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, counted_bars=IndicatorCounted();
double MA5,MA34;
int limit=Bars-counted_bars;
Print(" print limit = ", limit);
if(counted_bars>0) limit++;
//---- TODO: add your code here

// Main line
for(i=0; i<limit; i++)
{
MA5=iMA(NULL,0,Fast.MA.Period,0,MODE_SMA,PRICE_MED IAN,i);
MA34=iMA(NULL,0,Slow.MA.Period,0,MODE_SMA,PRICE_ME DIAN,i);

Buffer1[i]=MA5-MA34;
}

// Signal line

for(i=0; i<limit; i++)
{
Buffer2[i]=iMAOnArray(Buffer1,Bars,Signal.period,0,MODE_LWMA ,i);
}

// Arrows

for(i=0; i<limit; i++)
{
if(Buffer1[i] > Buffer2[i] && Buffer1[i-1] < Buffer2[i-1])
b2[i] = High[i]+10*Point;
if(Buffer1[i] < Buffer2[i] && Buffer1[i-1] > Buffer2[i-1])
b3[i] = Low[i]-10*Point;
}

//----
return(0);
} //+------------------------------------------------------------------+

Saludos

Wolfman
18-12-2024 22:54,
Estoy intentando leer el valor del indice de b2 o b3 desde un asesor experto as:
int x= b2;
int y =b3;
double kk=iCustom( NULL, 0, "Elliott_Arrow",x,y, 1, 0);
Alert(kk);

pero siempre me da 0 errores no da,
Alguno que controle de programación.

Es factible que subas el indicador, yo el problema que le veo que el indicador esta programado solo para mostrar algo en la pantalla y no guarda el valor de las variables, en cada vela se mete en lo buffer para calcular los valores.


Si te fijas en el programa utiliza dos emas, la de 5 y 34 periodos a la de 5 periodos la denomina la señal,

Me gustaria ver el indicador en un grafico para poder ver que es lo que hace.

Saludos.

riscking
18-12-2024 23:06,
Estoy intentando leer el valor del indice de b2 o b3 desde un asesor experto as:
int x= b2;
int y =b3;
double kk=iCustom( NULL, 0, "Elliott_Arrow",x,y, 1, 0);
Alert(kk);

pero siempre me da 0 errores no da,
Alguno que controle de programación.

riscking
21-12-2024 00:21,
Vaya pensaba que habia contestado, le habre dado a vista previa. Lo escribo de nuevo.

Decia que pienso que SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1); es la que imprime la flecha pero si pongo el alert debajo sale solo cuando se ejecuta al principio solamente.

He estado leyendo mucho por ahi pero no me he entero de nada, lo unico que he podido sacar igual algo en claro es que igual se tiene que leer desde una asesor experto o algo asi.

A ver si algien sabe algo mas del tema.

un saludo.

riscking
21-12-2024 03:02,
Es todo el indicador si, se supone que la q lo dibuja creo que es

SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);

y la acabada en 0 , la otra fecha, pero si debajo de ella pones el alert solo salta al ejecutarse la primera vez

No entiendo na :@

LLevo un buen rato leyendo por ahi un poco de todo y no me aclaro de nada, valga la redundancia pero igual hay q hacer un asesor experto y leerlo desde ahi podria ser??,

Wolfman
21-12-2024 03:36,
Eso mismo habia pensao yo pero si pones un alerta ahi esta saltando constantemente cada vez que se mueve la vela y temina de calcular el limit que es la cantidad, jaja.

Pero gracias por responder de ahi que no acabo de entender muy bien el codigo.

A ver si hay alguna otra opcion.

un saludo.

Ok.

Una pregunta esa es todo el codigo del indicador, porque solo seria de identificar la linea que hace que el indicador te dibuje la flecha que dices.

Lo descargare y lo probare para salir de dudas, si pudieras subir imagenes seria mas facil que otros compañeros echen la mano.

En el pasado he tenido problemas con indicador que solo dibujan algo, porque hay que realizar otras lineas para meterle la alarma.

Saludos.

riscking
21-12-2024 04:17,
Eso mismo habia pensao yo pero si pones un alerta ahi esta saltando constantemente cada vez que se mueve la vela y temina de calcular el limit que es la cantidad, jaja.

Pero gracias por responder de ahi que no acabo de entender muy bien el codigo.

A ver si hay alguna otra opcion.

un saludo.

Wolfman
21-12-2024 09:23,
Hola, estoy probando ha hacer cositas manipulando un indicador mq4, se algo de c pero se me esta haciendo complicado, os queria preguntar a ver si podriais ayudar.

El caso es que el indicador lo que hacer es segun las ondas de elliot pone imprime en el grafico una flecha hacia arriba y otra hacia abajo, la cosa es que me gustaria que en el momento en el que la imprima me muestre una alerta en la pantalla. Aparente parece facil pero no doy con la forma a ver si podeis ayudar, he conseguido que segun el buffer me vaya imprimiendo la ultima que me ha mostrado pero no quiero eso.

os pongo el código q no es mucho, porque no se como subir el archivo.

Un saludo y a ver si es posible o no hacerlo.


#property copyright "[email protected]"#property link ""


#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue


extern int Fast.MA.Period = 5;
extern int Slow.MA.Period = 34;
extern int Signal.period = 5;


//---- buffers
double Buffer1[],
Buffer2[],
b2[],
b3[];
extern int x;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators


// two additional buffers used for counting


IndicatorBuffers(4);


IndicatorShortName("Elliott_Arrow");

SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(0,234); // down 226 234 242
SetIndexBuffer(0,b2);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(1,233); //UP 225 233 241
SetIndexBuffer(1,b3);

// These buffers are not plotted, just used to determine arrows


SetIndexBuffer (2,Buffer1);
SetIndexBuffer (3,Buffer2);
//Alert(b2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, counted_bars=IndicatorCounted();
double MA5,MA34;
int limit=Bars-counted_bars;
Print(" print limit = ", limit);
if(counted_bars>0) limit++;
//---- TODO: add your code here

// Main line
for(i=0; i<limit; i++)
{
MA5=iMA(NULL,0,Fast.MA.Period,0,MODE_SMA,PRICE_MED IAN,i);
MA34=iMA(NULL,0,Slow.MA.Period,0,MODE_SMA,PRICE_ME DIAN,i);

Buffer1[i]=MA5-MA34;
}


// Signal line


for(i=0; i<limit; i++)
{
Buffer2[i]=iMAOnArray(Buffer1,Bars,Signal.period,0,MODE_LWMA ,i);
}

// Arrows


for(i=0; i<limit; i++)
{
if(Buffer1[i] > Buffer2[i] && Buffer1[i-1] < Buffer2[i-1]){
b2[i] = High[i]+10*Point;
Alert Funcion
}
if(Buffer1[i] < Buffer2[i] && Buffer1[i-1] > Buffer2[i-1]){
b3[i] = Low[i]-10*Point;
Alert funcion
}
}
return(0);
}

En programación mis conocimientos son limitados

Pero esta parte del código es el que calcula las flechas según entiendo por lo que al final de cada calculo si es positivo por lo que dibuje la flecha, tambien me de una alerta.

Espero no estar equivocado

Saludos

riscking
21-12-2024 11:31,
Hola, estoy probando ha hacer cositas manipulando un indicador mq4, se algo de c pero se me esta haciendo complicado, os queria preguntar a ver si podriais ayudar.

El caso es que el indicador lo que hacer es segun las ondas de elliot pone imprime en el grafico una flecha hacia arriba y otra hacia abajo, la cosa es que me gustaria que en el momento en el que la imprima me muestre una alerta en la pantalla. Aparente parece facil pero no doy con la forma a ver si podeis ayudar, he conseguido que segun el buffer me vaya imprimiendo la ultima que me ha mostrado pero no quiero eso.

os pongo el código q no es mucho, porque no se como subir el archivo.

Un saludo y a ver si es posible o no hacerlo.


#property copyright "[email protected]"#property link ""


#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue


extern int Fast.MA.Period = 5;
extern int Slow.MA.Period = 34;
extern int Signal.period = 5;


//---- buffers
double Buffer1[],
Buffer2[],
b2[],
b3[];
extern int x;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators


// two additional buffers used for counting


IndicatorBuffers(4);


IndicatorShortName("Elliott_Arrow");

SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(0,234); // down 226 234 242
SetIndexBuffer(0,b2);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(1,233); //UP 225 233 241
SetIndexBuffer(1,b3);

// These buffers are not plotted, just used to determine arrows


SetIndexBuffer (2,Buffer1);
SetIndexBuffer (3,Buffer2);
//Alert(b2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i, counted_bars=IndicatorCounted();
double MA5,MA34;
int limit=Bars-counted_bars;
Print(" print limit = ", limit);
if(counted_bars>0) limit++;
//---- TODO: add your code here

// Main line
for(i=0; i<limit; i++)
{
MA5=iMA(NULL,0,Fast.MA.Period,0,MODE_SMA,PRICE_MED IAN,i);
MA34=iMA(NULL,0,Slow.MA.Period,0,MODE_SMA,PRICE_ME DIAN,i);

Buffer1[i]=MA5-MA34;
}


// Signal line


for(i=0; i<limit; i++)
{
Buffer2[i]=iMAOnArray(Buffer1,Bars,Signal.period,0,MODE_LWMA ,i);
}

// Arrows


for(i=0; i<limit; i++)
{
if(Buffer1[i] > Buffer2[i] && Buffer1[i-1] < Buffer2[i-1]){
b2[i] = High[i]+10*Point;
}
if(Buffer1[i] < Buffer2[i] && Buffer1[i-1] > Buffer2[i-1]){
b3[i] = Low[i]-10*Point;
}
}
return(0);
}