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
La función IndexByTicket().
Devuelve el índice (número ordinal en la lista general de órdenes establecidas o posiciones abiertas) de la orden o posición en el ticket. Si IndexByTicket() no encuentra una orden o posición con el ticket requerido, devolverá -1. Podemos limitar la lista de órdenes o posiciones a comprobar mediante los parámetros de la función:
Escribí la función IndexByTicket() en un EA personalizado. Recuerdo que no podía prescindir de él, si no, ¿por qué lo habría escrito? Pero no recuerdo cómo se usaba allí ni por qué lo escribí prácticamente :-) Buscar el código fuente del asesor es aburrido. Hay cientos de ellos.
De todas formas, no veo el sentido de poner ejemplos como los que ya he puesto. Si somos inteligentes, podemos averiguar dónde "poner" los parámetros. Y si alguien tiene una buena idea para utilizar la función IndexByTicket(), que la publique aquí. Intentaré realizarlo.
Un breve anuncio.
Funciones SelectByTicket() y SelectByTicketFromHistory() suprimidas. Yo no los utilizaré, así que no veo el sentido de publicarlos. Quienes deseen debatir sobre este tema son siempre bienvenidos. Mostraré todos mis delirios TAL CUAL.
La función NumberOfOrders().
Esta función devuelve el número de pedidos y anula completamente ExistOrders(). Para sustituir la función ExistOrders() por la función NumberOfOrders(), es necesario y suficiente comprobar el valor de retorno para que sea mayor que cero. Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:
Ejemplos de cómo utilizar la función NumberOfOrders().
Adjuntamos de nuevo un script de trabajo con los ejemplos anteriores.
La función NumberOfOrders().
Esta función devuelve el número de pedidos y anula completamente ExistOrders(). Para sustituir la función ExistOrders() por la función NumberOfOrders(), es necesario y suficiente comprobar el valor de retorno para que sea mayor que cero. Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:
Estoy un poco confundido. Por alguna razón, veo alguna contradicción. Aquí mismo:
"...es necesario y suficiente comprobar que el valor de retorno es mayor que cero".
Si marca "esto y sólo esto", la función sobre el número de pedidos no tiene sentido.
Por eso empecé a meterme en esto. He insertado esta función en mi Asesor Experto. Pongo m=1 en los parámetros y la condición de abrir posiciones.
Pero es como si el Asesor Experto no viera esta limitación. Y abre órdenes en cada señal.
¿Cuál puede ser el problema aquí?
Estoy un poco confundido. Por alguna razón, veo una cierta contradicción. Aquí mismo:
"...es necesario y suficiente comprobar que el valor de retorno es mayor que cero".
Si marcamos "esto y sólo esto", entonces la función para el número de pedidos no tiene sentido.
hmm... Parece que no está prestando atención a la cantidad de información devuelta por cada una de las funciones ExistOrders() y NumberOfOrders(). La función ExistOrders( ) sólo devuelve información sobre la existencia de órdenes, y la función NumberOfOrders() devuelve información sobre el número de órdenes. La información sobre el número de pedidos contiene la información sobre la existencia de pedidos. Cuando necesitamos responder a la pregunta de si un pedido existe o no, la información sobre el número de pedidos es redundante. Por eso he dicho que si queremos sustituir la función ExistOrders() por la función NumberOfOrders(), debemos comprobar el valor devuelto por la función NumberOfOrders() para asegurarnos de que es mayor que cero. Al fin y al cabo, está claro que si este valor es igual a cero, no hay pedidos, y si este valor es mayor que cero, los pedidos están presentes. La función ExistOrders( ) se puede utilizar cuando no necesitamos información sobre la cantidad de pedidos, mientras que la función NumberOfOrders() se puede utilizar cuando no necesitamos información sobre la cantidad de pedidos y cuando sí la necesitamos. En este sentido, la función NumberOfOrders( ) sustituye completamente a la función ExistOrders().
Esto es lo que he empezado a investigar. He insertado esta función en mi Asesor Experto. Pongo m=1 en los parámetros y la condición de abrir posiciones.
Pero es como si el Asesor Experto no viera esta limitación. Y abre órdenes en cada señal.
¿Cuál puede ser el problema aquí?
Gracias. Lo tengo todo. Tanto en la primera pregunta como en la segunda.
En otras palabras, la función "ampliada" NumberOfOrders() ya incluye esencialmente la función IndexByTicket()
Sí, en efecto. ¡Abrí OP_BUY y OP_SELL !
Todavía tengo que darle un ejemplo de su siguiente función que funciona exactamente con las posiciones. (no con órdenes).
Recuerdo que ya lo has publicado en algún lugar de este foro. No lo encuentro.
Queda por dar un ejemplo de su siguiente función que funciona exactamente con las posiciones. (no con pedidos)
He terminado con las funciones para los pedidos. A continuación, las funciones de los puestos. Hay unos 30.
Recuerdo que en algún lugar del foro ya lo publicaste. No lo encuentro.
busque en
Querido Igor, ¡te pido ayuda! Necesito añadir un EA para que pueda tomar posiciones en varios instrumentos. Hay 2 EAs trabajando, MACD estándar y Ema, cada uno con 6 posiciones, pero sólo una posición se abre... He leído sus comentarios al respecto, pero como no soy bueno con el idioma, no puedo entender dónde añadir qué... Si no te importa, por favor, ayuda... copiado asesor de Ema... Gracias.
//+------------------------------------------------------------------+//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0.1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1];
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1)
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots))
{
Print("No tienes dinero. Fondos libres = ", AccountFreeMargin());
return(0);
}
if(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1;
Print("¡La posición es posible!");
}
if(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA position:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de venta abierta : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
}
if(EMA2-EMA3>2*Punto && Ask<=(hi-MoveBack*Punto))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"EMA position:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Orden de compra abierta : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Error de apertura de la orden BUY : ",GetLastError());
return(0);
}
}
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // ¿es una posición abierta? OP_BUY o OP_SELL
OrderSymbol()==Symbol()) // ¿coincidencia de herramientas?
{
if(OrderType()==OP_BUY) // posición larga abierta
{
// ¿comprobamos si ya es hora de cerrar?
if(Bid>=(OrderOpenPrice()+Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // cerrar posición
return(0); // salir
}
if(Bid<=(OrderOpenPrice()-SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // cerrar la posición
return(0); // salir
}
}
else // en caso contrario se trata de una posición corta
{
// ¿comprobar si ya es hora de cerrar?
if(Ask<=(OrderOpenPrice()-Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // cerrar posición
return(0); // salir
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // cerrar posición
return(0); // salir
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Igor, te hice una pregunta en la 'Biblioteca de funciones para trabajar con archivos INI', pero no hubo respuesta :(