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

 

C'est très incorrect...

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) donnera comme résultat true ou false ... et dans ce cas, true ou false sera considéré comme un 1 ou un 0 ... et non pas comme un numéro de SellTicket ou de Buyticket ...

Stoploss = 40 . . . . lorsque vous utilisez un stoploss dans OrderSend, il s'agit d'un prix . . . et non d'un nombre de pips, le slippage est un nombre de pips . . . lisez la documentation : OrderSend

stoploss - Niveau du stop loss.
takeprofit - Niveau de prise de bénéfices.
 

Je comprends ce que vous voulez dire, j'ai donc besoin d'une commande pour sélectionner l'ordre en utilisant OrderSelect... ou est-ce que OrderSelect dans ce cas est généralement erroné ?

 

Lisez la docs . . . OrderSelect est nécessaire pour sélectionner l'ordre avant de pouvoir utiliser les fonctions OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Note : The order must be previously selected by the OrderSelect() function ".

Si vous n'avez pas besoin d'utiliser une information relative à un ordre existant, vous n'avez pas besoin d'OrderSelect. Si vous en avez besoin... eh bien vous en avez besoin.

 
RaptorUK:

Lisez la docs . . . OrderSelect est nécessaire pour sélectionner l'ordre avant de pouvoir utiliser les fonctions OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Note : The order must be previously selected by the OrderSelect() function ".

Si vous n'avez pas besoin d'utiliser une information relative à un ordre existant, vous n'avez pas besoin de la fonction OrderSelect, mais si vous en avez besoin... alors vous en avez besoin.


Actuellement, je pense que j'aurais besoin de cette information, car s'il y a une position sur le marché, je dois la fermer et la remplacer par une autre. Je pensais que OrderSelect m'aiderait de cette façon. Mais si Orderselect ne concerne que les ordres ouverts et non la position active sur le marché, il n'est pas utile. Ai-je raison ?

Mais si OrderSelect ne m'aide pas, comment puis-je fermer les positions actives ?

salutations

Marc

 
Si vous n'utilisez pas d'ordres en attente et que vous avez des ordres ouverts, il s'agira soit d'un achat, soit d'une vente... un ordre au marché.
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
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;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

Cela semble être en grande partie correct, mais je dois maintenant savoir pourquoi le programme n'exécute que l'ordre de vente @ 12 & 23... et pas les ordres d'achat... ?

C'est probablement le cas... et cela génère probablement une erreur que vous n'avez pas détectée....

Essayez...

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

Votre OrderClose est faux... vous ouvrez un Buy at Ask, pour fermer un Buy you Sell... vous Sell at Bid, vous ouvrez un Sell at Bid pour fermer un Sell you Buy... vous Buy at Ask.

 
RaptorUK:
Votre OrderClose est erroné... vous ouvrez un Buy at Ask, pour fermer un Buy vous Sell... vous Sell at Bid, vous ouvrez un Sell at Bid pour fermer un Sell vous Buy... vous Buy at Ask.
Ou, puisque vous avez déjà sélectionné l'ordre, utilisez simplement
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
Et vous n'avez pas besoin de différencier le type d'ordre.
 

Merci beaucoup de m'avoir aidé... J'ai modifié le code avec vos conseils. Cela ressemble à ceci :

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01 ;
extern int Digits2Round=2 ;
extern int PercentOfFreeDepo=1 ;
extern int Slippage=5 ;
extern int MagicNumber =1 ;
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 ;
extern int StopLoss=400 ;

//Variables globales
int BuyTicket ;
int SellTicket ;
double UsePoint ;
int UseSlippage ;

int openbuy = 0 ;
int opensell = 0 ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol()) ;
UseSlippage = GetSlippage(Symbol(), Slippage) ;
}

//+------------------------------------------------------------------+
//| fonction de démarrage expert |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round) ;
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round) ;
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round) ;
//===================== Permet de déterminer la taille du lot et le risque ===================================
si ( Lot<Minlot )
{
Lot=Minlot ;
}
Comment( "\n", "Le risque acceptable est ",PercentOfFreeDepo,"% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot) ;
for(int i = OrdersTotal() - 1 ; i >= 0 ; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red) ;
openbuy = 0 ;
opensell = 0 ;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red) ;
opensell = 0 ;
openbuy = 0 ;
}
}
}
}
//BuyOrder
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour()) && openbuy == 0) //Signal Achat
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue) ;
if (openbuy < 0) Print("OrderSend OP_BUY failed, error : ", GetLastError() ) ;
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ",MagicNumber,0,Green) ;
if (opensell < 0) Print("OrderSend OP_SELL failed, error : ", GetLastError() ) ;
}

//----
return(0) ;
}
//+------------------------------------------------------------------+
//Fonction PipPoint
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS) ;
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01 ;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001 ;
retour (CalcPoint) ;
}

//Fonction d'obtention du glissement
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS) ;
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips ;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10 ;
retourne (CalcSlippage) ;
}

Pendant l'exécution du backtest, il y a un message d'erreur ERR_INVALID_TICKET (4108).

 

Tous les ordres n'ont pas été exécutés

Se pourrait-il que l'erreur provienne du fait que le SL a été déclenché avant ?

Raison: