Existe alguma classe/função na linguagem de programação mql5 que identifica o início do funcionamento da bolsa (B3)?

 
Existe alguma classe/função na linguagem de programação mql5 que identifica o início do funcionamento da bolsa (B3)?
 
thecarllos:
Existe alguma classe/função na linguagem de programação mql5 que identifica o início do funcionamento da bolsa (B3)?

Não conheço nenhuma nativa ou pronta, mas você pode determinar se o mercado está em atividade de várias maneiras. 

Dois exemplos:

1) Comparar TimeCurrent() com os horários de abertura e fechamento do ativo de interesse conforme o dia da semana (o problema desta solução é identificar os feriados)

2) Chamar CopyTicksRange() com flags=COPY_TICKS_TRADE para verificar se houve alguma negociação nos últimos X segundos (esta última solução eu acho mais segura)

 

Verdade.

Também penso que está no caminho do exemplo 2. Porém estou procurando exemplos de como usar as seguintes funções mas não estou encontrando:

  • TICK_FLAG_BUY — tick é resultado de uma compra
  • TICK_FLAG_SELL — tick é resultado de uma venda

Valeu!

Trader_Patinhas:

Não conheço nenhuma nativa ou pronta, mas você pode determinar se o mercado está em atividade de várias maneiras. 

Dois exemplos:

1) Comparar TimeCurrent() com os horários de abertura e fechamento do ativo de interesse conforme o dia da semana (o problema desta solução é identificar os feriados)

2) Chamar CopyTicksRange() com flags=COPY_TICKS_TRADE para verificar se houve alguma negociação nos últimos X segundos (esta última solução eu acho mais segura)

 
thecarllos:

Verdade.

Também penso que está no caminho do exemplo 2. Porém estou procurando exemplos de como usar as seguintes funções mas não estou encontrando:

  • TICK_FLAG_BUY — tick é resultado de uma compra
  • TICK_FLAG_SELL — tick é resultado de uma venda

Valeu!

Com essa finalidade eu utilizei uma função para verificar a criação de um novo candle, isso evita fins de semana e feriados
bool IsNewBar()
{
   static datetime lastbar;
   datetime curbar = (datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
   if(lastbar != curbar)
   {
      lastbar = curbar;
      return true;
   }
   return false;
}

 
thecarllos:
Existe alguma classe/função na linguagem de programação mql5 que identifica o início do funcionamento da bolsa (B3)?

Existe função nativa para isto na documentação.

bool  SymbolInfoSessionTrade( 
   string            name,                // symbol name 
   ENUM_DAY_OF_WEEK  day_of_week,         // day of the week 
   uint              session_index,       // session index 
   datetime&         from,                // session beginning time 
   datetime&         to                   // session end time 
   );

Consulte através deste link.

 
thecarllos:

Boa noite,

uma gambiarra que uso e que também que otimiza bastante o programa é testar se o último preço negociado alterou.   Se o mercado está fechado ou se o ativo está em leilão, obviamente o preço do último negócio não altera. 


int OnInit()
  {
   cSymbol.RefreshRates();
   Last=cSymbol.Last();

  }

void OnTick()
  {
   if(!cSymbol.RefreshRates()) return;
   if( Last==cSymbol.Last() ) return;
   Ask=cSymbol.Ask();
   Bid=cSymbol.Bid();
   Last=cSymbol.Last();
        
  }

Note que as alterações de ofertas são ignoradas.

 
Joscelino Celso de Oliveira:

Existe função nativa para isto na documentação.

Consulte através deste link.

Essa função cai no caso (1) que eu mencionei. Ela vai retornar os horários de abertura e fechamento para um dado dia de semana e você tem que comparar esses horários com TimeCurrent() pra inferir se o mercado está aberto ou fechado.

Os problemas que eu vejo aí são:

1) Vc vai precisar montar (e manter atualizada) uma tabela de exclusão com os feriados, pois certamente o sistema não conhece os feriados brasileiros e paulistanos.

2) Há risco de as informações retornadas não estarem corretas, por erro de configuração no servidor MT5 da corretora.

3) A B3 às vezes altera horários de alguns ativos, em função de horário de verão e outros fatores. Vc vai confiar que o pessoal da corretora vai manter isso atualizado na plataforma?

Eu, pessoalmente, acho mais seguro verificar se o mercado está aberto DE FATO, usando alguma das formas sugeridas nesta thread (se estão ocorrendo negócios, se novos candles estão sendo formados, se as cotações estão mudando, etc.).

 
Trader_Patinhas:

Essa função cai no caso (1) que eu mencionei. Ela vai retornar os horários de abertura e fechamento para um dado dia de semana e você tem que comparar esses horários com TimeCurrent() pra inferir se o mercado está aberto ou fechado.

Os problemas que eu vejo aí são:

1) Vc vai precisar montar (e manter atualizada) uma tabela de exclusão com os feriados, pois certamente o sistema não conhece os feriados brasileiros e paulistanos.

2) Há risco de as informações retornadas não estarem corretas, por erro de configuração no servidor MT5 da corretora.

3) A B3 às vezes altera horários de alguns ativos, em função de horário de verão e outros fatores. Vc vai confiar que o pessoal da corretora vai manter isso atualizado na plataforma?

Eu, pessoalmente, acho mais seguro verificar se o mercado está aberto DE FATO, usando alguma das formas sugeridas nesta thread (se estão ocorrendo negócios, se novos candles estão sendo formados, se as cotações estão mudando, etc.).

Compartilhamos da mesma analise.

[]'s

 
thecarllos:
Existe alguma classe/função na linguagem de programação mql5 que identifica o início do funcionamento da bolsa (B3)?

Em pesquisa, encontrei este código (mas não testei). Você poderia testa-lo e depois comentar aqui.

//+------------------------------------------------------------------+
//| CHECANDO SE MERCADO ESTA ABERTO                                  |
//+------------------------------------------------------------------+
bool market_open(string symbol)
  {
   if(StringLen(symbol)>1)
     {
      datetime begin=0;
      datetime end=0;
      datetime now=TimeCurrent();
      uint     session_index=0;

      MqlDateTime today;
      TimeToStruct(now,today);
      if(SymbolInfoSessionTrade(symbol,(ENUM_DAY_OF_WEEK) today.day_of_week,session_index,begin,end)==true)
        {
         string snow=TimeToString(now,TIME_MINUTES|TIME_SECONDS);
         string sbegin=TimeToString(begin,TIME_MINUTES|TIME_SECONDS);
         string send=TimeToString(end-1,TIME_MINUTES|TIME_SECONDS);

         now=StringToTime(snow);
         begin=StringToTime(sbegin);
         end=StringToTime(send);

         if(now>=begin && now<=end)
            return true;

         return false;
        }
      else return false;
     }
   Print("Ativo invalido!!!!!");
   return false;
  }

[]'s

 
Joscelino Celso de Oliveira:

Em pesquisa, encontrei este código (mas não testei). Você poderia testa-lo e depois comentar aqui.

[]'s

bool  SymbolInfoSessionTrade( 
   string            name,                // nome do ativo 
   ENUM_DAY_OF_WEEK  day_of_week,         // dia da semana 
   uint              session_index,       // índice da sessão 
   datetime&         from,                // hora de início da sessão 
   datetime&         to                   // hora de término da sessão 
   );

Esta função retorna se o dia que você esta é um dia válido de sessão, Joscelino Celso, aparentemente este função rodou tranquilamente aqui para mim dentro do esperado! 
 
Joscelino Celso de Oliveira:

Em pesquisa, encontrei este código (mas não testei). Você poderia testa-lo e depois comentar aqui.

[]'s

Boa tarde,

funcionaria se as corretoras implantassem essa informação nas especificações dos ativos.


Razão: