EA negociando em preços onde de não ouve negócios

 
Bom dia, meu EA como podem ver na imagem, comprou e vendeu em preços que nem houve negociação.
OBS. está na conta demo mercado fracionário (WEGE3F), ele entra com uma buy stop.
Arquivos anexados:
 
ROMEU MASSELAI:
Bom dia, meu EA como podem ver na imagem, comprou e vendeu em preços que nem houve negociação.
OBS. está na conta demo mercado fracionário (WEGE3F), ele entra com uma buy stop.

Olá,

Pode ser o seguinte:  DEMO aceita e executa ordens no período de leilão!  Solução, rejeite os ticks com volume igual a zero, isso também vai corrigir erro de o EA processar ofertas.

 
Rogerio Giannetti Torres #:

Olá,

Pode ser o seguinte:  DEMO aceita e executa ordens no período de leilão!  Solução, rejeite os ticks com volume igual a zero, isso também vai corrigir erro de o EA processar ofertas.

Olá, implementei a sugestão, e também mudei para entrar a mercado, mas o problema persiste, e parece ser no período do leilão. 

if (SymbolInfoInteger(_Symbol,SYMBOL_VOLUME)>0)
      {
       compra=true;
       }
Arquivos anexados:
erro1.png  22 kb
 
ROMEU MASSELAI #:

Olá, implementei a sugestão, e também mudei para entrar a mercado, mas o problema persiste, e parece ser no período do leilão. 

Essa questão do volume=0 seria suficiente, mas se achar que precisa muitas vezes no leilão o ASK e BID estão invertidos então se tu tiver um filtro por esse spread deveria reduzir esses casos...
 

. . .


Mais uma verificação que pode ser feita antes de enviar uma ordem é o horário de negociação do símbolo (ativo). Acho que a função abaixo pode lhe ajudar com isso:

//+--------------------------------------------------------------------------------------------------------------------+
//| This function checks if the symbol is trading at the current time                                                  |
//+--------------------------------------------------------------------------------------------------------------------+
bool CheckTradingTime(string symbol)
  {
//--- Local variables
   datetime    times = TimeCurrent(), trade_time_start = 0, trade_time_end = 0, _start = 0, _end = 0;
   MqlDateTime last_time;

//--- Check symbol trade end date
   datetime expiration = (datetime)SymbolInfoInteger(symbol, SYMBOL_EXPIRATION_TIME);
   if(expiration != 0 && times >= expiration)
     {
      return(false);
     }

   TimeToStruct(times, last_time);

//--- Session index: 0
   if(SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)last_time.day_of_week, 0, trade_time_start, trade_time_end))
     {
      _start = iTime(symbol, PERIOD_D1, 0) + trade_time_start;
      _end   = iTime(symbol, PERIOD_D1, 0) + trade_time_end;
      if(_start == _end)
        {
         return(true);
        }
      if(times >= _start && times < _end)
        {
         return(true);
        }
     }

//--- Session index: 1
   if(SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)last_time.day_of_week, 1, trade_time_start, trade_time_end))
     {
      _start = iTime(symbol, PERIOD_D1, 0) + trade_time_start;
      _end   = iTime(symbol, PERIOD_D1, 0) + trade_time_end;
      if(_start == _end)
        {
         return(true);
        }
      if(times >= _start && times < _end)
        {
         return(true);
        }
     }

//--- Check completed
   return(false);
  }
 
ROMEU MASSELAI #:

Olá, implementei a sugestão, e também mudei para entrar a mercado, mas o problema persiste, e parece ser no período do leilão. 

Uma dúvida, o EA está despachando as ordens no OnTick() certo? 

Na segunda antes das 9:00 coloque em DEMO e em REAL e compare os resultados. 


#property copyright "Rogério Giannetti Torres"
#property link      "mailto:giannetti.rogerio@gmail.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

bool                 flagOpen = false;

MqlTick              mqlTick;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("\nAtivo: ", _Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!SymbolInfoTick(_Symbol, mqlTick))
      return;
   if(!flagOpen)
      Print("Time: ", mqlTick.time, "  Mask = ", mqlTick.flags, " Vol = ", mqlTick.volume, " Bid = ", mqlTick.bid, " Ask = ", mqlTick.ask,  " Last = ", mqlTick.last);
   if(mqlTick.volume == 0)
      return;
   if(mqlTick.last == 0)
      return;
   if(! flagOpen )
     {
      Alert("Mercado abriu ");
      Print("Time: ", mqlTick.time, "  Mask = ", mqlTick.flags, " Vol = ", mqlTick.volume, " Bid = ", mqlTick.bid, " Ask = ", mqlTick.ask,  " Last = ", mqlTick.last);
      flagOpen = true;
      ExpertRemove();
     }
  }
//+------------------------------------------------------------------+
Razão: