Calcul du profit d'un ordre fermé "HELP

 

Le profit des ordres fermés est considéré correctement, mais après la fermeture il ajoute la valeur au précédent (5 ; 5+5=10 ; 10+5=15)
Comment faire pour que chaque profit fermé d'une série soit un nouveau profit, au lieu du précédent (5 ; 5 ; 5) ?
Dans une série d'ordres fermés, il peut y avoir des ordres d'achat et de vente, ou uniquement des ordres d'achat et uniquement des ordres de vente
.

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==0)ProfitColor=DarkGray;
   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(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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 (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
       if (op<0 || OrderType()==op) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 

Nous devons ajouter une condition pour diviser les ordres fermés en séries.

Dites-nous l'algorithme ou le principe de division

 
Natashe4ka:   ... Profit des commandes fermées ... ajoute la valeur à la précédente (5 ; 5+5=10 ; 10+5=15)

Comment faire en sorte que chaque bénéfice fermé d'une série soit un nouveau bénéfice et non le précédent (5 ; 5 ; 5) ? ? .....

Au lieu de faire une somme arithmétique, nous devrions ajouter une chaîne de caractères avec un espace ou un point-virgule et un espace, selon ce qui est le mieux.
 
STARIJ:
Au lieu de faire une somme arithmétique, nous pourrions l'ajouter à une chaîne de caractères avec un espace ou un point-virgule et un espace, selon ce que vous préférez.

Bonne idée.

Ou on pourrait le mettre dans un tableau.

 
Natashe4ka:

Le profit des ordres fermés est considéré correctement, mais après la fermeture il ajoute la valeur au précédent (5 ; 5+5=10 ; 10+5=15)
Comment faire pour que chaque profit fermé d'une série soit un nouveau profit, au lieu du précédent (5 ; 5 ; 5) ?
Dans une série d'ordres fermés, il peut y avoir des ordres d'achat et de vente, ou uniquement des ordres d'achat et uniquement des ordres de vente
.

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==0)ProfitColor=DarkGray;
   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(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  double LastProfit=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()) continue;
       if (OrderMagicNumber()!= magic) continue;        
       if (OrderType()!= op) continue;
       if (op<0 || OrderType()==op) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
Vous pouvez entrer une variable globale et y inscrire le bénéfice actuel. Après avoir fermé l'ordre, soustrayez le montant précédent, et ce qui reste sera le bénéfice et retenez-le
 

C'est compliqué, y a-t-il quelque chose de plus simple ?
Et des exemples pouvez-vous donner, parce que votre cerveau est en ébullition ?

 
Natashe4ka:
C'est un peu compliqué ; y a-t-il quelque chose de plus simple ?

Non, ce ne sera pas plus facile. Vous comptez toujours TOUS les ordres, y compris ceux qui ont été comptés les fois précédentes où vous avez utilisé la fonctionLastProfitCL.Et comme il y a de plus en plus de commandes, le montant du bénéfice augmente également.

Nous devons élaborer la condition selon laquelle la boucle sera rompue lorsque les nouvelles commandes seront achevées.

 
Vitalie Postolache:

Nous devons élaborer une condition selon laquelle la boucle sera interrompue lorsque les nouvelles commandes seront épuisées.

Voilà, c'est la bonne façon de voir les choses ;))

 
Natashe4ka:

Voilà, c'est la bonne façon de voir les choses ;))

Et alors ?

Où est l'état ?

 
Renat Akhtyamov:

Et alors ?
Où en est l'état ?

quelque chose comme ça :

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

et vous devez en quelque sorte soustraire le cnt nouveau du cnt passé
cnt 1,2,3 passé
cnt 4,5,6 nouveau

 
Natashe4ka:

quelque chose comme ça :

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

et vous devez en quelque sorte soustraire le cnt nouveau du cnt passé
cnt 1,2,3 passé
cnt 4,5,6 nouveau

Non, je ne veux pas dire la façon dont tu l'as déjà écrit.

Dites-moi en quelques mots - le calcul du profit pour les ordres fermés qui vous intéresse.

par exemple :

- pour la journée

- déficitaire

- dernière commande

ou autre chose ?

Décrire la série