OrderSelect

Seleziona un ordine con cui lavorare. Restituisce true se la funzione è stata completata con successo. Restituisce false se il completamento della funzione non è riuscito. Per ulteriori informazioni su un errore chiamare GetLastError().

bool  OrderSelect(
   ulong   ticket      // Ticket dell'ordine
   );

Parametri

ticket

[in]  Ticket dell'ordine.

Valore restituito

Valore di tipo bool.

Nota

Non confondere i correnti ordini pendenti con le posizioni, che sono anche visualizzati nella scheda "Trade" del "BoxAttrezzi" del terminale client.

Per l'interpretazione "netting" delle posizioni (ACCOUNT_MARGIN_MODE_RETAIL_NETTING e ACCOUNT_MARGIN_MODE_EXCHANGE), può esistere in qualsiasi momento una sola posizione per un simbolo. Questa posizione è il risultato di una o più operazioni. Non confondere le posizioni con gli ordini pendenti vigenti, che sono anche visualizzati nella scheda Trading della finestra BoxAttrezzi.

Se sono ammesse posizioni individuali (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), per un simbolo possono essere aperte più posizioni.

La funzione OrderSelect() copia i dati di un ordine nell'ambiente del programma, e successive chiamate di OrderGetDouble(), OrderGetInteger(), OrderGetString() restituiscono i dati precedentemente copiati. Ciò significa che l'ordine stesso non esiste più (o il suo prezzo di apertura, Stop Loss/Take Profit o scadenza sono cambiati), ma i dati di questo ordine possono essere ancora ottenuti. Per garantire la ricezione di nuovi dati relativi ad un ordine, si consiglia di chiamare OrderSelect() giusto prima di fare riferimento ad essi.

Esempio:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // scostamento dal prezzo corrente per effettuare l'ordine, in punti
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // tipo di ordine
#define   VOLUME        1.0                     // volume
#define   DEVIATION     2                       // deviazione consentita dal prezzo
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- dichiarare e inizializzare la richiesta di trade, il risultato e le variabili
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//-- parametri di immissione dell'ordine pendente
   request.action    = TRADE_ACTION_PENDING;                               // tipo di operazione di trading
   request.symbol    = _Symbol;                                            // simbolo
   request.volume    = VOLUME;                                             // volume
   request.deviation = DEVIATION;                                          // deviazione consentita dal prezzo
   request.magic     = EXPERT_MAGIC;                                       // MagicNumber dell'ordine
   
//-- controllo tipo di operazione
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // tipo di ordine
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// prezzo di apertura
        request.priceNormalizeDouble(order_price_Digits);              // prezzo di apertura normalizzato
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // tipo di ordine
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// prezzo di apertura
        request.priceNormalizeDouble(order_price,_Digits);               // prezzo di apertura normalizzato
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // tipo di ordine
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)+OFFSET*_Point;// prezzo di apertura
        request.priceNormalizeDouble(order_price,_Digits);               // prezzo di apertura normalizzato
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // tipo di ordine
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)-OFFSET*_Point;// prezzo di apertura
        request.priceNormalizeDouble(order_price,_Digits);               // prezzo di apertura normalizzato
        break;
      default// se viene selezionato l'ordine non in sospeso o StopLimit
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- inviare una richiesta. Se l'invio di una richiesta fallisce, visualizzare il codice di errore e completare l'operazione
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- visualizzare i dati dell'operazione
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- ottenere il ticket dell'ordine dal risultato dell'operazione di trade e selezionare l'ordine per ticket
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- visualizzare i dati dell'ordine, selezionato per ticket, nel journal
   ENUM_ORDER_TYPE   type  = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
   long              time  = OrderGetInteger(ORDER_TIME_SETUP_MSC);
   double            price = OrderGetDouble(ORDER_PRICE_OPEN);
   double            volumeOrderGetDouble(ORDER_VOLUME_CURRENT);
   string            symbolOrderGetString(ORDER_SYMBOL);
   int               digits= (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   PrintFormat("Current selected order: %s %.2f %s #%I64u at %.*f, %s",
               symbolvolumeOrderTypeDescription(type), ticketdigitspriceTimeMscToString(time));
   /*
  risultato:
   Trade request resultretcode=10009order=2811006719
   Current selected orderEURUSD 1.00 Buy Limit #2811006719 at 1.105502024.09.04 10:38:28.563
   */
  }
//+------------------------------------------------------------------+
//| Restituisce il tempo con millisecondi                            |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }
//+------------------------------------------------------------------+
//| Restituire la descrizione del tipo di ordine                     |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE type)
  {
   switch(type)
     {
      case ORDER_TYPE_BUY              :  return("Buy");
      case ORDER_TYPE_SELL             :  return("Sell");
      case ORDER_TYPE_BUY_LIMIT        :  return("Buy Limit");
      case ORDER_TYPE_SELL_LIMIT       :  return("Sell Limit");
      case ORDER_TYPE_BUY_STOP         :  return("Buy Stop");
      case ORDER_TYPE_SELL_STOP        :  return("Sell Stop");
      case ORDER_TYPE_BUY_STOP_LIMIT   :  return("Buy Stop Limit");
      case ORDER_TYPE_SELL_STOP_LIMIT  :  return("Sell Stop Limit");
      default                          :  return("Unknown order type");
     }
  }

Vedi anche

OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetTicket(), Proprietà degli Ordini