Подсчёт Профита/Убытка на открытых позициях.

 
Всем доброго времени суток. Я начал изучать MQL5 где-то полторы недели назад, но до сих пор у меня возникают некоторые трудности.
Суть моего вопроса в том что я написал функцию, которая подсчитывает прибыть по всем открытым BUY позициям на счёте и моя функция не работает. 
Так же я нашёл аналогичную функцию в интернете, немного подправил и она работает.
Хотелось бы чтобы мне в кради объяснили почему так. Просто пытаюсь разобраться в основах, чтобы подобных трудностей более не возникало.



Вот моя функция (работает некорректно) почему-то считает только одну BUY позицию и не обращает внимание на другие BUY поз. так же вообще игнорирует BUY поз. если есть хоть одна SELL поз.
double Current_Profit(int magic)  
 {                                      
   double Profit = 0;
   double Swap = 0;
   double Volume = 0;
   double Current_Profit = 0;

   for(int i=0; i<PositionsTotal(); i++)
    {
          if(PositionGetInteger(POSITION_MAGIC) == magic &&
             PositionGetInteger(POSITION_TYPE) == pos_type)
             {
               Profit += PositionGetDouble(POSITION_PROFIT);
               Swap += PositionGetDouble(POSITION_SWAP);
               Volume += PositionGetDouble(POSITION_VOLUME);
              }
      Current_Profit = Profit + Swap;
   }
return Current_Profit;
}


Вот другая функция, которую я нашёл в интернетах (она работает корректно)

double Current_Profit(int magic)          
  {                                       
   double Profit = 0;
   double Swap = 0;
   double Volume = 0;
   double Current_Profit = 0;

   for(int i=0; i<PositionsTotal(); i++)
     {
      ulong position_ticket = PositionGetTicket(i);

      if(PositionSelectByTicket(position_ticket))
        {
         if(PositionGetInteger(POSITION_MAGIC) == magic &&
            PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) 
           {
             Profit += PositionGetDouble(POSITION_PROFIT);
             Swap += PositionGetDouble(POSITION_SWAP);
             Volume += PositionGetDouble(POSITION_VOLUME);
           }
         Current_Profit = Profit + Swap;
        }
     }
   return Current_Profit;
  }
Почему так?? Мб кто-то может доступным языком сказать что я сделал не так когда писал свою функцию (первый вариант)?


 
Vadzim Bandarevich:
Всем доброго времени суток. Я начал изучать MQL5 где-то полторы недели назад, но до сих пор у меня возникают некоторые трудности.
Суть моего вопроса в том что я написал функцию, которая подсчитывает прибыть по всем открытым BUY позициям на счёте и моя функция не работает. 
Так же я нашёл аналогичную функцию в интернете, немного подправил и она работает.
Хотелось бы чтобы мне в кради объяснили почему так. Просто пытаюсь разобраться в основах, чтобы подобных трудностей более не возникало.



Вот моя функция (работает некорректно) почему-то считает только одну BUY позицию и не обращает внимание на другие BUY поз. так же вообще игнорирует BUY поз. если есть хоть одна SELL поз.


Вот другая функция, которую я нашёл в интернетах (она работает корректно)

Почему так?? Мб кто-то может доступным языком сказать что я сделал не так когда писал свою функцию (первый вариант)?


Почитайте в документации что такое функция PositionGetTicket() и обратите внимание, что в вашем коде её нет…

 
Vadzim Bandarevich:
Почему так?? Мб кто-то может доступным языком сказать что я сделал не так когда писал свою функцию (первый вариант)?

Здравствуйте. Вам Алексей Викторов уже дал подсказку на счёт функции PositionGetTicket(). Если открыть Справочник по MQL5, то там найдете одно из предназначений этой функции (выделенное мною жёлтым цветом):

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию 
для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

Если простыми словами, то Вы просто-напросто не выбрали ни одну позицию из списка открытых позиций, чтобы получить от неё нужные Вам значения при помощи функции PositionGetDouble().

Надеюсь, что всё понятно расписал.

С уважением, Владимир.

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