English Русский 中文 Español Deutsch 日本語
Princípios de transformação de tempo em negociações intraday

Princípios de transformação de tempo em negociações intraday

MetaTrader 4Negociação | 19 fevereiro 2016, 12:48
748 0
kamal
kamal

Introdução

A homogeneidade estatística das observações sempre desempenha um papel importante na análise de movimentos de preços anteriores. Quando tal homogeneidade ocorre, é possível estudar profundamente as propriedades do processo para a revelação de regularidades que contribuem para a construção de um sistema de negociação. Mas é um fato bem conhecido, e será provado mais tarde que, mesmo na primeira aproximação o processo de taxa de câmbio não é homogêneo, ou seja, há uma heterogeneidade, relacionada com a atividade de diferentes sessões de negociação: Americana, europeia, asiática e alterna entre elas.

Ouso dizer que alguns dos novos desenvolvedores de sistemas e nem todos os "experientes" pensam que mesmo os indicadores móveis mais simples de tipo médio, relacionados ao tempo, são unidades realmente diferentes em diferentes partes do dia. Sem dúvida, existem sistemas, formulados em termos de preços, não de tempo. Um exemplo típico: sistemas com base nos modelos renko e kagi, mas são minoria. Mas, repito, a maioria deles estão vinculados com o tempo, geralmente indiretamente, através de indicadores.

Todos os acima, obviamente, referem-se apenas a sistemas intraday. Para prazos maiores, mesmo que não haja sazonalidade, não é tão evidente. E na negociação intraday é essencial e, muitas vezes, leva ao fato de que o sistema mostra rentabilidades diferentes em tempos diferentes. Vamos nos deter nos fatores que causam esses efeitos e nas formas de superá-los.


Teoria

Do ponto de vista das estatísticas de processos acidentais, o processo da mudança de preço à primeira vista é geralmente tratado como um certo tipo de difusão, ou seja, a transferência de uma substância ou de energia a partir de uma zona de alta concentração num espaço com baixa concentração. Sabemos que a transformação de tempo traz martingais contínuos para um movimento browniano arranjado de maneira relativamente simples.

Não me detendo sobre a questão, se o processo de mudança de preço é uma difusão ou martingale, observaremos que nada impede a comutação da mesma forma do processo de transformação de tempo para algo organizado de forma mais simples, ou seja, um processo de tempo estatisticamente homogêneo. Para este propósito, seria natural utilizar barras não com divisão de tempo, mas simplesmente com um número fixo de créditos, por exemplo, uma barra contém não 60 minutos, mas, por exemplo, 1000 créditos.

Essa teoria é chamada operacional e é natural para o processo de transformação de tempo. Neste caso, o processo tem um desvio médio estatisticamente constante, o que permite detectar de forma mais clara a atmosfera do mercado e separá-la das flutuações acidentais com eficiência. E note que o uso de indicadores comuns não só seria possível, mas também muito mais homogêneo. Mas, infelizmente, o MetaTrader 4 ainda não contém tal opção. Então, vamos utilizar um outro método: reorganizar o sistema com um auxílio para o tempo. Abaixo estão exemplos de indicadores alterados. Mas primeiramente analisaremos a heterogeneidade que estamos nos referindo.


Dados estatísticos

Um gráfico de pares de moedas exóticas mostra nitidamente que a atividade no mercado é reduzida em uma certa parte de um dia. Por exemplo:



Além disso, os mesmos efeitos são observados em pares de moedas populares. Isso atrai o interesse para um exame mais detalhado de volumes e comportamento da volatilidade. É claro que, para uma melhor compreensão das flutuações de volatilidade intraday, é muito importante o comportamento dos volumes, ou seja, créditos em uma barra. Mas o próprio volume é um valor acidental, por isso precisamos dele para se referir à média histórica. Caso a estatística "matéria-prima" se comporte de uma maneira "errada" essa referência pode não parecer legal.

Para a verificação destas hipóteses vamos escrever um indicador simples - VolumeEsperado, que vai encontrar uma média histórica da quantidade de créditos por hora, histPasso passos anteriores, cada passo é um intervalo ao longo do dia. O valor típico destes parâmetros é por conseguinte de 100 e 1. O teste é realizado no calendário H1, em outros calendários intraday os parâmetros devem ser alterados. Aqui está o código indicador:
//+------------------------------------------------------------------+
//|                                             Expected Volumes.mq4 |
//|                                     Copyright © 2007, Amir Aliev |
//|                                      http://finmat.blogspot.com/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2007, Amir Aliev"
#property  link      "http://finmat.blogspot.com/"
//---- 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
//---- input parameters
extern int hist_steps = 100;      // Number of observations
extern int span = 1;              // Days to step back each time 
//---- buffers
double ExtMapBuffer1[];
int sum;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicators
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
//----
   short_name = "Expected volumes(" + hist_steps + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars = IndicatorCounted();
   int rest = Bars - counted_bars;
   int j, k, u;
//----     
   while(rest >= 0)
     {
      if(Bars - rest < span * 23 * hist_steps) 
        {
         ExtMapBuffer1[rest] = 0;     
         rest--; 
         continue;                                   
        }
      sum = 0;
      j = 0;
      k = 0;
      u = 0;
      while(j < hist_steps && k < Bars) 
        {
         if(TimeHour(Time[rest+k]) == TimeHour(Time[rest]))
           {
            u++;
            if(u == span)
              {
               u = 0;
               j++;
               sum += Volume[rest + k]; 
              }
            k += 23;
           }
         k++;
        }
      ExtMapBuffer1[rest] = sum / hist_steps;     
      rest--;                                    
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Para exemplos divididos em dias de semana, a verificação da homogeneidade estatística das observações deve ser independente. Para este propósito atribua intervalo=5. Obtemos o seguinte:

As curvas vizinhas são quase idênticas. Isso significa que a volatilidade, avaliada em créditos por hora, é estatisticamente homogênea. A estrutura deste volatilidade resulta das fotos abaixo (esquerda - EURUSD, direita - USDJPY):


Eles mostram vividamente três picos de atividade de pregões: Asiático, europeu e americano. Note-se, que a divisão exata para estes pregões não é convencional, algumas vezes, outros pregões são apontados. Bem, podemos notar algumas peculiaridades, por exemplo, o tipo de atividade durante o pregão americano (repete em ambos os gráficos).


Mudança de indicadores

Ao alterar os indicadores, é importante entender exatamente como o tempo está incluído neles. Para indicadores simples, como Média Móvel, isto é bastante fácil, embora seja difícil de alterar, por exemplo, um Jacaré.

Finalmente, seria mais racional introduzir um calendário "operacional". Mas agora vamos tentar alterar alguns indicadores simples. O mais primitivo deles é volumes corrigidos, volumes reais são divididos por aqueles esperados. Assim, o desvio para este ou aquele lado a partir de 1 deste indicador reflete o aumento/diminuição da atividade no mercado. O código é muito simples. Ele está incluído em um arquivo em anexo a este artigo.

O próximo exemplo é a Média. Na verdade, precisamos apenas ponderar a característica da barra em que a média é construída (por exemplo, aberta), pela quantidade de créditos na barra. O número final não é exatamente igual a soma dos valores de todos os créditos. Para uma estimativa mais precisa precisamos pegar não uma média “aberta”, mas uma média ponderada em um barra. O indicador é construído da força bruta, e é por isso que seu cálculo requer custos substanciais e custos de computação realmente desnecessários. É por isso que mais um parâmetro é adicionado - a quantidade de barras do passado, que um indicador vai desenhar, é, por padrão, igual a 500. Além disso, o período da média não é definido em barras, mas na quantidade de créditos. Aqui está o código:
//+------------------------------------------------------------------+
//|                                                Corrected SMA.mq4 |
//|                                     Copyright © 2007, Amir Aliev |
//|                                    http://finmat.blogspot.com/   |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Amir Aliev"
#property link      "http://finmat.blogspot.com/"
//----
#property indicator_chart_window
#property indicator_color1 Red
//---- input parameters
extern int MA_Ticks = 10000;
extern int MA_Shift = 0;
extern int MA_Start = 500;
//---- indicator buffers
double ExtMapBuffer[];
double ExpVolBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
   SetIndexStyle(0, DRAW_LINE);
   SetIndexShift(0, MA_Shift);
   IndicatorBuffers(2);
//---- indicator buffers mapping
   SetIndexBuffer(0, ExtMapBuffer);
   SetIndexBuffer(1, ExpVolBuffer);
   SetIndexDrawBegin(0, 0);  
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars = IndicatorCounted();
   int rest  = Bars - counted_bars;
   int restt = Bars - counted_bars;
   double sum;                               
   int ts;                                   
   int evol;                                 
   int volsum;
   int j;
//----
   while(restt >= 0)
     {
       volsum = 0;
       for(int k = 0; k < 30; k++) 
           volsum += iVolume(NULL, 0, restt + k*24); 
       ExpVolBuffer[restt] = volsum / 30;
       restt--;
     }
//----
   while(ExpVolBuffer[rest] == 0 && rest >= 0) 
       rest--;
   rest -= MA_Ticks / 200;
   if(rest > MA_Start) 
       rest = MA_Start;  
//----
   while(rest >= 0)
     {
       sum = 0;
       ts = 0;
       j = rest;
       while(ts < MA_Ticks)
         {
           evol = ExpVolBuffer[j];
           Print("Evol = ", evol);
           if(ts + evol < MA_Ticks)
             {
               sum += evol * Open[j];
               ts += evol;
             }
           else
             {
               sum += (MA_Ticks - ts) * Open[j];
               ts = MA_Ticks;
             }
           j++;
         }
       ExtMapBuffer[rest] = sum / MA_Ticks;
       rest--;
     }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Depois que os indicadores simples são escritos, alterar os mais complexos não será um problema. Assim, por exemplo, no código MACD uma média ajustada deve ser usada ao invés de uma média simples. O código correspondente também é dado no anexo.

Note que para um cálculo rápido da média corrigida, a média empírica de créditos por hora deve ser calculada uma vez, e não em tempo real, a fim de evitar novos cálculos. Isto foi omitido aqui, mas se conduzirmos uma escala completa de testes/otimização em um histórico, a produtividade avança. Além disso, existem admiradores de uma outra abordagem de construção de médias ajustadas sobre volumes, que deve ser discutida separadamente.

Parece sem sentido para média de volumes de períodos anteriores: os volumes disponíveis utilizados como coeficientes são suficientes para o cálculo da média. Aqui está um breve exemplo de um código. Ainda, deve-se notar, que por motivos técnicos, tal média é a melhor de todas utilizadas em pequenos calendários, como M1-M5.

//+------------------------------------------------------------------+
//|                                             Corrected SMA II.mq4 |
//|                                     Copyright © 2007, Amir Aliev |
//|                                      http://finmat.blogspot.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Amir Aliev"
#property link      "http://finmat.blogspot.com/"
 
#property indicator_chart_window
#property indicator_color1 Red
//---- input parameters
extern int MA_Ticks = 1000;
//---- indicator buffers
double sum = 0;                               
int ticks = 0;
bool collected = false;
bool started = false;
int fbar = 0;
double ExtMapBuffer[];
int oldRange = 0;
int lbarVol = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
   SetIndexStyle(0, DRAW_LINE);
//---- indicator buffers mapping
   SetIndexBuffer(0, ExtMapBuffer);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int rest = Bars - IndicatorCounted();
   if(! rest) 
       return (0);
   Print("Ticks = ", ticks);
   Print("Rest = ", rest);
   Print("fbar = ", fbar);  
   rest--;
   fbar += rest;
   while(!collected && (rest >= 0))
     {
      if(ticks + Volume[rest] < MA_Ticks)
        {
         ticks += Volume[rest];
         sum += Volume[rest] * Open[rest];
         if(!started)
           {
            fbar = rest;
            started = true;
           }
         rest--;
         continue;
        } 
      collected = true;
     }
   if(! collected) 
       return (0);
 
   ticks += (Volume[rest] - lbarVol);
   sum += (Volume[rest] - lbarVol) * Open[rest];
   lbarVol = Volume[rest];
   while(ticks > MA_Ticks)
     {
       Print("fbar-- because bar ticks reaches 1000");
       ticks -= Volume[fbar];
       sum -= Volume[fbar] * Open[fbar];
       fbar--;
     }
   ExtMapBuffer[rest] = sum / ticks;
   rest--;
   while(rest >= 0)
     {
      ticks += Volume[rest];
      sum += Volume[rest] * Open[rest];
      lbarVol = Volume[rest];
      while(ticks > MA_Ticks)
        {
         Print("fbar-- because of new bar ");
         ticks -= Volume[fbar];
         sum -= Volume[fbar] * Open[fbar];
         fbar--;
        }
      ExtMapBuffer[rest] = sum / ticks;
      rest--;
     } 
//----
   return(0);
  }
//+------------------------------------------------------------------+

No entanto, o autor pensa que utilizar este indicador pode ser útil em alguns casos, em geral, tem o significado, diferente do descrito neste artigo. A ideia de levar em conta preços, para a qual havia uma grande "luta" no mercado, é bastante artificial, porque desvios pequenos de valores podem ser causados por razões técnicas e não de mercado. Além disso, não parece razoável levar em conta a mudança de volatilidade (é disso que estamos tratando).

Cada indicador apresentado pode ser alterado permitindo tarefas específicas, por exemplo, alterar uma média para contabilizar a soma dos valores dentro de uma barra ou alterar parâmetros de um cálculo de média. Lembre-se, calculamos através de “aberto”, o que cria visualmente uma sensação de atraso - a concepção de transformação de tempo e a desvolatilização permitem uma interpretação ampla, incluindo interpretações não abordadas neste artigo, como a volatilidade sazonal.


Conclusão

Deve-se notar que, enquanto a média de preço é um valor bastante instável e de difícil previsão, a volatilidade, por exemplo, o segundo momento de incremento. Do ponto de vista das estatísticas é um pouco mais "agradável" e possui muitas características bem conhecidas, como conjunto de propriedades, efeito de alavanca nos mercados de ações e outros.

Do ponto de vista da análise técnica, é por isso que a concepção do próprio tempo operacional é bastante útil e natural. É claro que o fato de que, por exemplo, algumas notícias importantes sobre o estado de economia são liberadas em um determinado momento, quebram seriamente a homogeneidade e raramente são "tratadas". Mas na maioria dos casos, utilizar a transformação de tempo permite obter resultados mais estáveis e aumentam a rentabilidade de uma estratégia de negociação.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1455

Outros artigos do autor

Transferência de um Código Indicador para um Código Expert Advisor. Estrutura do Indicator Transferência de um Código Indicador para um Código Expert Advisor. Estrutura do Indicator
Este artigo trata sobre formas de transferência de um código indicador para um código Expert Advisor e sobre a escrita de Expert Advisors sem convocar indicadores personalizados, e com todo o código do programa para o cálculo dos valores dos indicadores necessários dentro do Expert Advisor. Este artigo fornece um esquema geral de uma estrutura de indicador, emulação de buffers indicadores no Expert Advisor e a substituição da função IndicatorCounted (). O artigo destina-se para leitores com experiência de programação na linguagem MQL4.
Usando o Skype para enviar mensagens de um Expert Advisor Usando o Skype para enviar mensagens de um Expert Advisor
O artigo trata de como enviar mensagens internas e SMS do Expert Advisor para celulares utilizando o Skype.
Transferência de um Código Indicador para um Código Expert Advisor. Esquemas da estrutura geral de um Expert Advisor e funções indicadoras Transferência de um Código Indicador para um Código Expert Advisor. Esquemas da estrutura geral de um Expert Advisor e funções indicadoras
Este artigo trata sobre formas de transferência de um código indicador para um código Expert Advisor e sobre a escrita de Expert Advisors sem convocar indicadores personalizados, e com todo o código do programa para o cálculo dos valores dos indicadores necessários dentro do Expert Advisor. Este artigo fornece um esquema geral de mudança do Expert Advisor e a ideia de construir uma função indicadora baseada em um indicador personalizado. O artigo destina-se para leitores com experiência de programação na linguagem MQL4.
Teste de Visualização: Histórico de negociações Teste de Visualização: Histórico de negociações
O artigo descreve as possibilidades de visualização convenientes do histórico de negociações ao visualizar testes.