Ordem Pendente - página 2

 
Gustavo Barbeiro Alonso #pergunta 1 : Nesse eu estava testando se era isso que estava fazendo com que não executasse Ponto 2: Corrigido! Ponto 3: Coloquei a função que você me passou; Ponto 4 Inseri a verificação em todas

O problema relatado no tópico abaixo é muito semelhante ao seu (ordens pendentes recusadas apenas em conta real, mesma corretora, etc.)... Segue a solução naquele caso...

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Ordens pendentes negadas pelo servidor. Mensagem: "Order received. Sending to OMS"

Rodrigo Malacarne, 2016.02.25 22:14

Olá sergio.brito,

Experimente trocar dentro de OnInit a seguinte linha:

Trade.SetTypeFilling(ORDER_FILLING_FOK);

 para

Trade.SetTypeFilling(ORDER_FILLING_RETURN);

Por favor não esqueça de nos reportar o resultado!

Abraços,
Malacarne

 
Gustavo Barbeiro Alonso #:

a corretora usada é a XP Investimentos

A corretora não é tão importante, o fato do vinicius falar do filling faria sentido se fosse pra todas as ordens e não somente para as stops (minha opiniao). Dado que essa função que tu postou é a que coloca os stops, tu poderia mandar a que esta contando as ordens para verificarmos? Outro ponto que seria o typ, ele esta vindo correto? Se voce esta posicionado na venda, ele esta vindo compra como deveria?

 
Ricardo Rodrigues Lucca #:

A corretora não é tão importante, o fato do vinicius falar do filling faria sentido se fosse pra todas as ordens e não somente para as stops (minha opiniao). Dado que essa função que tu postou é a que coloca os stops, tu poderia mandar a que esta contando as ordens para verificarmos? Outro ponto que seria o typ, ele esta vindo correto? Se voce esta posicionado na venda, ele esta vindo compra como deveria?

Outra coisa, o testador é uma coisa. Mas voce poderia depurar em mercado real na conta demo que seria para ter um comportamento muito similar ao do mercado real.
 
Vinicius Pereira De Oliveira #:

O problema relatado no tópico abaixo é muito semelhante ao seu (ordens pendentes recusadas apenas em conta real, mesma corretora, etc.)... Segue a solução naquele caso...

Coloquei 

Trade.SetTypeFilling(ORDER_FILLING_RETURN);

mas mesmo assim ta dando na mesma coisa, abre a ordem mas as ordens pendentes não estão indo, e não deixando erro no log

 
Gustavo Barbeiro Alonso #:

Coloquei 

mas mesmo assim ta dando na mesma coisa, abre a ordem mas as ordens pendentes não estão indo, e não deixando erro no log

Colocou o Print() que tinha pedido? E poderia mandar o codigo que falei tambem pra gente checar?

 

coloquei o print onde abre a ordem limite e chega nele, porém estou duvidando do report do cliente, vou abrir um conta em corretora nacional pra tentar eu testar.


já a parte do typ eu coloquei manual é so pra separar o tipo de entrada

//+------------------------------------------------------------------+
//|               função de compra a mercado                         |
//+------------------------------------------------------------------+
void CRobot::CompraMercado(double num_lotes,double _ask,double TK_,double SL_)
  {

   Trade.Buy(num_lotes,_Symbol,Robo.NormalizePrice(_ask),NULL,NULL);


   if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009)
     {
      Robo.StopsPend(num_lotes,_ask,TK_,SL_,1);
      Print("Ordem de compra Executada com Sucesso!!");
     }
   else
     {
      Print("Erro de execução... ", GetLastError());
      ResetLastError();
     }
  }
//+------------------------------------------------------------------+
//|            função d evenda a mercado                             |
//+------------------------------------------------------------------+
void CRobot::VendaMercado(double num_lotes,double _bid,double TK_,double SL_)
  {
   Trade.Sell(num_lotes,_Symbol,Robo.NormalizePrice(_bid),NULL,NULL);
   

   if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009)
     {
      Robo.StopsPend(num_lotes,_bid,TK_,SL_,0);
      Print("Ordem de venda Executada com Sucesso!!");
     }
   else
     {
      Print("Erro de execução... ", GetLastError());
      ResetLastError();
     }
  }
 
Gustavo Barbeiro Alonso #:

coloquei o print onde abre a ordem limite e chega nele, porém estou duvidando do report do cliente, vou abrir um conta em corretora nacional pra tentar eu testar.


já a parte do typ eu coloquei manual é so pra separar o tipo de entrada

bool CRobot::StopsPend(double _lote,double _price,double _TK,double _SL, int typ)
  {
//0 venda
//1 compra
   if(PositionSelect(_Symbol) && CountPendingOrders() < 2)
     {

      if(typ == 0)
        {
         Print("Regiao BUY");
         double priceStop = Robo.NormalizePrice(_price)+(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE));
         double priceTake = Robo.NormalizePrice(_price);

         Trade.BuyLimit(_lote,priceTake,_Symbol,NULL,NULL,ORDER_TIME_DAY);

         if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009)
           {
            Print("Envio de Ordens Pendentes com sucesso (BUY LIMIT).");
            return true;
           }
         else
           {
            Print("Erro ao enviar Ordens Pendentes.");
           }

         Trade.BuyStop(_lote,priceStop,_Symbol,NULL,NULL,ORDER_TIME_DAY);

         if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009)
           {
            Print("Envio de Ordens Pendentes com sucesso (BUY STOP).");
            return true;
           }
         else
           {
            Print("Erro ao enviar Ordens Pendentes.");
           }


        }
      if(typ == 1)
        {
         double priceStop = Robo.NormalizePrice(_price)-(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE));
         double priceTake = Robo.NormalizePrice(_price);

         Print("Regiao SELL");
         Trade.SellLimit(_lote,priceTake,_Symbol,NULL,NULL,ORDER_TIME_DAY);

         if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009)
           {
            Print("Envio de Ordens Pendentes com sucesso(SELL LIMIT).");
            return true;
           }
         else
           {
            Print("Erro ao enviar Ordens Pendentes.");
           }

         Trade.SellStop(_lote,priceStop,_Symbol,NULL,NULL,ORDER_TIME_DAY);

         if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009)
           {
            Print("Envio de Ordens Pendentes com sucesso(SELL STOP).");
            return true;
           }
         else
           {
            Print("Erro ao enviar Ordens Pendentes.");
           }


        }

     }
   return false;
  }
 
Gustavo Barbeiro Alonso #:

Não precisava repetir o código, e o CountPendingOrders() ? Eu esperava uma coisa no mínimo assim:

int number_of_open_orders(void)
  {
   int res=0.0;
   for(int K=0; !IsStopped() && K<OrdersTotal(); K++)
     {
      ulong ticket = OrderGetTicket(K);
      if(ticket == 0
         || magic_number!=OrderGetInteger(ORDER_MAGIC)
         || _Symbol!=OrderGetString(ORDER_SYMBOL))
        {
         continue;
        }
      res++;
     }
   return res;
  }

Aqui tem um problema que não verifica se as ordens estão colocadas ou não, só que elas existem. Já vi uma corrretora com problema ficar 2 minutos com uma ordem no estado inicial e depois sumir com ela.

 
Ricardo Rodrigues Lucca #:

Não precisava repetir o código, e o CountPendingOrders() ? Eu esperava uma coisa no mínimo assim:

Aqui tem um problema que não verifica se as ordens estão colocadas ou não, só que elas existem. Já vi uma corrretora com problema ficar 2 minutos com uma ordem no estado inicial e depois sumir com ela.


int CRobot::CountPendingOrders()
  {
   int totalOrders = OrdersTotal(); // Obtém o número total de ordens na conta
   int pendingOrderCount = 0; // Inicializa a contagem de ordens pendentes

   for(int i = 0; i < totalOrders; i++)
     {
      ulong tkt = OrderGetTicket(i);
      if(OrderSelect(tkt))
        {
         if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_LIMIT || OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP ||
            OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT|| OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
           {
            pendingOrderCount++;
           }
        }
     }

   return pendingOrderCount; // Retorna o número de ordens pendentes
  }
essa é minha função ela não usa o Magic number
 
Gustavo Barbeiro Alonso #:


essa é minha função ela não usa o Magic number
Essa sua função não define o ativo, logo tendo qualquer outra ordem pendente em outro ativo será contabilizado como de interesse. Pelo manual também se deu OrderGetTicket diz lá que ele já te garantiria que estaria selecionado o ticket para uso. Então esse select poderia só trocar por um tkt > 0. O uso do magic number seria só pra deixar preciso o que eu quero, eu poderia querer deixar a pessoa colocar a ordens no ativo e eu não contabilizar. Mas não vejo muita necessidade em conta netting.