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=0i<=ORDER_TYPE_SELLi++)
     {
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)i;                 // тип ордера: 0 - Buy, 1 - Sell
      double open_price=PriceOpenByOrderType(_Symbolorder_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_SymbolVOLUMEopen_priceclose_priceprofit))
        {
         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",
                  VOLUMEOrderTypeDescription(order_type), _Symbol_Digitsopen_price_Digitsclose_priceprofitcurrency_profit);
      
     }
   /*
   результат:
   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
   */
  }
//+------------------------------------------------------------------+
//| Возвращает цену открытия по типу ордера                          |
//+------------------------------------------------------------------+
double PriceOpenByOrderType(const string symbolconst ENUM_ORDER_TYPE order_type)
  {
   MqlTick tick={};
 
//--- получаем последние цены по символу
   if(!SymbolInfoTick(symboltick))
     {
      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(), Свойства ордеров, Типы торговых операций