Gewinnberechnung von abgeschlossenen Aufträgen "HELP"

 

Der Gewinn der geschlossenen Aufträge wird korrekt berücksichtigt, aber nach dem Schließen wird der Wert zum vorherigen addiert (5; 5+5=10; 10+5=15)
Wie kann man erreichen, dass jeder geschlossene Gewinn einer Serie ein neuer ist, anstatt des vorherigen (5; 5; 5)?
In einer Reihe von geschlossenen Aufträgen kann es Kauf- und Verkaufsaufträge oder nur Kauf- und Verkaufsaufträge geben.

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);
   }
 

Wir müssen eine Bedingung für die Aufteilung abgeschlossener Aufträge in Serien hinzufügen

Nennen Sie uns den Algorithmus oder das Teilungsprinzip

 
Natashe4ka:   ... Gewinn aus abgeschlossenen Aufträgen ... addiert den Wert zum vorherigen Wert (5; 5+5=10; 10+5=15)

Wie kann man erreichen, dass jeder geschlossene Gewinn einer Serie ein neuer Gewinn ist und nicht der vorherige (5; 5; 5)? .....

Anstelle der arithmetischen Summierung sollten wir eine Zeichenkette mit einem Leerzeichen oder einem Semikolon und einem Leerzeichen einfügen, je nachdem, was besser ist
 
STARIJ:
Anstelle der arithmetischen Summierung fügen Sie sie einer Zeichenkette mit einem Leerzeichen oder einem Semikolon und einem Leerzeichen hinzu, je nachdem, was Sie bevorzugen

Eine gute Idee.

Oder wir könnten sie in ein Array packen.

 
Natashe4ka:

Der Gewinn der geschlossenen Aufträge wird korrekt berücksichtigt, aber nach dem Schließen wird der Wert zum vorherigen addiert (5; 5+5=10; 10+5=15)
Wie kann man erreichen, dass jeder geschlossene Gewinn einer Serie ein neuer ist, anstatt des vorherigen (5; 5; 5)?
In einer Reihe von geschlossenen Aufträgen kann es Kauf- und Verkaufsaufträge oder nur Kauf- und Verkaufsaufträge geben.

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);
   }
Sie können eine globale Variable eingeben, in die Sie den aktuellen Gewinn schreiben. Nach Abschluss des Auftrags ziehen Sie den vorherigen Betrag ab, und der Gewinn wird gespeichert
 

Es ist kompliziert, gibt es etwas Einfacheres?
Und können Sie Beispiele nennen, weil Ihr Gehirn kocht?

 
Natashe4ka:
Das ist ein bisschen kompliziert; gibt es etwas Einfacheres?

Nein, es wird nicht einfacher werden. Es werden immer ALLE Aufträge gezählt, auch die, die bei der vorherigen Verwendung der FunktionLastProfitCL gezählt wurden.Und da es immer mehr Aufträge gibt, steigt auch die Höhe des Gewinns.

Wir müssen die Bedingung ausarbeiten, unter der die Schleife unterbrochen wird, wenn die neuen Aufträge abgeschlossen sind.

 
Vitalie Postolache:

Wir müssen eine Bedingung ausarbeiten, unter der die Schleife unterbrochen wird, wenn die neuen Aufträge ausgehen.

So, das ist der richtige Weg, darüber nachzudenken))

 
Natashe4ka:

So, das ist der richtige Weg, darüber nachzudenken))

Und?

Wo ist die Bedingung?

 
Renat Akhtyamov:

Und?
Wo ist die Bedingung?

etwa so:

double cnt=0;

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

und man muss irgendwie cnt new von past subtrahieren
cnt 1,2,3 past
cnt 4,5,6 new

 
Natashe4ka:

etwa so:

double cnt=0;

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

und man muss irgendwie cnt new von past subtrahieren
cnt 1,2,3 past
cnt 4,5,6 new

Nein, ich meine nicht so, wie Sie es bereits geschrieben haben.

Nennen Sie mir in Worten die Gewinnberechnung für abgeschlossene Aufträge, an denen Sie interessiert sind

zum Beispiel:

- für den Tag

- verlustreich

- letzte Bestellung

oder etwas anderes?

Beschreiben Sie die Serie