Почему не правильно определяется профитность позиции?

 
Столкнулся с некоторым парадоксом. В терминале вижу прибыльную позицию, а советник выдает что позиция убыточная.
Как такое может быть и почему? Может я не правильно что то определяю?
bool CheckProfit()
{
  if(PositionSelect(_Symbol))
  if(PositionGetDouble(POSITION_PROFIT)<0) return(false);
  return(true);
}
 
Gennady Mazur:
Столкнулся с некоторым парадоксом. В терминале вижу прибыльную позицию, а советник выдает что позиция убыточная.
Как такое может быть и почему? Может я не правильно что то определяю?


Потому что программист из тебя, как из меня папа римский.

1. Когда пишешь if, не пиши результат в ту же строку, это не по госту.
2. У тебя нету else, из-за этого всегда возвращается true.

Правильно так:

bool CheckProfitKakNado()
{
   if(PositionSelect(_Symbol))
      if(PositionGetDouble(POSITION_PROFIT)<0)
         return (false);
      else
         return(true);
}
 

или вот такой вариант

  HistorySelect(TimeforCoefVolum,TimeCurrent());
  uint     total=HistoryDealsTotal(); 
  ulong    ticket=0; 
  int profit=0;
  for(uint i=0;i<total;i++) 
  { 
    if((ticket=HistoryDealGetTicket(i))>0) 
    { 
      if(_Symbol==HistoryDealGetString(ticket,DEAL_SYMBOL))
      {
        if(HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
          if(HistoryDealGetDouble(ticket,DEAL_PROFIT)>0) profit++;
        }
      }
    }
  } 
 
Denis Glaz:


Потому что программист из тебя, как из меня папа римский.

1. Когда пишешь if, не пиши результат в ту же строку, это не по госту.
2. У тебя нету else, из-за этого всегда возвращается true.

Правильно так:


Я же написал...советник при прибыльной позе выдает что она убыточная.... а не наоборот
поэтому и Ваш код и мой....выдаст одно и то же....
тем более у меня код немного посложнее ... это только основная идея
 
Denis Glaz:


Потому что программист из тебя, как из меня папа римский.

1. Когда пишешь if, не пиши результат в ту же строку, это не по госту.
2. У тебя нету else, из-за этого всегда возвращается true.

Правильно так:


да и какой гост? у каждого своя манера написания кода, и тем более как для меня, мне так понятнее...
 
во втором коде произвожу подсчет положительных закрытий позиций на истории за определенный промежуток времени...
тоже не соответствует действительности...почему?
смотрю сам по истории у меня 9 позиций всего из них 7 прибыльных, а выдает что 5 прибыльных...т.е. почемуто сразу после закрытия позиции не учитывает последние
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Немного переделал функцию....посмотрю что и как...
  if(PositionSelect(_Symbol))
  PositionProfit=PositionGetDouble(POSITION_PROFIT);
  .......
// Далее в другом модуле
  if(PositionProfit<0) PositionLoss=true;
  else PositionLoss=false;
Может таким образом более четко будет определяться.
 
Gennady Mazur:
Столкнулся с некоторым парадоксом. В терминале вижу прибыльную позицию, а советник выдает что позиция убыточная.
Как такое может быть и почему? Может я не правильно что то определяю?


https://www.mql5.com/ru/forum/67298/page3#comment_2109451

Добавлено

Перед вызовом этой функции, нужно сделать PositionSelect()

Если позиция BUY, то profit = symlol_last - pos_price, 

если SELL, то profit = pos_price - symlol_last

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • 2015.12.08
  • www.mql5.com
Установка отложенного ордера командой OrderSend().
 
При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.
Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
Торговые функции / PositionSelect - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:

Он про netting спрашивает.
 
prostotrader:
Он про netting спрашивает.
Сомневаюсь. Маловероятно, но, возможно, это сможет помочь с историей
// if(HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)

плюс проверил бы корректность работы HistorySelect. В тестере она, например, не работает, как надо.