OrderClose no funciona

 

Hola,

Tengo la siguiente codificación para mi EA, por favor ayúdeme por qué el OrderClose no es triggerred? ¿Necesito usar Order Select()? ¿Cuál es el propósito de OrderSelect()? Gracias.

//+------------------------------------------------------------------+
//|                                                       chuale.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.abc.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=280;

double     bar1;
double     bar2;
double     bar3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
  int ticket;
  int total=OrdersTotal();
  int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   {
      bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
      bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
      bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
      if (bar1+bar2>1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
      if (bar3<-1) OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
      }
      if (bar1+bar2<-1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
      if (bar3>1)  OrderClose(OrderTicket(), OrderLots(),Ask,3,Red);
      }
   }
   
   return(0);
//---
   return(0);
  }
//+------------------------------------------------------------------+


 
no tienes que usar OrderSelect 4 OrderClose pero tienes 2 para OrderTicket(), OrderLots()
 
qjol:
no tienes que usar OrderSelect 4 OrderClose pero tienes 2 para OrderTicket(), OrderLots()


Estimado qjol,

No entiendo muy bien lo que quieres decir, ¿podrías explicarlo? Gracias


 

en su código

if (bar3>1)  OrderClose(OrderTicket(), OrderLots(),Ask,3,Red);

está utilizando OrderTicket() y OrderLots() y 4 de estas funciones debe utilizar OrderSelect()

Como puede ver en la documentación:

Nota

El parámetro pool se ignora si el pedido se selecciona por el número de ticket. El número de ticket es un identificador único del pedido.

Para saber de qué lista se ha seleccionado la orden, hay que analizar su hora de cierre. Si la hora de cierre de la orden es igual a 0, la orden está abierta o pendiente y se toma de la lista de posiciones abiertas de la terminal.

Se puede distinguir una posición abierta de una orden pendiente por el tipo de orden. Si la hora de cierre de la orden no es igual a 0, la orden es una orden cerrada o una orden pendiente eliminada y fue seleccionada del historial del terminal. También se diferencian por el tipo de orden.

La función OrderSelect() copia los datos de la orden en el entorno del programa y todas las llamadas posteriores de OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber() OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() devuelven los datos, copiados anteriormente. Esto significa que en algunos casos los detalles de la orden (precio de apertura, niveles SL/TP o fecha de vencimiento) pueden cambiar y los datos se vuelven no reales. Se recomienda encarecidamente llamar a la función OrderSelect() antes de solicitar los datos de la orden.

 

Si utilizo el número de ticket y los lotes, no es necesario utilizar OrderSelect, ¿verdad? Sólo abro una orden a la vez, ¿puedo saber cómo obtener el número de ticket de la orden abierta?

Gracias de nuevo

 
chuale:

Si utilizo el número de ticket y los lotes, no es necesario utilizar OrderSelect, ¿verdad? Sólo abro una orden a la vez, ¿puedo saber cómo obtener el número de ticket de la orden abierta?

Gracias de nuevo

La función OrderSend() devuelve el número de ticket si tiene éxito. Te sugiero que leas la sección de Libros de este sitio de principio a fin para entender mejor cómo usar MQL, así como consultar la documentación de referencia de cada función que uses para entender mejor qué parámetros usar y cuáles son los valores de retorno.

 

Queridos todos,

He insertado OrderSelect(), pero el OrderClose sigue sin funcionar, por favor, ayuda.


//+------------------------------------------------------------------+
//|                                                       chuale.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.abc.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
  int ticket;
  int total=OrdersTotal();
  int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   {
      bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
      bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
      bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
      if (bar2>1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
      OrderSelect(1,SELECT_BY_POS);
      if (bar3 <-1) OrderClose(OrderTicket(),Lots,Bid,3,Green);
      }
      if (bar2<-1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
      if ( bar3>1)  OrderClose(OrderTicket(), Lots,Ask,3,Red);
      }
   }
   
   return(0);
//---
   return(0);
  }
//+------------------------------------------------------------------+
 
¿Quién te dijo que el número de la orden es 1?
 
Sólo permito una orden abierta a la vez.
 

Hola a todos,


Ahora inserto el ticket y los lotes en el OrderClose sin usar OrderTicket() y OrderLots() pero tampoco cierra la orden. Por favor, ayuda.

//+------------------------------------------------------------------+
//|                                                       chuale.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.abc.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
  int ticket;
  int total=OrdersTotal();
  int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   {
      bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
      bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
      bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
      if (bar2>1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
      
      if (bar3 <-1) OrderClose(ticket,Lots,Bid,3,Green);
      }
      if (bar2<-1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
      if ( bar3>1)  OrderClose(ticket, Lots,Ask,3,Red);
      }
   }
   
   return(0);
//---
   return(0);
  }
//+------------------------------------------------------------------+


 
chuale:

Hola a todos,


Ahora inserto el ticket y los lotes en el OrderClose sin usar OrderTicket() y OrderLots() pero tampoco cierra la orden. Por favor, ayuda.



ticket es una variable local, por lo que en el próximo tick no tendrá el mismo valor

Poner fuera de las funciones para que sea Globalscope

double     bar1;
double     bar2;
double     bar3;
int ticket;