Иногда не открываются ордра

 
      int SL=(int)((Bid-Low[1])/Point+spred*3+punkty);
      int TP1=SL;
      CheckForOpen_s(Magic,risk,SL,TP1,comm1);

      SendNotification("Покупка на "+Symbol());

//CАМА ФУНКЦИЯ !!!! Которая, то открывает, то нет

//+------------------------------------------------------------+

//+---------------------------Функция ОТКРЫТИЯ покупок---------+

//+------------------------------------------------------------+

void CheckForOpen_b(int mag,double risk,int sl,int tp,string kom)

  {

   double teikpr=0,stop=0;

   if(tp!=0) teikpr=NormalizeDouble(Ask+tp*Point,Digits);

   if(sl!=0) stop=NormalizeDouble(Ask-sl  *Point,Digits);

   int a=0;

   int sch=0;

   while(a==0)

     {

      if(sch>10)Alert("CheckForOpen_b"," ","Счетчик более 10 раз");

      a=OrderSend(Symbol(),OP_BUY,Lot_Calculate(Symbol(),risk,sl),NormalizeDouble(Ask,Digits),

                  slippage,stop,teikpr,kom,mag);

      if(a==0)Sleep(3000);

      RefreshRates();

      sch++;

     }

  }

//+------------------------------------------------------------------+

Дело в том, что в функцию заходит и если даже не открылся ордер, то сразу выходит не обращая внимание на while!!! Фантастика бляха муха. Может я туплю? Ребят, подскажите.

 
Artem Likhachev:
              

Из справки:

OrderSend

Возвращаемое значение

Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

У Вас перед входом в цикл а=0 , в цикле проверка на а==0. Т.е. по факту выход из функции будет в любом случае, открылся ордер или пришла ошибка(Вы её кстати никак не отслеживаете). 

поменяйте на

int a=-1;

int sch=0;

while(a==-1)
 
Sergey Kolemanov:

Из справки:

У Вас перед входом в цикл а=0 , в цикле проверка на а==0. Т.е. по факту выход из функции будет в любом случае, открылся ордер или пришла ошибка(Вы её кстати никак не отслеживаете). 

поменяйте на

Спасибо, тогда проверю так.

   while(a==0)

     {

      if(sch>10){Alert("CheckForOpen_b"," ","Счетчик более 10 раз, выходим.");return;}

      a=OrderSend(Symbol(),OP_BUY,Lot_Calculate(Symbol(),risk,sl),NormalizeDouble(Ask,Digits),

                  slippage,stop,teikpr,kom,mag);

      if(a==-1){sch++;Alert("ОШИБКА НОМЕР," "sch"," ","Symbol()"," ","Пробую исчо");}

      if(a==0 || a==-1)Sleep(3000);

      a=0;

      RefreshRates();

     }

  }

 
Sergey Kolemanov:

Из справки:

У Вас перед входом в цикл а=0 , в цикле проверка на а==0. Т.е. по факту выход из функции будет в любом случае, открылся ордер или пришла ошибка(Вы её кстати никак не отслеживаете). 

поменяйте на

Да, вы правы, чего то голова уже не варит. Проще как вы сказали поменять на -1. А я уже велосипед изобретаю)

 
Artem Likhachev:

Спасибо, тогда проверю так.

   while(a==0)

     {

      if(sch>10)Alert("CheckForOpen_b"," ","Счетчик более 10 раз");

      a=OrderSend(Symbol(),OP_BUY,Lot_Calculate(Symbol(),risk,sl),NormalizeDouble(Ask,Digits),

                  slippage,stop,teikpr,kom,mag);

      if(a==-1){sch++;Alert("ОШИБКА НОМЕР," "sch"," ","Symbol()"," ","Пробую исчо");

      if(a==0 || a==-1)Sleep(3000);

      RefreshRates();

     }

  }

int a=-1;
int sch=0;
while(a==-1)
{
   if(sch>10)Alert("CheckForOpen_b"," ","Счетчик более 10 раз");
   a=OrderSend(Symbol(),OP_BUY,Lot_Calculate(Symbol(),risk,sl),NormalizeDouble(Ask,Digits),slippage,stop,teikpr,kom,mag);
   if(a==-1)
   {
      Sleep(3000);
      RefreshRates();
      sch++;
   }
}
 
Sergey Kolemanov:

Да, вы правы!) Я уже загоняюсь. Изобретаю велосипед так сказать))