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

 
Natashe4ka:
Les ordres sont clôturés en série, mais s'il n'y a pas de conditions de clôture, les ordres sont collectés pendant un jour ou deux, etc.

Si la série est fermée pratiquement pendant un cycle, disons, pendant la durée de vie d'une barre, alors nous pouvons prendre le critère de la série par le temps de fermeture plus une barre. Autrement dit, tous les ordres dont le délai de clôture est inférieur à cette valeur doivent être rejetés.

Cependant, nous craignons que cela ne fonctionne que dans le testeur ; toute intervention manuelle entraînera un calcul incorrect des bénéfices (seuls les bénéfices de l'EA seront pris en compte, alors que la transaction manuelle ne le sera pas).

 
Vitalie Postolache:
Si la série est fermée pratiquement pendant un cycle, disons, pendant la durée de vie d' une barre, alors nous pouvons prendre le critère de la série par le moment de la fermeture plus une barre. Autrement dit, tous les ordres dont l'heure de clôture est inférieure à cette valeur doivent être rejetés.

I.e.

if ((op<0||OrderType()==op) && (t==OrderCloseTime() ||  t==OrderCloseTime()+60)) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}

(t==OrderCloseTime()||t==OrderCloseTime()+60)?

 
Natashe4ka:

I.e.

if ((op<0||OrderType()==op) && t==OrderCloseTime()+60) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}

+60 ?

PeriodSeconds() serait plus correct. Ou allez-vous travailler uniquement sur le M1 ?

Quelque chose comme ça :

double lastloss()
{
double lastlos=0.0,op=0.0;
int cnt=0;
datetime time=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
         {
            if(cnt==0) time=OrderCloseTime();
            op=OrderProfit()+OrderSwap()+OrderCommission();
            if(OrderCloseTime()+PeriodSeconds()<time && op>0.0) break;
            lastlos+=op;
            if(cnt!=0) cnt++;
         }
      }
}
return(lastlos);
}
 
Vitalie Postolache:

Quelque chose comme ça :

Cela ajoute une nouvelle valeur à la valeur précédente. Mais à chaque nouvelle fermeture, une nouvelle valeur du bénéfice.
 

Et vous pouvez également numéroter les ordres dans le commentaire, pour les DC qui n'écrasent pas le commentaire. Et en essayant le numéro du commentaire, dès que le numéro est hors d'ordre - la série est terminée.

Exemple : les séries de commandes numérotées 1,2,3,4,5. Fermé dans l'ordre 5,4,3,2,1 - la boucle voit 1 et s'interrompt. Fermeture dans l'ordre 1,2,3,4,5 et 1 (le numéro d'ordre de la série précédente) - la boucle voit la différence 5-1>1 et s'interrompt. Je dois réfléchir à la manière de traduire cela en code )))).

 
Natashe4ka:
Une nouvelle valeur est donc ajoutée à la valeur précédente. Et chaque nouvelle fermeture, une nouvelle valeur de profit.
Je ne sais pas, ça ne colle pas pour moi.
 
Vitalie Postolache:
Je ne sais pas, ça ne colle pas pour moi.

Mettez les informations et vous verrez que ça s'additionne.

color ProfitColor;

   if(lastloss()<0) ProfitColor=Red;
   if(lastloss()>0) ProfitColor=LimeGreen;
   if(lastloss()==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(lastloss(),2)),10,"Arial",ProfitColor);
 
Natashe4ka:

Introduisez les informations et vous verrez immédiatement ce qui s'ajoute.

Hmm, oui en effet... Continuons à penser ))))
 
Je comprends que c'est un test dans le testeur....
 
Vitalie Postolache:
Hmm, oui en effet... Continuons à penser ))))

Je pensais aussi qu'il comptait comme il se doit.
Je n'aurais pas dû mettre cette info dans le code et la vie aurait été plus simple))

Et maintenant, on se demande comment la fonction n'a pas fonctionné correctement pendant tout ce temps ! !!