Советник иногда не хочет ставить сразу 2 ордера

 

Пытаюсь сделать советник который будет в определенное время смотреть дневной минимум и максимум и ставить ордера на пробитие этих пиков.

Вроде как что то состряпал, но по скольку я не программер, все делаю методом тыка, и некоторые моменты просто не осилить, поэтому работает с ошибочками.

Во первых, почему то в тестере неправильно определяются дневные мин и макс, хотя когда запустил на демо на тест там определил правильно.

И дальше возникает ошибка 130 с выставлением одного из ордеров, иногда и оба встают. Это все происходит при тестировании на 5 мин.

А если тестировать на M30 или H1 там вроде как оба ордера встают.

Подскажите пожалуйста в чем могут быть проблемы?

//+------------------------------------------------------------------+
//|                                                        Hours.mq4 |
//|                                          Copyright © 2006        |
//|                                                                  |
//+------------------------------------------------------------------+
 
extern double TakeProfit = 20;
extern double Lots = 0.1;
extern int    G=19;             // количество баров ожидания закрытия позиции по открытым ордерам
extern double Stop = 20;        // количество пипсов для стопа
extern int       H=60;// количество баров для снятия отложенных ордеров
extern int       MagicNumber=2000; // основная часть MagicNumber эксперта
 
 
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double  MaxPriceToday ,   LowPriceToday;
 
   int cnt, ticket, total, ticket2, i,ExpertMagicNumber;
 
    ExpertMagicNumber=MagicNumber+Period();
   if(Bars<10)
     {
      Print("bars less than 10");
      return(0);  
     }
   if(TakeProfit<5)
     {
      Print("TakeProfit less than 5");
      return(0);  // check TakeProfit
     }
// to simplify the coding and speed up access
// data are put into internal variables
   MaxPriceToday = iHigh(Symbol(), PERIOD_D1, 0);
   LowPriceToday = iLow(Symbol(), PERIOD_D1, 0);
 
   total=OrdersTotal();
 
   if(total<1) 
     {
      // no opened orders identified
           
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      if ((Hour()==8) && (Minute()<=10))
      {
      
      // check for long position (BUY) possibility
      Print(MaxPriceToday," : ",LowPriceToday);  
      Sleep(600);
      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,MaxPriceToday+5*Point,3,Bid-Stop*Point,Ask+TakeProfit*Point,"Hight",ExpertMagicNumber,CurTime()+H*Period()*60,Blue);
      if(ticket>0)
            {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
         else Print("Error opening BUY order : ",GetLastError()); 
       Sleep(600);  
      ticket2=OrderSend(Symbol(),OP_SELLSTOP,Lots,LowPriceToday-5*Point,3,Bid+Stop*Point,Bid-TakeProfit*Point,"Low",ExpertMagicNumber,CurTime()+H*Period()*60,Red); 
        if(ticket2>0)
            {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice());
            }
         else Print("Error opening SELL order : ",GetLastError()); 
                 
      // check for short position (SELL) possibility
      
       
       return(0);
      }
   
   return(0);
   }  
      
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
 
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if ((OrderMagicNumber()==ExpertMagicNumber)&&(Symbol()==OrderSymbol()))
      {
      if(OrderType()<=OP_SELL)   // check for opened position 
           // check for symbol
        {
         for(i=0;i<OrdersTotal();i++)
          {
          OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
          if(OrderType()>OP_SELL &&   // check for opened position 
             OrderSymbol()==Symbol())  // check for symbol
            {
            OrderDelete(OrderTicket());
            Sleep(60);
            }
          }
        }
      }     
    }
 
   
   return(0);
  }
// the end.
 
1. В первой сделке не учитывается спред (графики то бидовые, а покупка идет по аску) при выставлении BUYSTOP
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,MaxPriceToday+5*Point,3,
                 Bid-Stop*Point,Ask+TakeProfit*Point,"Hight",ExpertMagicNumber,CurTime()+H*Period()*60,Blue);
по идее должно быть MaxPriceToday+спред+5*Point , если ордер пытаетесь ставить на самой вершине дня, то может быть отказ

2. Странный стоплосс. Открываемся выше хая дня, а вот стоплосс ставим от текущего уровня Bid? Тоже самое касается аска. Странная логика. Да еще и велика вероятность отказа в операции из-за того, что Take Profit от аска будет ошибочный и не дотягивает до цены открытия. Поэтому и код ошибки 130 (Invalid Stops). Take Profit должен быть типа: MaxPriceToday+TakeProfit*Point

3. Тоже самое касается и второго ордера.

Дальше анализировать не имеет смысла - нужно исправить то что есть.
 
Спасибо Renat за помошь, как раз не хватало взгляда со стороны. У меня видать уже глаза совсем ничо не видят, ошибки конечно простые, все исправил и работает отлично :) Еще попрактикуюсь и надеюсь не буду глупые вопросы задавать
Причина обращения: