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=0i<=ORDER_TYPE_SELLi++)
     {
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)i;                 // tipo de ordem: 0 - Buy, 1 - Sell
      double open_price=PriceOpenByOrderType(_Symbolorder_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_SymbolVOLUMEopen_priceclose_priceprofit))
        {
         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",
                  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 o preço de abertura com base no tipo de ordem            |
//+------------------------------------------------------------------+
double PriceOpenByOrderType(const string symbolconst ENUM_ORDER_TYPE order_type)
  {
   MqlTick tick={};
 
//--- obtemos os últimos preços do símbolo
   if(!SymbolInfoTick(symboltick))
     {
      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)