Quem já se interessou por mercados de ações ou criptomoedas já viu essas linhas adicionais. E você provavelmente já ouviu opiniões de traders experientes de que eles não funcionam e como não usam nada. Mas eles ajudam muito e meu terminal de operações, que eu olho preguiçosamente uma vez por dia, se parece com a figura abaixo.
Como eles são todos iguais? E para quem isso pode ser útil? Você definitivamente deve se familiarizar com isso se:
- Você os usa em seu comércio
- Você está planejando escrever um robô de negociação
- Deseja implementar uma estratégia de negociação você mesmo

Um indicador técnico geralmente é uma função de janela, peso ou recorrência de preços e volumes provenientes da troca no formato de uma matriz de velas TOHLCV (tempo unix, aberto, alto, baixo, próximo, volume). Vários filtros, mínimos máximos ou outros indicadores também podem ser usados como base para cálculos subsequentes.
Média Móvel (SMA)Ao implementar indicadores, é muito conveniente usar uma abordagem de programação funcional. Por exemplo, uma média móvel, essa é apenas a média de cada valor da função de janela móvel ao preço de fechamento
function sma($close, window) { return rolling(x => mean(x), window, $close); }
onde a função mean () é o valor médio, o parâmetro window é o tamanho da janela, e rolling () é uma combinação da função window, que para cada célula atual na matriz produz uma matriz dos últimos n elementos e a operação que minimiza a janela para um número.
function rolling(operation, window, array) { let result = []; for (let i = 0; i < array.length; i++) { if (i + 1 < window) { result.push(NaN); } else { result.push(operation(array.slice(i + 1 - window, i + 1))); } } return result; }
A média móvel é um indicador de atraso e ajuda a determinar a tendência. Ele é desenhado sobreposto no gráfico de preços e os primeiros valores geralmente são descartados.

Normalmente, um par de indicadores é considerado, e o ponto em que um indicador com uma janela curta cruza um indicador com uma janela longa é considerado como um potencial ponto de entrada por baixo e um ponto de saída por cima. Na prática, uma média móvel ponderada exponencialmente é usada com mais frequência, usando uma função de janela ponderada para reduzir o efeito de atraso.
Desvio Padrão (DESVPAD)Se substituirmos a função mean () na versão anterior pela raiz da variação sd (), obteremos um desvio padrão móvel.
function stdev($close, window) { return rolling(x => sd(x), window, $close); }
A dispersão é considerada usual da maneira usual, na maioria das vezes sem correção de Bessel. A raiz da variação também é usada, uma vez que a própria variação é medida em rublos quadrados / dólares.
Bandas de Bollinger (BB)Assim, já recebemos dois indicadores básicos que já podem ser combinados e receber novos. Por exemplo, se adicionarmos ponto a ponto a média móvel e o desvio padrão, ao multiplicar por 2, obteremos a parte superior da banda de Bollinger e subtrairemos a parte inferior.

No código, ficará assim
function bb($close, window, mult) { let middle = sma($close, window); let upper = pointwise((a, b) => a + b * mult, middle, stdev($close, window)); let lower = pointwise((a, b) => a - b * mult, middle, stdev($close, window)); return { lower : lower, upper : upper}; }
onde a função pointwise não faz mais nada, mas coleta um elemento de duas matrizes usando a operação fornecida.
As bandas de Bollinger ajudam a determinar a pausa antes de um grande movimento de preços e são usadas como uma ferramenta para exibir convenientemente a volatilidade em um gráfico; o desvio padrão não pode ser exibido como uma sobreposição no mesmo gráfico que o preço, por isso é conveniente adiá-lo da média móvel.
NotaEste indicador tem uma desvantagem - ele usa funções ponderadas exponencialmente. Como exercício, você pode tentar transformá-lo, não se esqueça de levar em consideração que o desvio padrão também precisa ser calculado exponencialmente equilibrado.
Média móvel ponderada exponencialmente (EMA)Como o atraso médio móvel pode ser reduzido? Como no cálculo, são adicionados os últimos preços de fechamento, é possível entender que é possível adicionar com algum peso, reduzindo a contribuição dos preços antigos. Assim, chegamos à fórmula para uma função de janela ponderada.
se
e escolha algum tipo de constante
menos de um, obtemos um peso infinitamente decrescente, se, ao mesmo tempo, somarmos os preços a partir dos mais novos.

Os cálculos podem ser bastante simplificados se a contribuição das
caudas não
for levada em consideração. Expandindo o tamanho da janela para todo o comprimento, você pode obter uma definição recursiva.
Como resultado, precisamos escolher algum valor
como uma constante de suavização.
Pode ser demonstrado que, se você tomar
o centro de massa dos pesos EMA e SMA acima se torna o mesmo. No código, tudo parece muito mais fácil.
function ema($close, window, weight = null) { weight = weight ? weight : 2 / (window + 1); let ema = [ mean($close.slice(0, window)) ]; for (let i = 1; i < $close.length; i++) { ema.push($close[i] * weight + ema[i - 1] * (1 - weight)); }; return ema; }
Em geral, essa é a mesma média móvel, mas mais sensível.

A eficiência do uso depende da sua experiência e das configurações usadas. Por exemplo,
neste site, os parâmetros são muito bem escolhidos.
Média convergente / divergência móvel (MACD)Gerald Appel, em 1979, apresentou um dos osciladores mais simples e ao mesmo tempo eficazes de preços. Ele converte dois indicadores de tendência da EMA em um indicador de momento, tirando o melhor de dois mundos. Ou seja, ele, grosso modo, encontra uma derivada. Ele é desenhado em uma janela separada com duas linhas e um histograma, e não sobreposto, como os anteriores. De fato, há muito mais indicadores desenhados em uma janela separada, mas isso pode acontecer em outra época.

A fórmula de cálculo é bastante simples, pegue dois ema com uma janela curta e curta, por exemplo, 26 e 12 unidades e subtraia, a linha resultante será o indicador desejado. Tomando outro ema dessa diferença com um passo de 3 unidades, obtemos uma linha de sinal. O histograma que Gerald adicionou posteriormente é calculado pela diferença entre os dois resultados anteriores e é essencialmente um derivado médio ponderado.
function macd($close, wshort, wlong, wsig) { let line = pointwise((a, b) => a - b, ema($close, wshort), ema($close, wlong)); let signal = ema(line, wsig); let hist = pointwise((a, b) => a - b, line, signal); return { line : line, signal : signal, hist : hist }; }
Teste de indicador, erro padrão normalizadoTendo tabelas precisas com o significado de indicadores, você pode testar qualitativamente seu cálculo. Existem várias maneiras de determinar a medida do erro entre duas funções, mas a prática mostrou que o erro quadrado médio normalizado, que é considerado como
funciona melhor para tamanhos pequenos e grandes. Por exemplo, bitcoin em dólares pode custar US $ 20.000 e a diferença de US $ 10 não é crítica, ao mesmo tempo, um altcoin pode ser calculado em vários satoshi.
function nrmse(f, g) { let sqrDiff = pointwise((a, b) => (a - b) * (a - b), f, g); return Math.sqrt(mean(sqrDiff)) / (Math.max(...f) - Math.min(...f)); }
ConclusãoPortanto, em algumas linhas, você pode expressar os indicadores básicos, se planeja realizar suas análises por aprendizado de máquina e, em seguida, determinar os pontos de entrada ideais, aconselhamos a prestar atenção ao indicador ZigZag, que não é útil para negociação, mas extremamente útil como professor. Também deve-se ter em mente que, para negociação, você precisa escolher os indicadores mais diferentes e tentar alterar seus parâmetros de entrada. Você pode tentar alterá-los automaticamente ao longo do tempo, pois os parâmetros mais eficazes tendem a mudar.
Fontes utilizadas1.
StockCharts - lista de algoritmos com dados de verificação em tabelas
2.
Cryptowatch - parâmetros de indicadores bem ajustados
3.
Github - código fonte