Помощь: Почему советник не закрывает сделку - страница 4

 

Вы столкнетесь с проблемой, что вам никто не ответит, если вы не используете кнопку SRC для публикации вашего кода :D

 
crossy:

Здравствуйте, друзья,


OrderT - это номер билета заказа,
.




Моя ПРОБЛЕМА в следующем: Иногда советник закрывает сделку очень хорошо, но иногда советник закрывает ордер, но продолжает искать тикет для его закрытия, хотя он уже был закрыт.

(Я получаю ошибку: "Неизвестный номер тикета...").

Я думаю, что у меня логическая ошибка.

Спасибо за помощь.

Y

Это очень, очень просто....

Просто ответьте на этот простой вопрос, и вы получите ответ. ...

Вы передаете номер БИЛЕТА в функцию, чтобы билет мог быть закрыт... ...зачем вы затем перебираете ВСЕ остальные ордера? Вы уже ЗНАЕТЕ номер билета, который нужно закрыть... зачем зацикливаться?

 
...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      for ( int vvv = OrdersTotal()-1; vvv >= 0; vvv-- )
      {  
         if ( OrderSelect(vvv, SELECT_BY_POS, MODE_TRADES) )
         {   
            Check = false;
            if ( TREN == "LONG" )
              PRC = MarketInfo(SYMB,MODE_BID);
            else
            if ( TREN == "SHORT" )
               PRC = MarketInfo(SYMB,MODE_ASK);
         
            Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
            if ( Check )
               break;
         }      
      } 
   }
   return;
}
//-----------------------------------------------+

Надеюсь, теперь все стало более понятно.

Спасибо

 
RaptorUK:

Это очень, очень просто....

Просто ответьте на этот простой вопрос, и вы получите ответ...

Вы передаете номер БИЛЕТА в функцию, чтобы билет мог быть закрыт... ...зачем вы затем перебираете ВСЕ остальные заказы? Вы уже ЗНАЕТЕ номер билета, который нужно закрыть... зачем зацикливаться?


Спасибо, Raptor, я сделал это один раз без ORDERSELECT, но у меня была та же ошибка.

Y.

 
Я уже дал подсказку на самой первой странице. https://www.mql5.com/en/forum/139543
 

Спасибо onewithzachy, я сделал так, как вы посоветовали, и получил ошибку

сообщение о том, что не найден БИЛЕТ...

 
crossy:

Здравствуйте, друзья,


OrderT - это номер билета заказа,
.




Моя ПРОБЛЕМА в следующем: Иногда советник закрывает сделку очень хорошо, но иногда советник закрывает ордер, но продолжает искать тикет для его закрытия, хотя он уже был закрыт.

(Я получаю ошибку: "Неизвестный номер тикета...").

Я думаю, что у меня логическая ошибка.

Спасибо за помощь.

Y

Это очень, очень просто....

Просто ответьте на этот простой вопрос, и вы получите ответ. ...

Вы передаете номер БИЛЕТА в функцию, чтобы билет мог быть закрыт... ...зачем вы затем перебираете ВСЕ остальные ордера? Вы уже ЗНАЕТЕ номер билета, который нужно закрыть... зачем зацикливаться?

 
onewithzachy:
Я уже дал подсказку на самой первой странице. https://www.mql5.com/en/forum/139543
И я тоже дал ответ... https://www. mql5.com/en/forum/139543
 
crossy:


Спасибо, Raptor, я сделал это один раз без ORDERSELECT, но у меня была та же ошибка.

Вы не читаете то, что я написал и спросил... зачем цикл? какова функция цикла в этой ситуации?
 
...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+

O.K. Вот модифицированная версия, в которой я получил ту же ошибку.

Y.

Причина обращения: