Fechar uma posição com preenchimento ORDER_FILLING_RETURN

 

Boa tarde, pessoal

Estou quebrando minha cabeça aqui. Toda vez que tento fechar uma posição (conta hedge) a ordem gerada pelo OrderSend ou pelo CTrade estão sempre indo como ORDER_FILLING_FOK, porém eu gostaria que fosse ORDER_FILLING_RETURN.

Já tentei setar o tipo de preenchimento com trade.SetTypeFilling(ORDER_FILLING_RETURN) e também manualmente no Request do OrderSend, porém sem sucesso. Todas as ordens limite vão como RETURN, apenas os Closes estão indo como FOK.

Se eu compro e fecho a mercado manualmente, a ordem vai como RETURN também.

Minha corretora de testes é a XP, conta demo hedge. O problema ocorre também quando tento fechar uma posição pela outra (CloseBy).

Segue meu código, com o devido print no OnTradeTransaction quando a ordem é adicionada (deixei comentada a área de testes com OrderSend):

#include <Trade\Trade.mqh>

CTrade trade;

int OnInit()
{
   trade.SetTypeFilling(ORDER_FILLING_RETURN); // Seta preenchimento das ordens como RETORNAR por padrão   
   trade.SetAsyncMode(false); // Seta modo síncrono para as negociações   
   
   EventSetTimer(10); // Seta o tempo para o OnTimer em segundos   
   
   FechaTudo();

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{  
   EventKillTimer();
}

void OnTimer()
{
   FechaTudo();
}


void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   
   switch(trans.type)
   {
      case TRADE_TRANSACTION_ORDER_ADD:
      {
         OrderSelect(trans.order);
         Print(trans.order, " FILLING: ", EnumToString((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING)));
         break;
      }
   }
}

void FechaTudo()
{   
   // Fecha todas as posições a mercado
      
   for (int i=PositionsTotal()-1; i>=0; i--) 
   {
      ulong ticket = PositionGetTicket(i);
      
      if(PositionSelectByTicket(ticket)) 
      {
         trade.PositionClose(ticket);
         /*
         
         // TESTE SEM USAR A CLASSE CTRADE:
         MqlTradeRequest request;
         MqlTradeResult  result;
         double volume=PositionGetDouble(POSITION_VOLUME); 
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         
         ZeroMemory(request);
         ZeroMemory(result);
         //--- configuração dos parâmetros da ordem
         request.action   =TRADE_ACTION_DEAL;        // tipo de operação de negociação
         //request.position =ticket;          // bilhete da posição
         request.symbol   =name;          // símbolo 
         request.volume   =volume;                   // volume da posição
         request.deviation=5;                        // desvio permitido do preço
         request.type_filling=ORDER_FILLING_RETURN;
         request.magic    =MagicNumber;             // MagicNumber da posição
         //--- colocação do preço e tipo de ordem dependendo do tipo de ordem
         if(type==POSITION_TYPE_BUY)
           {
            request.price=SymbolInfoDouble(name,SYMBOL_BID);
            request.type =ORDER_TYPE_SELL;
           }
         else
           {
            request.price=SymbolInfoDouble(name,SYMBOL_ASK);
            request.type =ORDER_TYPE_BUY;
           }
         //--- saída de informação sobre o fechamento
         PrintFormat("Close #%I64d %s %s",ticket,name,EnumToString(type));
         //--- envio do pedido
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // se não for possível enviar o pedido, exibir um código de erro
         //--- informação sobre a operação 
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         
         */            
      }
   }
}