Problema de invalid stops (Erro 4756)

 

Ola pessoal,


estou tendo um problema para poder enviar ordens na abertura do mercado (alguns segundo depois da abertura), recebo o erro Erro na venda a mercado:4756.

Segue código:

//realiza a compra na abertura do mercado
void compraNaAbertura(){
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick))
   {
           //copia 2 candle do grafico corrente
           int copied = CopyRates(_Symbol,_Period,0,2,rates);
           if(copied < 2) return;
           Print("Preco rates[0].open:",rates[0].open);
           Print("last_tick.last:",last_tick.last);
           
           if( checa alguma condicao){
             compraMercado(inputVolume,NormalizeDouble(last_tick.last,Digits()),NormalizeDouble((last_tick.last - inputSl),Digits()), NormalizeDouble((last_tick.last + inpuTp),Digits()));
             Print("SL:",rates[0].open - inputSl);
             Print("TP:",rates[0].open + inpuTp);
           }
           if(checa outra condicao){
             vendaMercado(inputVolume,NormalizeDouble(last_tick.last,Digits()),NormalizeDouble((last_tick.last + inputSl),Digits()), NormalizeDouble((last_tick.last - inpuTp),Digits()));
             Print("SL:",rates[0].open + inputSl);
             Print("TP:",rates[0].open - inpuTp);
           }
    }
}

/realiza a compra do simbolo  
bool compraMercado(ulong volume,double preco,double st,double tp){
   bool ok =  trade.Buy(volume,_Symbol,preco,st,tp);
   if(!ok){
      int error = GetLastError();
      Print("Erro na compra a mercado:", error);
      ResetLastError();
   }
   return ok;
}

//realiza a venda do simbolo
bool vendaMercado(ulong volume,double preco,double st,double tp){
   bool ok =  trade.Sell(volume,_Symbol,preco,st,tp);
   if(!ok){
      int error = GetLastError();
      Print("Erro na venda a mercado:", error);
      ResetLastError();
   }
   return ok;
}

Para os cálculos do preços de SL e TP já utilizei tanto o valor "rates[0].open" quanto o valor do "ast_tick.last" e nenhum deu certo. Após esse período da abertura o processo de compra e venda funciona perfeitamente.


Log apresentado pelo EA

Preco rates[0].open:5620.0

SL:5625.0
TP:5615.0

CTrade::OrderSend: exchange sell 5.00 WDOK21 sl: 5625.000 tp: 5615.000 [invalid stops]
Erro na venda a mercado:4756

Se algum puder me ajudar nesta questão, agradeço !!!

 
Carlos Martins:


Bom dia Martins,

tira da sua cabeça em comandar uma ordem a MERCADO com um preço definido na ordem, isso não existe!  Você só coloca preço em ofertas a preço limite.   Então, coloca 0(zero) no preço. Posto isto, lembre-se que a ordem em executada  pelo preço ASK ou BID, do momento em que a ordem bate na B3,  então os stops GAIN/LOSS tem que estar de acordo com ASK/BID para não ganhar um invalid stop.


(*) Cuidado com DEMO pois as operações são feitas pelo last_tick.last;

 
Rogerio Giannetti Torres:.

Bom dia Martins,

tira da sua cabeça em comandar uma ordem a MERCADO com um preço definido na ordem, isso não existe!  Você só coloca preço em ofertas a preço limite.   Então, coloca 0(zero) no preço. Posto isto, lembre-se que a ordem em executada  pelo preço ASK ou BID, do momento em que a ordem bate na B3,  então os stops GAIN/LOSS tem que estar de acordo com ASK/BID para não ganhar um invalid stop.


(*) Cuidado com DEMO pois as operações são feitas pelo last_tick.last;

Obrigado Rogerio pelas dicas.


Perdi o inicio do pregão de hoje (22/04), mas amanhã testo a alteração usando o preço 0 (zero) e o SL e TP com preço ASK.


Caso dê algum problema posto a dúvida aqui.


Valeu !!!

 
Carlos Martins:

Obrigado Rogerio pelas dicas.


Perdi o inicio do pregão de hoje (22/04), mas amanhã testo a alteração usando o preço 0 (zero) e o SL e TP com preço ASK.


Caso dê algum problema posto a dúvida aqui.


Valeu !!!


Olá Carlos,

Estou enfrentando o mesmo problema, como você conseguiu resolver? 

Razão: