Processing

Реализует основной алгоритм.

virtual bool  Processing()

Возвращаемое значение

true - выполнена какая-либо торговая операция, иначе - false.

Примечание

Метод базового класса выполняет следующие действия:

1. Проверяется наличие открытой позиции по рабочему символу. Если позиции нет, то шаги 2, 3 и 4 пропускаются.

2. Проверяется необходимость переворота позиции (вызов метода CheckReverse()). Если позиция "перевернута", то уходим.

3. Проверяется необходимость закрытия позиции (вызов метода CheckClose()). Если позиция закрыта, то шаг 4 пропускается.

4. Проверяется необходимость модификации позиции (вызов метода CheckTrailingStop()). Если позиция модифицирована, то уходим.

5. Проверяется наличие отложенных ордеров по рабочему символу. Если ордеров нет, то переходим к п.9.

6. Проверяется необходимость удалить ордер (вызов метода CheckDeleteOrderLong() для ордеров на покупку или метода CheckDeleteOrderShort() для ордеров на продажу). Если ордер удален, то переходим к п.9.

7. Проверяется необходимость модифицировать ордер (вызов метода CheckTrailingOrderLong() для ордеров на покупку или метода CheckTrailingOrderShort() для ордеров на продажу). Если ордер модифицирован, то уходим.

8. Уходим.

9. Проверяется необходимость входа в рынок (вызов метода CheckOpen()).

Для реализации собственного алгоритма следует переопределить метод Processing() в классе-наследнике.

Реализация:

//+------------------------------------------------------------------+
//| Main function                                                    |
//| INPUT:  no.                                                      |
//| OUTPUT: true-if any trade operation processed, false otherwise.  |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CExpert::Processing()
  {
//--- check if open positions
   if(m_position.Select(m_symbol.Name()))
     {
      //--- open position is available
      //--- check the possibility of reverse the position
      if(CheckReverse()) return(true);
      //--- check the possibility of closing the position/delete pending orders
      if(!CheckClose())
        {
         //--- check the possibility of modifying the position
         if(CheckTrailingStop()) return(true);
         //--- return without operations
         return(false);
        }
     }
//--- check if plaсed pending orders
   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)
           {
            //--- check the ability to delete a pending order to buy
            if(CheckDeleteOrderLong()) return(true);
            //--- check the possibility of modifying a pending order to buy
            if(CheckTrailingOrderLong()) return(true);
           }
         else
           {
            //--- check the ability to delete a pending order to sell
            if(CheckDeleteOrderShort()) return(true);
            //--- check the possibility of modifying a pending order to sell
            if(CheckTrailingOrderShort()) return(true);
           }
         //--- return without operations
         return(false);
        }
     }
//--- check the possibility of opening a position/setting pending order
   if(CheckOpen()) return(true);
//--- return without operations
   return(false);
  }