Определение текущего profit при нескольких открытых позициях

 

Есть 2 советника которые могут иметь по 1 открытой позиции одновременно, на одной и той же валютной паре в одном и том же направлении на Buy к примеру, и нужно как-то определять их текущий профит на каждом тике пока позиции открыты. Как я понял это делается при помощи PositionSelect(Symbol()) и PositionGetDouble(POSITION_PROFIT) но в документации к  PositionSelect написано:


"При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом."


Но если я всегда буду получать позицию с наименьшим тикетом то как мне определить

1. К какому из советников тикет этот относится?

2. Как получить данные по второму тикету если всегда возвращается наименьший? 

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out). В...
 
Павел Раввич:

Есть 2 советника которые могут иметь по 1 открытой позиции одновременно, на одной и той же валютной паре в одном и том же направлении на Buy к примеру, и нужно как-то определять их текущий профит на каждом тике пока позиции открыты. Как я понял это делается при помощи PositionSelect(Symbol()) и PositionGetDouble(POSITION_PROFIT) но в документации к  PositionSelect написано:

и

Пытаюсь понять как мне определить в каком из этих 2х режимов работают советники, если установка сделок выглядит примерно так:

И как мне в этих условиях получать информацию о текущем профите каждого конкретного советника?

Совет номер 1: забыть и не использовать методы выбора позиции по символу. То есть бежать как от огня от конструкций вида 

PositionSelect(Symbol()


Всегда работайте перебором всех позиций, где выбор позиции идёт через индекс её в списке.

Пример подсчёта прибыли всех позиций:

//+------------------------------------------------------------------+
//| Profit all positions                                             |
//+------------------------------------------------------------------+
double ProfitAllPositions(void)
  {
   double profit=0.0;

   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
//---
   return(profit);
  }

просто и лаконично.

 
Vladimir Karputov :

Tip number 1: forget and do not use methods for selecting a position by a symbol. That is, to run like fire from constructions like 


Always work by enumerating all positions, where the position is selected through its index in the list.

An example of calculating the profit of all positions:

simple and concise.

Very precise. 

Причина обращения: