Проблема определения позиции с максимальный убытком. - страница 2

 

обстоит ситуация так, у меня код более 2000 строк, все работает корректно до этого момента: 

for(int j=PositionsTotal()-1; j>=0; j--)
      if(m_position.SelectByIndex(j))
      if(m_position.PositionType() == POSITION_TYPE_BUY)
        {
         ulong tick = m_position.Ticket();
         if ((m_position.Profit()-(m_position.Volume()*2))+Profit_S_pos()>0 && (m_position.Profit()-m_position.Volume()*2)<0 
         && Profit_S()>0 && tick==max_vol_b()) 

если я убираю из условия 

tick==max_vol_b()

, то все работает , но без данного условия работает некорректо. а как только я добавляю это условие, то ничего не работает)))

 
если я убираю это условие, советник всегда закрывает позицию с наименьшим убытком, а мне нужно чтобы закрывал с наибольшим убытком
 
надеюсь на вашу помощь, потому что когда советник работает правильно, приносит хорошую прибыль, но потом в моменте перестает закрывать нужные позиции. Я пытался найти нужную позицию по прибыли, по цене открытия, про тикету и всегда разный результат. И именно в условии 
tick==max_vol_b()
без этого условия всегда выдает один результат
 
Anton Novokhatskii #:

обстоит ситуация так, у меня код более 2000 строк,

С таким программированием можно и больше написать…

Скажите, зачем вам две одинаковые функции

double Profit_S_pos()
  {
   double rez3 = 0;
   for(int j=PositionsTotal()-1; j>=0; j--)
      if(m_position.SelectByIndex(j))
      if (m_position.PositionType()==POSITION_TYPE_SELL)
      if (m_position.Profit()-(m_position.Volume()*2)>0)
        {         
            rez3=rez3+m_position.Profit()-(m_position.Volume()*2);
        }
    
   return(NormalizeDouble(rez3,2));
  }
  
double Profit_B_pos()
  {
   double rez2 = 0;
   for(int j=PositionsTotal()-1; j>=0; j--)
      if(m_position.SelectByIndex(j))
      if (m_position.PositionType()==POSITION_TYPE_BUY)
      if (m_position.Profit()-(m_position.Volume()*2)>0)
        {       
            rez2=rez2+m_position.Profit()-(m_position.Volume()*2);
        }
   return(NormalizeDouble(rez2,2));
  }

только потому, что вы не знаете как получить из одного цикла два значения? Ну почитайте документацию.

void Profit__pos(double & rezB, double & rezS)
  {
   
   for(int j=PositionsTotal()-1; j>=0; j--)
    {
     if(m_position.SelectByIndex(j))
      {
       if (m_position.PositionType()==POSITION_TYPE_SELL)
       if (m_position.Profit()-(m_position.Volume()*2)>0)
        {         
            rezS += m_position.Profit()-(m_position.Volume()*2);
        }

       if (m_position.PositionType()==POSITION_TYPE_BUY)
       if (m_position.Profit()-(m_position.Volume()*2)>0)
        {       
            rezB += m_position.Profit()-(m_position.Volume()*2);
        }
      }
     }
  }

Из скрипта или советника вызываем функцию и получаем два значения…

double B, S;
Profit__pos(B, S);
Comment(B, "\n", S);
Правда я совсем не понимаю зачем из профита вычитать два объёма позиции, ну это ваши заморочки…
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Проблема определения позиции с максимальный убытком.

Anton Novokhatskii, 2023.10.15 20:19

         if ((m_position.Profit()-(m_position.Volume()*2))+Profit_S_pos()>0 && (m_position.Profit()-m_position.Volume()*2)<0 
         && Profit_S()>0 && tick==max_vol_b()) 

Комиссию так не посчитать.

 
Комиссия берется при открытии и после закрытия позиции, я кроме как m_position.Comission() не знаю как проверить комиссию, тк до этого работал на счёте без комиссий, а эта функция показывает по нулям, поэтому вручную вычитаю ее))) По поводу 2 значений из 1 функции, сейчас попробую)
 
fxsaber #:

Комиссию так не посчитать.

почему не посчитать? комиссия фиксированная - 200% от объема позиции, те если позиция 0.1, то комиссия 0.2

 
Anton Novokhatskii #:

почему не посчитать? комиссия фиксированная - 200% от объема позиции, те если позиция 0.1, то комиссия 0.2

Если всегда совпадает - хорошо.

 
fxsaber #:

Если всегда совпадает - хорошо.

да, она фиксированная - ни больше ни меньше)

 
огромное спасибо всем за помощь) Алексей, совет с 2 переменными в 1 функции помог) все заработало
Причина обращения: