//+------------------------------------------------------------------+
//|                                              OrderAccounting.mq4 |
//|                                             Komgrit Sungkhaphong |
//|                               http://iamforextrader.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Komgrit Sungkhaphong"
#property link      "http://iamforextrader.blogspot.com"

//+------------------------------------------------------------------+
//| My function                                                      |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
//   {
//    return(value+value2);
//   }
//+------------------------------------------------------------------+


//
int OA_Count(int MagicNumber,int type, string _symbol)
{
   int count=0;
   for(int i=0; i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS)==true)
      {
         if(OrderMagicNumber()==MagicNumber &&
               OrderSymbol()==_symbol &&
               OrderType()==type)
               {
                  count++;
               }
      }
   }
   return(count);
}

int OA_Last(int MagicNumber,int type,string _symbol)
{
   int last_ticket=0;
   
   if(OrdersTotal()==0) return(0);
   
   for(int i=0; i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS)==true)
      {
         if(OrderMagicNumber()==MagicNumber &&
               OrderSymbol()==_symbol &&
               OrderType()==type &&
               OrderCloseTime()==0)
               {
                  if(OrderTicket()>last_ticket) last_ticket=OrderTicket();
               }
      }
   }
   return(last_ticket);
}

double OA_OpenPrice(int ticket)
{
   if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
   {
      if(OrderCloseTime()==0)   return(OrderOpenPrice());
      
   }
}

datetime OA_OpenTime(int ticket)
{
   if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
   {
      if(OrderCloseTime()==0)   return(OrderOpenTime());
      
   }
}

double OA_PL_Pips(int ticket)
{
   //int Multi;
   //Multi=MathPow(10,Digits);
   if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
   {
      if(OrderCloseTime()==0)
      {
         double price,oOpen;
         oOpen=OrderOpenPrice();
         RefreshRates();
         if(OrderType()==OP_BUY)
         {
            price=Bid;
            //if loss
            //if(oOpen>price)   return((oOpen-price));
            return((price-oOpen)*MathPow(10,Digits-1));
         }   
         if(OrderType()==OP_SELL)
         {
            price=Ask;
            //if loss
            //if(oOpen<price)   return((price-oOpen));
            return((oOpen-price)*MathPow(10,Digits-1));
         }
      }
   }
}
double OA_Lots(int Magic,int type,string _symbol)
{
   double Sum_Lots=0;
   
   for(int i=0; i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS)==true)
      {
         if(OrderMagicNumber()==Magic &&
               OrderSymbol()==_symbol &&
               OrderType()==type &&
               OrderCloseTime()==0)
               {
                  Sum_Lots=Sum_Lots+OrderLots();
               }
      }
   }
   return(Sum_Lots);
}
double OA_Cost(int Magic,int type,string _symbol)
{
   double Sum_PriceByLots=0;
   double Sum_Lots=0;
   double BreakEvenPrice=0;
   Sum_Lots = OA_Lots(Magic,type,_symbol);
   if(Sum_Lots==0)
   {
      return(-1);
      Print("BREAKEVEN::error Sum.Lots=0");
   }
   else
   {
      BreakEvenPrice=Sum_PriceByLots/Sum_Lots;
      BreakEvenPrice=NormalizeDouble(BreakEvenPrice,Digits);
   }
   return(BreakEvenPrice);
}

void OA_CloseAll()
{
   while(OrdersTotal()>0)
   {
      for(int i=0;i<OrdersTotal();i++)
      {
         while(IsTradeContextBusy())
         {
            Sleep(100);
         }
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
         {
            OA_Close(OrderTicket());
         }   

      }
   }
}

//OA.CloseAllbyType(MagicNumber,type,_symbol);
void OA_CloseAllbyType(int MagicNumber, int type, string _symbol)
{
   while(OrdersTotal()>0)
   {
      for(int i=0;i<OA_Count(MagicNumber,type,_symbol);i++)
      {
         while(IsTradeContextBusy())
         {
            Sleep(100);
         }
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
         {
            if(OrderType()==type)   OA_Close(OrderTicket());
         }   

      }
   }
}

void OA_Close(int ticket)
{
   if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
   {
      RefreshRates();
      double price;
      if(OrderType()==OP_BUY)
      {
         price=MarketInfo(OrderSymbol(),MODE_BID);
         while(IsTradeContextBusy())   Sleep(50);
         if(OrderClose(OrderTicket(),OrderLots(),price,5,Gray)==true)
            Print("OA.CloseAll:Successful close order#"+OrderTicket());
      }
      if(OrderType()==OP_SELL)
      {
         price=MarketInfo(OrderSymbol(),MODE_ASK);
         while(IsTradeContextBusy())   Sleep(50);
         if(OrderClose(OrderTicket(),OrderLots(),price,5,Gray)==true)
            Print("OA.CloseAll:Successful close order#"+OrderTicket());
      }
   }
}


///OBSOLETE
void SafeOrderClose(int ticket)
{
   double p;
   
   OrderSelect(ticket,SELECT_BY_TICKET);
   RefreshRates();   
   if(OrderType()==OP_BUY) p=MarketInfo(OrderSymbol(),MODE_BID);
   if(OrderType()==OP_SELL) p=MarketInfo(OrderSymbol(),MODE_ASK);
   if(OrderClose(OrderTicket(),OrderLots(),p,5,Gray)==true)
   {
      while(IsTradeContextBusy())   Sleep(50);
      Print("SafeOrderClose:Close order #"+OrderTicket()+" success!");
   }
   
}


double OA_BreakEvenPrice(int MagicNumber,int type, string _symbol)
{
   double Sum_PriceByLots=0;
   double Sum_Lots=0;
   double BreakEvenPrice=0;
   
   for(int i=0; i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if(OrderMagicNumber()==MagicNumber &&
               OrderSymbol()==_symbol &&
               OrderType()==type )
               {
                  Sum_Lots=Sum_Lots+OrderLots();
                  Sum_PriceByLots=Sum_PriceByLots+(OrderOpenPrice()*OrderLots());                  
               }
      }
   }
   
   if(Sum_Lots==0)
   {
      return(0);
      //Print("BREAKEVEN::error Sum.Lots=0");
   }
   else
   {
      BreakEvenPrice=Sum_PriceByLots/Sum_Lots;
      BreakEvenPrice=NormalizeDouble(BreakEvenPrice,MarketInfo(_symbol,MODE_DIGITS));
   }
   return(BreakEvenPrice);
}

bool OA_IsLive(int ticket)
{
   if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
   {
      if(OrderCloseTime()==0)
         {
            return(true);
         }
         else return(false);
   }
}


