//+------------------------------------------------------------------+
//| Equity Manager for Martingale Lover v2                           |
//+------------------------------------------------------------------+
//mod. as requested at http://www.forexfactory.com/showthread.php?p=7386564#post7386564
#property copyright "Copyright(c)2008 latimeria"
#property link "http://ForexBaron.net"

extern string  MoneyExp = "<<< Manage by Money (AccountCurrency) >>>";
extern double  Equity_Target_by_Money      = 1500;
extern double  Equity_Stop_Target_by_Money = 1000;

string  AboutMisc = "<<< Miscellaneous >>>";
bool    Alert_On = false;
int     slippage = 9999;

 string sbhi="send one long and one short trade when backtester starts? -> Works on backtester only!";
 bool SendTestTradesOnBacktest = false;//should send one long and one short trade when backtester starts
 bool SendLongTrades  = true;
 bool SendShortTrades = false;


double CurrentEquity;
double EQTARGET;
double EQSTOPTARGET;

double HighestEquity;

int DQ_ADJUST []  = { 0 , 1 , 10 , 100 , 1 , 10 , 100 };
string DOW[] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

string NAME = "Equity Manager for Martingale Lover v2a *** mod. ForexBaron.net";

//+------------------------------------------------------------------+
//| init                                                             |
//+------------------------------------------------------------------+
int init()
{
   // Reset Equity
   CurrentEquity = AccountEquity();

   // Set Highest Equity
   HighestEquity = CurrentEquity;

   // Set Target by Money
   EQTARGET = CurrentEquity + Equity_Target_by_Money;
   EQSTOPTARGET = CurrentEquity - Equity_Stop_Target_by_Money;

  if (SendTestTradesOnBacktest && IsTesting()) {
  RefreshRates();
  if (SendLongTrades) OrderSend(Symbol(),OP_BUY,0.1,Ask,50,0,0,"",0,0,CLR_NONE);
  if (SendShortTrades) OrderSend(Symbol(),OP_SELL,0.1,Bid,50,0,0,"",0,0,CLR_NONE);
  OrderSend(Symbol(),OP_SELLSTOP,0.1,1.2550,50,0,0,"",0,0,CLR_NONE);
  OrderSend(Symbol(),OP_SELLLIMIT,0.1,1.4050,50,0,0,"",0,0,CLR_NONE);
  OrderSend(Symbol(),OP_BUYLIMIT,0.1,1.2500,50,0,0,"",0,0,CLR_NONE);
  OrderSend(Symbol(),OP_BUYSTOP,0.1,1.3700,50,0,0,"",0,0,CLR_NONE);
  Print("Testorders sent");
 }
   
   return(0);
}

//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
int start()
{
   ShowStatus();

   // Refresh Highest Equity
   if(AccountEquity() > HighestEquity) HighestEquity = AccountEquity();
   // Exit
   if(AccountEquity() > EQTARGET || AccountEquity() < EQSTOPTARGET) Initialize();
  
   return(0);
}

//+------------------------------------------------------------------+
//| Initialize (delete all existing orders)                          |
//+------------------------------------------------------------------+
void Initialize()
{
   int i,j,Type,SLIP; bool selected, success;

   for(j=0; j<3; j++)
   {
      // Delete All Orders & Positions
     for(i=0; i<OrdersTotal(); i++)
     {
        selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if(selected)
        {
           int DIGITS = MarketInfo(OrderSymbol(),MODE_DIGITS);
           int DQADJ = DQ_ADJUST [ DIGITS ];

           Type = OrderType();
           success = false;
           SLIP = slippage * DQADJ;
         
           while (IsTradeContextBusy()) Sleep(100);
           RefreshRates();
           if(Type > OP_SELL && Type <= OP_SELLSTOP) success = OrderDelete(OrderTicket()); // delete pending orders
           if(Type == OP_BUY) success = OrderClose(OrderTicket(),OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), SLIP, CLR_NONE); // close buy orders
           if(Type == OP_SELL) success = OrderClose(OrderTicket(),OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), SLIP, CLR_NONE); // close sell orders
           if (!success) Print("Equity Manager for Martingale Lover v2: OrderType() "+Order2Txt(OrderType())+" (ticket: "+OrderTicket()+") close -> ERROR code = " + GetLastError());
            else if (success) Print("Equity Manager for Martingale Lover v2: OrderType() "+Order2Txt(OrderType())+" (ticket: "+OrderTicket()+") closed");
        }
     }
   }

   //if(Alert_On) Alert(NAME + " has closed everything.") ;

   // Reset Equity
   CurrentEquity = AccountEquity();

   // Reset Target by Money
   EQTARGET = CurrentEquity + Equity_Target_by_Money;
   EQSTOPTARGET = CurrentEquity - Equity_Stop_Target_by_Money;
   
  
   // Reset Highest Equity
   HighestEquity = CurrentEquity;

} // end of Initialize


//+------------------------------------------------------------------+
//| Show Status                                                      |
//+------------------------------------------------------------------+
void ShowStatus()
{
   string PlusMinus;

   string DAAAAASH = "--------------------------------------------------------";

   int LotDigits = 2;
   if(MarketInfo(Symbol(),MODE_MINLOT) > 0.07) LotDigits = 1;

   // Current Equity
   string CurEquity = "  Initial Equity = "+DoubleToStr(CurrentEquity,2)+" "+AccountCurrency();
   
   // Equity Target
   string EQ_T;
   if(Equity_Target_by_Money>0) EQ_T = "Equity Target = "+DoubleToStr(EQTARGET,2)+" (+"+DoubleToStr(Equity_Target_by_Money,2)+")";
   if(Equity_Target_by_Money<0) EQ_T = "Equity Target = "+DoubleToStr(EQTARGET,2)+" ("+DoubleToStr(Equity_Target_by_Money,2)+")";

   // Equity Stop Target
   string EQ_STOPT;
   if(Equity_Stop_Target_by_Money>0) EQ_STOPT = "  Equity Stop = "+DoubleToStr(EQSTOPTARGET,2)+" (-"+DoubleToStr(Equity_Stop_Target_by_Money,2)+")";
   if(Equity_Stop_Target_by_Money<0) EQ_STOPT = "  Equity Stop = "+DoubleToStr(EQSTOPTARGET,2)+" (+"+DoubleToStr(-Equity_Stop_Target_by_Money,2)+")";
   
    // Floating Equity
   string FloatingEquity = "Floating Equity = "+DoubleToStr(AccountEquity(),2)+" "+AccountCurrency();

   // Floating P/L
   double CurrentPL = AccountEquity()-CurrentEquity;
   string CurPL = DoubleToStr(CurrentPL,2);
   string CurPercent = DoubleToStr((CurrentPL / CurrentEquity) * 100,2);
   PlusMinus = ""; if(CurrentPL>0) PlusMinus = "+";
   string FloatingPL = "Floating P/L = "+PlusMinus+CurPL + " ("+PlusMinus+CurPercent+"%)";

   string DayofWeek = DOW [ DayOfWeek() ];
   string MONTH = Month(); if(Month()<10) MONTH = "0"+MONTH;
   string DAY = Day(); if(Day()<10) DAY = "0"+DAY;
   string HOUR = Hour(); if(Hour()<10) HOUR = "0"+HOUR;
   string MIN = Minute(); if(Minute()<10) MIN = "0"+MIN;

   string CurrentTime = Year()+"/"+MONTH+"/"+DAY+"/"+DayofWeek+"/"+HOUR+":"+MIN;

   Comment(DAAAAASH,"\n",NAME,"\n",
           DAAAAASH,"\n",CurEquity,"\n",EQ_T,"\n",EQ_STOPT,"\n",
           DAAAAASH,"\n",FloatingEquity,"\n",FloatingPL,"\n",CurrentTime);
}

string Order2Txt(int type) {
 switch(type) {
  case 0     : return("BUY");        break;
  case 1     : return("SELL");       break;
  case 2     : return("BUY LIMIT");  break;
  case 3     : return("SELL LIMIT"); break;
  case 4     : return("BUY STOP");   break;
  case 5     : return("SELL STOP");  break;
  default    : return("OrderType(): "+type);
 }
 return("UNKNOWN");
}