¿Cómo codificar? - página 344

 
mladen:

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

}

Y luego puedes comprobar si la fecha es la misma

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

 
tkuan77:

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

Ryan

Ryan

Algo como esto :

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime())) // no se negocia

 
mladen:

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

}

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

 
tkuan77:

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

 

mladen:

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

}

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

 
tkuan77:

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

 
mladen:

tkuan77

Reemplaza esto :

if(total < 1)

por esto :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

Y no debería hacerlo más

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

}

}

}

}

}

 
tkuan77:
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"?

 
mladen:

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