SymbolInfoTick или PositionGetDouble(POSITION_PRICE_CURRENT))?

 
При расчёте разницы между ценой открытия позиции и текущей ценой, для получения текущей цены, что нужно выбирать: SymbolInfoTick или PositionGetDouble(POSITION_PRICE_CURRENT))?
 
Alexander Laur:

Вопрос сформулируйте корректно?

Что Вы хотите сделать/получить?

Хочу получить разницу между текущей ценой и ценой позиции. Цена позиции, естественно известна. А вот как лучше получить текущую цену: через SymbolInfoTick или PositionGetDouble(POSITION_PRICE_CURRENT))?
 
Alexander Laur:

В этом случае лучше воспользоваться PositionGetDouble(POSITION_PRICE_CURRENT), т.к. этот запрос Вам выдаст текущую цену (Bid/Ask) с учетом типа позиции (Buy/Sell).

Если для получения текущих цен, Вы будете пользоваться либо SymbolInfoDouble(), либо SymbolInfoTick(), то Вам придется делать проверки соответствия цены (Bid/Ask) типу позиции (Buy/Sell) самостоятельно.

Спасибо. Мне нужно текущую цену для позиции. Значит буду использовать  PositionGetDouble(POSITION_PRICE_CURRENT).
 
Karputov Vladimir:
Спасибо. Мне нужно текущую цену для позиции. Значит буду использовать  PositionGetDouble(POSITION_PRICE_CURRENT).
//+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice( const string aSymbol )
{
  double price_in = 0;
  double volume_in = 0;
  
  if ( PositionSelect( aSymbol ) )
  {
    ulong pos_id = ulong( PositionGetInteger( POSITION_IDENTIFIER ) );
    
    if ( pos_id > 0 )
    {
      if ( HistorySelectByPosition( pos_id ) )
      {
        int deals = HistoryDealsTotal();
      
        for( int i = 0; i < deals; i++ )
        {
          ulong deal_ticket = HistoryDealGetTicket( i );
          ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) );
        
          if ( order_ticket > 0 )
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY( HistoryDealGetInteger( deal_ticket, DEAL_ENTRY ) );
              
            if ( deal_entry == DEAL_ENTRY_IN )
            {
              double price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              double volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_in += price * volume;
              volume_in += volume;  
            }
          }
        }
        if ( volume_in > 0 ) return( NormalizeDouble( price_in / volume_in, _Digits ) );
      }
      else
      {
        Print( "GetPositionPrice: Невозможно получить историю позиции по символу ", aSymbol );
      }
    }
    else
    {
      Print( "GetPositionPrice: Невозможно определить идентификатор позиции по символу ", aSymbol );
    }
  }
  return( 0 );
}
 

Функция, приведённая выше, показывает цену позиции, ТОЛЬКО, если объём позиции не уменьшался.

Если объём позиции уменьшался, то введите еще DEAL_ENTRY_OUT

P/S PositionGetDouble(POSITION_PRICE_CURRENT)

Не показывает истинную (совокупную) цену позиции.