OrderCalcProfit

Esta función calcula el beneficio para la cuenta actual en las condiciones actuales del mercado a base de los parámetros pasados. La función se utiliza para la evaluación previa de los resultados de una operación comercial. El valor se devuelve en la moneda de la cuenta.

bool  OrderCalcProfit(
   ENUM_ORDER_TYPE       action,           // tipo de orden (ORDER_TYPE_BUY o ORDER_TYPE_SELL)
   string                symbol,           // nombre del símbolo
   double                volume,           // volumen
   double                price_open,       // precio de apertura
   double                price_close,      // precio de cierre
   double&               profit           // variable donde se recibe el valor del beneficio
   );

Parámetros

action

[in]  Tipo de orden, puede ser uno de los valores de la enumeración ENUM_ORDER_TYPE: ORDER_TYPE_BUY o ORDER_TYPE_SELL.

symbol

[in]  Nombre del símbolo.

volume

[in]  Volumen de la operación comercial.

price_open

[in]  Precio de apertura.

price_close

[in]  Precio de cierre.

profit

[out]  Variable en la que se recibirá el valor del beneficio en caso de que la función se ejecute con éxito. El valor del beneficio estimado depende de muchos factores y puede variar en diferentes entornos del mercado.

Valor devuelto

Devuelve true en caso de éxito. De lo contrario, la función devuelve false. Si se indica el tipo de orden no admisible, la función devolverá false. Para obtener la información sobre el error ocurrido, hay que llamar a la función GetLastError().

Ejemplo:

 
#define   VOLUME     1.0   // volumen de la orden
#define   DEVIATION  100   // número de puntos hasta el precio de cierre
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string currency_profit=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);   // divisa de beneficio
   double close_price=ChartPriceOnDropped(); // el precio de cierre será la coordenada de precio correspondiente al punto en el que se ha iniciado este script con el ratón
 
//---
   for(int i=0i<=ORDER_TYPE_SELLi++)
     {
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)i;                 // tipo de orden: 0 - Buy, 1 - Sell
      double open_price=PriceOpenByOrderType(_Symbolorder_type);   // precio de apertura: para Buy - Ask, para Sell - Bid
     
      //--- si el precio de apertura no ha sido obtenido, continuamos el ciclo
      if(open_price==0)
         continue;
      
      //--- si el precio de cierre es cero (el script no se ha iniciado arrastrándolo al gráfico), calculamos el precio
      if(close_price==0)
         close_price=(order_type==ORDER_TYPE_BUY ? open_price + DEVIATION * _Point : open_price - DEVIATION * _Point);
      
      //--- calculamos la cantidad aproximada de beneficio para la cuenta actual y el entorno del mercado según los parámetros transmitidos
      double profit=0;
      ResetLastError();
      if(!OrderCalcProfit(order_type_SymbolVOLUMEopen_priceclose_priceprofit))
        {
         Print("OrderCalcProfit() failed. Error "GetLastError());
         continue;
        }
      
      //--- imprimimos el valor de beneficio obtenido en el registro
      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);
      
     }
   /*
   resultado:
   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
   */
  }
//+------------------------------------------------------------------+
//| Retorna el tipo de precio de apertura según el tipo de orden     |
//+------------------------------------------------------------------+
double PriceOpenByOrderType(const string symbolconst ENUM_ORDER_TYPE order_type)
  {
   MqlTick tick={};
 
//--- obtenemos los últimos precios del símbolo
   if(!SymbolInfoTick(symboltick))
     {
      Print("SymbolInfoTick() failed. Error "GetLastError());
      return 0;
     }
     
//--- dependiendo del tipo de orden, retornamos el precio
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return(tick.ask);
      case ORDER_TYPE_SELL             :  return(tick.bid);
      default                          :  return(0);
     }
  }
//+------------------------------------------------------------------+
//| Retorna la descripción del tipo de orden                         |
//+------------------------------------------------------------------+
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");
     }
  }

Véase también

OrderSend(), Propiedades de órdenes, Tipos de operaciones comerciales