OrdemFechar não funciona

 

Hi,

Eu tenho a seguinte codificação para minha EA, por favor me ajude por que o OrderClose não é acionado? Eu preciso usar OrderSelect()? Qual é a finalidade da OrderSelect()? Obrigado.

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+


 
você não precisa usar OrderSelect 4 OrderClose, mas você tem 2 para OrderTicket(), OrderLots()
 
qjol:
você não precisa usar OrderSelect 4 OrderClose, mas você tem 2 para OrderTicket(), OrderLots()


Prezado qjol,

Eu não entendo muito bem o que você quer dizer. Poderia explicar-me, por favor? Obrigado, por favor.


 

em nosso código

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

u usando OrderTicket() & OrderLots() & 4 estas funções u deve usar OrderSelect()

Como você pode ver na documentação:

Nota

O parâmetro do pool é ignorado se o pedido for selecionado pelo número do bilhete. O número do bilhete é um identificador de pedido único.

Para descobrir a partir de que lista a ordem foi selecionada, seu horário de fechamento deve ser analisado. Se o tempo de fechamento da ordem for igual a 0, a ordem é aberta ou pendente e retirada da lista de posições abertas do terminal.

É possível distinguir uma posição aberta de uma ordem pendente pelo tipo de ordem. Se o tempo de fechamento da ordem não for igual a 0, a ordem é uma ordem fechada ou uma ordem pendente excluída e foi selecionada a partir do histórico do terminal. Eles também diferem uns dos outros por seus tipos de ordem.

A função OrderSelect() copia os dados do pedido para o ambiente do programa e todas as outras chamadas de OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderComission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() devolvem os dados, copiados anteriormente. Isso significa que em alguns casos os detalhes do pedido (preço aberto, níveis SL/TP ou data de vencimento) podem mudar e os dados se tornam não reais. É altamente recomendável chamar a função OrderSelect() antes de solicitar os dados do pedido.

 

Então se eu usar o número real do bilhete e Lots, então não há necessidade de usar OrderSelect, certo? Eu só abro um pedido de cada vez, posso saber como obter o número do bilhete do pedido aberto?

Obrigado novamente

 
chuale:

Então se eu usar o número real do bilhete e Lots, então não há necessidade de usar OrderSelect, certo? Eu só abro um pedido de cada vez, posso saber como obter o número do bilhete do pedido aberto?

Obrigado novamente

A função OrderSend() devolve o número do bilhete se for bem sucedida. Sugiro que você leia a seção Livro neste site do início ao fim para entender melhor como usar o MQL, bem como consulte a documentação de referência para cada função que você usa, de modo a entender melhor quais parâmetros usar e quais são os valores de retorno.

 

Prezados todos,

Eu inseri OrderSelect(), mas o OrderClose ainda não está funcionando, por favor, ajude-me. Muito obrigado


//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+
 
que lhe disse que o nº da ordem é 1 ?
 
só permito uma ordem em aberto de cada vez.
 

Olá a todos,


Agora eu inseri bilhete e Lotes no OrderClose sem usar OrderTicket() e OrderLots() mas não fechou o pedido também. Por favor, ajude-me.

//+------------------------------------------------------------------+
//|                                                       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:

Olá a todos,


Agora eu inseri bilhete e Lotes no OrderClose sem usar OrderTicket() e OrderLots() mas não fechou o pedido também. Por favor, ajude-me.



O ticket é uma variável local, portanto, no próximo tick, ele não terá o mesmo valor

Colocado fora das funções para torná-lo Globalscope

double     bar1;
double     bar2;
double     bar3;
int ticket;
Razão: