Открытие новых позиций если предыдущие в безубытке

 

Всем привет

Хотел написать функцию чтобы делала так:

Проверяет все открытые позиции и открывает последующие по сигналу только если все предыдущие находятся в безубытке. 

Написал с помощью....вот это:

bool PlusDeal()
     {
      for(int i=PositionsTotal()-1;i>=0;i--)
         if(Position.SelectByIndex(i))
            if(Position.Symbol()==Symbol() && Position.Magic()==Magic)
              {
               //if(POSITION_TIME!=0)return(true);
               if(Position.PositionType()==POSITION_TYPE_BUY)
                 {
                  if(Position.StopLoss()>=Position.PriceOpen())return(true);
                  else return(false);
                 }
               if(Position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(Position.StopLoss()<=Position.PriceOpen())return(true);
                  else return(false);
                 }
              }

      return(false);
     }

а затем добавил в условия для открытия вот так:

if(Signal==ORDER_TYPE_BUY)
        {
         if((total_buy<MaxOrders) && (total_sell==0))
           {
            if(TimeCurrent()>=clock)
              {
               if(A && B && C && D)
                 {
                  if(PlusDeal()==true)
                    {
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(Stop_time*60*1000);
                    }
                 }
              }
           }
        }


 не работает, может вечер и мозг не варит.

Что не так подскажите... 

 

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

Вопросы от начинающих

Vladimir Karputov, 2017.01.16 21:36

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PlusDeal()
  {
   bool res=true;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(Position.SelectByIndex(i))
         if(Position.Symbol()==Symbol() && Position.Magic()==Magic)
           {
            if(Position.PositionType()==POSITION_TYPE_BUY)
               if(Position.StopLoss()<Position.PriceOpen())
                  return(false);

            if(Position.PositionType()==POSITION_TYPE_SELL)
               if(Position.StopLoss()>Position.PriceOpen())
                  return(false);
           }

   return(res);
  }

asd

if(Signal==ORDER_TYPE_BUY)
        {
         if((total_buy<MaxOrders) && (total_sell==0))
           {
            if(TimeCurrent()>=clock)
              {
               if(A && B && C && D)
                 {
                  if(PlusDeal())
                    {
                     trade.Buy(Volume,_Symbol,0,0,0,CommentOrder);
                     Sleep(Stop_time*60*1000);
                    }
                 }
              }
           }
        }


Вот так попробуйте.


Добавлено: и картинка (распечатать и положить под стекло рабочего стола :) )

Модификация позиций Sell и Buy
 

Добавлено: а зачем Sleep()? Это не есть хорошо. 


 
Может имеет смысл поиск отдельно смотреть по Buy и по Sell?
 
bool PlusDeal()
     {
      for(int i=PositionsTotal()-1;i>=0;i--)
         if(Position.SelectByIndex(i))
            if(Position.Symbol()==Symbol() && Position.Magic()==Magic)
              {
               //if(POSITION_TIME!=0)return(true);
               if(Position.PositionType()==POSITION_TYPE_BUY)
                 {
                  if(Position.StopLoss()>=Position.PriceOpen())return(true); // true не надо возвращать, вдруг другая позиция не в безубытке
                  else return(false); // возвращать только false, как только наткнулись на позицию не в безубытке
                 }
               if(Position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(Position.StopLoss()<=Position.PriceOpen())return(true);
                  else return(false);
                 }
              }

      return(false); // если попали сюда, значит позиций нет, или они все в безубытке,значит надо вернут true  
     }
Еще не помешает проверять есть ли вообще стоплосс  позиции, если нету, то возвращать false
 
Dmitry Fedoseev:
bool PlusDeal()
     {
      for(int i=PositionsTotal()-1;i>=0;i--)
         if(Position.SelectByIndex(i))
            if(Position.Symbol()==Symbol() && Position.Magic()==Magic)
              {
               //if(POSITION_TIME!=0)return(true);
               if(Position.PositionType()==POSITION_TYPE_BUY)
                 {
                  if(Position.StopLoss()>=Position.PriceOpen())return(true); // true не надо возвращать, вдруг другая позиция не в безубытке
                  else return(false); // возвращать только false, как только наткнулись на позицию не в безубытке
                 }
               if(Position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(Position.StopLoss()<=Position.PriceOpen())return(true);
                  else return(false);
                 }
              }

      return(false); // если попали сюда, значит позиций нет, или они все в безубытке,значит надо вернут true  
     }
Еще не помешает проверять есть ли вообще стоплосс  позиции, если нету, то возвращать false
спасибо понял
 
Vladimir Karputov:
Может имеет смысл поиск отдельно смотреть по Buy и по Sell?
все работает спасибо!
Причина обращения: