SL sendo acionado fora do preço

 

Boa noite, estou criado um EA e ao enviar uma ordem com SL  ele é ativado instantaneamente. Alguém já passou por isso?

Coloquei já vários valores de SL, mas não estou conseguindo resolver.

Segue meu código e anexo uma imagem do log:

//+------------------------------------------------------------------+
//|                                                   teste_sltp.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade/SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CTrade trade;

CSymbolInfo simbolo;

bool x;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   if(!simbolo.Name(_Symbol))
   {
      Print("Erro ao carregar o ativo.");
      return INIT_FAILED;
   }
   
   x = true;
   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if (!simbolo.RefreshRates())
      return;

   if (x == true)
      Comprar();
   
  }
//+------------------------------------------------------------------+

bool Comprar()
{

   double preco_entrada = simbolo.Ask();
   double sl = simbolo.NormalizePrice(preco_entrada - 100.0);
   double tp = simbolo.NormalizePrice(preco_entrada + 100.0);
   
   bool ok = trade.Buy(1, _Symbol, 0.0, sl, tp);
   
   if (!ok){
      Print("Erro ao comprar: ", GetLastError());
      ResetLastError();
   }
   
   x = false;
   
   return ok;
}
Arquivos anexados:
 
Mahelder Carvalho:

Boa noite, estou criado um EA e ao enviar uma ordem com SL  ele é ativado instantaneamente. Alguém já passou por isso?

Coloquei já vários valores de SL, mas não estou conseguindo resolver.

Segue meu código e anexo uma imagem do log:

você está usando OHLC para o backtest?
 
Mahelder Carvalho:

Boa noite, estou criado um EA e ao enviar uma ordem com SL  ele é ativado instantaneamente. Alguém já passou por isso?

Coloquei já vários valores de SL, mas não estou conseguindo resolver.

Segue meu código e anexo uma imagem do log:

ta me parecendo que esta certo, vamos assumir que exatamente as 9h voce enviou a ordem baseado nos dados de ontem. A ordem possivelmente so seria executada no mercado real digamos 9h09 porque foi um dia que o leilao ficou com bid/ask subindo e descendo ate tudo se resolver as 9h09 e o mercado efetivamente abrir. Durante o sobe e desce do bid/ask sua ordem foi aberta e fechada imediatamente porque o bid/ask estava muito afastado ou invertidos....

Voce pode fazer um teste adicional pelo spread e se o mesmo for negativo ou maior que determinado valor voce nao faz nada. (nao eh o ideal, mas eh bem rapido de implementar)

 
Flavio Jarabeck #:
você está usando OHLC para o backtest?

Bom dia Flavio, 

Estou usando "Cada tick é baseado em um tick real"

Isso influencia em algo?
 
Ricardo Rodrigues Lucca #:

ta me parecendo que esta certo, vamos assumir que exatamente as 9h voce enviou a ordem baseado nos dados de ontem. A ordem possivelmente so seria executada no mercado real digamos 9h09 porque foi um dia que o leilao ficou com bid/ask subindo e descendo ate tudo se resolver as 9h09 e o mercado efetivamente abrir. Durante o sobe e desce do bid/ask sua ordem foi aberta e fechada imediatamente porque o bid/ask estava muito afastado ou invertidos....

Voce pode fazer um teste adicional pelo spread e se o mesmo for negativo ou maior que determinado valor voce nao faz nada. (nao eh o ideal, mas eh bem rapido de implementar)

Bom dia Ricardo, 

entendi o que disse, mas esse comportamento está se repetindo em qualquer horário...coloquei o código assim só pra exemplificar 

 
Mahelder Carvalho #:

Bom dia Ricardo, 

entendi o que disse, mas esse comportamento está se repetindo em qualquer horário...coloquei o código assim só pra exemplificar 

Entendi. Só pra desencargo de consciência poderia no oninit chamar na ctrade a função setdeviationpoint com um valor arbitrário, tipo 5. Possivelmente não é isso, já que o slippage no mercado brasileiro era pra ser ignorado.
 
Mahelder Carvalho:


Olá

no OnInit() experimente inserir comando abaixo. Essa função carrega os dados do ativo que serão usados pelas outras classes.


   simbolo.Refresh();
 
Ricardo Rodrigues Lucca #:
Entendi. Só pra desencargo de consciência poderia no oninit chamar na ctrade a função setdeviationpoint com um valor arbitrário, tipo 5. Possivelmente não é isso, já que o slippage no mercado brasileiro era pra ser ignorado.

Tentei aqui Ricardo, sem diferença alguma. Tentei também mudar o valor de 5 para outros mas também não...


coloquei esse código no OnInit()

trade.SetDeviationInPoints(5);
 
Rogerio Giannetti Torres #:

Olá

no OnInit() experimente inserir comando abaixo. Essa função carrega os dados do ativo que serão usados pelas outras classes.


Boa noite Rogério, 

fiz o refresh conforme você falou, mas também sem resultados.

Esse Refresh() e o RefreshRates() são quase a mesma coisa?

Vou tentar novamente em um outro computador...

 

Pessoal deu certo aqui agora...

Parece que tem a ver com as configurações do backtest, como Flavio comentou...

Antes eu estava usando "Cada tick é baseado em um tick real", alterei para "Cada tick" e passou a funcionar

Entendo que a opção tick base no tick real seria mais precisa, porém, devido a esse problema...entendo que o tick dá para trabalhar 

Li um pouco sobre isso nesse outro tópico...


Muito obrigado pela ajuda pessoal

 
Mahelder Carvalho #:

Pessoal deu certo aqui agora...

Parece que tem a ver com as configurações do backtest, como Flavio comentou...

Antes eu estava usando "Cada tick é baseado em um tick real", alterei para "Cada tick" e passou a funcionar

Entendo que a opção tick base no tick real seria mais precisa, porém, devido a esse problema...entendo que o tick dá para trabalhar 

Li um pouco sobre isso nesse outro tópico...


Muito obrigado pela ajuda pessoal

Na verdade não deveria acontecer isso jamais, a menos que seu Histórico de Ticks reais seja completamente zoado...

Se você estja criando uma estratégia de Scalping, Cada Tick é fictício, o que é ruim para backtest, dependendo do quão curta é a estratégia... Cuidado...

Razão: