Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
¿Es posible añadir color, estilo y peso a las líneas de los niveles del indicador?
Hola,
Me pregunto si alguien podría decirme si es posible añadir color, estilo y peso a las líneas de los niveles de los indicadores.
Para empezar me gustaría especificar tanto el estilo como el color a los niveles del RSI y me pregunto si se puede hacer esto añadiendo más código a, por ejemplo, la línea #property indicador_nivel1 70 ?
Si es posible agradecería mucho si alguien me lo pudiera indicar.
Gracias,
Laurus
...
Sí, puede
Utilizar las siguientes propiedades:
#property indicator_levelstyle
#property indicator_levelwidth
[/PHP]
If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)
You can use the SetLevelStyle() function too for that purpose,with same limitations as described above
[PHP]
void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)
Hola,
Me pregunto si alguien podría decirme si es posible añadir color, estilo y peso a las líneas de los niveles del indicador.
Para empezar me gustaría especificar tanto el estilo como el color a los niveles RSI y me pregunto si se puede hacer esto añadiendo más código a, por ejemplo, la línea: #property indicador_nivel1 70 ?
Si es posible agradecería mucho si alguien me lo pudiera indicar.
Gracias,
LaurusGracias por tu respuesta Mladen, tu ayuda es siempre muy apreciada.
Lo que has escrito es exactamente lo que me temía. Cuando se trata de la parte de las funciones todavía está por encima de mi cabeza.
Si usted echa un vistazo a la imagen se ve cómo me gustaría que fuera. Como compromiso he utilizado líneas horizontales normales, pero como dibujo líneas de tendencia con el propio indicador no es una buena solución.
Gracias,
Laurus
...
Mirando tu imagen, parece que es la única solución que puedes aplicar (usando objetos). El uso de buffers de dibujo simplemente agotaría tus buffers de dibujo y no podrías dibujar todos los valores que estás usando en ese indicador. A veces todavía estamos "pagando" por la decisión de metatraders 4 de tener sólo 8 buffers de dibujo
Gracias por tu respuesta Mladen, tu ayuda es siempre muy apreciada.
Lo que has escrito es exactamente lo que me temía. Cuando se trata de la parte de las funciones todavía está por encima de mi cabeza.
Si echas un vistazo a la imagen verás cómo me gustaría que fuera. Como solución de compromiso he utilizado líneas horizontales normales, pero como dibujo líneas de tendencia con el propio indicador no es una buena solución.
Gracias,
LaurusLa DLL externa devuelve resultados extraños
¡Hola!
A continuación se muestra un ejemplo muy simple de una llamada a una DLL externa. El registro del diario debería mostrar números crecientes a partir de 0 cuando se utiliza con el probador de estrategias.
Sin embargo, el resultado es bastante extraño. La primera fila del registro del diario muestra un número grande (es decir, 18472) y luego aumenta correctamente durante un tiempo hasta que empieza a saltar unos 10, a veces más de 100, pasos a la vez.
¿Podría alguien explicarme la razón de esto y cómo corregirlo?
Gracias.
// MyExpert.mql //
#import "MyDLL.dll"
int Test();
#import
void start(){
Print(Test());
}[/CODE]
// MyDLL.def //
LIBRARY MyDLL
EXPORTS
Test
[CODE]
// MyDLL.dll //
int i= 0;
int __stdcall Test() {
i++;
return i;
}problema de código interesante para el indicador
Hola Chicos,
Estoy tratando de aprender a programar en MT4, y en este momento estoy desarrollando un indicador de detección de PinBar, que me dice que comprar o bien. Este indicador lo desarrollé especialmente para el gráfico de 4 horas, debido a las reglas especiales para comprar o vender. La regla de detección es la siguiente
Cuerpo de la vela <= 35% de la longitud de la vela.
Al menos 1 mecha de la vela >= 50 % de la longitud de la vela.
Hasta ahora no tengo problemas para detectar esas barras con el indicador.
Sin embargo, la siguiente regla me indica que debo comprar o vender.
Me acerco al gráfico de 1 hora y miro las 4 barras que crearon el pinbar en el gráfico de 4 horas.
Utilicé la función iClose para recoger el valor del cierre de la primera y la última barra de esa formación en la barra de 1 hora.
Sin embargo..tal y como está programado ahora, siempre miro la primera y la última vela en el propio gráfico de 1 hora. Y eso no está bien. Tiene que ser la primera y la última barra de la formación y no del gráfico.
Aquí está el código que tengo ahora con las funciones iClose equivocadas en él.
{
Buy = Close;
SetLevel(true,i+1,Close);
}No he sido capaz de localizar las velas de 1 hora correctas en el fondo de esa vela de 4 horas en particular.
¿Hay alguien por ahí que pueda darme la respuesta a mi problema?
Lo he arreglado:
int H1BarNumber;
H4BarTime = Tiempo;
H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);¡tx mucho!
Jacobo
Viendo tu imagen, parece que es la única solución que puedes aplicar (usando objetos). Usar buffers de dibujo simplemente agotaría tus buffers de dibujo y no podrías dibujar todos los valores que estás usando en ese indicador. A veces todavía estamos "pagando" por la decisión de metatraders 4 de tener sólo 8 buffers de dibujo
Perdón por mi tardía respuesta Mladen y gracias por aclarar el asunto. Respecto a lo que has escrito, al menos ahora lo sé con certeza.
Gracias,
Laurus
Ayuda con los criterios de entrada
Hola chicos,
Estoy tratando de hacer un criterio de entrada usando MA. Mi criterio de entrada es simple, quiero entrar en una operación larga cuando la MA rápida cruza la MA lenta hacia arriba en el cierre de la vela en lugar de la vela actual y viceversa.
Mi situación actual es que mi EA desencadenará una operación larga cuando la MA rápida cruce la MA lenta hacia arriba y viceversa, sin embargo esa vela aún no se ha cerrado, y a veces cuando la vela se cierra, la MA final podría no cruzar hacia arriba por lo tanto, no debería haber desencadenado esa operación en particular, y sin embargo el sistema la desencadenó porque ha cruzado hacia arriba una vez y de vuelta. Esto es lo mismo para las operaciones cortas
Llevo ya unos días con esto sin ningún progreso. ¿Alguien puede aclarar cómo puedo hacer esto? Gracias.
//--- parámetros de entrada
extern double TakeProfit=2700.0;
extern double Lots=0.1;
extern double StopLoss=2500.0;
//+------------------------------------------------------------------+
//---función de inicialización del experto ||.
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Cruzado (doble línea1 , doble línea2)
{
static int última_dirección = 0
static int dirección_actual = 0;
if(línea1>línea2)dirección_actual = 1; //arriba
if(línea1<línea2)dirección_actual = 2; //abajo
if(dirección_actual != última_dirección) //cambio
{
última_dirección = última_dirección;
return (última_dirección);
}
else
{
return (0);
}
}
//+------------------------------------------------------------------+
//| función de inicio experto ||
//+------------------------------------------------------------------+
int inicio()
{
//----
int cnt, ticket, total
double shortEma, longEma;
if(Bars<100)
{
Print("barras inferiores a 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit menos de 10");
return(0); // comprobar TakeProfit
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
if(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Mi EA",12345,0,Verde);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}
if(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "Mi EA",12345,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de venta abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
Gracias y saludos
Terrance
...
Terrance
Prueba a cambiar estas líneas :
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);[/PHP]
to something like this :
[PHP] int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);
double diff1 = shortEma1-longEma1;
double diff2 = shortEma2-longEma2;
if ((diff1*diff2)<0)
{
if (shortEma1>longEma1)
isCrossed = 1;
else isCrossed = 2;
}
De esta manera incluso no necesitas la función cruzada y se comprobará si hay cruces en una barra cerrada.
Hola chicos,
Estoy tratando de hacer un criterio de entrada usando MA. Mi criterio de entrada es simple, quiero entrar en una operación larga cuando la MA rápida cruza la MA lenta hacia arriba en el cierre de la vela en lugar de la vela actual y viceversa.
Mi situación actual es que mi EA desencadenará una operación larga cuando la MA rápida cruce la MA lenta hacia arriba y viceversa, sin embargo esa vela aún no se ha cerrado, y a veces cuando la vela se cierra, la MA final podría no cruzar hacia arriba por lo tanto, no debería haber desencadenado esa operación en particular, y sin embargo el sistema la desencadenó porque ha cruzado hacia arriba una vez y de vuelta. Esto es lo mismo para las operaciones cortas
Llevo ya unos días con esto sin ningún progreso. ¿Alguien puede aclarar cómo puedo hacer esto? Gracias.
//--- parámetros de entrada
extern double TakeProfit=2700.0;
extern double Lots=0.1;
extern double StopLoss=2500.0;
//+------------------------------------------------------------------+
//---función de inicialización del experto ||.
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Cruzado (doble línea1 , doble línea2)
{
static int última_dirección = 0
static int dirección_actual = 0;
if(línea1>línea2)dirección_actual = 1; //arriba
if(línea1<línea2)dirección_actual = 2; //abajo
if(dirección_actual != última_dirección) //cambio
{
última_dirección = última_dirección;
return (última_dirección);
}
else
{
return (0);
}
}
//+------------------------------------------------------------------+
//| función de inicio experto ||
//+------------------------------------------------------------------+
int inicio()
{
//----
int cnt, ticket, total
double shortEma, longEma;
if(Bars<100)
{
Print("barras inferiores a 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit menos de 10");
return(0); // comprobar TakeProfit
}
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
if(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Mi EA",12345,0,Verde);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}
if(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "Mi EA",12345,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de venta abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
return(0);
}
return(0);
}
//+------------------------------------------------------------------+
Gracias y saludos
TerranceTerrance
Prueba a cambiar estas líneas :
shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);[/PHP]
to something like this :
[PHP] int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);
double diff1 = shortEma1-longEma1;
double diff2 = shortEma2-longEma2;
if ((diff1*diff2)<0)
{
if (shortEma1>longEma1)
isCrossed = 1;
else isCrossed = 2;
}
Hola Mladen, he probado lo que me has dicho y funciona de maravilla. Sin embargo, no entiendo muy bien la lógica detrás de los códigos. ¿por qué se establece el desplazamiento de iMA a 1 y 2 y por qué el código de este: (diff1*diff2)<0) también? Lo siento pero de momento sigo con la frase de aprendizaje.
Gracias y saludos
Terrance