OrderCalcProfit

Essa função calcula o lucro para a conta atual, considerando as condições de mercado do momento, com base nos parâmetros fornecidos. Ela é utilizada para fazer uma pré-avaliação do resultado de uma operação de negociação (comércio). O valor retornado é na moeda da conta.

bool  OrderCalcProfit(
   ENUM_ORDER_TYPE       action,           // tipo de ordem (ORDER_TYPE_BUY ou ORDER_TYPE_SELL)
   string                symbol,           // nome do símbolo
   double                volume,           // volume
   double                price_open,       // preço de abertura
   double                price_close,      // preço de fechamento
   double&               profit            // variável para a obtenção do valor de lucro
   );

Parâmetros

action

[in]  Tipo de ordem. Porde ser um dos dois valores da enumeração ENUM_ORDER_TYPE: ORDER_TYPE_BUY ou ORDER_TYPE_SELL.

symbol

[in]  Nome do ativo.

volume

[in]  Volume das operações de negociação (comércio).

price_open

[in]  Preço de abertura.

price_close

[in]  Preço de fechamento.

profit

[out]  A variável onde o valor do lucro é armazenado, caso a função seja executada com sucesso. O valor do lucro estimado depende de muitos fatores, e pode variar em diferentes ambientes de mercado.

Valor retornado

A função retorna true em caso de sucesso, caso contrário ela retorna false. Se for especificado um tipo de ordem inválido, a função retornará false. Para informações sobre o erro na ordem, chame GetLastError().

Exemplo:

 
#define   VOLUME     1.0   // // volume da ordem
#define   DEVIATION  100   // número de pontos até o preço de fechamento
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string currency_profit=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);   // moeda do lucro
   double close_price=ChartPriceOnDropped(); // o preço de fechamento será a coordenada de preço correspondente ao ponto onde o script foi arrastado com o mouse
 
//---
   for(int i=0; i<=ORDER_TYPE_SELL; i++)
     {
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)i;                 // tipo de ordem: 0 - Buy, 1 - Sell
      double open_price=PriceOpenByOrderType(_Symbol, order_type);   // preço de abertura: para Buy - Ask, para Sell - Bid
     
      //--- se o preço de abertura não for obtido, continuamos o loop
      if(open_price==0)
         continue;
      
      //--- se o preço de fechamento for zero (script não iniciado arrastando no gráfico), calculamos o preço
      if(close_price==0)
         close_price=(order_type==ORDER_TYPE_BUY ? open_price + DEVIATION * _Point : open_price - DEVIATION * _Point);
      
      //--- calculamos o tamanho aproximado do lucro para a conta atual e o ambiente de mercado com base nos parâmetros fornecidos
      double profit=0;
      ResetLastError();
      if(!OrderCalcProfit(order_type, _Symbol, VOLUME, open_price, close_price, profit))
        {
         Print("OrderCalcProfit() failed. Error ", GetLastError());
         continue;
        }
      
      //--- o valor de lucro obtido será impresso no log
      PrintFormat("Estimated profit for %.2f %s position on %s with opening price of %.*f and closing price of %.*f: %.2f %s",
                  VOLUME, OrderTypeDescription(order_type), _Symbol, _Digits, open_price, _Digits, close_price, profit, currency_profit);
      
     }
   /*
   Resultado:
   Estimated profit for 1.00 Buy position on EURUSD with opening price of 1.10757 and closing price of 1.10881: 124.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 o preço de abertura com base no tipo de ordem            |
//+------------------------------------------------------------------+
double PriceOpenByOrderType(const string symbol, const ENUM_ORDER_TYPE order_type)
  {
   MqlTick tick={};
 
//--- obtemos os últimos preços do símbolo
   if(!SymbolInfoTick(symbol, tick))
     {
      Print("SymbolInfoTick() failed. Error ", GetLastError());
      return 0;
     }
     
//--- dependendo do tipo de ordem, retornamos o preço
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return(tick.ask);
      case ORDER_TYPE_SELL             :  return(tick.bid);
      default                          :  return(0);
     }
  }
//+------------------------------------------------------------------+
//| Retorna a descrição do tipo de ordem                             |
//+------------------------------------------------------------------+
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");
     }
  }

Também Veja

OrderSend(), Order Properties, Tipos de Operações de Negociação (Trade)