Нужна помощь с проверкой ордера.

 

Доброго времени суток, уважаемые!

Есть вопрос. ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит. Выяснять, что пошло не так у меня нет никакого желания, просто хочу заставить его закрыть позицию, если она оказалась с ТП = 0.

Подскажите, как это правильно отписать? Ибо код не мой, а сам я не программист, но весь тест робота смазывает этот досадный баг...

 
Lexx_Luthor:

Доброго времени суток, уважаемые!

Есть вопрос. ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит. Выяснять, что пошло не так у меня нет никакого желания, просто хочу заставить его закрыть позицию, если она оказалась с ТП = 0.

Подскажите, как это правильно отписать? Ибо код не мой, а сам я не программист, но весь тест робота смазывает этот досадный баг...


  То, что Вы просите отписать  - вопрос не решит... принесет убытки: хотя бы на открытии позы и тут же закрытии и т.д. Необходимо нормально написать функцию открытия 

ордеров с учетом стопов и тейков... Уточните разрешает ли Ваш брокер выставлять эти ордера при открытии позиции. Конкретнее формулируйте вопрос и подробнее (код) - 

здесь телепатов нет... 

 
Lexx_Luthor:

Доброго времени суток, уважаемые!

Есть вопрос. ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит. Выяснять, что пошло не так у меня нет никакого желания, просто хочу заставить его закрыть позицию, если она оказалась с ТП = 0.

Подскажите, как это правильно отписать? Ибо код не мой, а сам я не программист, но весь тест робота смазывает этот досадный баг...


 Ф-ия открытия ордеров с вызовами из ф-ии старт эксперта, например:


// Вызов ф-ии открытия ордеров из ф-ии stаrt эксперта
if  (здесь условия покупки) 
      
   {
      WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "старт", MagicNumber);
    }
   
   if (продажи) 
   {
      WmOrderSend(Symbol(), OP_SELL, Lots_New, Bid, 0, 0, "старт", MagicNumber);
   }
   
   return(0);    //  ВЫХОД ИЗ СТАРТ
}



//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+

void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0)
{
   color clr;
   datetime opentime;
   int ticket;
   int error;
  
   comment = WindowExpertName() + " " + GetNameTF(Period()) + " " + comment;
   int msl = MarketInfo(symbol, MODE_STOPLEVEL);
   clr = CLR_NONE;
   if (cmd == OP_BUY)
   {
      clr = ColorBuy;
   }
   else if (cmd == OP_SELL)
   {
      clr = ColorSell;
   }
   
   if ((expiration > 0) && (expiration < TimeCurrent())) 
   {
      expiration = 0;
   }
  
   for (int try = 1; try <= NumberOfTry; try++)
   {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped()))
      {
         break;
      }
   
      while (!IsTradeAllowed()) 
      {
         Sleep(5000);
      }
    
      RefreshRates();
      opentime = TimeCurrent();
      Print ("Lot_New в ф-ии открытия = ", price);
      ticket = OrderSend(symbol, cmd, volume, price, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr);
      if (ticket > 0)
      {
         if (UseSound) 
         {
            PlaySound("ok.wav"); 
            break;
         }
      } 
      else
      {
         error = GetLastError();
         if (error == ERR_TRADE_TIMEOUT)
         {
            Sleep(1000*66);
            if (ExistOrders(symbol, cmd, magic, opentime))
            {
               if (UseSound) 
               {
                  PlaySound("ok.wav"); 
                  break;
               }
            }
         }
        
         Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
         continue;
      }
      
      Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
      Print("Ask=", Ask, "  Bid=", Bid, "  symbol=", symbol, "  volume=", volume, "  cmd=", GetNameOP(cmd), "  price=", price, "  stoploss=", stoploss, "  takeprofit=", stoploss, "  magic=", magic);
      if ((error == ERR_COMMON_ERROR) || (error == ERR_ACCOUNT_DISABLED) || (error == ERR_INVALID_ACCOUNT) || (error == ERR_TRADE_DISABLED))
      {
         IsExpertFailed = true;
         break;
      }
      
      if ((error == ERR_SERVER_BUSY) || (ERR_INVALID_TRADE_VOLUME) || (error == ERR_MARKET_CLOSED))
      {
         Sleep(1000*300); 
         break;
      }
      
      if ((error == ERR_TOO_FREQUENT_REQUESTS) || (error == ERR_TOO_MANY_REQUESTS)) 
      {
         Sleep(1000*100);
      }
      
      if ((error == ERR_ORDER_LOCKED) || (error == ERR_LONG_POSITIONS_ONLY_ALLOWED) || (error == ERR_TRADE_TOO_MANY_ORDERS)) 
      {
         break;
      }
      
      if (error == ERR_TRADE_CONTEXT_BUSY) 
      {
         while (IsTradeContextBusy()) 
         {
            Sleep(1000*11);
         }
      }
      
      if (error == ERR_TRADE_EXPIRATION_DENIED )
      {
         expiration = 0; 
         continue;
      }
      
      if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE)) 
      {
         Sleep(1000*7.7);
      }
   }      
}
 

Спасибо за ответ, Роман!

Основные проверки есть, и ордер открывается всегда, когда позволяет ДЦ. ДЦ позволяет открывать сразу с ТП и СЛ, но почему-то в 1 случаи из 100 не ставится ТП.. Я готов к убыткам на открытии ордера, который тут же закроется, если не будет ТП, а вот убытки от не взятия ТП, и ухода в другую степь - куда хуже... Всё же прошу дать ответ, как проверять ордер на наличие ТП > 0 и при ТП = 0, закрывать его немедленно.

 
Roman.:


Ф-ия открытия ордеров с вызовами из ф-ии старт эксперта, например:

Так Вы же не выставляете ни стопа, ни профита при открытии ордера - чего ж Вы хотите? Все верно.

// Вызов ф-ии открытия ордеров из ф-ии stаrt эксперта
if  (здесь условия покупки) 
      
   {
      WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "старт", MagicNumber);
    }
   
   if (продажи) 
   {
      WmOrderSend(Symbol(), OP_SELL, Lots_New, Bid, 0, 0, "старт", MagicNumber);
   }
   
   return(0);    //  ВЫХОД ИЗ СТАРТ
}



//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+

void WmOrderSend(string symbol, int cmd, double volume, double price, 
double stoploss, double takeprofit, 
string comment, int magic, datetime expiration = 0)
{
   color clr;
   datetime opentime;
   int ticket;
   int error;

Более того - странно, то, что, по вашим словам, только некоторые ордера без профитов.

ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит

Без профитов должны быть все ордера.

 
Господа, я ничего не выкладывал из своего кода.. откуда Вы берёте заключения? Робот открывает ордера с ТП каждый раз! ***НО***, по неизвестной мне причине бывает открывает ордер без ТП. (Надеюсь это понятно) Далее просто тупо ждёт, когда закроется ордер, чтобы отработать дальше, а не тут-то было.. Вот в этот момент, когда ордер открыт без ТП и надо ликвидировать сделку...
 
Lexx_Luthor:
Господа, я ничего не выкладывал из своего кода.. откуда Вы берёте заключения? Робот открывает ордера с ТП каждый раз! ***НО***, по неизвестной мне причине бывает открывает ордер без ТП. (Надеюсь это понятно) Далее просто тупо ждёт, когда закроется ордер, чтобы отработать дальше, а не тут-то было.. Вот в этот момент, когда ордер открыт без ТП и надо ликвидировать сделку...

Сорри - это не Ваш код... моя вина.... Что можно посоветовать навскидку - вставьте проверку на наличие ТП при открытии ордера - если ТП==0 просто не посылать запрос на открытие ордера :

if(TP!=0) OrderSend( ...... );

как-нибудь так. Зачем потом закрывать ордер и терпеть лишние убытки.

 
Lexx_Luthor:

Спасибо за ответ, Роман!

Основные проверки есть, и ордер открывается всегда, когда позволяет ДЦ. ДЦ позволяет открывать сразу с ТП и СЛ, но почему-то в 1 случаи из 100 не ставится ТП.. Я готов к убыткам на открытии ордера, который тут же закроется, если не будет ТП, а вот убытки от не взятия ТП, и ухода в другую степь - куда хуже... Всё же прошу дать ответ, как проверять ордер на наличие ТП > 0 и при ТП = 0, закрывать его немедленно.


   Ваш вариант. Хотя сам я с подобным "глюком" не сталкивался. У себя в советнике добавьте код после  функций открытия ордеров с Вашими

   параметрами открытия...

   Например:

   
 int ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,1000,"OrderOpenOne",14774,0,CLR_NONE);// ф-ия открытия - сюда бейте Ваши переменные
    if (ticket>0)                                               // Если позиция открылась
    {
       while(OrderSelect(ticket,SELECT_BY_TICKET)==false)            // Если ордер выбран
       {
          Sleep(100);
       }
       double Order_TP = OrderTakeProfit();
        if (Order_TP <= 0) ClosePosBySelect()                        // если ТП = 0 либо <  0 - закрываем его ф-ей закрытия ордера так,
                                                                       // как эта ф-ия реализована в Вашем эксперте... 
                                                                      // у меня это ф-ия ClosePosBySelect(), у Вас название другое...
    }


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