OrderClose ne fonctionne pas

 

Bonjour,

J'ai le codage suivant pour mon EA, s'il vous plaît aidez-moi pourquoi l'OrderClose n'est pas déclenché ? Dois-je utiliser OrderSelect()? Quel est le but de OrderSelect() ? Merci.

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


 
vous n'avez pas besoin d'utiliser OrderSelect 4 OrderClose mais vous en avez 2 pour OrderTicket(), OrderLots()
 
qjol:
vous n'avez pas besoin d'utiliser OrderSelect 4 OrderClose mais vous en avez 2 pour OrderTicket(), OrderLots()
.


Cher qjol,

Je ne comprends pas très bien ce que vous voulez dire, pouvez-vous m'expliquer ? Merci de votre compréhension.


 

dans votre code

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

vous utilisez OrderTicket() & OrderLots() & 4 ces fonctions vous devez utiliser OrderSelect()

Comme vous pouvez le voir dans la documentation :

Note

Le paramètre pool est ignoré si la commande est sélectionnée par le numéro de ticket. Le numéro de ticket est un identifiant unique de la commande.

Pour savoir à partir de quelle liste l'ordre a été sélectionné, son temps de fermeture doit être analysé. Si l'heure de clôture de l'ordre est égale à 0, l'ordre est ouvert ou en attente et pris dans la liste des positions ouvertes du terminal.

On peut distinguer une position ouverte d'un ordre en attente par le type d'ordre. Si le temps de clôture de l'ordre n'est pas égal à 0, l'ordre est un ordre fermé ou un ordre en attente supprimé et a été sélectionné dans l'historique du terminal. Ils se distinguent également les uns des autres par leur type d'ordre.

La fonction OrderSelect() copie les données de l'ordre dans l'environnement du programme et tous les appels ultérieurs de OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() retournent les données copiées précédemment. Cela signifie que dans certains cas, les détails de l'ordre (prix ouvert, niveaux SL/TP ou date d'expiration) peuvent changer et les données deviennent non réelles. Il est fortement recommandé d'appeler la fonction OrderSelect() avant de demander les données de l'ordre.

 

Donc, si j'utilise le numéro de ticket et les lots actuels, il n'est pas nécessaire d'utiliser OrderSelect, n'est-ce pas ? Je n'ouvre qu'un seul ordre à la fois, puis-je savoir comment obtenir le numéro de ticket de l'ordre ouvert ?

Merci encore

 
chuale:

Donc, si j'utilise le numéro de ticket et les lots actuels, il n'est pas nécessaire d'utiliser OrderSelect, n'est-ce pas ? Je n'ouvre qu'un seul ordre à la fois, puis-je savoir comment obtenir le numéro de ticket de l'ordre ouvert ?

Merci encore

La fonction OrderSend() renvoie le numéro de ticket en cas de succès. Je vous suggère de lire la section Livre de ce site du début à la fin pour mieux comprendre comment utiliser MQL, ainsi que de consulter la documentation de référence pour chaque fonction que vous utilisez afin de mieux comprendre quels paramètres utiliser et quelles sont les valeurs de retour.

 

Chers tous,

J'ai inséré OrderSelect(), mais l'OrderClose ne fonctionne toujours pas, merci de m'aider.


//+------------------------------------------------------------------+
//|                                                       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 vous a dit que le numéro de l'ordre est 1 ?
 
Je n'autorise qu'un seul ordre ouvert à la fois.
 

Bonjour à tous,


J'ai inséré un ticket et des lots dans l'OrderClose sans utiliser OrderTicket() et OrderLots() mais l'ordre n'est pas fermé. Veuillez m'aider.

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

Bonjour à tous,


J'ai inséré un ticket et des lots dans l'OrderClose sans utiliser OrderTicket() et OrderLots() mais l'ordre n'est pas fermé. Veuillez m'aider.



ticket est une variable locale, donc le prochain tick, il n'aura pas la même valeur.

Mettez en dehors des fonctions pour le rendre Globalscope.

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