Processing

Algoritmo de procesamiento principal.

virtual bool  Processing()

Valor devuelto

true si la operación se ha ejecutado; en caso contrario false.

Nota

Lleva a cabo los siguientes pasos:

1. Comprueba la presencia en el símbolo de la posición abierta. Si no hay ninguna posición abierta, omite los pasos 2, 3 y 4.
2. Comprueba las condiciones para invertir la posición abierta (método CheckReverse()). Si la posición ha sido "revertida", termina.
3. Comprueba las condiciones para cerrar la posición (método CheckClose()). Si la posición se ha cerrado, omite el paso 4.
4. Comprueba las condiciones para modificar los parámetros de la posición (método CheckTrailingStop()). Si los parámetros de la posición han cambiado, termina.
5. Comprueba la presencia de órdenes pendientes en el símbolo. Si no hay ninguna orden pendiente, va al paso 9.
6. Comprueba las condiciones para borrar la orden (CheckDeleteOrderLong() para comprar órdenes pendientes o CheckDeleteOrderShort() para venderlas). Si la orden se ha borrado, va al paso 9.
7. Comprueba las condiciones para modificar los parámetros de la orden pendiente (CheckTrailingOrderLong() para comprar órdenes o CheckTrailingOrderShort() para venderlas). Si los parámetros de la orden han cambiado, termina.
8. Termina.
9. Comprueba las condiciones para abrir la posición (método CheckOpen()).

Si desea implementar su propio algoritmo, debe sobreescribir el método Processing()  de la clase derivada.

Implementación

//+------------------------------------------------------------------+
//| Principal function                                                    |
//| ENTRADA:  no.                                                      |
//| SALIDA: true si se procesa alguna operación de trading, false en caso contrario.  |
//| OBSERVACIONES: no.                                                      |
//+------------------------------------------------------------------+
bool CExpert::Processing()
  {
//--- comprueba posiciones abiertas
   if(m_position.Select(m_symbol.Name()))
     {
      //--- abre posición disponible
      //--- comprueba la posibilidad de revertir la posición
      if(CheckReverse()) return(true);
      //--- comprueba la posibilidad de cerrar la posición/borrar órdenes pendientes
      if(!CheckClose())
        {
         //--- comprueba la posibilidad de modificar la posición
         if(CheckTrailingStop()) return(true);
         //--- devuelve sin operaciones
         return(false);
        }
     }
//--- comprueba si hay órdenes pendientes colocadas
   int total=OrdersTotal();
   if(total!=0)
     {
      for(int i=total-1;i>=0;i--)
        {
         m_order.SelectByIndex(i);
         if(m_order.Symbol()!=m_symbol.Name()) continue;
         if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT || m_order.OrderType()==ORDER_TYPE_BUY_STOP)
           {
            //--- comprueba la posibilidad de borrar una orden pendiente de compra
            if(CheckDeleteOrderLong()) return(true);
            //--- comprueba la posibilidad de modificar una orden pendiente de compra
            if(CheckTrailingOrderLong()) return(true);
           }
         else
           {
            //--- comprueba la posibilidad de borrar una orden pendiente de venta
            if(CheckDeleteOrderShort()) return(true);
            //--- comprueba la posibilidad de modificar una orden pendiente de venta
            if(CheckTrailingOrderShort()) return(true);
           }
         //--- devuelve sin operaciones
         return(false);
        }
     }
//--- comprueba la posibilidad de abrir una posición/establecer una orden pendiente
   if(CheckOpen()) return(true);
//--- devuelve sin operaciones
   return(false);
  }