Ordem Parcialmente executada - Possível solução para mercado futuro

Guilherme Mendonca  

Olá senhores, 

Algumas vezes minhas ordens limites são executadas parcialmente e acontece do mercado andar a favor sem executar por completo.

Estou pensando uma possível solução para evitar esse problema.

Caso a ordem foi executada parcialmente e o mercado andou 2 ou mais ticks a favor da operação, ele irá fazer um incremento à mercado.

Obs.: Os dados das variáveis cur_sl e cur_tp foram obtidos em outra rotina usando "Positions Properties".

Se alguém souber de alguma solução mais prática, poderia postar também.  

Segue o modelo de código abaixo:

void Check_Partial()
  {
//---
   uint  ord_total=OrdersTotal();
   for(uint i=0; i<ord_total; i++)
     {
      ulong ticket;
      if((ticket=OrderGetTicket(i))>0)
        {
         if(OrderGetString(ORDER_SYMBOL)==_Symbol)
            if(OrderGetInteger(ORDER_MAGIC)==EA_Magic)
              {
   	      //--- Para ordens de compra	
                if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_LIMIT)
                  {
                   if(OrderGetInteger(ORDER_STATE)==ORDER_STATE_PARTIAL)
                     {
                      if(SymbolInfoDouble(_Symbol,SYMBOL_LAST)>=(OrderGetDouble(ORDER_PRICE_OPEN)+(2*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE))))
                        {
                         double fix_vol=OrderGetDouble(ORDER_VOLUME_INITIAL)-OrderGetDouble(ORDER_VOLUME_CURRENT);
                         Trade.Buy(fix_vol,_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_LAST),cur_sl,cur_tp,"Fix Volume");
                        }
                     }
                  }
	      //--- Para ordens de venda
                if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_LIMIT)
                  {
                   if(OrderGetInteger(ORDER_STATE)==ORDER_STATE_PARTIAL)
                     {
                      if(SymbolInfoDouble(_Symbol,SYMBOL_LAST)<=(OrderGetDouble(ORDER_PRICE_OPEN)-(2*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE))))
                        {
                         double fix_vol=OrderGetDouble(ORDER_VOLUME_INITIAL)-OrderGetDouble(ORDER_VOLUME_CURRENT);
                         Trade.Sell(fix_vol,_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_LAST),cur_sl,cur_tp,"Fix Volume");
                        }
                     }
                  }
              }
               
        }
     }
   

  }
Adailton Silva  

Serve sem código?

Eu faria um loop do while verificando se a quantidade de contratos que requeri foi atendida

enum eTipo_de_posicao
{
    eCompradora,
    eVendedora,
};

//+------------------------------------------------------------------+

bool verifique_o_preco_medio(double pPreco_atual, eTipo_de_posicao pTipo_de_posicao)
{
    bool retorno = false;
    if(pTipo_de_posicao == eCompradora)
    {
        retorno = pPreco_atual > posicao[ticket].preco_medio;
    }
    else if (pTipo_de_posicao == eVendedora)
    {
        retorno = pPreco_atual < posicao[ticket].preco_medio;
    }
    return retorno;
};

//+------------------------------------------------------------------+

if(PositionSelectByTicket(ticket))
{
    if(verifique_o_preco_medio(posicao[ticket].preco_medio, posicao[ticket].tipo_de_posicao)
    {
        do
        {
         //Realize novas compras
         //Obtenha o novo preço médio
	 //Atualize a quantidade atual de contratos
        }
        while(condicao_para_continuar_comprando()
		&& verifique_o_preco_medio(preco_atual, posicao[ticket].tipo_de_posicao)
                && !IsStopped());
    }
};

//+------------------------------------------------------------------+

bool condicao_para_continuar_comprando()
{
    return posicao[ticket].qntd_de_contratos_requerida > posicao[ticket].qntd_atual_de_contratos;

};
//+------------------------------------------------------------------+

Mais ou menos isso aí....

Agora observe que há uma recursividade acontecendo e por isso mesmo, afim de evitar o custo computacional, faço a seleção da posição que me interessa no código.

Se utilizar essa lógica varrendo continuamente o total de ordens como faz atualmente, esse código que postei vai virar um verdadeiro "tijolo" para seu processador.

Rogerio Giannetti Torres  
Guilherme Mendonca:

Olá senhores, 


Guilherme, 

você deve usar o comando ORDER_MODIFY, alterando o preço da ordem pendente para um preço de execução imediata, ou seja para compra acima do ASK, para venda abaixo BID

Guilherme Mendonca  
Rogerio Giannetti Torres #:

Guilherme, 

você deve usar o comando ORDER_MODIFY, alterando o preço da ordem pendente para um preço de execução imediata, ou seja para compra acima do ASK, para venda abaixo BID

Você está certo Rogério.

Muito obrigado pela dica.

Razão: