//+------------------------------------------------------------------+
//|                                                  CLS_KWR_01.mq4 |
//|                               Copyright © 2014, Khalil Abokwaik. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Khalil Abokwaik"
#property description "Cut Losses Short & Keep Winners Running"
//--- input parameters
 
input int      Magic_Number              = 40010;
input int      T1                        =PERIOD_D1;
input int      T2                        =PERIOD_W1;
input int      T3                        =PERIOD_MN1;
input double   Fixed_Lot_Size            = 0.1;    
input double   Lot_as_EQ_Perc            = 0.1;
input int      Max_Open_Orders           = 10;      
input int      Trailing_SL_Pips                   = 0;
input int      Sync_Minutes = 10;
input int      Cut_Loss_TF  = 1; //1, 2, 3
int ord_arr[100],T1_Bar_Time,T2_Bar_Time,T3_Bar_Time;
int Last_Sync_Time=0;
double sell_price = 0,buy_price  = 0,stop_loss=0,profit_target=0;
bool OrderSelected=false,OrderDeleted=false;
int NewOrder=0;
int oper_max_tries = 10,tries=0;
int operation_mode = -1; // -1:stand by, 0:Long, 1:Short
double fast_ma=0,slow_ma=0,slower_ma=0,prev_fast_ma=0,prev_slow_ma=0,prev_slower_ma=0;
double sl_price=0,tp_price=0,Lot_Size=0;
//-----------

int market_buy_order()
{    double rem=0; bool x=false;
   NewOrder=0;
   tries=0;
   if(Fixed_Lot_Size==0 && Lot_as_EQ_Perc>0)
   {
      Lot_Size=MathMin(NormalizeDouble(AccountEquity()/MarketInfo(Symbol(),MODE_MARGINREQUIRED)*Lot_as_EQ_Perc,2),MarketInfo(Symbol(),MODE_MAXLOT));
      rem=Lot_Size/(MarketInfo(Symbol(),MODE_MINLOT));
      Lot_Size=MathFloor(rem)*MarketInfo(Symbol(),MODE_MINLOT);
   }
   else
   { 
      if (Fixed_Lot_Size==0) Lot_Size=0.1;
      else Lot_Size=Fixed_Lot_Size;
   }
   while(NewOrder<=0 && tries< oper_max_tries)
   {
      NewOrder=OrderSend(Symbol(),OP_BUY,Lot_Size,Ask,5,
                         0,
                         0,
                         "MACROSSWT",Magic_Number,0,Blue);            
      tries=tries+1;
   }
   x=OrderSelect(NewOrder,SELECT_BY_TICKET,MODE_TRADES);
   Print("Ticket# ",OrderTicket(),"  Open Time = ",OrderOpenTime());
   return(NewOrder);
}
int market_sell_order()
{
   double rem=0; bool x=false;
   NewOrder=0;
   tries=0;
   if(Fixed_Lot_Size==0 && Lot_as_EQ_Perc>0)
   {
      Lot_Size=MathMin(NormalizeDouble(AccountEquity()/MarketInfo(Symbol(),MODE_MARGINREQUIRED)*Lot_as_EQ_Perc,2),MarketInfo(Symbol(),MODE_MAXLOT));
      rem=Lot_Size/(MarketInfo(Symbol(),MODE_MINLOT));
      Lot_Size=MathFloor(rem)*MarketInfo(Symbol(),MODE_MINLOT);
      
   }
   else
   { 
      if (Fixed_Lot_Size==0) Lot_Size=0.1;
      else Lot_Size=Fixed_Lot_Size;
   }
   
   while(NewOrder<=0 && tries< oper_max_tries)
   {
      NewOrder=OrderSend(Symbol(),OP_SELL,Lot_Size,Bid,5,
                         0,
                         0,
                         "MACROSSWT",Magic_Number,0,Red);            
      tries=tries+1;
   }
   x=OrderSelect(NewOrder,SELECT_BY_TICKET,MODE_TRADES);
   Print("Ticket# ",OrderTicket(),"  Open Time = ",OrderOpenTime());
   
   return(NewOrder);
}



int total_orders()
{ int tot_orders=0;
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()==Magic_Number 
         && OrderSymbol()==Symbol()
         && (OrderType()==OP_BUY || OrderType()==OP_SELL)
        ) tot_orders=tot_orders+1;
   }
   return(tot_orders);
}

int last_order_type()
{ int ord_type=-1;
  int tkt_num=0;
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()==Magic_Number 
         && OrderSymbol()==Symbol()
         && OrderTicket()>tkt_num
        ) 
        {
            ord_type = OrderType();
            tkt_num=OrderTicket();
        }
   }
   return(ord_type);
}
bool Open_Orders()
{ int j=0;
   for(j=0;j<OrdersTotal();j++)
   {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number)
      {   
         if((TimeCurrent()-OrderOpenTime())/60 < T1) return(true);
      }     
    }
   return(false);
}
void close_loosers(int TF)
{ int k=-1;
   bool x= false;
   for(int j=0;j<100;j++) ord_arr[j]=0;
   
   int ot = OrdersTotal();
   for(j=0;j<ot;j++)
   {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number)
      {   
         if( (OrderType()==OP_SELL || OrderType()==OP_BUY)
            && OrderOpenTime() >= iTime(Symbol(),TF,1)   && OrderOpenTime()<iTime(Symbol(),TF,0)
            && OrderProfit()<0)
         {  k = k + 1; 
            ord_arr[k]=OrderTicket();
         }
      }     
    }
    for(j=0;j<=k;j++)
    {  OrderDeleted=false;
       tries=0;
       while(!OrderDeleted && tries<oper_max_tries)
            {
               x=OrderSelect(ord_arr[j],SELECT_BY_TICKET,MODE_TRADES);
               if(OrderType()==OP_SELL) OrderDeleted=OrderClose(ord_arr[j],OrderLots(),Ask,100,Red);
               if(OrderType()==OP_BUY) OrderDeleted=OrderClose(ord_arr[j],OrderLots(),Bid,100,Red);
               tries=tries+1;
            }
    }
}

void init()
{
}
int start()
{  
   T1_Bar_Time=(TimeCurrent()-iTime(NULL,T1,0))/60;
   //T2_Bar_Time=(TimeCurrent()-iTime(NULL,T2,0))/60;
   //T3_Bar_Time=(TimeCurrent()-iTime(NULL,T3,0))/60;
   if(T1_Bar_Time<5 && !Open_Orders()) 
   { 
      market_buy_order();
      market_sell_order() ;
   }
   if ( (TimeCurrent()-Last_Sync_Time)/60 > Sync_Minutes)
   {  Last_Sync_Time = TimeCurrent();
      if (Cut_Loss_TF<2) close_loosers(T1);
      if (Cut_Loss_TF<3) close_loosers(T2);
      if (Cut_Loss_TF<4) close_loosers(T3);
   }
   return(1);
}

