Gewinnberechnung von abgeschlossenen Aufträgen "HELP" - Seite 7

 
Sergey Gritsay:
Und wo befindet sich das alles? Schreiben Sie es irgendwo in eine Variable oder ein Array? Zeigen Sie mir zuerst, wo Sie es speichern, dann können Sie sehen, was Sie als nächstes tun müssen.
Nirgendwo. Sie müssen alles fachkundig erstellen und die Gewinndaten sammeln.
 
Natashe4ka:

OK, dann schlüsseln wir das mal auf: Es gibt einen Auftragsschluss, es gibt ein Ticket oder eine Anzahl von Aufträgen, die mit dem Auftragsschluss zusammenfallen. Wie können wir diese Aufträge kombinieren und ihren Gewinn berechnen?
Es scheint einfach zu sein, aber ich verstehe es immer noch nicht.

Bisher hat noch niemand herausgefunden, welche davon rot markiert sind. Wir brauchen die genauen Kriterien, um diese Aufträge zu finden. Versuchen Sie daher, wie man so schön sagt, mit den Fingern, mit Bildern usw. zu erklären.
 
Sergey Gritsay:
Bisher hat noch niemand herausgefunden, welche davon rot markiert sind. Wir brauchen die genauen Kriterien, um diese Aufträge zu finden. Versuchen Sie also zu erklären, wie man es mit den Fingern macht, mit Bildern und so weiter.

?

Warum kann das niemand verstehen, Sie meinen wahrscheinlich sich selbst?

Alles ist seit langem klar.

Madam will es einfach selbst machen, ohne mit den Details ihres Programms anzugeben.

 
Sergey Gritsay:
Bislang kann niemand verstehen, welche davon rot hervorgehoben sind. Wir brauchen genaue Kriterien, um diese Aufträge zu finden. Versuchen Sie deshalb zu erklären, wie es auf den Fingern geht, mit Bildern und so weiter

Ja, ich habe bereits einen 100% funktionierenden Zustand angegeben und als fertigen Code beigefügt. Sie sollten auch beachten, dass der Code eine Methode verwendet, die nicht durch Neustarts des Terminals beeinträchtigt wird, und dass nichts verloren geht, wenn das Terminal wieder eingeschaltet wird und weiterhin funktioniert. Aber hier wird ein Rad erfunden, das nur im Testgerät funktioniert.

Sergey, beachten Sie auch, dass in der ursprünglichen TS-Code, wenn Sie eine Reihe von 5 Positionen zu schließen, die Reihenfolge in der Mitte der Schließung ist auch gelöscht, dies wiederum wird nicht dazu führen, etwas Gutes in den realen Handel. Im Allgemeinen ist alles für alle klar, außer für TS.

 
Ich glaube, ich verstehe, was Natalia erreichen will.
//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+
....
 

Die zweite Version der Funktion wurde korrigiert

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:

Die zweite Version der Funktion wurde korrigiert

Ich danke Ihnen für Ihre Hilfe.
Die Variante 1 funktioniert nicht richtig
Die Variante 2 funktioniert richtig.
Meine Variante funktioniert auch richtig, aber wenn die Aufträge auf einen anderen Tag oder mehr übertragen werden, ist der Wert nicht klar Profit 190, während er 4,27 sein sollte.

Siehe Bildschirmfoto Nr. 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);
   }
 
Wie sich herausstellt, liegt das Problem nicht in der Anzahl der Aufträge, sondern in der Verschiebung der Aufträge auf einen anderen oder mehrere Tage.
 
Natashe4ka:
Wie sich herausstellt, liegt das Problem nicht in der Anzahl der Aufträge, sondern in der Verschiebung der Aufträge auf einen anderen oder mehrere Tage.
Schließen Sie in Serie oder was? Wie hoch ist die Überweisung, wenn Sie alle Aufträge in einem Zyklus abschließen?
 
Vitalie Postolache:
Schließen Sie also in einer Serie oder was? Wie hoch ist der Übertrag, wenn Sie alle Aufträge in einem Zyklus abschließen?

Die Aufträge werden serienweise geschlossen, aber wenn es keine Bedingungen für die Schließung gibt, werden die Aufträge für ein oder zwei Tage gesammelt usw.
Allerdings wirkt sich die Anzahl der Aufträge auch auf den Gewinn aus.
Gibt es mehr als 3 Aufträge, wird der Wert nur für den letzten abgeschlossenen Auftrag berechnet.