MQL4 - EA - current profit and profit since EA initialised shown as comment on Chart - Need Help!

 
//+------------------------------------------------------------------+
void comment()
   {
      string cmt="\n";
      double ProfitCum=0,ProfitToday=0;
      
   if (FirstStartCount == 0)
      {
         FirstStartCount++;
         FirstStartTime = TimeCurrent();
      }

   if (DayCount == 0)
      {
         DayCount++;
         Today = DayOfWeek();
      }
          
   else if (DayCount != 0 && Today == DayOfWeek())
      {
         for(int i=OrdersTotal()-1; i>=0; i--)
            {
               if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
                  {
                     int OrderOpenDay = TimeDayOfWeek(OrderOpenTime());
                     
                     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderOpenDay==Today && OrderOpenTime() >= FirstStartTime)
                        {
                           ProfitToday+=OrderProfit()+OrderCommission()+OrderSwap();
                        }
                     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderOpenTime()>=FirstStartTime)
                        {
                           ProfitCum+=OrderProfit()+OrderCommission()+OrderSwap();
                        }
                  }
            }
     }
   else
     {
         DayCount = 0;
         ProfitToday = 0;
     }
     
      cmt+="  -=====   EA - ORDER MAGIC NUMBER   =====    "+DoubleToStr(MagicNumber,0)+"    ====-\n\n";
      
   if (getSpread() > MaxSpread)
      cmt+="  TRADING STOPPED  -  Spread  "+DoubleToStr(getSpread(),Digits)+"  exceeds MaxSpread of  "+DoubleToStr(MaxSpread,Digits)+"\n\n";
   else cmt+="  current Spread  /  MaxSpread:    "+DoubleToStr(getSpread(),Digits)+"   /    "+DoubleToStr(MaxSpread,Digits)+"\n\n";    
   
   if(!allowOpenDealByEquity())
      cmt+="  TRADING STOPPED  -  EQUITY STOP LEVEL REACHED @ "+DoubleToStr(EquityStop,2)+" EUR\n\n";
   else cmt+="  current Equity Stop = "+DoubleToStr(EquityStop,2)+" EUR\n\n";
   
   cmt+="  current  /  max. available LotSize:    "+DoubleToStr(LotSizeDyn,DigitsLotSize)+"   /   "+DoubleToStr(MaxLotsAvailable,DigitsLotSize)+"\n\n";
   
   cmt+="  current Margin as %age of Account Balance:   "+DoubleToStr (AccountMargin()*100/AccountBalance(),0)+" %\n\n";
   
   cmt+="  realised profit today / since start of EA:  "+DoubleToStr(ProfitToday,2)+"  EUR    /    "+DoubleToStr(ProfitCum,0)+"  EUR\n\n";
 
   cmt+="  Start of EA was     "+TimeToStr(FirstStartTime,TIME_DATE)+"   "+TimeToStr(FirstStartTime,TIME_MINUTES)+"";
   Comment(cmt);
   }
//+------------------------------------------------------------------+

This is the comment subroutine for which I need support. I want to show in the comment block the profit of the current day and the cumulated profit since the EA has been launched / initialised the first time (could be running 7/24) only for closed and not for open / pending orders.

I appreciate your help.

Thx Roger

 
  1. Du wählst das deutsche Forum und schreibst in Englisch? Nimm Deutsch hier :)
  2. Du musst durch alle geschlossenen Positionen iterieren, etwa so:
   #define  BoD(t) ((t)-((t)%86400))                        // Begin of day 17.5 12:54 => 17.5. 00:00:00
   ...
   if ( !HistorySelect(BoD(TimeCurrent()),TimeCurrent()) ) return(-1); // error
   int i,d=HistoryDealsTotal(); //p =  HistoryOrdersTotal(); // returns the number of closed positions
   ulong dt,t;
   while(d-->0) {
      dt = HistoryDealGetTicket(d);
      ENUM_DEAL_ENTRY tmp = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(dt, DEAL_ENTRY);
      if ( HistoryDealGetInteger(dt, DEAL_ENTRY) != DEAL_ENTRY_OUT ) continue; // not closed totally
      ...
   }
   ...

(UNGETESTET!!)

 
Carl Schreiber:
  1. Du wählst das deutsche Forum und schreibst in Englisch? Nimm Deutsch hier :)
  2. Du musst durch alle geschlossenen Positionen iterieren, etwa so:

(UNGETESTET!!)

Hallo Carl, darauf hatte ich nicht geachtet ;-)

Meines Erachtens habe ich die Iteration programmiert, abhängig von der Erfüllung der Bedingung ... else if ... werden dann mit for ... die Orderprofits täglich bzw. kumulativ aufsummiert - läuft aber nicht, zeigt mir keine Werte an.

Wo liegt da der Fehler, denn die Grundlogik ist ja m. E. wie von Dir vorgeschlagen.

 

Müsste es nicht OrdersHistoryTotal heißen?

 

In solchen Fällen startet man den Debugger und trägt als oberste Variable _LastError ein und geht dann Zeile für Zeile durch den Code!

Dann hättest Du erkannt, dass OrdersTotal() (Zaubertaste F1) nur die offenen Positionen bearbeitet, Du bräuchtest aber OrdersHistoryTotal()!

 
Carl Schreiber:

In solchen Fällen startet man den Debugger und trägt als oberste Variable _LastError ein und geht dann Zeile für Zeile durch den Code!

Dann hättest Du erkannt, dass OrdersTotal() (Zaubertaste F1) nur die offenen Positionen bearbeitet, Du bräuchtest aber OrdersHistoryTotal()!

Perfekt, Danke.