OrderCalcProfit

Вычисляет размер прибыли для текущего счета и рыночного окружения на основании переданных параметров. Предназначена для предварительной оценки результата торговой операции. Значение возвращается в валюте счета.

bool  OrderCalcProfit(
   ENUM_ORDER_TYPE       action,           // тип ордера (ORDER_TYPE_BUY или ORDER_TYPE_SELL)
   string                symbol,           // имя символа
   double                volume,           // объем
   double                price_open,       // цена открытия
   double                price_close,      // цена закрытия
   double&               profit           // переменная для получения значения прибыли
   );

Параметры

action

[in]  Тип ордера, может принимать одно из двух значений перечисления ENUM_ORDER_TYPE: ORDER_TYPE_BUY или ORDER_TYPE_SELL.

symbol

[in]  Имя финансового инструмента.

volume

[in]  Объем торговой операции.

price_open

[in]  Цена открытия.

price_close

[in]  Цена закрытия.

profit

[out]  Переменная, в которую будет записано вычисленное значение прибыли в случае успешного выполнения функции. Значение оценки прибыли зависит от многих факторов и может меняться при изменении рыночного окружения.

Возвращаемое значение

Возвращает true в случае успеха, иначе false. Если указан недопустимый тип ордера, функция вернет false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

 
#define   VOLUME     1.0   // объем ордера
#define   DEVIATION  100   // количество пунктов до цены закрытия
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string currency_profit=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);   // валюта прибыли
   double close_price=ChartPriceOnDropped(); // ценой закрытия будет ценовая координата, соответствующая точке, в которой брошен мышкой данный скрипт
 
//---
   for(int i=0; i<=ORDER_TYPE_SELL; i++)
     {
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)i;                 // тип ордера: 0 - Buy, 1 - Sell
      double open_price=PriceOpenByOrderType(_Symbol, order_type);   // цена открытия: для Buy - Ask, для Sell - Bid
     
      //--- если цена открытия не получена - продолжаем цикл
      if(open_price==0)
         continue;
      
      //--- если цена закрытия нулевая (скрипт запущен не перетаскиванием на график) - рассчитываем цену
      if(close_price==0)
         close_price=(order_type==ORDER_TYPE_BUY ? open_price + DEVIATION * _Point : open_price - DEVIATION * _Point);
      
      //--- вычислим приблизительный размер прибыли для текущего счета и рыночного окружения на основании переданных параметров
      double profit=0;
      ResetLastError();
      if(!OrderCalcProfit(order_type, _Symbol, VOLUME, open_price, close_price, profit))
        {
         Print("OrderCalcProfit() failed. Error ", GetLastError());
         continue;
        }
      
      //--- полученное значение прибыли распечатаем в журнале
      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);
      
     }
   /*
   результат:
   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
   */
  }
//+------------------------------------------------------------------+
//| Возвращает цену открытия по типу ордера                          |
//+------------------------------------------------------------------+
double PriceOpenByOrderType(const string symbol, const ENUM_ORDER_TYPE order_type)
  {
   MqlTick tick={};
 
//--- получаем последние цены по символу
   if(!SymbolInfoTick(symbol, tick))
     {
      Print("SymbolInfoTick() failed. Error ", GetLastError());
      return 0;
     }
     
//--- в зависимости от типа ордера возвращаем цену
   switch(order_type)
     {
      case ORDER_TYPE_BUY              :  return(tick.ask);
      case ORDER_TYPE_SELL             :  return(tick.bid);
      default                          :  return(0);
     }
  }
//+------------------------------------------------------------------+
//| Возвращает описание типа ордера                                  |
//+------------------------------------------------------------------+
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");
     }
  }

Смотри также

OrderSend(), Свойства ордеров, Типы торговых операций