Помогите написал не могу понять где ошибка

 
#property copyright "Copyright © 2007 Daniil"
#property link      "simple_jet@mail.ru"
 
 
extern string rem0="Выбор лота стопа и профита";
extern double TakeProfit   = 30; // оптимально
extern double Lot         = 0.1;  // количество лотов
extern double Step         = 30;  // количество лотов
 
double OpenPrice_buy1, OpenPrice_sell1;
double OpenPrice_buy2, OpenPrice_sell2;
double OpenPrice_buy3, OpenPrice_sell3;
double OpenPrice_buy4, OpenPrice_sell4;
 
int cnt = 0;
int i = 0;
int b1,b2,b3,b4;
int s1,s2,s3,s4;
int c1,c2,c3,c4;
int e1,e2,e3,e4;
 
 
 
 
//                                                    <<<<<  Start  >>>>>    
 
 
 
 
int start()
  {
   
 
   int cnt, ticket, total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<2)
     {
      Print("TakeProfit less than 200");
      return(0);  // check TakeProfit
     }
     
    
 
 //---------------------\\
   total=OrdersTotal();
   for(i=0; i<=total; i++) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lot))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
   
//                                                    <<<<<  Work history  >>>>>           
        
// retrieving info from trade history
  int accTotal=OrdersHistoryTotal();
  for(i=accTotal-1; i>=0; i--)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
       {
  
          if (OrderCloseTime()>0 && OrderType()==OP_BUY && OrderTicket()==b1 && OrderProfit()>0) 
                  {
              OpenPrice_buy1=0;
                  }
          if (OrderCloseTime()>0 && OrderType()==OP_BUY && OrderTicket()==b2 && OrderProfit()>0) 
                  {
              OpenPrice_buy2=0;
                  }
          if (OrderCloseTime()>0 && OrderType()==OP_BUY && OrderTicket()==b3 && OrderProfit()>0) 
                  {
             
                  for(cnt=0; cnt<=OrdersTotal(); cnt++) 
                       { 
                          OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                            
                            if (OrderTicket()==b1 && c1==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_buy1=0;
                               c1=1;
                                }
 
                            if (OrderTicket()==b2 && c2==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_buy2=0;
                               c2=1;
                                }    
                            
 
                       }   
               OpenPrice_buy3=0;
                  }
                  
         if (OrderCloseTime()>0 && OrderType()==OP_SELL && OrderTicket()==b4 && OrderProfit()>0) 
                  {
              
                   for(cnt=0; cnt<=OrdersTotal(); cnt++) 
                       { 
                          OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                            
                            if (OrderTicket()==b1 && c1==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_buy1=0;
                               c1=1;
                                }
 
                            if (OrderTicket()==b2 && c2==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_buy2=0;
                               c2=1;
                                }    
                             if (OrderTicket()==b3 && c3==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_buy3=0;
                               c3=1;
                                }    
                            
 
                       }   
              OpenPrice_buy4=0;
                  }          
                  
//-----                  
 
         if (OrderCloseTime()>0 && OrderType()==OP_SELL && OrderTicket()==s1 && OrderProfit()>0) 
                  {
             OpenPrice_sell1=0;
                  }
         if (OrderCloseTime()>0 && OrderType()==OP_SELL && OrderTicket()==s2 && OrderProfit()>0) 
                  {
             OpenPrice_sell2=0;
                  }
         if (OrderCloseTime()>0 && OrderType()==OP_SELL && OrderTicket()==s3 && OrderProfit()>0) 
                  {
             OpenPrice_sell3=0;
                 for(cnt=0; cnt<=OrdersTotal(); cnt++) 
                       { 
                          OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                            
                            if (OrderTicket()==s1 && e1==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_sell1=0;
                               e1=1;
                                }
 
                            if (OrderTicket()==s2 && e2==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_sell2=0;
                               e2=1; 
                                }    
                            
 
                       }        
  
                
                  }   
        if (OrderCloseTime()>0 && OrderType()==OP_BUY && OrderTicket()==s4 && OrderProfit()>0) 
                  {
             OpenPrice_sell4=0;
                    for(cnt=0; cnt<=OrdersTotal(); cnt++) 
                       { 
                          OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
                            
                            if (OrderTicket()==s1 && e1==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_sell1=0;
                               e1=1;
                                }
 
                            if (OrderTicket()==s2 && e2==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_sell2=0;
                               e2=1; 
                                }    
                                
                            if (OrderTicket()==s3 && e3==0)
                                {
                               OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
                               OpenPrice_sell3=0;
                               e3=1; 
                         
                                }    
 
                            
 
                       }        
             
                  }          
                      
       
       }
     // работа с ордером ...
    }
 
 
        
        
 
//                                                    <<<<<  Buy  >>>>>      
//#1
if(OpenPrice_buy1==0)
 {
                             
       ticket=OrderSend(Symbol(),OP_BUY,0.1,Bid,5,0,Bid+TakeProfit*Point,"priceEX",16384,0,Green);
   
                  
         if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
           OpenPrice_buy1=OrderOpenPrice();
           b1=OrderTicket();
        
     //     Print("Open1=",OpenPrice_buy1); 
              
           }
     
    //   return(0); 
         
        }
        
//#2  
if((OpenPrice_buy1-Bid)>=Step*Point && OpenPrice_buy2==0)
 {
  //  Print("Span",OpenPrice_buy1);                    
       ticket=OrderSend(Symbol(),OP_BUY,0.2,Bid,5,0,Bid+TakeProfit*Point,"priceEX",16384,0,Green);
   
                  
         if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
           OpenPrice_buy2=OrderOpenPrice();
           b2=OrderTicket();
              
           }
     
    //     return(0); 
         
        }
        
//#3 
if((OpenPrice_buy2-Bid)>=Step*Point && OpenPrice_buy3==0 && OpenPrice_buy2!=0)
 {
//    Print("Span",OpenPrice_buy1);                    
       ticket=OrderSend(Symbol(),OP_BUY,0.3,Bid,5,0,Bid+TakeProfit*Point,"priceEX",16384,0,Green);
   
                  
         if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
           OpenPrice_buy3=OrderOpenPrice();
           b3=OrderTicket();
           c1=0;
           c2=0;
              
           }
     
    //     return(0); 
         
        }
        
//#4    
if((OpenPrice_buy3-Bid)>=Step*Point && OpenPrice_buy4==0 && OpenPrice_buy3!=0)
    {  
                                  
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,5,0,Bid-TakeProfit*Point,"priceEX",16384,0,Red);
 
        
         if(ticket>0)
           {                                    
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print ("device");
            OpenPrice_buy4=OrderOpenPrice();
            b4=OrderTicket();
            c3=0;
           
   //   return(0); 
           }
    }
     
 
 
 
 
//                                                    <<<<<  Sell  >>>>>
//#1
if (OpenPrice_sell1==0) 
    {  
                                  
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,Bid-TakeProfit*Point,"priceEX",16384,0,Red);
 
        
         if(ticket>0)
           {                                    
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            
            OpenPrice_sell1=OrderOpenPrice();
            s1=OrderTicket();
           
 //    return(0); 
           }
    }
     
//#2    
if ((Bid-OpenPrice_sell1)>=Step*Point && OpenPrice_sell2==0 && OpenPrice_sell1!=0) 
    {  
                                  
      ticket=OrderSend(Symbol(),OP_SELL,0.2,Bid,5,0,Bid-TakeProfit*Point,"priceEX",16384,0,Red);
 
        
         if(ticket>0)
           {                                    
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            OpenPrice_sell2=OrderOpenPrice();
            s2=OrderTicket();
           
  //      return(0); 
           }
    }
      
//#3    
if ((Bid-OpenPrice_sell2)>=Step*Point && OpenPrice_sell3==0 && OpenPrice_sell2!=0) 
    {  
                                  
      ticket=OrderSend(Symbol(),OP_SELL,0.3,Bid,5,0,Bid-TakeProfit*Point,"priceEX",16384,0,Red);
 
        
         if(ticket>0)
           {                                    
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print ("device");
            OpenPrice_sell3=OrderOpenPrice();
            s3=OrderTicket();
            e1=0;
            e2=0;
           
   //   return(0); 
           }
    }
     
   Print ("OOOOOOOOOOO3333",OpenPrice_sell3); 
//#4 
if ((Bid-OpenPrice_sell3)>=Step*Point && OpenPrice_sell4==0 && OpenPrice_sell3!=0) 
 {
//    Print("Span",OpenPrice_buy1);                    
       ticket=OrderSend(Symbol(),OP_BUY,0.5,Bid,5,0,Bid+TakeProfit*Point,"priceEX",16384,0,Green);
   
                  
         if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
           OpenPrice_sell4=OrderOpenPrice();
           s4=OrderTicket();
           e3=0;
              
           }
     
    //     return(0); 
         
        }
          
     
   
        
     return(0);
    }
 
 
 
 
        
   return(0);
  }
 
Какая ошибка ? Попробовал в тестере, все нормально, эксперт успешно слил депозит.
 

Так все работает но позиции открываются не по нужному мне алгоритму! после первых нескольких сделок чтото сбивается. Естественно он сольет если я говорю что работает не правильно! Тем более дальше надо еще усовершенствовать его!
Мне нужно чтобы он работал по такому алгоритму:
1. открываем две позиции лотом 0.1 buy1 и sell1 тэйк профит 30п.
2. рассмотрим движении цены вверх тогда buy1 закрывается по тэйк профиту и открывается еще buy2 лотом 0.1 одновременно с ним открывается sell2 лотом 0.2
3. если цена идет вниз то sell2 закрываем в точке открытия sell1 и открываем buy2 лотом 0.2
4. если цена идет вверх то закрываем buy2 с профитом 30 и открываем sell3 лотом 0.3 с закрытием в точке открытия sell2 в этом случае закрываем sell1 с убытком
5. если цена идет еще выше то через 30п. вверх от sell3 открываем bay лотом 0.5 с тэйком 30п. и если берем тэйк 30п. то закрываем с ним sell1 sell2 sell3 и все снова начинаем.

ошибка у меня когда открываем лот на buy 0.5 лота после этого все идет как то не так до этого момента т.е. до 5 пункта все вроде работает а вот дальше хоть убей не пойму что ни так! если кто может подскажите пожалуйста.

 
Ошибка может возникать при закрытии ордеров в цикле for. Дело в том что после закрытия ордера значение OrderTotal() уменьшается на единицу, и ещё не обработанный ордер с номером cnt+1 получает номер cnt, и на следующем шаге цикла этот ордер будет пропущен. Варианты решения проблемы:
1. Начинать обрабатывать ордера начиная с OrderTotal()-1 и заканчивая 0.
2. Или после каждого закрытия ордера выполнить оператор continue чтобы передать управление к началу цикла.

for(cnt=0; cnt<=OrdersTotal(); cnt++)
 {
  OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
  if (OrderTicket()==b1 && c1==0)
   {
    OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
    OpenPrice_buy1=0;
    c1=1;
    continue;
   }
  if (OrderTicket()==b2 && c2==0)
   {
    OrderClose(OrderTicket(),OrderLots(),Bid,5,White);
    OpenPrice_buy2=0;
    c2=1;
    continue;
   }
 }

P.S. Как мне кажется, эксперт будет в плюсе пока нет тренда... Но если попадется тренд убытки будут больше возможной прибыли. ..
 
Sepulca 07.06.2007 12:36
Спасибо, буду пробывать.