Эксперт не закрывает позиции

 

Здравствуйте, знатоки.

Все бьюсь почему мой эксперт не закрывает позиции? Открывает одну по первому сигналу и все!

extern double Lots = 0.1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double P_up0,P_down0,P_up1,P_down1;
   double P_u,P_d;
   int i, cnt, ticket, total;
   bool flag=true;
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
     // Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
  P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
  P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
  P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
  P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
  P_u=iCustom(0,0,"5",7,0.10,1,1,1000,2,1);
  P_d=iCustom(0,0,"5",7,0.10,1,1,1000,3,1);
 
//задали все данные 
 
   // Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
   total=OrdersTotal();
// Условие открытие позиции BUY
   if(P_u>P_d)
   {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(P_u<P_d)
   {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 
индикатор 5
Файлы:
5.mq4  5 kb
 
индикатор ценовой канал
Файлы:
 
Господа знатоки, ответьте пожалуйста!!!
 
Kostay писал (а) >>
Господа знатоки, ответьте пожалуйста!!!

Потому что доходит до этих мест и заканчивает работу

if(P_u>P_d)
   {
      if((total>0) || (!flag)) return(0);
     ...
   }
      
// Условие открытие позиции SELL
   if(P_u<P_d)
   {
      if((total>0) || (!flag)) return(0);
      ...
    }
 

Замените

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

на

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
И ещё перед этим циклом я бы обновил содержимое переменной cnt.
 
ТОгда почему этот эксперт "EURUSD" работает. отличие от первого только в том что там другой индикатор. все остальное также!!!!!????
extern double Lots = 0.1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double P_up0,P_down0,P_up1,P_down1;
   double Macd_m,Macd_s,Pivot1,Macd_m2,Macd_s2,ao3,ao2,ao1,st_m1,st_s1;
   int i, cnt, ticket, total;
   bool flag=true;
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
     // Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
  P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
  P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
  P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
  P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
  Macd_m=iMACD(0,0,5,34,5,PRICE_CLOSE,MODE_MAIN,1);
  Macd_s=iMACD(0,0,5,34,5,PRICE_CLOSE,MODE_SIGNAL,1);
  Macd_m2=iMACD(0,0,5,34,5,PRICE_CLOSE,MODE_MAIN,2);
  Macd_s2=iMACD(0,0,5,34,5,PRICE_CLOSE,MODE_SIGNAL,2);
  ao1=iAO(0,0,1);
  ao2=iAO(0,0,2);
  ao3=iAO(0,0,3);
  st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
  st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
  Pivot1=iCustom(0,0,"Пивот по сессиям",30,2,12,9,6,"00:15","06:15",
     "13:00",0,250,0,true,White,0,1);
 
//задали все данные 
 
   // Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
   total=OrdersTotal();
// Условие открытие позиции BUY
   if(Macd_m2>Macd_s2&&Macd_m>Macd_s&&Macd_m2<0&&ao2<0&&st_m1>st_s1&&st_m1<40)
   {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(Macd_m2>Macd_s2&&Macd_m<Macd_s&&Macd_m2>0&&ao2>0&&st_m1<st_s1&&st_m1>60)
   {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
Причина обращения: