Anomalia de Dados (Problema do Servidor?)

 

Bom dia! Uma vela está faltando hoje (13/09/2021), para ser mais preciso a de 00:52 no gráfico de M1.

Não deveria ter ao menos um Doji ali? Observei que esse fenômeno é mais comum de segunda-feira nos primeiros 30 minutos. Mas porque isso foi acontecer com o mercado já em movimento? Porque não colocar apenas um doji para representar ausência de negociação? (um tracinho que seja) Isso quebra as minhas pernas no meu EA.

Coloquei linhas verticais separando de 5 em cinco minutos para ilustrar:

Anomalia

Meu EA separa as velas em grupos de 5. Minha matriz deveria considerar um doji (mesmo que o servidor não considere nada) nesses casos.

Alguma sugestão de como contornar isso?

 
israeltandrade:

Bom dia! Uma vela está faltando hoje (13/09/2021), para ser mais preciso a de 00:52 no gráfico de M1.

Não deveria ter ao menos um Doji ali? Observei que esse fenômeno é mais comum de segunda-feira nos primeiros 30 minutos. Mas porque isso foi acontecer com o mercado já em movimento? Porque não colocar apenas um doji para representar ausência de negociação? (um tracinho que seja) Isso quebra as minhas pernas no meu EA.

Coloquei linhas verticais separando de 5 em cinco minutos para ilustrar:


Meu EA separa as velas em grupos de 5. Minha matriz deveria considerar um doji (mesmo que o servidor não considere nada) nesses casos.

Alguma sugestão de como contornar isso?

Isto é em qual ativo?

É backtest, DEMO ou conta Real?

O ativo é líquido?

Momentos onde não há negociação deveria ter um buraco em branco, pois o MT5 preserva a escala de tempo.

;)

 
Flavio Jarabeck:

Isto é em qual ativo?

É backtest, DEMO ou conta Real?

O ativo é líquido?

Momentos onde não há negociação deveria ter um buraco em branco, pois o MT5 preserva a escala de tempo.

;)

- NZDUSD

- DEMO (MT5 da Metaquotes)

- Bem ele é um dos majors.

- Eu imaginei que isso se referia a um "mercado de balcão" (não sei se isso se aplica ao Forex) e portanto antecedendo a primeira vela do gráfico. Imaginei que quando o mercado já está rolando e NÃO há negociações, o MT5 colocava Doji. Se não é o caso, tenho de compensar isso com alguma função.

 

Resolvi aqu criando uma função que substitui a data ausente por uma data fake (uma totalmente irrelevante) usando contadores. Valeu pessoal!

 

Um exemplo aqui representando dojis e velas ausentes por 0, velas verdes por 1 e velas vermelhas por 2. O problema aqui é resolvido para as velas de segunda feira à 00:00 (elas estão ausentes em alguns pares, senão todos, não conferi):

//+------------------------------------------------------------------+
//|                                                 completaData.mq5 |
//|                                       Israel Teixeira de Andrade |
//|                                        tradermoderado.weebly.com |
//+------------------------------------------------------------------+
#property copyright "Israel Teixeira de Andrade"
#property link      "tradermoderado.weebly.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime       dataInicial = D'2021.01.18 00:00';
   datetime       dataFinal = D'2021.01.18 00:10';
   datetime       dataFake = D'1984.04.01 00:30';
   MqlRates       dadosVelas[];
   int            diferencaSegundos;
   int            divisorPeriodo = 60;
   int            diferencaVelas;
   int            direcaoVelas[];

//--- Estabelece o divisor dos segundos de acordo com o timeframe
   if(Period() == PERIOD_M1)
     {
      divisorPeriodo = 60;
     }
   else
      if(Period() == PERIOD_M5)
        {
         divisorPeriodo = 300;
        }
      else
         if(Period() == PERIOD_M15)
           {
            divisorPeriodo = 900;
           }

//--- Copia os dados das velas de acordo com o que é disponibilizado no servidor e isola o horário das mesmas
   CopyRates(Symbol(), Period(), dataInicial, dataFinal, dadosVelas);
   Print("Vetor Original:");
   ArrayPrint(dadosVelas);

//--- Confirma se o primeiro horário copiado é diferente do proposto e calcula a diferença em segundos
   if(dadosVelas[0].time > dataInicial)
     {
      Print("Diferença de horários! Ajustando...");
      diferencaSegundos = (int) dadosVelas[0].time - (int) dataInicial;
     }
   else
      if(dadosVelas[0].time < dataInicial)
        {
         Print("Diferença de horários! Ajustando...");
         diferencaSegundos = (int) dataInicial - (int) dadosVelas[0].time;
        }
      else
        {
         Print("Tudo ok, não há necessidade de ajuste.");
         diferencaSegundos = 0;
        }
   Print("diferencaSegundos: ", diferencaSegundos);

//--- Cálculo da diferença em número de velas:
   diferencaVelas = diferencaSegundos / divisorPeriodo;
   Print("diferencaVelas: ", diferencaVelas);

//--- Aumenta o tamanho do vetor de acordo com o número de elementos faltantes
   ArrayResize(dadosVelas, (ArraySize(dadosVelas) + diferencaVelas), 0);
   Print("Vetor Aumentado:");
   ArrayPrint(dadosVelas);

//--- Move os elementos da vetor para a direita (liberando os espaços iniciais)
   for(int i = ArraySize(dadosVelas) - 1; i - diferencaVelas >= 0; i--)
     {
      dadosVelas[i] = dadosVelas[i - diferencaVelas];
     }
   Print("Vetor Deslocado:");
   ArrayPrint(dadosVelas);

//--- Substitui os primeiros elementos por uma data falsa
   for(int i = 0; i < diferencaVelas; i++)
     {
      dadosVelas[i].time = dataFake;
     }
   Print("Vetor editado com data falsa nos primeiros índices:");
   ArrayPrint(dadosVelas);

   ArrayResize(direcaoVelas, ArrayRange(dadosVelas, 0), 0);

//--- Estabelece a direção das velas
   for(int i = 0; i < ArraySize(dadosVelas); i++)
     {
      if(dadosVelas[i].time != dataFake)
        {
         if(dadosVelas[i].close > dadosVelas[i].open)
           {
            direcaoVelas[i] = 1;
           }
         else
            if(dadosVelas[i].close < dadosVelas[i].open)
              {
               direcaoVelas[i] = 2;
              }
            else
               if(dadosVelas[i].close == dadosVelas[i].open)
                 {
                  direcaoVelas[i] = 0;
                 }
        }
      else
        {
         direcaoVelas[i] = 0;
        }
     }

//--- Substitui os primeiros dados por datas reais
   for(int i = diferencaVelas - 1; i >= 0 ; i--)
     {
      dadosVelas[i].time = dadosVelas[i + 1].time - divisorPeriodo;
     }
   Print("dadosVelas:");
   ArrayPrint(dadosVelas);
   Print("direcaoVelas:");
   ArrayPrint(direcaoVelas);
  }
//+------------------------------------------------------------------+
Mereço publicar um artigo? :P

Note que isso resolve as datas faltantes no começo e cria um vetor com a direção de velas "fantasmas". Criei um outro script/função que resolve caso o problemas seja no meio (como no exemplo inicial), se alguém tiver interesse em conferir posto aqui também, um abraço!
Razão: