Ordem Pendente

 

Boa Tarde Pessoal,


estou com um cliente que quer, que os Stops das negociações sejam feitas com ordens limit e stop 

para isso criei a seguinte função:

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

      if(typ == 0)
        {
         double priceStop = (NormalizeDouble((_price+(_SL*_Point))/10,_Digits)*10)+(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE));
         double priceTake = NormalizeDouble((_price-(_TK*_Point))/10,_Digits)*10;

         Trade.BuyLimit(_lote,priceTake,_Symbol,NULL,NULL,ORDER_TIME_GTC);
         Trade.BuyStop(_lote,priceStop,_Symbol,NULL,NULL,ORDER_TIME_GTC);

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


        }
      if(typ == 1)
        {
         double priceStop = (NormalizeDouble((_price-(_SL*_Point))/10,_Digits)*10)-(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE));
         double priceTake = (NormalizeDouble((_price+(_TK*_Point))/10,_Digits)*10);


         Trade.SellLimit(_lote,priceTake,_Symbol,NULL,NULL,ORDER_TIME_SPECIFIED_DAY);
         Trade.SellStop(_lote,priceStop,_Symbol,NULL,ORDER_TIME_SPECIFIED_DAY);

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


        }

     }
   return false;
  }

na função eu recebo o valor do contrato, o preço da ordem aberta, o valor do take e o valor do stop, esse typ é so pra colocar se é compra ou venda

a cliente fala q a ordem vai, porém os stops não estão indo, no testador funciona, mas na real não funciona
não há mensagens de erro na aba expert

 
O seu tópico foi movido para a secção: Expert Advisors e Negociação Automatizada.
Por favor ter em conta a secção adequada quando criar tópicos — https://www.mql5.com/pt/forum/421109/page6#comment_49385139
 
Gustavo Barbeiro Alonso:

Boa Tarde Pessoal,


estou com um cliente que quer, que os Stops das negociações sejam feitas com ordens limit e stop 

para isso criei a seguinte função:

na função eu recebo o valor do contrato, o preço da ordem aberta, o valor do take e o valor do stop, esse typ é so pra colocar se é compra ou venda

a cliente fala q a ordem vai, porém os stops não estão indo, no testador funciona, mas na real não funciona
não há mensagens de erro na aba expert

Se for forex verifica no ativo o atributo stop level, voce possivelmente esta dentro desse intervalo. Outra possibilidade, mas dai nao acreditaria seria alguma proteção anti-flood.

 
Ricardo Rodrigues Lucca #:

Se for forex verifica no ativo o atributo stop level, voce possivelmente esta dentro desse intervalo. Outra possibilidade, mas dai nao acreditaria seria alguma proteção anti-flood.

é no mercado Nacional, ainda não consegui identificar oque pode ser

 
Gustavo Barbeiro AlonsoBoa Tarde Pessoal, estou com um cliente que quer, que os Stops das negociações sejam feitas com ordens limit e stop para isso criei a seguinte função: [ . . . ] na função eu recebo o valor do contrato, o preço da ordem aberta, o valor do take e o valor do stop, esse typ é so pra colocar se é compra ou venda a cliente fala q a ordem vai, porém os stops não estão indo, no testador funciona, mas na real não funciona não há mensagens de erro na aba expert

Boa tarde, Gustavo!!

1. Nas funções Trade.BuyLimit() e Trade.BuyStop() você utiliza ORDER_TIME_GTC, e nas funções  Trade.SellLimit() e Trade.SellStop() você utiliza ORDER_TIME_SPECIFIED_DAY... Eu não entendi por quê...

2. Na função  Trade.SellStop() faltou o parâmetro correspondente ao Take Profit...

3. Os preços priceStop e priceTake não estão sendo normalizados... A função abaixo está disponível também na classe SymbolInfo:

//+--------------------------------------------------------------------------------------------------------------------+
//| This function normalizes and adjusts the price to the TICK SIZE                                                    |
//+--------------------------------------------------------------------------------------------------------------------+
double NormalizePrice(double price)
  {
//--- Get the minimal price change
   double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

//--- Return the price normalized
   if(tick_size == 0.0)
     {
      return(NormalizeDouble(price, _Digits));
     }

//--- Return the price normalized and adjusted to the TICK SIZE
   return(NormalizeDouble(MathRound(price / tick_size) * tick_size, _Digits));
  }

4. Exemplo básico de verificação do retorno das ordens para salvar possíveis mensagens na guia Experts (verificar o retorno de cada ordem):

                  if(Trade.BuyLimit(_lote,priceTake,_Symbol))
                    {
                     Print("Envio de Ordens Pendentes com sucesso.");
                     return(true);
                    }
                  else
                    {
                     Print(Trade.ResultRetcode(), " ", Trade.ResultRetcodeDescription());
                     return(false);
                    }

                  //---

                  if(Trade.BuyStop(_lote,priceStop,_Symbol))
                    {
                     Print("Envio de Ordens Pendentes com sucesso.");
                     return(true);
                    }
                  else
                    {
                     Print(Trade.ResultRetcode(), " ", Trade.ResultRetcodeDescription());
                     return(false);
                    }
 
Gustavo Barbeiro Alonso #:

é no mercado Nacional, ainda não consegui identificar oque pode ser

Se for mercado nacional, o stop level possivelmente é zero (mas eu teria verificado, principalmente se for em corretora não-B3 como activtrades, roboforex, etc). Seu sistema abre e fecha ordens com qual frequencia? Seria possivel colocar isso antes do envio das ordens? A ideia seria entender como estava a melhor venda e compra em relacao aos seus precos de colocacao de ordem.

Print(SymbolInfoDouble(NULL,SYMBOL_BID), " ", SymbolInfoDouble(NULL,SYMBOL_ASK), " ", priceTake, " ", priceStop);
Outra coisa que eu descarto, o erro de arredondamento proposto pelo Vinicius que isso seria bem aparente no log (diario) quando ele da invalid stop / invalid price.
 
Vinicius Pereira De Oliveira #:

Boa tarde, Gustavo!!

1. Nas funções Trade.BuyLimit() e Trade.BuyStop() você utiliza ORDER_TIME_GTC, e nas funções  Trade.SellLimit() e Trade.SellStop() você utiliza ORDER_TIME_SPECIFIED_DAY... Eu não entendi por quê...

2. Na função  Trade.SellStop() faltou o parâmetro correspondente ao Take Profit...

3. Os preços priceStop e priceTake não estão sendo normalizados... A função abaixo está disponível também na classe SymbolInfo:

4. Exemplo básico de verificação do retorno das ordens para salvar possíveis mensagens na guia Experts (verificar o retorno de cada ordem):

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

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

      if(typ == 0)
        {
         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);


         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;
  }
 
Ricardo Rodrigues Lucca #:

Se for mercado nacional, o stop level possivelmente é zero (mas eu teria verificado, principalmente se for em corretora não-B3 como activtrades, roboforex, etc). Seu sistema abre e fecha ordens com qual frequencia? Seria possivel colocar isso antes do envio das ordens? A ideia seria entender como estava a melhor venda e compra em relacao aos seus precos de colocacao de ordem.

Outra coisa que eu descarto, o erro de arredondamento proposto pelo Vinicius que isso seria bem aparente no log (diario) quando ele da invalid stop / invalid price.

então, o EA abre ordem seguindo um indicador, acredito que seja poucas entradas no intraday, então o que estranho é não tem erro no log. por isso fiquei sem saber o que fazer, o robo só funciona em conta nacional NETTING

 
Gustavo Barbeiro Alonso #:

então, o EA abre ordem seguindo um indicador, acredito que seja poucas entradas no intraday, então o que estranho é não tem erro no log. por isso fiquei sem saber o que fazer, o robo só funciona em conta nacional NETTING

Isso não diz muito sobre a implementação, tem gente que esbarra em problema porque segue o indicador meio que arrisca ele entrou na zona de acao. Vai lá e cria a ordem, ele saiu (na mesma vela 1s depois), deleta a ordem e fica nesse zigzag... não sendo assim, acho que tu não teria problema com flood também.

 
Ricardo Rodrigues Lucca #:

Isso não diz muito sobre a implementação, tem gente que esbarra em problema porque segue o indicador meio que arrisca ele entrou na zona de acao. Vai lá e cria a ordem, ele saiu (na mesma vela 1s depois), deleta a ordem e fica nesse zigzag... não sendo assim, acho que tu não teria problema com flood também.

a referente a esse zigzag eu criei um estado que é so resetado na criação de uma barra nova, a questão da frequencia ta tranquilo neste projeto

 
Gustavo Barbeiro Alonso #:

a referente a esse zigzag eu criei um estado que é so resetado na criação de uma barra nova, a questão da frequencia ta tranquilo neste projeto

a corretora usada é a XP Investimentos