OrderCalcProfit

La funzione calcola il profitto per il corrente account, nelle attuali condizioni di mercato, in base ai parametri passati. La funzione viene utilizzata per la pre-valutazione del risultato di un'operazione di trade. Il valore viene restituito nella valuta del conto.

bool  OrderCalcProfit(
   ENUM_ORDER_TYPE       action,           // tipo di ordine (ORDER_TYPE_BUY or ORDER_TYPE_SELL)
   string                symbol,           // nome del simbolo
   double                volume,           // volume
   double                price_open,       // prezzo di apertura
   double                price_close,      // prezzo di chiusura
   double&               profit            // variabile per ottenere il valore del profitto
   );

Parametri

action

[in] Tipo di ordine, può essere uno dei due valori dell'enumarazione ENUM_ORDER_TYPE: ORDER_TYPE_BUY o ORDER_TYPE_SELL.

symbol

[in] Nome del Simbolo.

volume

[in] volume delle operazioni di trade.

price_open

[in] Prezzo di apertura.

price_close

[in]  Prezzo di chiusura.

profit

[out] La variabile, per cui il valore del profitto calcolato sarà scritto nel caso la funzione viene eseguita correttamente. Il valore di profitto stimato dipende da molti fattori, e può variare nei diversi contesti di mercato.

Valore restituito

La funzione restituisce true in caso di successo, altrimenti restituisce false. Se un tipo di ordine non valido viene specificato, la funzione restituisce false. Al fine di ottenere informazioni sull' errore, chiamare GetLastError().

Esempio:

 
#define   VOLUME     1.0   // volume dell'ordine
#define   DEVIATION  100   // numero di punti prima del prezzo di chiusura
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string currency_profit=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);   // valuta di profitto
   double close_price=ChartPriceOnDropped(); // la coordinata del prezzo, corrispondente al punto in cui lo script è stato lasciato cadere con il mouse, serve come prezzo di chiusura
 
//---
   for(int i=0i<=ORDER_TYPE_SELLi++)
     {
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)i;                 // tipo di ordine: 0 - Buy, 1 - Sell
      double open_price=PriceOpenByOrderType(_Symbolorder_type);   // prezzo di apertura: per Buy - Ask, per Sell - Bid
     
      //--- se il prezzo di apertura non viene ricevuto, continuare il ciclo
      if(open_price==0)
         continue;
      
      //--- se il prezzo di chiusura è zero (lo script non è stato avviato trascinandolo sul grafico), calcolare il prezzo
      if(close_price==0)
         close_price=(order_type==ORDER_TYPE_BUY ? open_price + DEVIATION * _Point : open_price - DEVIATION * _Point);
      
      //--- calcolare l'importo approssimativo del profitto per il corrente conto e l'ambiente di mercato sulla base dei parametri passati
      double profit=0;
      ResetLastError();
      if(!OrderCalcProfit(order_type_SymbolVOLUMEopen_priceclose_priceprofit))
        {
         Print("OrderCalcProfit() failed. Error "GetLastError());
         continue;
        }
      
      //--- stampare il valore del profitto ricevuto nel journal
      PrintFormat("Estimated profit for %.2f %s position on %s with opening price of %.*f and closing price of %.*f: %.2f %s",
                  VOLUMEOrderTypeDescription(order_type), _Symbol_Digitsopen_price_Digitsclose_priceprofitcurrency_profit);
      
     }
   /*
   risultato:
   Estimated profit for 1.00 Buy position on EURUSD with opening price of 1.10757 and closing price of 1.10881124.00 USD
   Estimated profit for 1.00 Sell position on EURUSD with opening price of 1.10753 and closing price of 1.10881: -128.00 USD
   */
  }
//+------------------------------------------------------------------+
//| Restituire il prezzo di apertura per il tipo di ordine           |
//+------------------------------------------------------------------+
double PriceOpenByOrderType(const string symbolconst ENUM_ORDER_TYPE order_type)
  {
   MqlTick tick={};
 
//--- ottenere gli ultimi prezzi del simbolo
   if(!SymbolInfoTick(symboltick))
     {
      Print("SymbolInfoTick() failed. Error "GetLastError());
      return 0;
     }
     
//--- restituire il prezzo a seconda del tipo di ordine
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return(tick.ask);
      case ORDER_TYPE_SELL             :  return(tick.bid);
      default                          :  return(0);
     }
  }
//+------------------------------------------------------------------+
//| Restituire la descrizione del tipo di ordine                     |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE order_type)
  {
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return("Buy");
      case ORDER_TYPE_SELL             :  return("Sell");
      default                          :  return("Unknown order type");
     }
  }

Vedi anche

OrderSend(), Proprietà degli Ordini, Tipi di Operazioni di Trade