Calculating profit with a given price

 

Hi,

I'm trying to write a function in MQL4 which will calculate my total profit (could be negative, which would mean loss) at a given price.

In other words, if I have an open Buy order at price P1 then:

my profit at P2 would be ((P2-P1) * volume) - but that's in most simplistic terms, now I need to do that for all open orders, and account for Buys and Sells and also Account for Spread and the fact that Buys open with Ask and close with Bid and vice versa, Sells open with Bid and close with Asks.

 

I know this might be an easy exercise for a good programmer, but I'm just being lost in all these details and can't seem to get it right. Can someone help me out here? In other words, I need something similar to a sum of all OrderProfit() for my open orders but calculated at a given price instead of current.

 

Thanks!

 
RodionPronin:

Hi,

I'm trying to write a function in MQL4 which will calculate my total profit (could be negative, which would mean loss) at a given price.

In other words, if I have an open Buy order at price P1 then:

my profit at P2 would be ((P2-P1) * volume) - but that's in most simplistic terms, now I need to do that for all open orders, and account for Buys and Sells and also Account for Spread and the fact that Buys open with Ask and close with Bid and vice versa, Sells open with Bid and close with Asks.

 

I know this might be an easy exercise for a good programmer, but I'm just being lost in all these details and can't seem to get it right. Can someone help me out here? In other words, I need something similar to a sum of all OrderProfit() for my open orders but calculated at a given price instead of current.

 

Thanks!

string CheckReport () {
        static string   ProfitReport = "";
        static int      TimeToReport = 0;
        static int      TradeCounter = 0;
#define Daily           0
#define Weekly          1
#define Monthly         2
#define All             3

        if (TradeCounter != HistoryTotal()) {
                TradeCounter = HistoryTotal();
                TimeToReport = 0;
        }

        if (TimeLocal() > TimeToReport) {
                TimeToReport = TimeLocal() + 300;
                double  Profit[10], Lots[10], Count[10];
                ArrayInitialize(Profit,0);
                ArrayInitialize(Lots,0.000001);
                ArrayInitialize(Count,0.000001);

                int Today     = TimeCurrent() - (TimeCurrent() % 86400);
                int ThisWeek  = Today - TimeDayOfWeek(Today)*86400;
                int ThisMonth = TimeMonth(TimeCurrent());
                for (int i = 0; i < HistoryTotal(); i++) {
                        if ( OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && (OrderMagicNumber()== magic)  && OrderCloseTime() > 0 ) {
                                Count[All]      += 1;
                                Profit[All]     += OrderProfit() + OrderSwap() + OrderCommission();
                                Lots[All]       += OrderLots();
                                if (OrderCloseTime() >= Today) {
                                        Count[Daily]    += 1;
                                        Profit[Daily]   += OrderProfit() + OrderSwap() + OrderCommission();
                                        Lots[Daily]     += OrderLots();
                                }
                                if (OrderCloseTime() >= ThisWeek) {
                                        Count[Weekly]   += 1;
                                        Profit[Weekly]  += OrderProfit() + OrderSwap() + OrderCommission();
                                        Lots[Weekly]    += OrderLots();
                                }
                                if (TimeMonth(OrderCloseTime()) == ThisMonth) {
                                        Count[Monthly]  += 1;
                                        Profit[Monthly] += OrderProfit() + OrderSwap() + OrderCommission();
                                        Lots[Monthly]   += OrderLots();
                                }
                        }
                }
                ProfitReport =  "\n\nProfit Report" +
                                "\nToday: $"             + DoubleToStr(Profit[Daily],2) +
                                "\nThis Week: $"         + DoubleToStr(Profit[Weekly],2) +
                                "\nThis Month: $"        + DoubleToStr(Profit[Monthly],2) +
                                "\nAll Profits: $"       + DoubleToStr(Profit[All],2) +
                                "\nAll Trades: "         + DoubleToStr(Count[All],0)    + "  (Average $"+DoubleToStr(Profit[All]/Count[All],2)+" per trade)"+
                                "\nAll Lots: "           + DoubleToStr(Lots[All],2)     + "  (Average $"+DoubleToStr(Profit[All]/Lots[All],2) +" per lot)";
        }
        return (ProfitReport);
}

Would something like this help??  

 

RodionPronin: my profit at P2 would be ((P2-P1) * volume) - but that's in most simplistic terms, now I need to do that for all open orders, and account for Buys and Sells and also Account for Spread and the fact that Buys open with Ask and close with Bid and vice versa, Sells open with Bid and close with Asks.

I know this might be an easy exercise for a good programmer, but I'm just being lost in all these details and can't seem to get it right. Can someone help me out here? In other words, I need something similar to a sum of all OrderProfit() for my open orders but calculated at a given price instead of current.

  1. Just sum individual orders: (P2 - OrderOpenPrice) *Direction(OrderType) * OrderLots * DeltaPerlot
    double   Direction(int op_xxx){ return( 1. - 2. * (op_xxx%2) );               }
    
  2. Spread and Bid/Ask are irrelevant. If you close at P2 the spread is included.
Reason: