MetaFórmulas: Indicadores customizados usando formulas

por: Omas Reis - set/06


Indicadores customizados usando fórmulas: MetaFormulas.

Além dos indicadores padrão, o terminal enfoque permite a criação de indicadores customizados nos gráficos. O recurso é implementado na forma de scripts nas linguagens JavaScript e VBScript. Essas linguagens, embora poderosas e com recursos avançados de cálculo e lógica, requerem conhecimentos de programação relativamente avançados. Notamos que a maioria dos usuários tem dificuldade em programar seus indicadores nestas linguagens. Por isso implementamos uma nova maneira de especificar indicadores customizados usando apenas fórmulas simples: as MetaFormulas.

Introdução às MetaFormulas

Os gráficos de preços são construídos a partir de séries históricas. As séries históricas consistem em sequências de preços associados aos diferentes períodos de tempo. Dois grupos principais de séries são usados: as série diárias (onde cada registro ou barra corresponde a um dia de negociação) e as séries intraday (com cada barra correspondendo a um intervalo de alguns minutos).

Os indicadores da análise técnica são calculados usando dados contidos nessas série históricas. Por exemplo, um indicador bem conhecido é a média móvel aritmética (MMA). Ela consiste em somar os preços de fechamento dos últimos N períodos e dividir a soma por N, onde N é o número de períodos da média, o parâmetro desse indicador. A média movel tem a propriedade de filtrar os ruídos de curto prazo nos preços, mostrando mais claramente as tendências.

Outros indicadores podem usar outros dados das séries, como abertura, máximo, mínimo, volume, número de negócios, mas o padrão se repete: os indicadores associam preços de períodos diferentes, e tentam extrair das séries novas formas de análise e perspectivas diferentes.

As MetaFormulas incluem os campos da série de preços na forma de variáveis pré definidas. Estas variáveis são:

Símbolo Significado
C Close - Preço de fechamento da barra
H High - Preço máximo da barra
L Low - Preço mínimo da barra
O Open - Preço de abertura
Vol Volume negociado na barra
Data Data da barra
Time Time - Data e hora do início da barra (a hora é válida só para series intraday)
Col Coluna da barra - 1 é a primeira barra da série
Neg Número de negócios
Minuto Minuto inicial da barra

Operando com arrays de valores

Cada uma dessas variáveis é na verdade um conjunto de valores - um array - com um valor correspondente a cada barra da série. Se a série tiver 1000 barras, o array de fechamentos C terá também 1000 valores, um para cada barra. Para ilustrar isso vamos implementar um indicador simples, o preço médio. A formula é:

PM := (H+L)/2

Ou seja, máximo mais mínimo dividido por dois. Essa formula especifica que a operação deve ser repetida para cada barra. Exemplo:

PM1 := (H1+L1)/2
PM2 := (H2+L2)/2
.....
PM100 := (H100+L100)/2

Outra característica das MetaFormulas: assim como as variáveis, todos os resultados intermediários de calculos são também arrays, com o mesmo número de valores. A variável PM na fórmula acima tem também um valor para cada barra da série.

Definição e atribuição de novas variáveis

A idéia das MetaFormulas é reduzir ao máximo o número de linhas necessárias a definição de um indicador. As vezes porém, o indicador apresenta alguma complexidade e é conveniente quebrar o cálculo em etapas, usando variáveis para conter valores intermediários.

Veja o exemplo do indicador definido abaixo:


meuifr:=ifr(9); //linha 1. atribuição mov(
meuifr,3); //linha 2. resultado plotado

Na linha 1 temos a definição de uma variável chamada meuifr. Essa variável recebe o valor do IFR (Índice de Força Relativa) de 9 períodos da série. O símbolo := indica um comando de atribuição de valor. O IFR, assim como outros indicadores populares na análise técnica, é uma função pré-definida nas Metaformulas, facilitando o trabalho de criar o seu indicador customizado.

Linhas plotáveis: os resultados de um indicador

Ainda no indicador acima, a linha 2 calcula a média movel aritmética de 3 períodos da variável meuifr. Como o valor da segunda linha não é atribuído a nenhuma variável, o sistema de MetaFormulas entende que se trata de uma linha plotável, a ser traçada no gráfico. Ou seja, as linhas que não contém atribuição são consideradas resultados de cálculo e vão para o gráfico. Isso facilita escrever indicadores com apenas uma linha.

Cada indicador pode traçar até 3 linhas (resultados) no mesmo gráfico. Notar também o ponto e virgula ; no final de cada linha. Esse símbolo é necessário como separador das várias linhas de uma fórmula (se a fórmula tiver mais que uma linha).

Cálculos lógicos

Condições lógicas são importantes na definição de indicadores. Um indicador pode, por exemplo, especificar o uso do maior valor entre abertura e fechamento. Isso requer uma comparação.

Em outros casos, a ocorrência de um conjunto de condições simultâneas pode determinar um ponto de compra. É necessário escrever uma condição lógica: que tem como resultado verdadeiro ou falso.

Voce pode usar os operadores > , < , = ,>= , <= , <>, or e and em fórmulas. Com esses operadores é possível construir condições complexas de entrada e saída no mercado, com base nos valores dos indicadores calculados.

Nas Metaformulas, as variáveis lógicas são variáveis numéricas comuns. O valor 0 corresponde a condição falsa e 1 corresponde a condição verdadeira.

x:=ifr(9)>60; //x=1 se condição verdadeira
y:=DmiAdx(14)>50;
x and y;
//plota resultado (grafico de serra com valores 1 ou 0

Observe o exemplo acima. Na primeira linha o valor da variável x será 1 nas barras onde o ifr(9) for maior que 60 e 0 para todas as outras. Na segunda linha, a variável y será 1 para as barras onde o indicador ADX de 14 períodos for maior que 50. A terceira linha plota o resultado final: 1 para as barras onde os valores de x e y forem verdadeiros e 0 para aquelas onde a expressão é falsa.

Outras funções lógicas podem ser usadas (veja no final deste texto o resumo das funções):

if(o>c,o,c);

A fórmula acima usa a função IF e retorna o maior valor entre a abertura e o fechamento.

Comentários

Programas de computador devem ser comentados, para documentar os cálculos e a lógica utilizada. As MetaFórmulas podem conter comentários no estilo da linguagem C: duas barras iniciam um comentário que vai até o final da linha. Os comentários são ignorados pelo computador quando a formula é calculada, servindo apenas para explicar o cálculo para seres humanos que lerem a formula. Exemplo:


// ----------------------------------------- // meu detector de volumes atípicos // ----------------------------------------- nper:=90; //parametro: tamanho do periodo (90 dias) m:=mov(Vol,nper); //calc media dos volumes (usa média movel) dp:=desvpad(Vol,nper); //calc desvio padrao dos Vols nos ultimos nper dias vmais :=m+2*dp; //volume medio acrescido de 2 dps (inclui 95% das ocorrencias) i:=(Vol>vmais); //dias com vol > vmais //plots: m; //plota media dos volumes vmais; //plota volume limite vol*i; //destaca volumes acima do limite de 2 dp

No indicador acima, as partes na cor roxa são os comentários incluídos por quem implementou o indicador. Esse indicador, plotado junto com o Volume, gera o gráfico abaixo. A linha azul é o m; a vermelha o vmais; e a pontilhada azul mostra os volumes destacados.

Not A Number

Em algumas situações um array pode conter um ou mais valores indefinidos. Por exemplo, uma média movel aritmética só pode ser calculada depois que a série contiver o número de períodos da média. Antes disso, nas primeiras barras da série, o valor da média é indefinido.

Em outros casos, uma fórmula contém uma divisão por zero em alguma das barras. Ou a série contém um período sem negociação. Nestes casos, a variável recebe o valor NaN, ou Not a Number, para indicar que aquele valor é indefinido. Qualquer operação que involva um NaN resulta também em NaN.

Quando uma linha é plotada, os pontos com valor NaN são ignorados (omitidos do gráfico). Isso é uma forma de manter todos os arrays alinhados, com o mesmo número de valores (mesmo que alguns sejam indefinidos)

Criando um indicador tipo MetaFormula no Enfoque

Para criar um indicador tipo MetaFormula no gráfico do terminal enfoque, selecione a janela do gráfico e tecle i . Isso abre a lista de indicadores no grafico. Na lista de indicadores disponíveis à esquerda, dê dois clicks na opção MetaFormula (customizada). Isso inclui uma MetaFormula na lista de indicadores usados neste gráfico.

Selecione a janela onde o indicador será plotado: a escala. Voce pode plotar o indicador junto com as barras do ativo, em janela de indicador de escala arbitrária ou em janela de escala de 0 a 100. Se o indicador for um preço (como as médias moveis) plote junto com as barras. Se for um indicador de 0 a 100%, use a escala correspondente.

Especifique o nome do indicador e o estilo/cor das linhas. O indicador pode conter até 3 linhas. Isso depende do número de linhas plotáveis definidas na fórmula.

Aperte o botão [Edita Fórmula] para escrever a fórmula do indicador. Isso abre o ambiente de desenvolvimento de MetaFormulas, como ilustrado na figura abaixo.

Escreva a fórmula e use o botão calcula para testar. Se houver erro, o motivo pode ser encontrado na página de Debug. Se a formula estiver ok, os valores são calculados e exibidos no gráfico anexo e na planilha de valores. Se quiser exportar a planilha para o Excel ou outro aplicativo para mais análises, use o botão direito do mouse na planilha para copiar.

O campo Plots permite exibir no gráfico as outras linhas plotáveis do indicador (uma por vez).

 

 

Resumo das funções disponíveis nas MetaFormulas

Mov(A,N) - Média Movel Aritmética de N períodos do array A

MovExp(A,N) - Média Móvel Exponencial de N períodos do array A

Sum(A,N) - Soma dos ultimos N periodos do array A

SumAc(A) - Soma acumulada dos termos do array A (desde o inicio) (jul/07)

DesvPad(A,N) - Desvio Padrão do array A nos ultimos N periodos

MinVal(A,N) - Mínimo do array A nos N períodos anteriores

MaxVal(A,N) - Máximo do array A nos N períodos anteriores

Roc(A,N) - Rate of Change do array A nas ultimas N barras. Uma variação de 100% é indicada pelo valor 1. Valores de N positivo indicam Roc entre passado e o presente.

exemplo: Roc(C,10) retorna a variação dos fechamentos nos 10 períodos anteriores

RocP(A,N) - Rate of change percentual. Semelhante a Roc(), porém 100% de variação corresponde ao valor 100.

Cross(A,B) - Retorna 1 quando a linha do array A cruzar acima da do array B (Retorna 0 para todas as outras barras onde não ocorre esse cruzamento). Notar que a função só sinaliza quando A cruzar para cima de B. Para obter o resultado oposto (i.e. A cruzar para baixo de B) usar Cross(B,A)

MaxAB(A,B) - Retorna array com maximos dos arrays A e B, comparando cada periodo individualmente.

MinAB(A,B) - Retorna array com minimos dos arrays A e B

Ref(A,N) - Essa função retorna o valor do array A no período N barras atrás. (N p/ trás = positivo) . Ref é uma função muito útil, pois permite associar vários valores do mesmo array em diferentes barras.

exemplo: Ref(H,1) retorna um array com máximos da barra anterior

Array(p1,p2,p3,p4,...) - ret array de valores. Essa função permite definir os valores de um array um a um. Útil para importar um série da planilha ou de um arquivo formato texto diretamente para dentro da formula.

exemplo: A:=Array(10,9,8,7,8,9,11,10,9,8);

Funções de indicadores pré definidos

Todos os indicadores existentes no Gol podem ser usados em MetaFormulas. São eles:

Ifr(N) - Indice de força relativa de N períodos

DmiPdi(N) - Linha DI+ do DMI de Welles Wilder de N períodos

DmiNdi(N) - Linha DI- do DMI

DmiAdx(N) - Linha Adx do DMI

BBtop(N,NDP) - Bollinger Band superior de N períodos e NDP desvios padrão

BBbot(N,NDP) - Bollinger Band inferior

BBwidth(N,NDP) - Bollinger Band Width

BpercB(N,NDP) - Bollinger Percent B

MaCD(N1,N2) - MaCD com parâmetros N1 e N2

sMaDC(N1,N2) - sinal do MaCD

MaCDHist(N1,N2) - Histograma do MacD

MMA(N) - Média Movel Aritmética dos fechamentos. Mesmo que Mov(C,N)

MME(N) - Média Movel Exponencial dos fechamentos. Mesmo que MovExp(C,N)

ParSAR(aAFIni,aAFMax,aAFInc) - Stop and Reverse do parabólico

ParPos(aAFIni,aAFMax,aAFInc) - Posição indicada pelo parabólico

StocK(N) - Estocástico K de N períodos

StocD(N) - Estocástico D de N períodos

Obv() - On Balance Volume

Trix(N) - Trix de N períodos

TrixSinal(N) - Sinal do Trix

WpercR(N) - Willians Percent R de N períodos

Didi1(N1,N2,N3) - Linha 1 do indicador Didi (N1,N2 e N3 são parâmetros)

Didi2(N1,N2,N3) - Linha 2 do indicador Didi

Didi3(N1,N2,N3) - Linha 3 do indicador Didi

VH(N,NPerAno) - Volatilidade Historica. Para serie diária e periodo anual, usar NPerAno=252

ATR(N) - Average true range de N períodos

Funções matematicas com arrays:

Sqrt(A) Sin(A) Cos(A) Tan(A) ArcTan(A) ArcSin(A) ArcCos(A) Log(A) Exp(A) Frac(A) Int(A)

If(boolCond, TrueA, FalseA) - Se boolCond for verdadeira (i.e. diferente de zero), usa o valor do array TrueA. Caso contrário use o valor de FalseA. Os 3 parametros são arrays.

MAX(p1,p2,p3,p4,...) - Valor max nos parametros pi

MIN(p1,p2,p3,p4,...) - Valor min nos parametros pi

Constantes Matemáticas: Pi, NaN

Operadores lógicos: =, >,>=,<,<=,<>, AND , OR

nota: nenhuma precedência de cáculo é definida entre operadores lógicos. Por exemplo:

a:=b and c or d; 
Use parênteses para estabelecer essa precedência se necessário, como nos exemplos:

a:=(b and c) or d;
a:=b and (c or d);

 

 

 

Exemplos de Indicadores implementados em metafórmulas:

Os exemplos a seguir ilustram como escrever indicadores usando metaformulas:

// Bollinger Bands - plotar junto com os precos
//========= parametros
np:=20; // num de periodos do Bollinger Bands
nd:=2; // num de desvios padrao aplicados
//========= calc section
amed:=mov(c,np); // tira media movel arit dos fechamentos
adp:=DesvPad(c,np); // calc desvio padrao dos fechamentos
abbmais :=amed+nd*adp;
abbmenos:=amed-nd*adp;
//========= plots
abbmenos;
abbmais;
amed;

Talvez um dos mais complexos: o Directional Movement Index:

// DMI de Welles Wilder - plotar na escala de 0 a 100
// parâmetro do indicador: N = Número de períodos do DMI

N:=20;
//pega valores de High, Low e Close no periodo anterior
Hp:=Ref(H,1);
Lp:=Ref(L,1);
Cp:=Ref(C,1);
//calc plus directional movement (DM+)
PDM:=H-Hp;
PDM:=if(PDM>0,PDM,0);
//calc minus directional movement (DM-)
MDM:=Lp-L;
MDM:=if(MDM>0,MDM,0);
//zera o menor entre PDM e MDM
PDM:=if(PDM>MDM,PDM,0);
MDM:=if(MDM>PDM,MDM,0);
//calc true range
TR1:=Abs(H-L);
TR2:=Abs(H-Cp);
TR3:=Abs(L-Cp);
//pega TR = max(TR1,TR2,TR3);
B:=MaxAB(TR1,TR2);
TR:=MaxAB(TR3,B);
//calc medias de DM+, DM- e TR
// nota: O uso de media exponencial com periodo 2*N simula a forma como
// Welles Wilder calcula a média exponencial: A invés de usar
// k = 2/(N+1) como fator da media exponencial, ele usa k = 1/N

SPDM:=MovExp(PDM,N*2);
SMDM:=MovExp(MDM,N*2);
STR:= MovExp(TR,N*2);
//calc resultados
PDI:=SPDM/STR; //plus directional indicator
MDI:=SMDM/STR; //minus directional indicator
//calc DX

DX :=Abs(PDI-MDI)/(PDI+MDI);
ADX:=MovExp(DX,N*2);
//plots
PDI*100;
MDI*100;
ADX*100;

 

// Williams Accumulation Distribution

CA:=Ref(C,1);             //cria array c/ close anterior
TRH:=MaxAB(H,CA);         //calc True Range High
TRL:=MinAB(L,CA);         //calc True Range Low
PM:=if(C>CA,C-TRL,C-TRH); //calc Price Move
PM:=if(C=CA,0,PM);
AD:=PM*Vol;               
WAD:=SumAc(AD);           //calc soma acumulada 
//plots
WAD;

 

Historico:
- OFR: jul/07 - SumAc() func

 

(c)copr 1988-2005 Enfoque Gráfico Sistemas Ltda - todos os direitos reservados