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
tkuan77
Tienes que encontrar la última barra cerrada y ver si el día de la última barra cerrada es el mismo que el día actual.
Puedes usar algo como esta función para obtener la hora de la última orden cerrada :
{
datetime CloseTime = 0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)
CloseTime = OrderCloseTime();
}
return(CloseTime);
}
Hola mladen,
¿Pero dónde inserto esta parte del código? Lo siento por preguntar esto ya que todavía soy bastante nuevo en la codificación y todavía no puedo averiguar cómo funciona el bucle For.
Saludos
Ryan
Hola mladen,
¿Pero dónde inserto esta parte del código? Perdona que te pregunte esto ya que soy bastante nuevo en la codificación y todavía no puedo entender cómo funciona el bucle For.
Saludos
RyanRyan
Algo como esto :
if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime())) // no se negocia
Ryan
Algo como esto :
if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()) // no hay comercio
Hola mladen, he añadido el código pero parece que da algún tipo de error de variable global. Además, me he dado cuenta de que tienes una variable MagicNumber que no está definida, ¿puedo preguntar para qué sirve? Lo he añadido en int pero no estoy seguro de cuál es el uso de esa variable.
No dude en consultarme. Gracias de nuevo por su paciencia.
//---- parámetros de entrada
extern double TakeProfit = 1000.0;
extern double Lots = 0.1;
extern double StopLoss = 980.0;
extern int Hora_de_entrada_1ª = 21;
//+------------------------------------------------------------------+
//| función de inicialización de los expertos ||.
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto ||
//+------------------------------------------------------------------+
int inicio()
{
//+------------------------------------------------------------------+
//-- Activar el comercio
//+------------------------------------------------------------------+
int ticket, total, MagicNumber
double Valor_TP, Valor_SL;
datetime GetLastClosedOrderTime()
{
datetime CloseTime = 0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)
CloseTime = OrderCloseTime();
}
return(CloseTime);
}
total = OrdersTotal(); // comprueba el número total de operaciones actualmente abiertas
if(total < 1)
{
if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
Valor_TP = (Cierre[1] - Apertura[1]);
SL_Value = (Low[1] - 0.0010);
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]);
SL_Value = (Low[1] - 0.0010);
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]);
SL_Value = (Low[1] - 0.0010);
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
}
if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
Valor_TP = (Cierre[1] - Apertura[1]);
SL_Value = (High[1] + 0.0010);
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]);
SL_Value = (High[1] + 0.0010);
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]);
SL_Value = (High[1] + 0.0010);
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Hola mladen, he añadido el código pero parece que da algún tipo de error de variable global. Además, me he dado cuenta de que tienes una variable MagicNumber que no está definida, ¿puedo preguntar para qué sirve? Lo he añadido en int pero no estoy seguro de cuál es el uso de esa variable.
Por favor, aconséjeme. Gracias de nuevo por su paciencia.
//---- parámetros de entrada
extern double TakeProfit = 1000.0;
extern double Lots = 0.1;
extern double StopLoss = 980.0;
extern int Hora_de_entrada_1ª = 21;
//+------------------------------------------------------------------+
//| función de inicialización de los expertos ||.
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto ||
//+------------------------------------------------------------------+
int inicio()
{
//+------------------------------------------------------------------+
//-- Activar el comercio
//+------------------------------------------------------------------+
int ticket, total, MagicNumber
double Valor_TP, Valor_SL;
datetime GetLastClosedOrderTime()
{
datetime CloseTime = 0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)
CloseTime = OrderCloseTime();
}
return(CloseTime);
}
total = OrdersTotal(); // comprueba el número total de operaciones actualmente abiertas
if(total < 1)
{
if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
Valor_TP = (Cierre[1] - Apertura[1]);
SL_Value = (Low[1] - 0.0010);
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]);
SL_Value = (Low[1] - 0.0010);
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]);
SL_Value = (Low[1] - 0.0010);
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
}
if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
Valor_TP = (Cierre[1] - Apertura[1]);
SL_Value = (High[1] + 0.0010);
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]);
SL_Value = (High[1] + 0.0010);
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]);
SL_Value = (High[1] + 0.0010);
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Esto es una función
Muévelo fuera del cuerpo de la función start()
↵
Esa es una función
Moverlo fuera del cuerpo de la función start()Hola mladen, he intentado mover la función fuera de la función de inicio, sin embargo, mi EA todavía está desencadenando más de 1 comercio al día en lugar de limitar a sólo desencadenar 1 comercio al día.
Te agradezco la aclaración.
Saludos
//---- parámetros de entrada
extern double TakeProfit = 1000.0;
extern double Lots = 0.1;
extern double StopLoss = 980.0;
extern int Hora_de_entrada_1ª = 21;
//+------------------------------------------------------------------+
//| función de inicialización de los expertos ||.
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto ||
//+------------------------------------------------------------------+
int NúmeroMágico;
datetime GetLastClosedOrderTime()
{
datetime CloseTime = 0;
for(int i=TotalPedidos()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)
CloseTime = OrderCloseTime();
}
return(CloseTime);
}
int inicio()
{
//+------------------------------------------------------------------+
//-- Comercio de disparo
//+------------------------------------------------------------------+
int ticket, total
double Valor_TP, Valor_SL;
total = OrdersTotal(); // comprueba el número total de operaciones actualmente abiertas
if(total < 1)
{
if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
TP_Value = (Close[1] - Open[1]); // valor del cuerpo largo
SL_Value = (Low[1] - 0.0010); // siempre el mismo para el largo
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]); // valor del cuerpo corto
SL_Value = (Low[1] - 0.0010); // siempre igual para los largos
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]); // valor de toda la vela incluyendo cabeza y cola
SL_Value = (Low[1] - 0.0010); // siempre el mismo para los largos
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
}
if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
TP_Value = (Close[1] - Open[1]); // valor del cuerpo largo
SL_Value = (High[1] + 0.0010); // siempre igual para los cortos
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]); // valor del cuerpo corto
SL_Value = (High[1] + 0.0010); // siempre el mismo para el corto
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]); // valor de toda la vela incluyendo cabeza y cola
SL_Value = (High[1] + 0.0010); // siempre igual para los cortos
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
↵
Hola mladen, he intentado mover la función fuera de la función de inicio, sin embargo, mi EA todavía está disparando más de 1 comercio al día en lugar de limitar a sólo disparar 1 comercio al día.
Te agradezco la aclaración.
Saludos
//---- parámetros de entrada
extern double TakeProfit = 1000.0;
extern double Lots = 0.1;
extern double StopLoss = 980.0;
extern int Hora_de_entrada_1ª = 21;
//+------------------------------------------------------------------+
//| función de inicialización de los expertos ||.
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta ||
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto ||
//+------------------------------------------------------------------+
int NúmeroMágico;
datetime GetLastClosedOrderTime()
{
datetime CloseTime = 0;
for(int i=TotalPedidos()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)
CloseTime = OrderCloseTime();
}
return(CloseTime);
}
int inicio()
{
//+------------------------------------------------------------------+
//-- Comercio de disparo
//+------------------------------------------------------------------+
int ticket, total
double Valor_TP, Valor_SL;
total = OrdersTotal(); // comprueba el número total de operaciones actualmente abiertas
if(total < 1)
{
if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
TP_Value = (Close[1] - Open[1]); // valor del cuerpo largo
SL_Value = (Low[1] - 0.0010); // siempre el mismo para el largo
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]); // valor del cuerpo corto
SL_Value = (Low[1] - 0.0010); // siempre igual para los largos
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]); // valor de toda la vela incluyendo cabeza y cola
SL_Value = (Low[1] - 0.0010); // siempre igual para los largos
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);
return(0);
}
}
if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))
{
si ((Close[1] - Open[1]) > 0,00100)
{
TP_Value = (Close[1] - Open[1]); // valor del cuerpo largo
SL_Value = (High[1] + 0.0010); // siempre igual para los cortos
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) > 0.00100)
{
TP_Value = (Open[1] - Close[1]); // valor del cuerpo corto
SL_Value = (High[1] + 0.0010); // siempre el mismo para el corto
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
if ((Open[1] - Close[1]) <= 0.00100)
{
TP_Value = (High[1] - Low[1]); // valor de toda la vela incluyendo cabeza y cola
SL_Value = (High[1] + 0.0010); // siempre igual para los cortos
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);
return(0);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
tkuan77
Reemplazar esto :
if(total < 1)
por esto :
if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;
Y ya no debería hacer eso
tkuan77
Reemplaza esto :
if(total < 1)
por esto :
if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;
Y no debería hacerlo másHola mladen, después de haber introducido el código, en lugar de desencadenar 1 operación al día, desencadenó múltiples operaciones a la vez hasta que la cuenta estalló. ¿Podría ser debido a algún mecanismo de activación que cause esto?
Saludos
Hola mladen, tengo este código en particular que cerrará todas las operaciones pendientes que tengo después de que tengo un comercio en ejecución. ¿Cómo puedo configurar para cancelar sólo mi comercio pendiente actual después de haber desencadenado un comercio en lugar de todos los futuros oficios pendientes?
gracias.....
int nueva_cancelación()
{
int i,a;
int total = OrdersTotal();
string comentario,par;
for (i=total-1; i >=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
for (a=total-1; a >=0; a--)
{
OrderSelect(a,SELECT_BY_POS,MODE_TRADES);
comentario=OrderComment();
par=StringSubstr(comentario,0,6);
if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())
{
OrderDelete(OrderTicket());
Print("Borrando SELL_STOP"," Ordertype:",OrderType());
return(1);
}
if(OrderType()==OP_BUYSTOP)// && par==Symbol())
{
OrderDelete(OrderTicket());
Print("Borrando BUY_STOP"," Ordertype:",OrderType());
return(1);
}
}
}
}
}
Hola mladen, tengo este código en particular que cerrará todas las operaciones pendientes que tengo después de tener una operación en marcha. ¿Cómo puedo configurar para que sólo cancele mi operación pendiente actual después de haber desencadenado una operación en lugar de todas las operaciones pendientes futuras?
gracias.....
int nuevo_del()
{
int i,a;
int total = OrdersTotal();
string comentario,par;
for (i=total-1; i >=0; i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
for (a=total-1; a >=0; a--)
{
OrderSelect(a,SELECT_BY_POS,MODE_TRADES);
comentario=OrderComment();
par=StringSubstr(comentario,0,6);
if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())
{
OrderDelete(OrderTicket());
Print("Borrando SELL_STOP"," Ordertype:",OrderType());
return(1);
}
if(OrderType()==OP_BUYSTOP)// && par==Symbol())
{
OrderDelete(OrderTicket());
Print("Borrando BUY_STOP"," Ordertype:",OrderType());
return(1);
}
}
}
}
}tkuan77
¿Qué significa la "operación pendiente actual" y qué significa la "operación pendiente futura"?
tkuan77
¿Qué significa la "operación pendiente actual" y qué significa la "operación pendiente futura"?
Hola mladen,
La operación pendiente actual significa: una vez que se ha cumplido una condición, el EA establecerá 2 operaciones pendientes (1 larga y 1 corta). Por lo tanto, si se activa la operación larga, el EA cancelará automáticamente las operaciones pendientes cortas.
Futuras operaciones pendientes significa: después de que el ea haya cancelado las operaciones pendientes anteriores y digamos que la condición se cumple de nuevo, el ea por derecho debería establecer otras 2 operaciones pendientes (1 larga y 1 corta). sin embargo, si el ea tiene actualmente una operación en curso, el ea cancelará automáticamente cualquier orden pendiente que el ea esté tratando de establecer.
lo que estoy tratando de hacer es dejar que el sistema cancele solamente la operación pendiente actual después de que una operación haya sido activada.
saludos