Elabora

Algoritmo di elaborazione principale.

virtual bool  Processing()

Valore di ritorno

true se è stata eseguita un'operazione di trade, altrimenti false.

Nota

Fa le seguenti operazioni:

1. Verifica la presenza della posizione aperta sul simbolo. Se non ci sono posizioni aperte, salta i passaggi №2, №3 and №4.
2. Controlli condizioni per invertire la posizione aperta (metodo CheckReverse()). Se la posizione è stata "invertita", esce.
3. Controlli condizioni per chiudere la posizione (metodo CheckClose ()). Se la posizione è stata chiusa, salta il passaggio №4.
4. Verifica le condizioni per modificare i parametri della posizione (metodo CheckTrailingStop()). Se i parametri della posizione sono stati modificati, esce.
5. Controlla la presenza di ordini pendenti sul simbolo. Se non c'è alcun ordine pendete, va al passaggio №9.
6. Controlla condizioni per eliminare ordine (CheckDeleteOrderLong() per ordini pendenti buy o CheckDeleteOrderShort() per ordini pendenti sell). Se l'ordine è stato eliminato, va al passaggio №9.
7. Controlla condizioni per modificare i parametri dell'ordine pendente (CheckTrailingOrderLong() per ordini buy oppure CheckTrailingOrderShort() per ordini sell). Se i parametri dell'ordine sono stati modificati, esce.
8. Exit.
9. Controlli condizioni per aprire posizione (metodo CheckOpen()).

Se si desidera implementare il proprio algoritmo, hai bisogno di eseguire l'override del metodo Processing() della classe erede.

Implementazione

//+------------------------------------------------------------------+
//| Funzione principale                                                    |
//| INPUT:  no.                                                      |
//| OUTPUT: true-se una qualunque operazione di trade è stata elaborata, false altrimenti.  |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CExpert::Processing()
  {
//--- controlal se ci sono posizioni aperte
   if(m_position.Select(m_symbol.Name()))
     {
      //--- posizione aperta è disponibile
      //--- controlla la possibilità di invertibilità posizione
      if(CheckReverse()) return(true);
      //--- controlla la possibilità di chisura della posizione/eliminazione ordini pendenti
      if(!CheckClose())
        {
         //--- controlla la possibilità di modifica della posizione
         if(CheckTrailingStop()) return(true);
         //--- ritorno senza operazioni
         return(false);
        }
     }
//--- controlla se ci sono oridini pendenti piazzati
   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)
           {
            //--- controlla la possibilità di eliminare un ordine pendente di buy
            if(CheckDeleteOrderLong()) return(true);
            //--- controlla la possibilità di modifica di un ordine pendente di buy
            if(CheckTrailingOrderLong()) return(true);
           }
         else
           {
            //--- controlla la possibilità di eliminare un ordine pendente sell
            if(CheckDeleteOrderShort()) return(true);
            //--- controlla la possibilità di modifica di un ordine pendente sell
            if(CheckTrailingOrderShort()) return(true);
           }
         //--- ritorno senza operazioni
         return(false);
        }
     }
//--- controlla la possibilità di apertura di una posizione/impostazione di un ordine pendente
   if(CheckOpen()) return(true);
//--- ritorno senza operazioni
   return(false);
  }