В режиме хэджа TRADE_ACTION_CLOSE - страница 2

 
fxsaber:

Попробуйте без обертки CTrade написать на MQL5 закрытие открытой позиции.

К сожалению, сейчас нет доступа к десктопному MT5, чтобы попытаться конструктивнее показать Вам, о чем изначально идет речь.

Я Вас уже поблагодарил за желание помочь. Больше не надо, спасибо. Если разработчики или фрилансеры ответят - будет хорошо. 

Берёте эту самую обёртку и смотрите, как там всё сделано.

Если не нужна обёртка, так просто скопируйте к себе этот код.

bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check
   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);
     }
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =PositionGetDouble(POSITION_VOLUME);
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   PrintFormat("PositionClose #%I64d %s %.2f",ticket,EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),m_request.volume);
   return(OrderSend(m_request,m_result));
  }

Что тут непонятного. Если у Вас счёт с хеджингом, то закрывать надо не просто позицию (так как может быть открыто много позиций по одному и тому же символу), а позицию по конкретному тикету.

Если же Вы хотите закрыть все позиции по данному символу используйте этот исходный код в цикле

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();
   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;
      //--- hedging? just send order
      if(IsHedging())
        {
         m_request.position=PositionGetInteger(POSITION_TICKET);
         return(OrderSend(m_request,m_result));
        }
      //--- check filling
      if(!FillingCheck(symbol))
         return(false);
      //--- 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;
      //--- 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);
  }

Можно ведь просто заглянуть в уже приготовленные исходники. Что Вам и посоветовал Владимир Карпутов. Но Вам ведь нужно вип-обслуживание?

 
Slawa:

Можно ведь просто заглянуть в уже приготовленные исходники.

Как появилась возможность - заглянул.

Ответ оказался в одной строчке

Request.position = ticket;

 

Но Вам ведь нужно вип-обслуживание?

Риторический же вопрос. Спасибо.

 
fxsaber #:

Как появилась возможность - заглянул.

Ответ оказался в одной строчке

 

Риторический же вопрос. Спасибо.

То что вы написали хоть и есть в справочнике, но блин... до этого ещё дойти нужно. Неужели разрабам сложно было прямым текстом написать, что при request.action = TRADE_ACTION_DEAL добавите request.position = position (тикет позиции) и позиция будет удалена.

Спасибо!

зы: выдержка у Вас на 5+, как не с агрелись на "помощников" хз...

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