Erro INVALID PRICE aparecendo aleatoriamente

 

Ola,


Estou escrevendo um EA que opera inside bar, ela poe uma ordem de compra na maxima e venda na minima do candle e poe o take profit, quando o take profit ou stop loss é atingido ela cancela todas as ordens restantes.


O problema que tenho é o seguinte, a EA funciona com alguns inside bars e com outros nao, tudo ocorre perfeitamente, as ordens são colocadas e o stop loss e take profit atingidos mas com alguns inside bars  nenhuma ordem  é colocada mesmo tudo estando de acordo com as regras e no log dizendo INVALID PRICE diversas vezes para o mesmo preco. 


O que esta acontecendo, alguém pode me ajudar a concertar isso?


void OnTick()
  {
   
    CopyRates(Symbol(), Period (), 0, 3, rates);
    
    double maxCurrent = rates[1].high;
    double minCurrent = rates[1].low;
    
    double maxPrev = rates[2].high;
    double minPrev = rates[2].low;
    
    double newHigh = rates[0].high;
    double newLow = rates[0].low;
    
    
    if(maxPrev > maxCurrent && minPrev < minCurrent) 
    
    
    {
    
    
    
      
    if(OrdersTotal()==0 && PositionsTotal()==0) 
    
    
    {
      
      
    if(maxCurrent < newHigh && minCurrent < newLow)
    {
           
         trade.BuyStop(5, maxCurrent + 10, _Symbol, minCurrent -10, maxCurrent+250, 0, 0, "");
  
}
else

     if(maxCurrent > newHigh && minCurrent > newLow)

           {  trade.SellStop(5, minCurrent - 10, _Symbol, maxCurrent +10, minCurrent-250, 0, 0, "");
           
            }
            
           }
       }
         
   
   }




 

Repare: vc está posicionando a ordem buy stop em max_current + 10 quando new_high > max_current, sendo que o preço do ativo anda de 5 em 5 pontos.

Na maioria das vezes vai dar certo, pois logo que new_high = max_current + 5 o seu gatilho é acionado e vc consegue posicionar sua ordem buy stop em max_current + 10.

Porém, muitas vezes algum tubarão manda uma ordem de compra a mercado de volume grande que consome toda a oferta disponível em  2, 3, ou mais níveis de preço de uma vez só. Nesses casos o preço ASK pode pular direto pra max_current + 15, por exemplo, e aí sua ordem buy stop será rejeitada por estar abaixo do preço ASK.

Sugiro vc comparar max_current + 10 com ASK e, se for menor ou igual, vc envia ordem a mercado em lugar de ordem buy stop.

Ou então deixa como está e testa o retorno da ordem buy_stop e, se tiver sido rejeitada, manda a ordem a mercado.

 

Além do que o @Trader_Patinhas falou, não esqueça de normalizar os preços para ordens pendentes. A razão é evitar aqueles preços estranhos (Ex.: WIN@ 100.000,999999999999).

 
Rafael Judson Lima Valle #:

Além do que o @Trader_Patinhas falou, não esqueça de normalizar os preços para ordens pendentes. A razão é evitar aqueles preços estranhos (Ex.: WIN@ 100.000,999999999999)




Poderia exemplificar isso 

 

civil.luciano #

Poderia exemplificar isso

Se o preço de entrada/saída se baseá em um indicador como Media Móvel, Canal de Keltner, etc... 

E o ativo para operações for o Mini Índice por exemplo, o preço retornado do Indicador pode vim divergente do padrão em 5 em 5, com casas decimais a mais.

Uma possível solução para lidar com esse problema é utilizar a função  NormalizeDouble().

Exemplo:

double PrecoEntrada =  NormalizeDouble( ValorPreco, Digits() );

Razão: