Obter volume de acordo com a simulação do profit da operação.

 

Pessoal, o método OrderProfitCheck(), da classe CAccountInfo simula o lucro/prejuízo de uma operação de acordo com os parâmetros, preço de abertura e fechamento, volume, símbolo e tipo (compra ou venda).

double  OrderProfitCheck(
   const string        symbol,              // symbol
   ENUM_ORDER_TYPE     trade_operation,     // operation type (ORDER_TYPE_BUY or ORDER_TYPE_SELL)
   double              volume,              // volume
   double              price_open,          // open price
   double              price_close          // close price
   ) const

Alguém tem alguma sugestão de um método similar, mas que eu obtenha o volume que fique mais próximo de um determinado lucro/prejuízo da função? Algo do tipo OrderVolumeCheck():

double  OrderVolumeCheck(
   const string        symbol,              // symbol
   ENUM_ORDER_TYPE     trade_operation,     // operation type (ORDER_TYPE_BUY or ORDER_TYPE_SELL)
   double              profit/loss,         // Lucro ou prejuízo estimado da operação.
   double              price_open,          // open price
   double              price_close          // close price
   ) const // Retornar o volume que mais se aproxime do lucro / prejuízo informado, de acordo com os preços de abertura e fechamento.
 
Rodorush:

Pessoal, o método OrderProfitCheck(), da classe CAccountInfo simula o lucro/prejuízo de uma operação de acordo com os parâmetros, preço de abertura e fechamento, volume, símbolo e tipo (compra ou venda).

Alguém tem alguma sugestão de um método similar, mas que eu obtenha o volume que fique mais próximo de um determinado lucro/prejuízo da função? Algo do tipo OrderVolumeCheck():

Olá Rodolfo,

Não conheço uma função nativa que faça isso no MT5, a mais próxima que já utilizei é a CheckOpenLong()/Short(), mas nesse caso você calcula o volume a partir do preço e SL.  

Nesse artigo tem um exemplo (ver abaixo) próximo do que você quer fazer, mas para um lote fixo usando a função OrderCalcProfit() que é a mesma chamada pela OrderProfitCheck() dessa classe.

//+------------------------------------------------------------------+
//| Calcular o potencial de lucro/prejuízo para a compra de 1 lote   |
//+------------------------------------------------------------------+
double CalculateProfitOneLot(double entry_price,double exit_price)
  {
//--- receber o valor de lucro para esta variável
   double profit=0;
   if(!OrderCalcProfit(ORDER_TYPE_BUY,Symbol(),1.0,entry_price,exit_price,profit))
     {
      Print(__FUNCTION__,"  Falhou em calcular OrderCalcProfit(). Erro ",GetLastError());
     }
//---
   return(profit);
  }

Uma forma de resolver o problema por força bruta seria você definir uma faixa de valor de lote e chamar a mesma função fazendo uma varredura de vários lotes.

Mas o elegante e mais eficaz seria examinar o funcionamento interno da OrderCalcProfit() que é a função original chamada pela classe que estás utilizando.

Razão: