Ordem de venda executada quase que imediatamente após Compra

 

Opa pessoal, tudo bem ?

Estou com o seguinte problema: após eu executar uma ordem buylimit , a ordem de venda é quase que executada que imediatamente. Como apresento nos logs abaixo:

2021.01.07 13:45:37.438 2020.12.21 12:00:00   Alteraçao de compra: 27.05
2021.01.07 13:45:37.438 2020.12.21 12:00:00   order modified [#2 buy limit 1K PETR4 at 27.05]
2021.01.07 13:45:37.440 2020.12.21 12:00:00   CTrade::OrderSend: modify #2 at 27.05 (sl: 0.00 tp: 27.33) [done]
2021.01.07 13:45:37.443 2020.12.21 12:07:43   order [#2 buy limit 1K PETR4 at 27.05] triggered
2021.01.07 13:45:37.443 2020.12.21 12:07:43   deal #2 buy 1K PETR4 at 27.05 done (based on order #2)
2021.01.07 13:45:37.443 2020.12.21 12:07:43   deal performed [#2 buy 1K PETR4 at 27.05]
2021.01.07 13:45:37.443 2020.12.21 12:07:43   order performed buy 1K at 27.05 [#2 buy limit 1K PETR4 at 27.05]
2021.01.07 13:45:37.444 2020.12.21 12:07:43   take profit triggered #2 buy 1K PETR4 27.05 tp: 27.33 [#3 sell 1K PETR4 at 27.33]
2021.01.07 13:45:37.444 2020.12.21 12:07:43   deal #3 sell 1K PETR4 at 27.03 done (based on order #3)
2021.01.07 13:45:37.444 2020.12.21 12:07:43   deal performed [#3 sell 1K PETR4 at 27.03]
2021.01.07 13:45:37.444 2020.12.21 12:07:43   order performed sell 1K at 27.03 [#3 sell 1K PETR4 at 27.33]

Este é o código dessa parte da lógica:

   if(!existeOrdemAberta() && !existePosicaoAberta())
     {

      Print("-----> Preço Compra: ",preco_controle_compra, " Preço Venda: ",preco_controle_venda);

      trade.BuyLimit(
         quantidade_lotes,
         preco_controle_compra,
         _Symbol,
         0.0,
         preco_controle_venda,
         ORDER_TIME_DAY,ORDER_TIME_EXPIRATION,0);

      desenhaSeta("Compra",velas[0].time,"C");

     }
   else
     {

      if(!existePosicaoAberta())
        {
         ulong ticket = OrderGetTicket(OrdersTotal()-1);

         Print("Alteraçao de compra: ",preco_controle_compra);
         trade.OrderModify(ticket,preco_controle_compra,0,preco_controle_venda,ORDER_TIME_GTC,0);
        }
      else
        {
         ulong ticket = PositionGetTicket(PositionsTotal()-1);
         Print("Contador de Candles: ", contadorCandles);
         if(contadorCandles == 3)
           {
            Print("Trade encerrado por tempo máximo.");
            //encerrarOrdensPosicoes();
            contadorCandles = 0;
           }
         else
           {
            Print("Alteraçao de venda: ",preco_controle_venda);
            trade.PositionModify(ticket,
                                 0.00,
                                 preco_controle_venda);
            contadorCandles += 1;
           }
        }

     }

Uso o Trade.mqh para executar as ordens no mql5. 

Se alguém conseguir me orientar, agradeço de ante mão.

 

Olá,

O problema é o seu Take Profit no BuyLimit. O preço bate em 27.33, porém o preço volta e fecha no preço de mercado 27.03.

Ao invés de utilizar o Take Profit no BuyLimit deixe o valor zerado e crie uma SellLimit no preço de 27.33.

O Take Profit somente dispara uma venda a preço de mercado.

 
Ivan Ronchi:

Olá,

O problema é o seu Take Profit no BuyLimit. O preço bate em 27.33, porém o preço volta e fecha no preço de mercado 27.03.

Ao invés de utilizar o Take Profit no BuyLimit deixe o valor zerado e crie uma SellLimit no preço de 27.33.

O Take Profit somente dispara uma venda a preço de mercado.

Olá Ivan, no caso recomendaria utilizar uma ordem Limit para criar o Take Profit ao invés do parâmetro direto da função de BuyLimit?

Razão: