Calcul du profit d'un ordre fermé "HELP - page 7

 
Sergey Gritsay:
et où est-ce que tout cela existe ? est-ce que vous l'écrivez quelque part dans une variable ou un tableau ? montrez-moi d'abord où vous le stockez, ensuite vous pourrez voir ce qu'il faut faire ensuite.
Pas n'importe où. Vous devez créer le tout de manière compétente et collecter les données sur les bénéfices.
 
Natashe4ka:

OK, alors décomposons : il y a une heure de clôture des ordres, il y a un ticket ou un nombre d'ordres qui coïncident avec l'heure de clôture. Comment combiner et calculer le bénéfice de ces commandes?
Cela semble facile, mais je ne le comprends toujours pas.

Jusqu'à présent, personne n'a pu déterminer lesquels sont surlignés en rouge. Nous avons besoin des critères exacts pour trouver ces commandes. Essayez donc d'expliquer, comme on dit, sur les doigts, avec des images, etc.
 
Sergey Gritsay:
Jusqu'à présent, personne n'a réussi à trouver ceux qui sont surlignés en rouge. Nous avons besoin des critères exacts pour trouver ces commandes. Essayez donc d'expliquer, comme on dit sur les doigts, avec des images et ainsi de suite.

?

Pourquoi personne ne peut comprendre cela, vous voulez probablement dire vous-même ?

Tout est clair depuis longtemps maintenant.

Madame veut juste le faire par elle-même, sans étaler les détails de son programme.

 
Sergey Gritsay:
Jusqu'à présent, personne n'a pu comprendre quels sont ceux qui sont surlignés en rouge. Nous avons besoin de critères précis pour trouver ces commandes. Pour cette raison, essayez d'expliquer, comme on dit sur les doigts, avec des images, etc.

Oui, j'ai déjà donné une condition de fonctionnement à 100% et je l'ai jointe en tant que code prêt à l'emploi. Il faut également noter que le code utilise une méthode qui n'est pas affectée par les redémarrages du terminal, et rien ne sera perdu lorsque le terminal sera rallumé et continuera à fonctionner. Mais ici, ils inventent une roue qui ne fonctionnera que dans le testeur.

Sergey, notez également que dans le code TS original, lorsque vous fermez une série de 5 positions, l'ordre au milieu de la fermeture est également supprimé, ce qui ne mènera à rien de bon dans le trading réel. En général, tout est clair pour tout le monde, sauf pour le TS.

 
Je pense que je comprends ce que Natalia veut obtenir
//+------------------------------------------------------------------+
//|                                                   Natashe4ka.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict

input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   color ProfitColor=0;

// START //
   LastProfitCL_1(Profit,TimeCurrent(),-1);
  
   if(Profit<0)ProfitColor=clrRed;
   else if(Profit>0)ProfitColor=clrLimeGreen;
   else ProfitColor=clrDarkGray;
  
   ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
   ObjectSet("Last Profit",OBJPROP_CORNER,1);
   ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
   ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //

  }
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();

   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderCloseTime()!=timecurent)continue;
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Вариант 2                                                               |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                  datetime timecurent,// текущее время
                  int op=-1//"op" позиция (-1 любая позиция)                
                  )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
     {
      timecurents=OrderCloseTime();
     }
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderCloseTime()<timecurents)continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()==op || op==-1)
        {
         profit+=OrderProfit()+OrderCommission()+OrderSwap();
         cnt++;
        }
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
....
 

Correction de la deuxième version de la fonction

bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
                    datetime timecurent,// текущее время
                    int op=-1//"op" позиция (-1 любая позиция)                
                    )
  {
   double profit=0;
   int cnt=0;
   datetime timecurents=0;
   int total=OrdersHistoryTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(OrderType()>1)continue;// исключим удаленные отложенные ордера
      if(OrderType()!=op && op!=-1)continue;  
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
      if(OrderCloseTime()<timecurents)continue;

      profit+=OrderProfit()+OrderCommission()+OrderSwap();
      cnt++;
     }
   if(cnt!=0)
     {
      LastProfit=profit;
      return(true);
     }
   return(false);
  }

..........

 
Sergey Gritsay:

Correction de la deuxième version de la fonction

Merci pour votre aide.
La variante 1 ne fonctionne pas correctement
La variante 2 fonctionne correctement.
Ma variante fonctionne également correctement, mais si les ordres sont reportés à un autre jour ou plus, la valeur n'est pas claire Profit 190, alors qu'elle devrait être 4,27.

Voir la capture d'écran n°3https://www.mql5.com/ru/forum/162930/page3

//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=0;
  datetime t=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
       if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
       if (t<OrderCloseTime()) {t=OrderCloseTime();}
       if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 
Il s'avère que le problème n'est pas le nombre de commandes mais le transfert des commandes à un autre jour ou plus.
 
Natashe4ka:
Il s'avère que le problème n'est pas le nombre de commandes mais le transfert des commandes à un autre jour ou plus.
Vous fermez en série ou quoi ? Quel est le transfert si vous fermez tous les ordres en un seul cycle ?
 
Vitalie Postolache:
Alors vous fermez dans une série ou quoi ? Quel est le report si vous fermez tous les ordres en un seul cycle ?

Les ordres sont clôturés par série, mais s'il n'y a pas de conditions de clôture, les ordres sont rassemblés pour un jour ou deux, etc.
Cependant, le nombre de commandes affecte également la valeur du bénéfice.
S'il y a plus de 3 ordres, la valeur est calculée pour le dernier ordre clôturé uniquement.