Fermer l'ordre automatiquement après une période donnée et/ou SL

 

Bonjour à tous,

J'aimerais savoir s'il est possible de fermer un ordre automatiquement après avoir atteint une période et/ou un SL...

Par exemple :

J'ai ouvert une transaction à 13h et je veux que cet ordre soit fermé lorsque la cotation atteint son StoppLoss ou qu'une période de 2 heures s'est écoulée.

Voici le code actuel :

// Critères d'achat
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour())) //Signal d'achat
{
int openbuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,slb,tpb, "time trader buy order ",BuyMagicNumber,0,Blue) ;
if(openbuy<1){int buyfail=1;}
}

}// halt1

if((halt2!=1)&&(AllowSell==true)){// halt2
RefreshRates() ;
// Critères de vente
if ((TradeHour12==Hour())||(TradeHour23==Hour())) //Signal de vente
{
int opensell=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,sls,tps, "time trader sell order ",SellMagicNumber,0,Green) ;
if(opensell<1){int sellfail=1;}
}

}// halte2

Merci d'avance

Marc

 

Veuillez utiliser ceci pour afficher le code. . il est plus facile à lire.

 
Faites une boucle dans les ordres ouverts en vérifiant quand ils ont été ouverts en utilisant OrderOpenTime (n'oubliez pas d'utiliser OrderSelect d'abord), puis vérifiez cette heure par rapport à TimeCurrent pour voir si 2 heures se sont écoulées... si c'est le cas, fermez l'ordre.
 
nirvanamac:

Bonjour à tous,

J'aimerais savoir s'il est possible de fermer un ordre automatiquement après avoir atteint une période et/ou un SL...

Par exemple :

J'ai ouvert une transaction à 13h et je veux que cet ordre soit fermé lorsque la cotation atteint son StoppLoss ou qu'une période de 2 heures s'est écoulée.

Voici le code actuel :

// Critères d'achat
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour())) //Signal d'achat
{
int openbuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,slb,tpb, "time trader buy order ",BuyMagicNumber,0,Blue) ;
if(openbuy<1){int buyfail=1;}
}

}// halt1

if((halt2!=1)&&(AllowSell==true)){// halt2
RefreshRates() ;
// Critères de vente
if ((TradeHour12==Hour())||(TradeHour23==Hour())) //Signal de vente
{
int opensell=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,sls,tps, "time trader sell order ",SellMagicNumber,0,Green) ;
if(opensell<1){int sellfail=1;}
}

}// halte2

Merci d'avance

Marc


// Buy criteria
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour())) //Signal Buy
{
int openbuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,slb,tpb,"time trader buy order ",BuyMagicNumber,0,Blue);
if(openbuy<1){int buyfail=1;}
}

}// halt1

if((halt2!=1)&&(AllowSell==true)){// halt2
RefreshRates();
// Sell criteria
if ((TradeHour12==Hour())||(TradeHour23==Hour())) //Signal Sell
{
int opensell=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,sls,tps,"time trader sell order ",SellMagicNumber,0,Green);
if(opensell<1){int sellfail=1;}
}

}// halt2
 
nirvanamac:
J'aimerais savoir s'il est possible de fermer un ordre automatiquement après avoir atteint une période et/ou un SL...
  1. Si le SL est atteint, il se ferme de lui-même.
  2. Sinon, il suffit de le coder. Où est votre OrderClose() et votre test pour le temps ?
 
WHRoeder:
  1. Si le SL est atteint, il se ferme de lui-même.
  2. Sinon, il suffit de le coder. Où est votre OrderClose() et votre test de temps ?


HI WHRoeder,

Je pense que vous voulez dire le code du trou ou ?

//---- input parameters
extern double    Lots=0.01;
extern int       TakeProfit=200;
extern int       StopLoss=200;
extern int       Slip=50;
extern int BuyMagicNumber =1;
extern int SellMagicNumber =2;
extern bool AllowBuy=true;
extern bool AllowSell=true;
extern int  TradeHour3=3;
extern int  TradeHour4=4;
extern int  TradeHour7=7;
extern int  TradeHour10=10;
extern int  TradeHour17=17;
extern int  TradeHour18=18;
extern int  TradeHour20=20;
extern int  TradeHour12=12;
extern int  TradeHour23=23;
 
//+------------------------------------------------------------------+
//| expert starts                                  |
//+------------------------------------------------------------------+
int start()
  {
//----
int StopMultd,Sleeper=1;
 
 
 
int digits=MarketInfo("EURUSD",MODE_DIGITS);
if(digits==5){StopMultd=10;} else{StopMultd=1;}
double TP=NormalizeDouble(TakeProfit*StopMultd,Digits);
double SL=NormalizeDouble(StopLoss*StopMultd,Digits);
double Slippage=NormalizeDouble(Slip*StopMultd,Digits);
 
// Calculate stop loss
double slb=NormalizeDouble(Ask-SL*Point,Digits);
double sls=NormalizeDouble(Bid+SL*Point,Digits);
 
// Calculate take profit
double tpb=NormalizeDouble(Ask+TP*Point,Digits);
double tps=NormalizeDouble(Bid-TP*Point,Digits);
 
//-------------------------------------------------------------------+
//Check open orders
//-------------------------------------------------------------------+
if(OrdersTotal()>0){
  for(int i=1; i<=OrdersTotal(); i++)          // Cycle searching in orders
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
        {
          if(OrderMagicNumber()==BuyMagicNumber) {int halt1=1;}
          if(OrderMagicNumber()==SellMagicNumber) {int halt2=1;}
        }
     }
}
//-------------------------------------------------------------------+
 
 
if((halt1!=1)&&(AllowBuy==true)){// halt1
 
// Buy criteria
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour())) //Signal Buy
 {
   int openbuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,slb,tpb,"time trader buy order ",BuyMagicNumber,0,Blue);
   if(openbuy<1){int buyfail=1;}
 }
 
}// halt1
 
if((halt2!=1)&&(AllowSell==true)){// halt2
RefreshRates();
 // Sell criteria
 if ((TradeHour12==Hour())||(TradeHour23==Hour())) //Signal Sell
 {
   int opensell=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,sls,tps,"time trader sell order ",SellMagicNumber,0,Green);
   if(opensell<1){int sellfail=1;}
 }
 
}// halt2
 
 
//-------------------------------------------------------------------+
// Error processing
//-------------------------------------------------------------------+
if(buyfail==1||sellfail==1){
int Error=GetLastError();
  if(Error==130){Alert("Wrong stops. Retrying."); RefreshRates();}
  if(Error==133){Alert("Trading prohibited.");}
  if(Error==2){Alert("Common error.");}
  if(Error==146){Alert("Trading subsystem is busy. Retrying."); Sleep(500); RefreshRates();}
 
}
 
// if(openbuy==true||opensell==true)Sleep(1*60*1000*Sleeper);
//-------------------------------------------------------------------
   return(0);
  }
//+-----------------------------------
 

En fait, il y a juste un stopploss. Je veux seulement fermer l'ordre 2 heures après l'ouverture d'une nouvelle barre ou à la dernière seconde de 1:59:59... Mon problème est de remplir le code dans mon code actuel...

 
RaptorUK:
Faites une boucle à travers les ordres ouverts en vérifiant quand ils ont été ouverts en utilisant OrderOpenTime (n'oubliez pas d'utiliser OrderSelect d'abord), puis vérifiez cette heure par rapport à TimeCurrent pour voir si 2 heures se sont écoulées... si c'est le cas, fermez l'ordre.
Il suffit de coder cela... ce n'est vraiment pas difficile.
 
RaptorUK:
Il suffit de coder ça... ce n'est vraiment pas difficile.

J'espère que vous pourrez me donner des conseils si j'échoue ;-)
 
AFAIK tout le monde ici veut aider mais pas être l'esclave de quelqu'un.
 
qjol:
AFAIK tout le monde ici veut aider mais pas être l'esclave de quelqu'un.


Oui, bien sûr, je comprends... Je ne veux pas avoir d'esclaves pour mes EA.... la seule chose que j'ai besoin de savoir c'est comment comprendre le fonctionnement d'un programme...

Si vous avez un EA simple comme SMA Cross...ce n'est pas un grand problème...mais plus vous voulez réaliser de choses, plus cela devient difficile...(au moins pour moi)