Princípios de transformação de tempo em negociações intraday
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.
//+------------------------------------------------------------------+ //| 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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso