Resultado do mês de março (2019)

Apesar das “pequenas turbulências” no cenário político-econômico (em torno da proposta para a reforma da previdência), o resultado do mês foi excelente – provavelmente o melhor do ano (contamos com rendimentos “generosos”). Pela primeira vez conferimos o índice IBov romper os 100.000 pts. O clima de tensão atual fez com que o índice recuasse, mas existe a influência do ímpeto de realização de lucros também. Sem muitas delongas, vamos aos resultados.

Estamos entrando no último mês para a entrega para declaração anual do Imposto de Renda (IRPF), terei bastante trabalho para os próximos dias. Sendo assim, desta vez, serei mais direto. Para quem investe em renda variável, recomendo a contratação de alguma calculadora de IR, como o IRPFBolsa – lhe asseguro, quanto mais adiar, maior será seu arrependimento no futuro (é muito trabalhoso, risos).


Apesar de pequenas turbulências, o otimismo no mercado de capitais prevalece. Se avaliarmos o período de 6 meses, estamos com uma vantagem de 16.790,90 pts.

Fonte: Google

Um “pequeno atrito” entre o Presidente da Câmara e representantes do atual governo geraram incertezas momentâneas para o mercado. Seja como for, acredito que um movimento corretivo era esperado.

Como de costume, confiram os principais números e acontecimentos que sacudiram o país e o mundo (do redator chefe da Modal):

Para quem tem interesse em aperfeiçoar o conhecimento sobre o mercado financeiro, surgiu uma oportunidade bastante interessante: a BTG Pactual abriu inscrições (até 7 de abril) para um curso de graduação – será ministrado pelos sócios do Banco.

Para ter acesso ou acompanhar os balanços, recomendo o seguinte link:
https://www.acionista.com.br/agenda/resultados-das-cias.html

Quanto aos investimentos…

Recebi proventos de BBAS3, EGIE3, ITSA3, ITUB3, WEGE3, BRCR11 (9,95%), FCFL11 (0,555%), PQDP11 (0,495%), KNRI11 (0,484%), RNGO11 (0,585%), SAAG11 (0,740%), GGRC11 (0,634%), MXRF11 (0,629%), KNCR11 (0,515%), HGRE11 (0,493%), FLMA11 (0,374%), HGBS11 (0,560%) e FIGS11 (1,358%). O mês foi simplesmente impressionante (risos). Finalizada a negociação com a Brookfield, o fundo BRCR11 distribuiu o rendimento de 9,95% (R$ 10,57 por cota) – portanto, não foi um evento recorrente, mas a previsão é que o fundo apresente uma performance melhor no ano (até pela diminuição da vacância). De maneira geral, o rendimento da carteira permanece excelente, sendo reforçado (e que reforço) com o pagamento de dividendos e JCP de BBAS3, EGIE, ITSA3, ITUB3 e WEGE3.

O rendimento da carteira quebrou qualquer expectativa para o ano. É óbvio que foi um resultado atípico e acho pouco provável que os próximos meses superem. E agora… Entendem porque a atuação como holder é praticamente obrigatória.

Com o rendimento da própria carteira, somado ao capital que me prontifico separar para investir mensalmente, comprei mais ações (ou cotas) de BBAS3, ITSA3, ITUB3, WEGE3, FLRY3, BBSE3, HYPE3, EGIE3, ODPV3, BRCR11 e KNRI11. Os menores aportes foi para ODPV3, BBAS3 e BRCR11, e os maiores para ITUB3, WEGE3 e KNRI11 (de maneira geral, foram bem equilibrados). Como o rendimento foi bastante expressivo, decidi “distribuir melhor” os aportes.

Confiram a distribuição dos ativos, segundo o portal CEI (NÃO inclui o Fundo DI):

A proporção em ações continua bastante expressiva em decorrência da forte valorização do índice Ibov

A composição atual ficou assim (gráfico do IrpfBolsa):

Vale lembrar que o gráfico acima representa uma distribuição baseada no custo de aquisição, não no valor de mercado

O resultado mensal foi MUITO surpreendente. Fiquei extremamente satisfeito, pois minha capacidade de aporte foi maior. É preciso saber aproveitar bem estes momentos, pois não são frequentes.

O robô de trade abriu o mês com vários gains, mas, infelizmente, finalizou com prejuízo de R$20. Já estou na 22 revisão do código e o índice de acerto está melhorando bastante – ainda não coloquei em produção a última revisão.

De maneira geral, estou bastante satisfeito. Vale lembrar que, no curto prazo, oscilações são naturais e esperadas (com movimentos de repique, por exemplo). Dentro de qualquer tendência, os papeis não se movimentam em linha reta.

Estou apenas demonstrando o potencial de crescimento, isto não é recomendação de investimento.

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.

Programação de Robôs de trade: Introdução

Dei início a produção de videoaulas, no canal do Youtube, sobre programação de Robôs de Trade no Metatrader5. Para evitar euforia desmedida e ilusão, decidi fazer uma introdução demonstrando e refletindo sobre os riscos reais de cada operação.

Muitas vezes também fico eufórico…
Logo, para puxar o freio de mão, vamos aos alertas:

Nossa mente é traiçoeira… É muito fácil ficar iludido quando enxergamos as “possibilidades” de ganho, mesmo conhecendo os riscos envolvidos. Lidar com a euforia nos lucros é fácil e prazeroso, mas lidar com os prejuízos não é para qualquer um.

Pelo que percebi, na maioria das vezes, quem mais defende operações especulativas ou esquemas fraudulentos (pirâmides) são justamente pessoas com recurso financeiro limitado, mas querem acreditar que podem atuar “profissionalmente” (quando possível) neste mercado e acelerar sua independência financeira. O mais triste é que em quase todos os casos que conheço ocorre o inverso – perdem o que não tem.

Demonstrarei como nossa mente pode ser traiçoeira:

Continuando…

Minha primeira experiência na Bolsa foi complicada. Vi a possibilidade de ganho rápido e fiquei cego. Ganhei muito dinheiro em poucas semanas. Na época, mesmo com pouca experiência, consegui realizar várias operações lucrativas. Era tão frequente que não consegui assimilar que poderia ser apenas sorte. A confiança foi aumentando naturalmente. Conferir o lucro rápido mexe com o emocional. Mas, presenciar um grande prejuízo mexe infinitamente mais (risos). Chegou em um momento que me perdi entre operações como holder ou trader. Foi ladeira abaixo. Vários colegas de trabalho seguiram o mesmo caminho. Sabem quantos obtiveram sucesso? NENHUM!

Voltei para o mercado sem a intenção de especular e estudei mais. O foco principal tem sido a atuação como Holder. No início, não parecia tão vantajoso. Porém, 5 anos depois vi um resultado que, no início, nem imaginei.

Com mais experiência e influenciado por outros colegas, resolvi “especular moderadamente” o mercado futuro. Para variar, a grande maioria fala com muita paixão sobre algo que requer muita frieza – não combina. Alguns destes colegas falam em crescer e atuar profissionalmente. O mais engraçado é que estes argumentos são repetitivos. Novamente, sabem quantos estão com lucros consistentes? NENHUM.

Como tenho compartilhado minha experiência como investidor amador, resolvi dar mais uma chance aos trades, sem perder o foco no B&H. A combinação do controle emocional, disciplina e manejo de risco é algo muito complicado. Nas duas primeiras semanas de operação manual consegui um lucro de R$ 1.500. Porém, na semana semana seguinte, perdi R$ 3.000. Manter o controle emocional tendo que operar em horários picados no trabalho ou no intervalo do almoço é impossível (prejuízo certo).

Desisti de operar manualmente…

Decidi codificar um robô no MT5. O resultado tem sido bom, porém manter o equilíbrio entre lucro/prejuízo não é fácil. Aparentemente, o robô está conseguindo entregar um resultado positivo, mas preciso tomar cuidado para não cair em “game-over” em momentos que o robô não consegue acertar. Pois é. O próximo passo tem sido incluir RNA (redes neurais artificiais). Ainda estou afinando a configuração, usando o FANN (Fast Artificial Neural Network). O grande problema é que, muitas vezes, o mercado não é bem comportado e a inteligência artificial acaba perdendo movimentos que não poderia deixar passar e minha relação risco x retorno fica desvantajosa.

O meu objetivo, caso bem sucedido, é conseguir uma remuneração adicional de carteira – reinvestindo os lucros por B&H.

Para finalizar, recomendo que assistam o vídeo:

Faça as operações de forma consciente! 😉