//+------------------------------------------------------------------+
//|                                                      S&R_ELO.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#define MODO_TODO 0
#define MODO_BUY  1
#define MODO_SELL 2

extern double ValorLote = 0.01;

// MagicNumber. 
// Operamos sólo con las ordenes marcadas con este número
int iMagicNumber = 12332199; 
string sAccion = "";

// Valores anteriores
double val1Resistencia = 0;
double val1Soporte = 0;
// Valores actuales
double val2Resistencia = 0;
double val2Soporte = 0;

double valSpread = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{   
   DibujarMenu();
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   ObjectDelete("Actual");
   ObjectDelete("Anterior");
   ObjectDelete("Soporte1");
   ObjectDelete("Soporte2");
   ObjectDelete("Resistencia1");
   ObjectDelete("Resistencia2");
   ObjectDelete("AccionL");
      
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{         
   // Solamente operamos al inicio de cada Vela.
   if(Volume[0] > 1)
      return(0);     
   
   // Leer valores del indicador S/R Barry
   val1Resistencia = val2Resistencia;
   val1Soporte = val2Soporte;
   val2Resistencia = iCustom(NULL, 0, "SRBarry", 0, 0);
   val2Soporte = iCustom(NULL, 0, "SRBarry", 1, 0);
   
   // Mostramos los valores
   RedibujarMenu();
   
   // Hemos de esperar a leer dos valores, para poder operar
   if(val1Resistencia == 0 || val1Resistencia == 0 ||
      val2Resistencia == 0 || val2Resistencia == 0)        
      return(0);
            
   if(val2Resistencia > val1Resistencia)
   {
      // Aumenta la resistencia      
      if(!CerrarOrden(MODO_TODO))
      {
         Print("Error CerrarOrden(TODO) ", GetLastError());
         return(0);
      }
      else
      {
         // ABRIR VENTA  
         if(!AbrirSELL(true))
         {
            Print("Se ejecuto CerrarOrden(TODO) OK ", 
               "Error en AbrirSELL(true).", 
               GetLastError());
            return(0);
         }
         else
            sAccion = "Aumenta Resistencia";
      }      
   }
   
   if(val2Resistencia < val1Resistencia)
   {
      // Disminuye la resistencia         
      if(!CerrarOrden(MODO_BUY))
      {
         Print("Error en CerrarOrden(BUY). ", 
            GetLastError());
         return(0);
      }      
      else
      {
         if(!AbrirSELL(false))
         {
            Print("Error en AbrirSELL(false).", 
               GetLastError());
            return(0);
         }
         else
            sAccion = "Disminuye Resistencia";
      }
   }   
     
   if(val2Soporte > val1Soporte)
   {
      // Aumenta el soporte      
      if(!CerrarOrden(MODO_TODO))
      {
         Print("Error CerrarOrden(TODO) ", GetLastError());
         return(0);
      }
      else
      {
         // ABRIR COMPRA
         if(!AbrirBUY(true))
         {
            Print("Se ejecuto CerrarTodo(TODO) OK ", 
               "Error en AbrirBUY(true).", 
               GetLastError());
            return(0);
         }
         else
            sAccion = "Aumenta Soporte";
      }
   }
      
   if(val2Soporte < val1Soporte)
   {
      // Disminuye el soporte
      if(!CerrarOrden(MODO_SELL))
      {
         Print("Error en CerrarOrden(SELL). ", 
            GetLastError());
         return(0);
      }
      else      
      {
         if(!AbrirBUY(false))
         {
            Print("Error en AbrirBUY(false).", 
               GetLastError());
            return(0);
         }
         else
            sAccion = "Disminuye Soporte";
      }
   }      
   
//----
   return(0);
}
  
bool CerrarOrden(int iModo)
{
   int iTotalOrdenes = OrdersTotal();   
   
   for(int i = 0; i < iTotalOrdenes; i++)
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber() == iMagicNumber)
      {
         if(iModo == MODO_TODO)
         {           
            if(OrderType() == OP_BUY)
               if(!OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red))
                  return(false);
            if(OrderType() == OP_SELL)
               if(!OrderClose(OrderTicket(), OrderLots(), Ask , 3, Red))
                  return(false);
         }
         else
         {
            if(OrderType() == OP_BUY && iModo == MODO_BUY)
            {
               if(!OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red))
                  return(false);
            }
            if(OrderType() == OP_SELL && iModo == MODO_SELL)
            {
               if(!OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red))
                  return(false);
            }
         }                  
      }
   }   
   return(true);
}

int AbrirBUY(bool bModo)
{
   int iTotalOrdenes = 0; 
   int i = 0;
   int iTicket = 0;
   
   if(bModo)
   {
      // INCONDICIONAL
      valSpread = MarketInfo(Symbol(), MODE_SPREAD);
      iTicket = OrderSend(Symbol(), OP_BUY, ValorLote, Ask, 3, 
         0, 0, "BUY Incondicional", iMagicNumber, 0, Green);
      if(iTicket == 0)         
         return(false);
   }
   else
   {
      // COMPROBAR QUE NO HAYA UNA ORDEN BUY ABIERTA
      iTotalOrdenes = OrdersTotal();     
      for(i = 0; i < iTotalOrdenes; i++)
      {
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == iMagicNumber && OrderType() == OP_BUY)         
            iTicket++;
      }         
      if(iTicket == 0) 
      {
         valSpread = MarketInfo(Symbol(), MODE_SPREAD);
         iTicket = OrderSend(Symbol(), OP_BUY, ValorLote, Ask, 3, 
            0, 0, "BUY Condicional", iMagicNumber, 0, Green);
         if(iTicket == 0)            
            return(false);
      }
   }
      
   return(true);
}

int AbrirSELL(bool bModo)
{
   int iTotalOrdenes = 0; 
   int i = 0;

   int iTicket = 0;
   
   if(bModo == true)
   {
      // INCONDICIONAL
      valSpread = MarketInfo(Symbol(), MODE_SPREAD);
      iTicket = OrderSend(Symbol(), OP_SELL, ValorLote, Bid, 3, 
         0, 0, "SELL Incondicional", iMagicNumber, 0, Green);
      if(iTicket == 0)
         return(false);
   }
   else
   {
      // COMPROBAR QUE NO HAYA UNA ORDEN DE VENTA ABIERTA
      iTotalOrdenes = OrdersTotal();     
      for(i = 0; i < iTotalOrdenes; i++)
      {
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == iMagicNumber && OrderType() == OP_SELL)         
            iTicket++;
      }         
      if(iTicket == 0) 
      {
         valSpread = MarketInfo(Symbol(), MODE_SPREAD);
         iTicket = OrderSend(Symbol(), OP_SELL, ValorLote, Ask, 3, 
            0, 0, "SELL Condicional", iMagicNumber, 0, Green);
         if(iTicket == 0)            
            return(false);
      }
   }
   return(true);
}      

void DibujarMenu()
{
   ObjectCreate("Actual",OBJ_LABEL,0,0,0,0,0);
   ObjectCreate("Soporte1",OBJ_LABEL,0,0,0,0,0);
   ObjectCreate("Resistencia1",OBJ_LABEL,0,0,0,0,0);
   ObjectCreate("Anterior",OBJ_LABEL,0,0,0,0,0);
   ObjectCreate("Soporte2",OBJ_LABEL,0,0,0,0,0);
   ObjectCreate("Resistencia2",OBJ_LABEL,0,0,0,0,0);   
   ObjectCreate("AccionL",OBJ_LABEL,0,0,0,0,0);
                 
   ObjectSetText("Actual", "Actual", 8, "Arial", White);
   ObjectSet("Actual",OBJPROP_XDISTANCE,9*8);     
   ObjectSet("Actual",OBJPROP_YDISTANCE,10+2*(8+2));
   ObjectSet("Actual",OBJPROP_CORNER,1);
     
   ObjectSetText("Anterior", "Anterior", 8, "Arial", White);
   ObjectSet("Anterior",OBJPROP_XDISTANCE,9*8);     
   ObjectSet("Anterior",OBJPROP_YDISTANCE,10+5*(8+2));
   ObjectSet("Anterior",OBJPROP_CORNER,1);     
      
   ObjectSetText("Resistencia1", DoubleToStr(val1Resistencia, 5), 8, "Arial", Red);
   ObjectSet("Resistencia1",OBJPROP_XDISTANCE,3*8);     
   ObjectSet("Resistencia1",OBJPROP_YDISTANCE,10+2*(8+2));
   ObjectSet("Resistencia1",OBJPROP_CORNER,1);
   
   ObjectSetText("Soporte1", DoubleToStr(val1Soporte, 5), 8, "Arial", Blue);
   ObjectSet("Soporte1",OBJPROP_XDISTANCE,3*8);     
   ObjectSet("Soporte1",OBJPROP_YDISTANCE,10+3*(8+2));
   ObjectSet("Soporte1",OBJPROP_CORNER,1);
      
   ObjectSetText("Resistencia2", DoubleToStr(val2Resistencia, 5), 8, "Arial", Red);
   ObjectSet("Resistencia2",OBJPROP_XDISTANCE,3*8);     
   ObjectSet("Resistencia2",OBJPROP_YDISTANCE,10+5*(8+2));
   ObjectSet("Resistencia2",OBJPROP_CORNER,1);
   
   ObjectSetText("Soporte2", DoubleToStr(val2Soporte, 5), 8, "Arial", Blue);
   ObjectSet("Soporte2",OBJPROP_XDISTANCE,3*8);     
   ObjectSet("Soporte2",OBJPROP_YDISTANCE,10+6*(8+2));
   ObjectSet("Soporte2",OBJPROP_CORNER,1);
    
   ObjectSetText("AccionL", sAccion, 8, "Arial", Yellow);
   ObjectSet("AccionL",OBJPROP_XDISTANCE,3*8);     
   ObjectSet("AccionL",OBJPROP_YDISTANCE,10+8*(8+2));
   ObjectSet("AccionL",OBJPROP_CORNER,1);       
}

void RedibujarMenu()
{
   ObjectSetText("Soporte1", DoubleToStr(val1Soporte, 5), 8, "Arial", Blue);
   ObjectSetText("Resistencia1", DoubleToStr(val1Resistencia, 5), 8, "Arial", Red);
   
   ObjectSetText("Soporte2", DoubleToStr(val2Soporte, 5), 8, "Arial", Blue);
   ObjectSetText("Resistencia2", DoubleToStr(val2Resistencia, 5), 8, "Arial", Red);
   
   ObjectSetText("AccionL", sAccion, 8, "Arial", Yellow);
}
//+------------------------------------------------------------------+