Вс. Апр 28th, 2024

//+----------------------------------------------------------------------------+
//|  Ожидаемый профит по ТП
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double ProfitIFTakeInCurrency(string sy="")
  {
   if(sy=="0")
      sy=_Symbol;  // Текущий символ
   int k=PositionsTotal(); // Подсчёт открытых позиций
   long    m=0;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
   double l;                  // Размер контракта в базовой валюте инструмента
   double p;                  // Размер пункта в валюте котировки
   double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
   double v;                  // Размер минимального изменения цены инструмента в валюте депозита
   double s=0;                // Подсчёт стопа в валюте депозита

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(m_position.SelectByIndex(i))
        {
         if(m_position.PositionType() <= 1 && (m_position.Symbol() == sy || sy == "") && m_position.TakeProfit() > 0)
           {
            l=SymbolInfoDouble(m_position.Symbol(),SYMBOL_TRADE_CONTRACT_SIZE);
            m=SymbolInfoInteger(m_position.Symbol(),SYMBOL_TRADE_CALC_MODE);
            p=SymbolInfoDouble(m_position.Symbol(),SYMBOL_POINT);
            t=SymbolInfoDouble(m_position.Symbol(),SYMBOL_TRADE_TICK_SIZE);
            v=SymbolInfoDouble(m_position.Symbol(),SYMBOL_TRADE_TICK_VALUE);

            // Print("m: ",m);
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.TakeProfit() > 0)
                 {
                  //  Print("m_position.Volume(): ",m_position.Volume(),"; m_position.TakeProfit() - m_position.PriceOpen(): ",m_position.TakeProfit() - m_position.PriceOpen(), "; p: ", p);
                  if(m==0)
                     s+= m_position.Volume() * v * ((m_position.TakeProfit() - m_position.PriceOpen())/p);
                  // s +=  (m_position.TakeProfit() - m_position.PriceOpen()) * l * m_position.Volume();
                  // s += (m_position.TakeProfit() - m_position.PriceOpen())/p*v*m_position.Volume(); //Profit:   (close_price - open_price) * Contract_Size*Lots
                  if(m==1)
                     s += (m_position.TakeProfit() - m_position.PriceOpen())/p*v/t/l*m_position.Volume();
                  if(m==2)
                     s += (m_position.TakeProfit() -  m_position.PriceOpen())/p*v*m_position.Volume();
                  s += m_position.Commission() + m_position.Swap();
                 }
              }
            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               if(m==0)
                  s += (m_position.PriceOpen()-m_position.TakeProfit()) / p * v * m_position.Volume();
               if(m==1)
                  s += (m_position.PriceOpen()-m_position.TakeProfit())/p*v/t/l*m_position.Volume();
               if(m==2)
                  s += (m_position.PriceOpen()-m_position.TakeProfit())/p*v*m_position.Volume();
               s += m_position.Commission() + m_position.Swap();
              }
           }
        }
     }
   return(NormalizeDouble(s,2));
  }

Поделись с друзьями:

от drivermql

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.