¿Cómo codificar? - página 297

 

...

Terrance

Querías probar un cruce en una barra cerrada. El turno 1 significa la primera barra cerrada y el turno 2 significa la primera barra antes de eso. Y si quieres probar un cruce en una barra cerrada esas son las barras que tienes que probar

A partir de (diff1*diff2)<0) es bastante simple en realidad

diff1 es la diferencia entre 2 medias en la barra 1

diff2 es la diferencia entre 2 medias en la barra 2

Cualquiera puede ser positiva o negativa. Lo que nos interesa es cuando una es positiva y la otra negativa porque eso significa que las medias se han cruzado. Multiplicándolas nos da una respuesta rápida si hay un cruce (si los signos son diferentes, entonces el resultado es menor que 0, si los signos son iguales el resultado de esa multiplicación es mayor que 0)

Espero que esto haya aclarado lo que hace ese código

tkuan77:
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é se codifica esto: (diff1*diff2)<0) también? Lo siento pero de momento sigo con la frase de aprendizaje.

Gracias y saludos

Terrance
 

Cómo añadir flechas

Se adjunta una versión abreviada del EA de cruce de MA que se ha discutido en los últimos posts.

Cuando se produce un cruce en una vela cerrada, esta versión imprime un mensaje en el archivo de registro.

¿Sería posible reemplazar la lógica de impresión con un código que muestre las flechas arriba/abajo en el gráfico?

Gracias por su ayuda.

Archivos adjuntos:
 

...

Pruebe esta manera ...

Dibujará la flecha y mostrará un comentario en la esquina inferior derecha del gráfico - así (añadí los promedios en el gráfico sólo para que sea obvio lo que hace) :

michaelB:
Se adjunta una versión abreviada del EA de cruce de MA que se ha discutido en los últimos posts.

Cuando se produce un cruce en una vela cerrada, esta versión imprime un mensaje en el archivo de registro.

¿Sería posible reemplazar la lógica de impresión con un código que muestre las flechas arriba/abajo en el gráfico?

Gracias por su ayuda.
Archivos adjuntos:
 

Flechas MA

El "2MAcrossover con comentarios" funciona muy bien.

Sólo una pregunta: una vez que aparece una flecha, desaparece cuando se abre una nueva vela, ¿fue esto intencional?

Me gusta el comentario en la esquina inferior derecha del gráfico.

Gracias de nuevo.

 
mladen:
Terrance

Usted quería probar una cruz en una barra cerrada. El turno 1 significa la primera barra cerrada y el turno 2 significa la primera barra antes de eso. Y si desea probar un cruce en una barra cerrada esas son las barras que tiene que probar

A partir de (diff1*diff2)<0) es bastante simple en realidad

diff1 es la diferencia entre 2 medias en la barra 1

diff2 es la diferencia entre 2 medias en la barra 2

Cualquiera puede ser positiva o negativa. Lo que nos interesa es cuando una es positiva y la otra negativa porque eso significa que las medias se han cruzado. Multiplicándolas nos da una respuesta rápida si hay un cruce (si los signos son diferentes, entonces el resultado es menor que 0, si los signos son iguales el resultado de esa multiplicación es mayor que 0)

Espero que esto aclare lo que hace ese código

¡Gracias Mladen por tu ayuda! Pero cuando he añadido ese código, mi EA parece ir un poco loco. De vez en cuando se auto SL o TP por su cuenta, incluso antes de que el SL o TP real se alcanza como el que se muestra en mi captura de pantalla.

Gracias y saludos

Terrance

//--- parámetros de entrada

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//---función de inicialización del experto ||.

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de desinicialización experta ||

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int última_dirección_de_la_familia = 0

static int direccion_actual = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //principal hacia abajo

if(dirección_actual_principal != última_dirección_principal) //principal cambiado

{

mainlast_direction = maincurrent_dirction;

return (última_dirección_principal);

}

else

{

return (0);

}

}

//+------------------------------------------------------------------+

//| función de inicio experto ||

//+------------------------------------------------------------------+

int inicio()

{

//----

int cnt, ticket, total

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("barras menos de 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit menos de 10");

return(0); // comprobar TakeProfit

}

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;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1;

si no, isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

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 && mainshortEma < mainlongEma)

{

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

}

//+------------------------------------------------------------------+

Archivos adjuntos:
ps.jpg  16 kb
 

Terrance

Ese código no tiene nada que ver con el SL o el TP. Simplemente prueba 2 promedios para cruces (ver como michaelB usó ese mismo código en su 2MACrosses, ya que eso es nan EA también). El resto de tu código debe ser revisado para esos errores de SL y TP

tkuan77:
¡Gracias Mladen por su ayuda! Pero cuando añadí ese código, mi EA parece ir un poco loco. De vez en cuando se auto SL o TP por su cuenta, incluso antes de que el SL o TP real se alcanza como el que se muestra en mi captura de pantalla.

Gracias y saludos

Terrance

//--- parámetros de entrada

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//---función de inicialización del experto ||.

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| función de desinicialización experta ||

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int última_dirección_de_la_familia = 0

static int direccion_actual = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //principal hacia abajo

if(dirección_actual_principal != última_dirección_principal) //principal cambiado

{

mainlast_direction = maincurrent_dirction;

return (última_dirección_principal);

}

else

{

return (0);

}

}

//+------------------------------------------------------------------+

//| función de inicio experto ||

//+------------------------------------------------------------------+

int inicio()

{

//----

int cnt, ticket, total

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("barras menos de 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit menos de 10");

return(0); // comprobar TakeProfit

}

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;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1;

si no, isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

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 && mainshortEma < mainlongEma)

{

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

}

//+------------------------------------------------------------------+
 

...

Sí, es intencional

Como hiciste un EA y no un indicador, la adición fue para que sólo muestre el último cruce activo y cuando no hay cruce activo, no para que muestre una flecha. Para que pueda mostrar múltiples flechas tendría que ser convertido en indicador primero y luego todo tendría que ser reescrito, pero creo que hay un montón de indicadores que están mostrando promedios de cruces en el gráfico ya

michaelB:
El "2MAcrossover con comentarios" funciona muy bien.

Sólo una pregunta - una vez que aparece una flecha, desaparecerá cuando se abra una nueva vela, ¿era esto intencional?

Me gusta el comentario en la esquina inferior derecha del gráfico.

Gracias de nuevo.
 
mladen:
Terrance Ese código no tiene nada que ver con el SL o el TP. Simplemente prueba 2 promedios para cruces (ver como michaelB usó ese mismo código en su 2MACrosses, ya que ese es nan EA también). El resto de tu código necesita ser revisado para esos errores de SL y TP

Hola Mladen,

¿quieres decir que la forma en que puse mi TP y SL están mal o?

Saludos

Terrance

 

...

Terrance

¿Has visto esta sección de TSD : Lecciones?

Creo que muchas de las preguntas ya están contestadas allí y que puedes encontrar muy buenos ejemplos para la escritura general de EAs allí. En cuanto a tu pregunta: no he probado tu EA, así que no lo sé. El problema de probar el EA de otra persona es que uno tiene que conocer la idea y la lógica del mismo y muchas veces es simplemente imposible "leer" eso desde el propio código. El fragmento de código del que hablábamos se refería a cómo detectar 2 cruces de medias en una barra cerrada y ese código hace justo eso y nada más que eso. Por eso dije que "no tiene nada que ver con el SL o el TP"

saludos

Mladen

tkuan77:
Hola Mladen,

¿te refieres a que la forma en que configuro mi TP y SL están mal o?

Saludos

Terrance
 

Hilo de Lecciones MQL

mladen-- ¡¡¡gracias por el enlace!!!

Razón de la queja: