Стандартная библиотека, CTrade - PositionClose не работает

 
Осваиваю стандартную библиотеку, кажется метод плохо работает 
bool CTrade::PositionClose(const string symbol,const ulong deviation)
  {
   bool partial_close=false;
   int  retry_count  =10;
   uint retcode      =TRADE_RETCODE_REJECT;
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
   do
     {
      //--- check
      if(SelectPosition(symbol))
        {
         if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            //--- prepare request for close BUY position
            m_request.type =ORDER_TYPE_SELL;
            m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
           }
         else
           {
            //--- prepare request for close SELL position
            m_request.type =ORDER_TYPE_BUY;
            m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
           }
        }
      else
        {
         //--- position not found
         m_result.retcode=retcode;
         return(false);
        }
      //--- setting request
      m_request.action   =TRADE_ACTION_DEAL;
      m_request.symbol   =symbol;
      m_request.volume   =PositionGetDouble(POSITION_VOLUME);
      m_request.magic    =m_magic;
      m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
      //--- check volume
      double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
      if(m_request.volume>max_volume)
        {
         m_request.volume=max_volume;
         partial_close=true;
        }
      else
         partial_close=false;
      //--- hedging? just send order
      if(IsHedging())
        {
         m_request.position=PositionGetInteger(POSITION_TICKET);
         return(OrderSend(m_request,m_result));
        }
      //--- order send
      if(!OrderSend(m_request,m_result))
        {
         if(--retry_count!=0)
            continue;
         if(retcode==TRADE_RETCODE_DONE_PARTIAL)
            m_result.retcode=retcode;
         return(false);
        }
      //--- WARNING. If position volume exceeds the maximum volume allowed for deal,
      //--- and when the asynchronous trade mode is on, for safety reasons, position is closed not completely,
      //--- but partially. It is decreased by the maximum volume allowed for deal.
      if(m_async_mode)
         break;
      retcode=TRADE_RETCODE_DONE_PARTIAL;
      if(partial_close)
         Sleep(1000);
     }
   while(partial_close);
//--- succeed
   return(true);
  }
в строчке 
//--- order send
      if(!OrderSend(m_request,m_result))
если закрывается с ошибкой, делается --retry_count и continue, но цикл заканчивается поскольку выше уже выставлено partial_close=false
то есть ордер зафейлился, но никаких retry не происходит, возвращает true 

выглядит так что partial_close должен выставляться в случае успешного выполнения ордера, и начальное значение должно true а не false
 
стандартная библиотека обновляется сама при обновлении терминала?
 
Александр Кувакин #:
стандартная библиотека обновляется сама при обновлении терминала?
Стандартная библиотека работает на ура. Руками лезть в СБ запрещено. 

Все методы закрытая позиций работают. 

Вы лучше скажите, что именно Вы хотите запрограммировать? Какое действие?
 
я хочу чтобы в случае фейла при закрытии ордера функция возвращала false и делала retry
выше код который я скопировал из Trade.mqh и он работает неправильно, выше описал как именно
то есть если приглядеться то можно по коду понять где ошибки,
конкретно сейчас тестирую - код не работает
 
Александр Кувакин #:
я хочу чтобы в случае фейла при закрытии ордера функция возвращала false и делала retry
выше код который я скопировал из Trade.mqh и он работает неправильно, выше описал как именно
то есть если приглядеться то можно по коду понять где ошибки,
конкретно сейчас тестирую - код не работает
Совет: не нужно руками лезть в  СБ. Работайте с методами и анализируйте ошибки возврата. До сих пор не  ясно - что именно Вы пытаетесь сделать? Где код перебора позиций  в цикле и попыток закрытия?
Добавлено: не употребляйте сленг 
 
Александр Кувакин #:
стандартная библиотека обновляется сама при обновлении терминала?
При обновлении терминала СБ тоже обновляется и все сделанные там изменения теряются. Поэтому бесплатный вам совет, не пользуйтесь ей. Лучше самые нужные методы скопировать оттуда в собственную библиотеку, там сделать собственные изменения и ей пользоваться. Вы никогда не услышите согласия, что в СБ есть ошибки.
 
Vladimir Karputov #:
Совет: не нужно руками лезть в  СБ. Работайте с методами и анализируйте ошибки возврата. До сих пор не  ясно - что именно Вы пытаетесь сделать? Где код перебора позиций  в цикле и попыток закрытия?
Добавлено: не употребляйте сленг 

я руками не лезу и не хочу туда лезть, код полностью скопировал из СБ без изменений, дебаг показал ошибку в данной функции, подробности я уже описал
код небольшой и чтобы понять где ошибка достаточно проанализировать условие выхода из цикла while(partial_close); в случае если OrderSend вернёт ошибку

 
Александр Кувакин #:

я руками не лезу и не хочу туда лезть, код полностью скопировал из СБ без изменений, дебаг показал ошибку в данной функции, подробности я уже описал
код небольшой и чтобы понять где ошибка достаточно проанализировать условие выхода из цикла while(partial_close); в случае если OrderSend вернёт ошибку

Я так понял кода от Вас не дождаться.,, Жаль.
 
Vladimir Karputov #:
Совет: не нужно руками лезть в  СБ. Работайте с методами и анализируйте ошибки возврата. До сих пор не  ясно - что именно Вы пытаетесь сделать? Где код перебора позиций  в цикле и попыток закрытия?
Добавлено: не употребляйте сленг 

Пытаюсь закрыть позицию

if (myPosition.Select(mySymbol.Name())) {
         if (trailIsVirtual && virtualStopValue > 0) {
            if(myPosition.PositionType() == POSITION_TYPE_BUY) {
               if (mySymbol.Last() <= virtualStopValue) {
                  if(myTrade.PositionClose(mySymbol.Name()) {
                     printf("Long position closed by virtual stop loss - %f", virtualStopValue);
                     virtualStopValue = 0;
                  }
               }
            }
            if (myPosition.PositionType() == POSITION_TYPE_SELL) {
               if (mySymbol.Last() >= virtualStopValue) {
                  if(myTrade.PositionClose(mySymbol.Name()) {
                     printf("Short position closed by virtual stop loss - %f", virtualStopValue);
                     virtualStopValue = 0;
                  }
               }
            }
         }
      }

myPosition, myTrade, mySymbol - сущности стандартной библиотеки

CSymbolInfo*      mySymbol;
   CTrade*          myTrade;
   CPositionInfo     myPosition;
ложно срабатывает условие 
if(myTrade.PositionClose(mySymbol.Name()) {
                     printf("Long position closed by virtual stop loss - %f", virtualStopValue);
                     virtualStopValue = 0;
                  }
 
Alexey Viktorov #:
Вы никогда не услышите согласия, что в СБ есть ошибки.

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

 
Александр Кувакин #:

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

Используйте стандарт переборах позиции в цикле и выбор позиции через Тикет позиции. Пример сейчас дать не могу к сожалению.