Ne fermez que les transactions rentables, à l'objectif de profit. - page 3

 
af1:

Hi GumRai, thanks for your time. I've already tried with your changes, but orders keep closing at 1. In other words, profitable orders are not waiting to reach 25.

Même en utilisant la ligne de code précédemment fournie par DeVries et Raptor ?

if(CloseAllNow) CloseAll();
    
    if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget && !CloseProfitableTradesOnly) CloseAll(); 

    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit();

    if(ClosePendingOnly) ClosePendingOrdersOnly();

J'espère que vous n'avez pas changé cette ligne, vous l'avez envisagée.

if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();

Si vous l'avez changé à 25.00, alors vous aurez tous les trades profitables de $1+ fermés.

 
GumRai:

Même en utilisant la ligne de code précédemment fournie par DeVries et Raptor ?

J'espère que vous n'avez pas changé cette ligne, vous l'avez envisagée.

Si vous l'avez changé à 25.00, alors vous aurez tous les trades profitables de $1+ fermés.


J'ai essayé toutes les suggestions, mais ça ne ferme toujours pas correctement.

 
af1:


J'ai essayé toutes les suggestions, mais ça ne ferme toujours pas correctement.


Vous pouvez peut-être montrer le code complet que vous utilisez actuellement.
 
GumRai:

Vous pouvez peut-être montrer le code complet que vous utilisez actuellement.

//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//|              Close 
//|   Last Updated 12-12-2006 10:00pm
//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#define     NL    "\n" 

extern int    ProfitTarget     = 25;             // closes all orders once Float hits this $ amount
extern bool   CloseAllNow      = false;          // closes all orders now
extern bool   CloseProfitableTradesOnly = true; // closes only profitable trades
extern double ProftableTradeAmount      = 1;     // Only trades above this amount close out
extern bool   ClosePendingOnly = false;          // closes pending orders only
extern bool   UseAlerts        = false;

//+-------------+
//| Custom init |
//|-------------+
int init()
  {

  }

//+----------------+
//| Custom DE-init |
//+----------------+
int deinit()
  {

  }

//+------------------------------------------------------------------------+
//| Closes everything
//+------------------------------------------------------------------------+
void CloseAll()
{
   int i;
   bool result = false;

   while(OrdersTotal()>0)
   {
      // Close open positions first to lock in profit/loss
      for(i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS)==false) continue;

         result = false;
         if ( OrderType() == OP_BUY)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 15, Red );
         if ( OrderType() == OP_SELL)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 15, Red );
         if (UseAlerts) PlaySound("alert.wav");
      }
      for(i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS)==false) continue;

         result = false;
         if ( OrderType()== OP_BUYSTOP)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_BUYLIMIT)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_SELLLIMIT)  result = OrderDelete( OrderTicket() );
         if (UseAlerts) PlaySound("alert.wav");
      }
      Sleep(1000);
   }
}
   
//+------------------------------------------------------------------------+
//| cancels all orders that are in profit
//+------------------------------------------------------------------------+
void CloseAllinProfit()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    bool result = false;
        if ( OrderType() == OP_BUY && OrderProfit()+OrderSwap()>ProftableTradeAmount)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
        if ( OrderType() == OP_SELL && OrderProfit()+OrderSwap()>ProftableTradeAmount)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
        if (UseAlerts) PlaySound("alert.wav");
 }
  return; 
}

//+------------------------------------------------------------------------+
//| cancels all pending orders 
//+------------------------------------------------------------------------+
void ClosePendingOrdersOnly()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    bool result = false;
        if ( OrderType()== OP_BUYSTOP)   result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
  }
  return; 
  }

//+-----------+
//| Main      |
//+-----------+
int start()
  {
   int      OrdersBUY;
   int      OrdersSELL;
   double   BuyLots, SellLots, BuyProfit, SellProfit;

//+------------------------------------------------------------------+
//  Determine last order price                                       |
//-------------------------------------------------------------------+
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_BUY)  
         {
            OrdersBUY++;
            BuyLots += OrderLots();
            BuyProfit += OrderProfit() + OrderCommission() + OrderSwap();
         }
         if(OrderType()==OP_SELL) 
         {
            OrdersSELL++;
            SellLots += OrderLots();
            SellProfit += OrderProfit() + OrderCommission() + OrderSwap();
         }
      }               
   
    if(CloseAllNow) CloseAll();
    
    if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget && !CloseProfitableTradesOnly) CloseAll();
    
    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit(); 

    if(ClosePendingOnly) ClosePendingOrdersOnly();
       
   
   Comment("                            Comments Last Update 12-12-2006 10:00pm", NL,
           "                            Buys    ", OrdersBUY, NL,
           "                            BuyLots        ", BuyLots, NL,
           "                            Sells    ", OrdersSELL, NL,
           "                            SellLots        ", SellLots, NL,
           "                            Balance ", AccountBalance(), NL,
           "                            Equity        ", AccountEquity(), NL,
           "                            Margin              ", AccountMargin(), NL,
           "                            MarginPercent        ", MathRound((AccountEquity()/AccountMargin())*100), NL,
           "                            Current Time is  ",TimeHour(CurTime()),":",TimeMinute(CurTime()),".",TimeSeconds(CurTime()));
 } // start()

 


 

Veuillez vous référer à mon message

https://forum.mql4.com/56959/page2#822980

Vous n'additionnez pas seulement les transactions rentables. Vous calculez le bénéfice net ou la perte nette.

 
GumRai:

Veuillez vous référer à mon message

https://forum.mql4.com/56959/page2#822980

Vous n'additionnez pas seulement les transactions rentables. Vous calculez le bénéfice net ou la perte nette



GumRai, j'ai fait les changements de code suggérés par Raptor et par vous :

https://www.mql5.com/en/forum/146091
https://www.mql5.com/en/forum/146091/page2#822980

Et maintenant, il semble que la fermeture soit correcte. Merci pour cela !


Juste une dernière chose. Si je souhaite calculer uniquement les achats rentables, ou uniquement les ventes rentables, au lieu de calculer toutes les transactions rentables, que dois-je modifier ?

Je pense que ce changement permet de calculer uniquement les achats, mais je ne suis pas sûr. Est-ce correct ?

de ceci :

if(OrderType()==OP_SELL) 
         {
            OrdersSELL++;
            SellLots += OrderLots(); 
            ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

à cela :

//if(OrderType()==OP_SELL) 
         {
            //OrdersSELL++;
            //SellLots += OrderLots(); 
            //ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            //if(ThisTradeProfit>0)
            //BuyProfit += ThisTradeProfit;
         }
 

Je pense que vous pourriez ajouter 2 bools externes aux paramètres d' entrée, appelés quelque chose comme "BuyTradesOnly" et "SellTradesOnly", tous deux définis à false initialement .

puis

if(OrderType()==OP_SELL && BuyTradesOnly == false)
         {
            OrdersSELL++;
            SellLots += OrderLots(); 
            ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }
 
GumRai:

Je pense que vous pourriez ajouter 2 bools externes aux paramètres d'entrée, appelés quelque chose comme "BuyTradesOnly" et "SellTradesOnly", tous deux définis à false initialement .

puis


Je n'ai pas ajouté les 2 extern bool, j'ai juste changé ceci pour fermer "seulement les ordres d'achat".

for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_BUY)  
         {
            OrdersBUY++;
            BuyLots += OrderLots();
            double ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

et changer cela pour fermer "seulement les ordres de vente".

for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_SELL)  
         {
            OrdersSELL++;
            SellLots += OrderLots();
            double ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

Donc maintenant j'ai deux EA. Un pour les achats de clôture, et un pour les ventes de clôture. C'est bon pour moi.


J'ai testé sur les deux comptes, démo et réel. Sur la démo, cela fonctionne bien, mais sur le compte réel, une fois que l'objectif de profit est atteint, il commencera à fermer des positions, mais ensuite il arrêtera de fermer des positions lorsque les ordres restants tomberont en dessous de l'objectif de profit. Cela se produit si le prix change au moment de la fermeture. Il a donc tendance à laisser ouverts les ordres rentables, au lieu de les fermer tous (ordres rentables).

J'ai lu ce message de RaptorUK https://www.mql5.com/en/forum/139654. C'est quelque chose comme ça, mais je ne sais pas vraiment quelle pourrait être la meilleure solution pour ce problème.


 
af1:


J'ai lu ce post de RaptorUK https://www.mql5.com/en/forum/139654. C'est quelque chose comme ça, mais je ne sais pas vraiment quelle pourrait être la meilleure solution pour ce problème.

La solution est donnée dans le fil de discussion . . . c'est pourquoi je l'ai créé. Compte à rebours dans la boucle, pas en haut.
 
RaptorUK:
La solution est donnée dans le fil de discussion... c'est pourquoi je l'ai créé. Compte à rebours dans la boucle, pas en haut.


Ok Raptor, je vais essayer de faire cette boucle, mais avant de faire ça, si je changeais simplement

De ceci :
}
      Sleep(1000);
   }
à ceci :
}
      Sleep(5000);
      RefreshRates();
      continue;
   }


Cela pourrait-il faire l'affaire ?