¿Cómo codificar? - página 298

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

Hola Mladen, perdona que te moleste de nuevo. He revisado mis códigos y noto que no sólo mi TP y SL, a veces incluso mis órdenes de compra y venta están fuera de lugar. He revisado los enlaces en la lección que me diste por codersgurus y es el mismo conjunto de tutoriales que tenía y basado en mis códigos. En serio no puedo encontrar la causa de mi error en los códigos.

Los cruces de la MA funciona como debería junto con la orden larga y corta, sin embargo, a veces la entrada y la salida parece ir loco, incluso cuando hice una función básica ASK para probarlo. Por favor, arrojar algo de luz aquí.

Gracias y saludos

Terrance

 

...

Terrance

En primer lugar: ¿Es su corredor ECN / STP como? Si es así, entonces no puedes colocar el stop loss y el take profit junto con la apertura de la orden, sino que primero debes abrir una orden con esos valores a 0 y luego utilizar OrderModify() para establecer el stop loss y/o el take profit en una orden ya abierta.

Segundo : También, compruebe siempre si tiene algo escrito en la pestaña de expertos de la ventana del terminal (compruebe si hay algunos errores escritos allí: probablemente descubrirá entonces lo que está pasando y por qué

Tercero : Podría ser una buena idea colocar una línea como esta :

int err=GetLastError(); Print(err);

Después de cada función de gestión de pedidos. Las descripciones de los errores se pueden encontrar en el archivo experts/include/stderror.mqh (hay muchos errores que pueden ocurrir (sólo vea la lista de posibles códigos de error y descripciones) con las órdenes y debe monitorear todos y cada uno de los posibles errores) Con los códigos de error conocidos (la línea de código de arriba), puede concentrarse en la corrección de errores específicos en lugar de adivinar lo que está pasando

tkuan77:
Hola Mladen, siento molestarte de nuevo. He revisado mis códigos y noto que no sólo mi TP y SL, a veces incluso mis órdenes de compra y venta están fuera de lugar. He revisado los enlaces en la lección que me diste por codersgurus y es el mismo conjunto de tutoriales que tenía y basado mis códigos en. No puedo encontrar la causa de mi error en los códigos.

Los cruces de la MA funcionan como deberían junto con la orden Larga y Corta, sin embargo, a veces la Entrada y la Salida parecen ir mal incluso cuando hice una función básica de ASK para probarlo. Por favor, arrojar algo de luz aquí.

Gracias y saludos

Terrance
Archivos adjuntos:
terminal_1.gif  62 kb
 
mladen:
Terrance

En primer lugar: ¿Su broker es del tipo ECN/STP? Si es así, entonces no puede colocar el stop loss y el take profit junto con la apertura de la orden, sino que primero debe abrir una orden con estos valores a 0 y luego utilizar OrderModify() para establecer el stop loss y/o el take profit en una orden ya abierta.

Segundo : También, compruebe siempre si tiene algo escrito en la pestaña de expertos de la ventana del terminal (compruebe si hay algunos errores escritos allí: probablemente descubrirá entonces lo que está pasando y por qué

Tercero : Podría ser una buena idea colocar una línea como esta :

int err=GetLastError(); Print(err);
Después de cada función de gestión de pedidos. Las descripciones de los errores se pueden encontrar en el archivo experts/include/stderror.mqh (hay muchos errores que pueden ocurrir (sólo hay que ver la lista de posibles códigos de error y descripciones) con los pedidos y hay que controlar todos y cada uno de los posibles errores) Con los códigos de error conocidos (la línea de código de arriba), puede concentrarse en la corrección de errores específicos en lugar de adivinar lo que está pasando

Hola Mladen,

Gracias por señalar la cosa ECN/STP. No sabía de ellos hasta que lo mencionaste. He hecho los cambios como usted sugirió, sin embargo ahora sólo se puso peor para mí. No sólo es el problema de entrada y salida persisten, mi SL está desapareciendo ahora. Esto es más difícil de lo que pensaba.

//--- 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,0,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,0,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

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

}

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY) // se abre una posición larga

{

OrderClose(OrderTicket(),OrderLots(),Ask-StopLoss*Point,3,Violet);

// se cierra la posición

return(0); // salir

}

else // ir a la posición corta

{

OrderClose(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet);

// cerrar la posición

return(0); // salir

}

}

}

return(0);

}

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

 
mladen:
Terrance

En primer lugar: ¿Su broker es del tipo ECN/STP? Si es así, entonces no puede colocar el stop loss y el take profit junto con la apertura de la orden, sino que primero debe abrir una orden con estos valores a 0 y luego utilizar OrderModify() para establecer el stop loss y/o el take profit en una orden ya abierta.

Segundo : También, compruebe siempre si tiene algo escrito en la pestaña de expertos de la ventana del terminal (compruebe si hay algunos errores escritos allí: probablemente descubrirá entonces lo que está pasando y por qué

Tercero : Podría ser una buena idea colocar una línea como esta :

int err=GetLastError(); Print(err);
Después de cada función de gestión de pedidos. Las descripciones de los errores se pueden encontrar en el archivo experts/include/stderror.mqh (hay muchos errores que pueden ocurrir (sólo hay que ver la lista de posibles códigos de error y descripciones) con los pedidos y hay que controlar todos y cada uno de los posibles errores) Con los códigos de error conocidos (la línea de código de arriba), puede concentrarse en la corrección de errores específicos en lugar de adivinar lo que está pasando

Hey Mladen, me gustaría agradecerte tu ayuda estos días. He conseguido encontrar el error en mi código que está causando el error de entrada y salida.

Saludos

Terrance

 

Abrir más de 1 operación

Hola a todos, he estado tratando de hacer que mi EA sea capaz de abrir múltiples operaciones, pero hasta ahora sólo soy capaz de hacer que se limite a 1 operación.

Mi objetivo es simple:

Cuando la LWMA 10 cruce por debajo de la LWMA 20 el sistema se pondrá en corto siempre que tanto la LWMA 10 como la 20 crucen por debajo de la SMA 50 y viceversa para las operaciones en largo.

Quiero limitar mi EA para abrir no más de 2 operaciones, sin embargo, cuando cambio los códigos, se convierte en la apertura de 2 operaciones a la vez en lugar de abrir 1 operación por criterio.

¿Necesito configurar un sistema de contador o algo así o cómo configuro mi contador para que reaccione cuando 1 de mis operaciones ya tiene TP o SL?

Alguien puede arrojar algo de luz aquí en cuanto a lo que está mal con mis códigos.

Muchas gracias y saludos

Terrance

//--- parámetros de entrada

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1;

si no, isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

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

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

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

}

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

 

Preguntas

Mladen,

Estoy tratando de buscar lecciones en el enlace que me has mostrado, pero son lecciones genéricas, estoy buscando información para específicamente para el indicador de Henderson...

Además, he revisado los hilos publicados y después de eso quiero encontrar las siguientes cosas.

-En lenguaje sencillo y fácil de entender, quiero preguntar es que aproximadamente después de cuántas barras pasa, y el color cambia.

En otras palabras, ¿máximo cuántas barras se necesita antes de que el color de la línea cambia de azul a rosa? Por desgracia, no entiendo la terminología de lujo y me appriciated respuesta muy simple donde puedo seguir adelante y comenzar la estrategia. Cualquier gráfico es altamente appriciated. premalmunshaw@yahoo.com es mi dirección de correo electrónico.

Estoy tratando de pagar $ 39 para este paquete para ser activado.

¡ESPERANDO UNA RESPUESTA POSITIVA!

Saludos,

Premal Munshaw

mladen:
Francamente, no entiendo lo que está preguntando.

Si preguntas cuándo cambia el color, la respuesta es: cuando cambia la pendiente.

Si usted está preguntando cómo se codifica para cambiar de color, entonces la respuesta que debe buscar en esta sección : Lecciones.
 

...

Desgraciadamente no entiendo sus preguntas, así que lo único que haré será volver a citarme (la longitud de cálculo se refiere a la longitud de cálculo del filtro de Henderson) :

si su longitud de cálculo es de 5 entonces los últimos 2 bares pueden cambiar

si su longitud de cálculo es de 7, los últimos 3 compases pueden cambiar

Si la longitud de cálculo es 9, los últimos 4 compases pueden cambiar.

Más simple que eso es imposible de responder. Y no hay una explicación más sencilla de cómo se calcula el filtro de Henderson : sería si intentara explicar la transformada de Fourier en términos de "1+1 = 2". Por favor, examina los enlaces que te han proporcionado

En cuanto al resto : tienes enlaces a las matemáticas que hay detrás del filtro, tienes información sobre cuántas barras se recalculan, incluso tienes ejemplos del hilo de noticias de la sección de élite. En cuanto a la estrategia que utiliza ese filtro: he dicho 1000 veces en 1000s de mensajes que los indicadores de recálculo (SSA, filtro de Henderson, TMA centrado, transformadas de Fourier, análisis de regresión, ...) no deben ser utilizados en "modo de señalización", sino en "modo de estimación". Si lo que buscas es una señal del filtro de Henderson, entonces estás en un camino completamente equivocado y si es la única razón por la que consideras la suscripción a la sección de élite, entonces es mejor que no te suscribas

PD: es una mala práctica hacer público su correo electrónico. De esta manera todo lo que vas a conseguir es una tonelada de mensajes de spam en tu buzón de correo electrónico

______________________________________

Te deseo lo mejor en tu búsqueda de un sistema de trading

saludos

Mladen

premalmunshaw:
Mladen,

Estoy intentando buscar las lecciones en el enlace que me has mostrado, pero son lecciones genéricas, estoy buscando información para el indicador de Henderson específicamente...

Además, he revisado los hilos publicados y después de eso quiero encontrar las siguientes cosas.

-En lenguaje sencillo y fácil de entender, quiero preguntar es que aproximadamente después de cuántas barras pasa, y el color cambia.

En otras palabras, ¿máximo cuántas barras se necesita antes de que el color de la línea cambia de azul a rosa? Por desgracia, no entiendo la terminología de lujo y me appriciated respuesta muy simple donde puedo seguir adelante y comenzar la estrategia. Cualquier gráfico es altamente appriciated. premalmunshaw@yahoo.com es mi dirección de correo electrónico.

Estoy tratando de pagar $ 39 para este paquete para ser activado.

¡ESPERANDO UNA RESPUESTA POSITIVA!

Saludos,

Premal Munshaw
 

Mladen,

¿Existe una manera de establecer un contador a mi comercio de tal manera que cuando mi comercio tiene TP o SL soy capaz de desencadenar el salto del contador?

Saludos

Terrance

tkuan77:
Hola a todos, he estado tratando de hacer que mi EA sea capaz de abrir múltiples operaciones, pero hasta ahora sólo soy capaz de hacer que se limite a 1 operación.

Mi objetivo es simple:

Cuando la LWMA 10 cruce por debajo de la LWMA 20 el sistema se pondrá en corto siempre que tanto la LWMA 10 como la 20 crucen por debajo de la SMA 50 y viceversa para las operaciones en largo.

Quiero limitar mi EA para abrir no más de 2 operaciones, sin embargo, cuando cambio los códigos, se convierte en la apertura de 2 operaciones a la vez en lugar de abrir 1 operación por criterio.

¿Necesito configurar un sistema de contador o algo así o cómo configuro mi contador para que reaccione cuando 1 de mis operaciones ya tiene TP o SL?

Alguien puede arrojar algo de luz aquí en cuanto a lo que está mal con mis códigos.

Muchas gracias y saludos

Terrance

//--- parámetros de entrada

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1;

si no, isCrossed = 2;

}

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

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

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

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

}

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

...

Pruebe esta función:

int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
y luego puedes comprobar
:if openedBuys==0 open buy

if openedSells==0 open sell

tkuan77:
Mladen,

¿Hay alguna manera de establecer un contador a mi comercio de tal manera que cuando mi comercio tiene TP o SL soy capaz de desencadenar el salto del contador?

Saludos

Terrance
 

Hola Mladen,

He llegado a otra manera mediante el uso de la función "Bares". Cuando se desencadena una operación, estableceré un recuento entero con la función de barras (por ejemplo, una operación de compra se desencadena en la barra 122, por lo que el recuento será 122) y cuando mis criterios se hayan desencadenado de nuevo, llamaré a la función de barras de nuevo y la compararé con el recuento y la operación sólo se desencadenará si el nuevo recuento es mayor que el anterior, que es 122 en este caso.

Sin embargo, todavía estoy desencadenando 2 operaciones juntas en lugar de 1 por criterio. ¿Por qué es así?

Por favor, ayúdenme.

Gracias y saludos

Terrance

//--- parámetros de entrada

extern double TakeProfit=530.0;

extern double Lots=0.1;

extern double StopLoss=520.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,113,0,MODE_EMA,PRICE_CLOSE,0);

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1;

si no, isCrossed = 2;

}

int BarCounter, BarCounter2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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());

BarCounter = Bares;

}

else Print("Error al abrir la orden de COMPRA : ",GetLastError());

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Orden de venta abierta : ",OrderOpenPrice());

BarCounter = Bares;

}

else Print("Error al abrir la orden de VENTA : ",GetLastError());

return(0);

}

return(0);

}

if(total == 1)

{

BarCounter2 = Bars;

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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());

BarCounter = BarCounter2;

}

else Print("Error al abrir la orden de COMPRA : ",GetLastError());

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Mi EA",12345,0,Rojo);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Orden de venta abierta : ",OrderOpenPrice());

BarCounter = BarCounter2;

}

else Print("Error al abrir la orden de VENTA : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

mladen:
Prueba esta función :
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
y luego puedes comprobar
:if openedBuys==0

open

buy

if openedSells==0 open sell

Razón de la queja: