¿Cómo codificar? - página 296

 

¿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_levelcolor

#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)

Laurus12:
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,

Laurus
 

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 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

Archivos adjuntos:
 

...

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

Laurus12:
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,

Laurus
 

La 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.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4))

{

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:

datetime H4BarTime;

int H1BarNumber;

H4BarTime = Tiempo;

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);

¡tx mucho!

Jacobo

 
mladen:
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.

tkuan77:
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
 
mladen:
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;

}

Así incluso no necesitas la función cruzada y comprobará si hay cruces en una barra cerrada.

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