OrderClose ne fonctionne pas - page 2

 
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.



Il y a plusieurs choses que vous avez mal faites. Je suppose que vous voulez que cet EA fonctionne sur les paires JPY sur le cadre temporel M1. Voulez-vous placer des ordres sur la nouvelle barre uniquement et fermer les ordres sur la nouvelle barre uniquement ou voulez-vous entrer sur la nouvelle barre et sortir si les conditions sont remplies ? Voici ce que je pense :

D'abord vous comptez les ordres avec OrdersTotal().

Ensuite, vous calculez vos variables

S'il y a des ordres sur le marché , vérifiez s'ils doivent être fermés.

S'il n'y a pas d'ordres sur le marché, vérifiez si les conditions d'entrée sont remplies.

N'hésitez pas à me contacter si vous avez des questions.

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.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;
int        total,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   total=OrdersTotal();
/*
  counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
  IndicatorCounted() is actually for indicators not EA
  
   */

   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;
   /*
   Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
           "Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
           "Bar3 = "+DoubleToString(bar3,Digits)+"\n"
           );
   */
//Close any orders if conditions are met
   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(total<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
Dossiers :
 
GumRai:


Le ticket est une variable locale, donc au prochain tic, il n'aura pas la même valeur.

Mis en dehors des fonctions pour le rendre Globalscope

 
   total=OrdersTotal();

? ????? ..... inutile

vérifiez correctement les transactions que vous avez

recherchez le bon symbole et le bon numéro magique

avec une boucle d'ordre, vous pouvez alors sélectionner le bon trade à clôturer.

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);

.

avec votre méthode

vous perdez la valeur du ticket au moment où vous redémarrez votre pc donc

   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }

échoue .....

 
chuale:

Pourquoi avez-vous cité mon message et n'avez-vous pas ajouté de commentaire ?
 
oui, il peut être fermé maintenant. merci GumRai. maintenant je sais que le numéro de ticket change en fonction des ticks, alors comment obtenir le numéro de ticket de l'ordre ouvert ? Je dois utiliser OrderTicket(), n'est-ce pas ?
 
chuale:
oui, il peut être fermé maintenant. merci GumRai. maintenant je sais que le numéro de ticket change en fonction des ticks, alors comment obtenir le numéro de ticket de l'ordre ouvert ? Je dois utiliser OrderTicket(), n'est-ce pas ?

Si vous utilisez OrderTicket(), assurez-vous d'abord d'utiliser OrderSelect() et assurez-vous également que c'est bien la transaction que vous voulez fermer.
 
chuale:
Je sais maintenant que le numéro de ticket change en fonction des ticks, alors comment obtenir le numéro de ticket de l'ordre ouvert ? Je dois utiliser OrderTicket(), n'est-ce pas ?


Salut Chuale,

Voici un moyen facile de sélectionner vos ordres et de clôturer vos ordres par symbole et par numéro magique :

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.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;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
int        myTrades,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   myTrades = CountTrades();//Count trades function counts this EA trades only
//
   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;

//Close any orders if conditions are met
   if(myTrades>0)
     {
      if(bar3<-1) CloseThisSymbolAll();
      if(bar3>1) CloseThisSymbolAll();
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(myTrades<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//========================================================================
int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
   continue;
   if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
   if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
   }
return(count);
}
//========================================================================
void CloseThisSymbolAll()
  {
   int trade;
   for(trade=OrdersTotal();trade>=0;trade--)
     {
      OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
      //Sleep(1000);
     }
  }
//========================================================================
 
chuale:
oui, il peut fermer maintenant. merci GumRai. maintenant je sais que le numéro de ticket change en fonction des ticks, alors comment obtenir le numéro de ticket de l'ordre ouvert ? Je dois utiliser OrderTicket(), n'est-ce pas ?


Rebonjour Chuale,

J'ai joué avec votre idée sur USDJPY et je n'ai pas pu obtenir de résultats positifs sans quelques changements.Voici un échantillon de mes résultats sur USDJPY sur le graphique M1 :

USDJPY sur M1

Avez-vous l'intention de l'utiliser sur une autre paire ?

Exit sur bar3 < -1 ou bar3 > 1 n'a pas donné de résultats positifs.

 
deVries:

? ????? ..... inutile

vérifiez correctement les transactions que vous avez

recherchez le bon symbole et le bon numéro magique

avec une boucle d'ordre, vous pouvez alors sélectionner le bon trade à clôturer.

.

avec votre méthode

vous perdez la valeur du ticket au moment où vous redémarrez votre pc donc

échoue .....


Si vous voulez dire que ce n'est pas la meilleure façon de fermer un ordre, je suis d'accord, mais si la personne ne veut pas utiliser OrderSelect (ou ne sait pas comment le faire) et ne laisse aucun ordre ouvert sur le marché, cela fonctionne.

Nous essayons de nous entraider ici et votre réponse ne l'a pas aidé du tout, vous ne lui avez pas montré comment utiliser la fonction Order Select et son EA ne fonctionne pas mieux maintenant à cause de votre commentaire.

La prochaine fois que vous voulez aider, faites-le de la bonne façon, mettez le bon code pour que les autres puissent apprendre quelque chose.

 
thrdel:


Il y a plusieurs choses que vous avez mal faites. Je suppose que vous voulez que cet EA fonctionne sur les paires JPY sur le cadre temporel M1. Voulez-vous placer des ordres sur la nouvelle barre uniquement et fermer les ordres sur la nouvelle barre uniquement ou voulez-vous entrer sur la nouvelle barre et sortir si les conditions sont remplies ? Voici ce que je pense :

Tout d'abord, vous comptez les commandes avec OrdersTotal().

Ensuite, vous calculez vos variables

S'il y a des ordres sur le marché, vérifiez s'ils doivent être fermés.

S'il n'y a pas d'ordres sur le marché, vérifiez si les conditions d'entrée sont remplies.

Faites-moi savoir si vous avez des questions.

Raison: