Indicadores-parte2: Programação de robôs de trade (videoaula)

Nesta segunda parte, da série de vídeos sobre indicadores, optei por tratar sobre a codificação da mudança de cor do candlestick em função da média móvel exponencial.

Conforme exposto anteriormente, meu primeiro contato com a codificação do indicador foi através de um vídeo da DeltaTrader. Mas, a base para manipular as cores do candlestick foi a partir de um projeto gratuito, desenvolvido por Kourosh Davallou:
https://www.mql5.com/pt/code/1349

Confiram a segunda parte:

Os exemplos demonstrados estão disponíveis através da url:
http://aprendizfinanceiro.com.br/indicador-aulas2.zip

Conforme prometido, também disponibilizarei para download o código para implementação da VWAP

A VWAP é a representação do Preço Médio Ponderado por Volume (Volume Weighted Average Price) e costuma ser vista como uma opção para visualizar como os grandes players estão agindo.

Em relação aos trades, a VWAP pode ser utilizada como uma referência de suporte ou resistência. Existem várias observações. É fácil perceber que uma reversão pode acontecer quando o preço toca a VWAP. Porém, caso o preço rompa de forma expressiva (rompendo um suporte ou resistência), o movimento dentro da tendência pode acontecer de forma mais expressiva (ao acionar stops, por exemplo).

Compreendi melhor a formula da VWAP através deste artigo (em inglês):
https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:vwap_intraday

O bloco de código é basicamente este:

   sumPrice    += (double) (((high[i]+low[i]+close[i])/3) * volume[i]);
   sumVol      += (double) volume[i];
   buf_VWAP[i] = NormalizeDouble(sumPrice/sumVol,2);

A seguir, o link para download:
http://aprendizfinanceiro.com.br/vwap.zip

No momento, é a última versão que tenho utilizado. Caso você tenha alguma sugestão ou faça alterações, por favor nos informe e compartilhe o código!

Gostaria de deixar claro que minha atuação principal permanece como holder. O que estou compartilhando é uma experiência pessoal e, caso bem sucedido, pretendo apenas reforçar os aportes mensais. Não estou muito convicto de que realmente vale a pena.

Tenham consciência de que poucos *investidores* sobrevivem aos trades. Vende-se muita ilusão na Internet. Seja qual for a sua escolha, faça consciente!

Desejo sucesso a todos… infelizmente, sei que serão poucos! 😉

Indicadores-parte1: Programação de robôs de trade (videoaula)

Finalmente, disponibilizei uma demonstração da codificação de um indicador no Metatrader5 (linguagem MQL5). Resolvi dividir, em pelo menos, duas partes. Na primeira, tratei sobre a estrutura básica e a lógica fundamental para criação de um indicador.

No vídeo seguinte, pretendo demonstrar a codificação de um indicador VWAP e, se possível, finalizarei demonstrando como criar um indicador que ajuste as cores do candlestick de acordo com alguns critérios da análise técnica – será referência para nosso EA.

Caso você não tenha experiência com programação, recomendo a leitura do artigo sobre algoritmos:

Vamos a primeira videoaula sobre a codificação do indicador:

Os exemplos demonstrados estão disponíveis através da url:
http://aprendizfinanceiro.com.br/indicador-aulas1.zip

Na explicação da média móvel, estava com pressa para finalizar (antes de minha câmera digital encerrar o vídeo) e não expliquei corretamente o cálculo da média móvel. Mas, resumindo:

1. Somando preço de fechamentos das últimas 20 barras (period): 
   for (int j=0; j<period; j++) media+=close[i-j]; 

Este código faria algo como 
   media=media+close[i-0]; 
   media=media+close[i-1];
... 
   media=media+close[i-period];

2. A média é o valor da soma dividido pelo período:
   media=media/period;

Procurei ser o mais objetivo possível, cobrindo os pontos principais para codificação.

Vi, em outros vídeos, uma demonstração de codificação voltada para “traders” e não, necessariamente, para programadores

Infelizmente, não acredito que isto seja possível.

Quem não abstrair a lógica de programação, fatalmente terá uma capacidade de codificação muito limitada. Desenhar linhas, por si só, não serve para nada. Portanto, não desprezem os aspectos técnicos demonstrados.

Para auxiliar no entendimento, recomendo assistir o seguinte vídeo:

O vídeo anterior foi produzido pela equipe da DeltaTrader e é bastante didático. Aliás, foi por onde me orientei para começar.

Sei que não é tão simples como muitos gostariam, mas sejam pacientes. Ao abstrair a base de codificação, os próximos passos se tornam cada vez mais fáceis.

Então, cada coisa ao seu tempo! 😉

Sucesso para todos!

Instalando Metatrader5 no Linux

A dica, desta vez, é voltada para usuários de Linux. Se não for o seu caso, este artigo será de grande serventia.

De qualquer forma, para quem estiver interessado na utilização de um robô na “conta quente”, recomendo fazer isto em uma instalação Windows ( para execução nativa).

wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key apt-get update apt-get install --install-recommends winehq-stable



Algoritmos: Programação de robôs de trade (videoaula)

Sei que o intervalo de tempo entre um vídeo e outro está longo, mas não estou com muita disponibilidade de tempo livre e, infelizmente, no final de semana passado o HD (disco rígido) principal do meu computador danificou definitivamente. Logo, precisei refazer a instalação do sistema operacional e recuperar o backup de minhas aplicações e projetos. Isto sem falar que ainda estou codificando e otimizando meu robô de trade.

Antes de tratar sobre a codificação de indicadores ou robôs propriamente, começaremos falando sobre lógica de programação (algoritmos). Para quem pretende criar seu próprio indicador ou EA no Metatrader, este conhecimento é fundamental.

Para melhor compreensão, é importante entender primeiro o conceito de entrada (INPUT) e saída (OUTPUT).

Entrada: Recebimento de dados para processamento (associação direta, leitura de um arquivo ou dados fornecidos pelo teclado)

Saída: Resultado final do processamento (escrita em disco ou exibição em tela).

Com este entendimento, fica mais simples compreender o que é um algoritmo e como escrever o nosso próprio código.

Um algoritmo nada mais é que uma sequência lógica de instruções (código) que determinam como dados recebidos (entrada) serão tratados pelo computador.

Resumindo, o algoritmo é uma sequência lógica de instruções que utilizaremos para solucionar determinado problema. A sequência lógica pode ser apresentado em diagrama (fluxograma) ou por um bloco de código (prévia para codificação).

https://www.lucidchart.com/pages/pt/modelos-e-exemplos-de-fluxogram

Como o nosso objetivo principal é a codificação de indicadores ou assistentes especializados (robôs), o foco deste artigo será voltado aos blocos de código. A figura anterior (fluxograma), foi utilizada como reforço para demonstrar como funciona a lógica de programação.

Porém, é através do algoritmo que aprendemos a programar… 😉

http://aprendizfinanceiro.com.br/awrp/wp-content/uploads/2019/03/Algoritmo-videoaula.doc

O primeiro passo, será identificar as “variáveis” necessárias para nosso programa.

As variáveis representam áreas de memória que identificam um dado específico (onde guardaremos o dado recebido para posterior referência – seja por arquivo, teclado ou associação direta).

Por exemplo (associação direta – atribuindo valores):

candle_maior=10
candle_abertura=5
candle_fechamento=8
candle_menor=3

Foram utilizadas 4 variáveis para guardar o valor do “último negócio” realizado no MT5, onde candle_abertura representa o preço de abertura da barra e candle_maior a máxima da barra. As demais variáveis são autoexplicativas.

“Aliás, sempre utilize nomes sugestivos para associar rapidamente a finalidade da variável

O exemplo anterior foi de variáveis simples, mas podemos trabalhar com vetores (array) para armazenar múltiplos valores na mesma variável – permite ter acesso a informações passadas a qualquer momento (histórico).

Caso precisássemos armazenar os preços negociados nas últimas 100 barras, por exemplo:

candle_maior[0]=10
candle_abertura[0]=5
candle_fechamento[0]=8
candle_menor[0]=3

candle_maior[n]=…
candle_abertura[n]=…
candle_fechamento[n]=…
candle_menor[n]=…

candle_maior[99]=6
candle_abertura[99]=5
candle_fechamento[99]=3
candle_menor[99]=2

O valor que aparece entre colchetes (“n”) é um índice que identificará cada barra. Como, no MQL5, o primeiro índice começa em 0, o último (em 100 barras) será 99.

Também precisamos identificar o tipo de dado:
1. lógico: boleano (verdadeiro ou falso)
2. data_hora: formato data e hora
3. numérico: inteiro ou flutuante
4. textual: caractere ou string

Por exemplo:

inteiro i = 0
boleano candle_alta = verdadeiro
flutuante maior_preco = 0.0
flutuante candle_fechamento[]

Neste artigo, para receber dados por teclado, convencionaremos que a instrução será “leia“. E, para exibir os dados, convencionaremos “exiba“.

Entendida a declaração das variáveis, podemos começar a definir a lógica de processamento – “99% do sucesso de todo código (instruções) depende desta definição (onde as comparações serão feitas)”.

Estruturas condicionais:

São blocos de código onde validaremos se o conteúdo das variáveis atendem nossas necessidades: “se condição_verdadeira; faça

– Qual seria o algoritmo necessário para descobrir se um candle é de alta ou baixa?

flutuante candle_abertura=0.0, candle_fechamento=0.0
boleano candle_alta = falso
leia candle_abertura
leia candle_fechamento

se candle_abertura < candle_fechamento; então
candle_alta = verdadeiro
exiba “fechamento”+candle_fechamento+“ alta”
senão
candle_alta = falso
exiba “fechamento”+candle_fechamento+“ baixa”
fim-se

Na realidade, defini candle_fechamento como boleano de propósito, pois no MQL5 poderia ter feito a comparação pela própria variável.

flutuante candle_abertura=0.0, candle_fechamento=0.0
leia candle_abertura
leia candle_fechamento

boleano candle_alta = (candle_abertura < candle_fechamento)

se candle_alta == verdadeiro; então
exiba “fechamento ”+candle_fechamento+“ de alta”
senao
exiba “fechamento ”+candle_fechamento+“ de baixa”
fim-se

Caso pareça muito confuso, respire fundo e leia novamente!

Não é obrigatório dominar tudo que foi demonstrado, mas saiba que é o básico para que possamos otimizar o código para as nossas necessidades. Do contrário, a contratação de um programador será a única alternativa.

Em relação a programação, o que fiz, no exemplo anterior, pode gerar alertas de compilação ou resultado inesperado em algumas linguagens de programação. Percebam que, na exibição, fiz uma soma entre strings com um valor flutuante (são tipos diferentes).

Logo, o ideal é realizar a conversão para um tipo comum. Neste caso, o mais lógico, no momento da soma, seria converter candle_fechamento para string.

Este processo de conversão é conhecido como casting:

exiba “fechamento ”+(string) candle_fechamento+“ de alta”

A partir deste momento, a instrução exiba entenderá que está somando (concatenando) strings. Em algumas linguagens (não é o caso da MQL), ‘a+1’ é igual ‘b’!

Vale lembrar que tenho colocado verdadeiro ou falso em negrito porque representa um valor reservado para identificar o resultado lógico da variável boleana. Não se preocupe muito com isto agora, mas é fundamental que você saiba interpretar os exemplos dados (como está sendo processado).

É evidente que muitas vezes faremos mais de uma comparação na mesma expressão, obrigando que duas ou mais condições sejam atendidas (AND) ou apenas uma (OR).

-É aqui que entra a interpretação da tabela verdade:

se (a > b AND b > c): será processado quando ambas forem verdadeiras
se (a>b OR b>c): será processado se qualquer uma das condições for verdadeira.

Confiram uma videoaula específica sobre estruturas condicionais:

Estruturas de repetição (loop):

Uma estrutura de repetição é basicamente um bloco de instrução em que uma determinada operação deverá ser executada repetidas vezes até atingir o resultado esperado.

Poderíamos utilizar um loop para descobrir qual é o maior preço de fechamento das últimas 100 barras, por exemplo.

inteiro i=0
flutuante maior_preco=0.0
flutuante candle_fechamento[]
...
para (de i=0 até 99); faça
leia candle_fechamento[i]
se (candle_fechamento[i] > maior_preco); então
maior_preco = candle_fechamento[i]
fim-se
fim-para

exiba maior_preco

A variável maior_preco foi inicializada em 0 (menor preço possível) e será substituída no primeiro preço acima de 0. Nas comparações seguintes, ela será atualizada cada vez que o valor de candle_fechamento[i] for maior que o conteúdo de maior_preco.

Se não utilizássemos uma estrutura de repetição (loop) teríamos que escrever cada comparação individualmente – em muitos casos, seria inviável.

se (candle_fechamento[0] > maior_preco); então
maior_preco = candle_fechamento[0]
fim-se

se (candle_fechamento[1] > maior_preco); então

se (candle_fechamento[99] > maior_preco); então
maior_preco = candle_fechamento[99]
fim-se

Mais uma videoaula específica sobre estruturas de repetição (bastante didático):

Cuidado para não tornar os laços infinitos (no exemplo anterior, o limite foi fixado em 99 – repetição de 100x), pois, caso fique infinito, o processamento não terminará e causará o travamento da aplicação.”

Para finalizar, também podemos trabalhar com reaproveitamento de código e melhor organização estrutural disponibilizando funções.

Chamadas de funções:

Quando precisarmos executar uma mesma operação várias vezes em diferentes partes do código, ao invés de repetir o mesmo bloco de código várias vezes, podemos separar o código responsável por este processamento e chamá-lo sempre que for necessário (com uma única chamada, informando os dados necessários).

flutuante função calc_media (flutuante maxima, flutuante minima); início
flutuante resultado = (maxima + minima)/2
retorne resultado
fim-função

flutuante maxima=0.0, minima=0.0, media=0.0
leia maxima
leia minima
media=calc_media(maxima,minima)

exiba media

Percebam que cada função representa um bloco de código separado. Caso o processamento da função, ao final do seu processamento, ofereça algum retorno (resultado final), deveremos configurar o tipo de dado que será retornado (no exemplo foi flutuante).

Confiram uma videoaula específica sobre funções (bastante didático):

No MQL5, a posição da função, em relação a sua chamada, não importará. Não é algo muito comum porque a interpretação do código é sequencial e o compilador, teoricamente, precisa conhecer a função antes de uma chamada no bloco de código principal.

Espero que o conteúdo lhe auxilie no aprendizado!

– Quem não se familiarizar com lógica de programação, precisa contratar um programador para MQL5 – sua curva de aprendizado pode ser longa.

– Outra opção é buscar soluções comerciais onde você apenas alimenta as opções do robô de acordo com o tipo de lógica já programada – aqui Brasil, a Smartbot oferece este serviço.

Será que o país perde R$ 4,6 bi ao não tributar acionistas de Itaú, Bradesco e Santander?

Pois é, se o Leão é Manso, então a CONTRAF-CUT não é muito “inteligente”… na maioria das vezes, estes Bancos citados remuneram por JCP, onde há tributação de IR no ato do pagamento aos acionistas.

Confiram o artigo que recebi como sugestão de leitura:
http://spbancarios.com.br/02/2019/pais-perde-r-46-bi-ao-nao-tributar-acionistas-de-itau-bradesco-e-santander

Logo, no JCP, a distribuições dos lucros favorece as empresas diminuindo o IR, mas o encargo fica com o acionista que será taxado em uma alíquota de 15%. E, no caso dos dividendos, a distribuição acontece sobre o lucro líquido da empresa, após o pagamento de todos os seus tributos (como IR e outras contribuições).

Portanto, o governo já arrecada em ambos os casos – seria bitributação!

Além disso, faria com que inúmeros investidores percam o interesse pela relação risco x retorno do país, direcionando capital para países com menor volatilidade ou, como nossa taxa de juros é alta, direcionando para renda fixa.

Gostaria de saber de onde saem estes cálculos…

Não acreditem em qualquer coisa, questionem! 😉