A dica desta vez é voltada para usuários de Linux. Se não for o seu caso, este artigo não 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).
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).
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… 😉
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):
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:
“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
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?
secandle_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.
Atrasei um pouco para compartilhar o resultado mensal, mas decidi aproveitar o feriado de carnaval para escrever (alguns contratempos me atrasaram mais). O mês foi marcado por acidentes de grandes proporções e, no cenário político-econômico, o que mais chamou mais a atenção tem sido a proposta da reforma da previdência (provavelmente continuará). É evidente que, para “variar um pouco”, sem sucesso e quase vexatória, a mídia tradicional não cansa de “buscar” elementos negativos para criar alguma crise no governo Bolsonaro. Sem muitas delongas, vamos aos resultados.
O mês praticamente começou com grande expectativa em torno da votação no novo presidente do Senado. Acredita-se que, por um possível conflito de interesses, a permanência de Renan Calheiros não seria positiva para o atual governo. Felizmente, o senador Davi Alcolumbre (DEM-AP) foi escolhido como novo presidente da Casa – foi escolhido por seus pares com 42 votos, entre 77 válidos. Sendo assim, o mercado reagiu com mais otimismo.
Em relação ao cenário político, o que mais espanta é ver o empenho da mídia tradicional em tentar desmoralizar, sem sucesso, o atual governo:
– No início do ano, tentaram desqualificar a Ministra Damares criando polêmicas infantis e difamatórias (como sequestro de crianças indígenas). Fizeram de tudo para provar atividade financeira irregular pela família do atual presidente. Os filhos tem sido alvo constante de ataques. Pois é, em todos os casos, não há confirmação.
– Neste mês, o desgaste foi com o secretário-geral (Gustavo Bebianno). Sua permanência no governo foi abalada após o vazamento de informações e possíveis mentiras quanto a reuniões com o presidente Bolsonaro. Se havia alguma suspeita, provavelmente foi reforçada com o vazamentos de uma conversa pessoal pelo WhatsApp. Aliás, em minha opinião, é complicado justificar ou confirmar pauta de reunião com conversas pessoais por WhatsApp.
– A última polêmica tem sido em torno da fala do Ministro da Educação em relação ao hino nacional. Particularmente, concordo que houve excesso apenas quando pontuou a gravação e o lema de campanha do atual presidente. Porém, vale lembrar, que a execução do hino nacional no sistema de ensino brasileiro já era prevista em lei desde 1971 (art 39 da lei 5.700). Entendo como um aspecto cultural que deveria ser resgatado, pois fortifica o espírito de patriotismo da nação.
O início do ano tem sido marcado com acidentes de grandes proporções. Após o rompimento da barragem de Brumadinho, o governo decidiu liberar o FGTS para as vítimas do acidente. Infelizmente, criminosos aproveitaram o momento para dar golpes na região, tentando receber indenização da Vale (na casa de R$ 100.000) – por sorte, na maioria dos casos, a polícia conseguiu identificar e prender os autores. Pouco tempo depois, em acidente de helicóptero, o país perdeu o jornalista Ricardo Boechat. Como se não bastasse, também fomos surpreendidos com o incêndio no alojamento do Flamengo, resultando na morte de 10 jogadores e alguns feridos. Passamos por um mês de muitas perdas.
Nem preciso dizer que a proposta da reforma da previdência causa e continuará causando bastante polêmica…
Particularmente, não vejo como agradar a todos. Ninguém quer perder direitos ou benefícios. É possível perceber que a proposta foi apresentada com uma certa gordurinha para ter abertura de negociações. Infelizmente, o que está em jogo é a sobrevivência do sistema atual e do próprio Estado. As pessoas não deveriam estar preocupadas apenas com a possibilidade de perder direitos, mas sim com a possibilidade não contar com uma remuneração minimamente digna na aposentadoria. Seja como for, não espere muito de governo algum, invista o quanto antes.
Alguns pontos da reforma certamente serão revistos, porém a questão da idade e tempo de contribuição não permite flexibilidade de negociação. Assim que o presidente sinalizou a possibilidade de baixar a idade mínima das mulheres para 60 anos, o mercado reagiu imediatamente. Vale lembrar que a nossa contribuição é destinada diretamente aos aposentados (não estamos contribuindo para a nossa aposentadoria) e o país está com índice de desemprego muito elevado, a população está envelhecendo rápido e o sistema atual é deficitário (crescente) – é, nitidamente, uma bomba relógio prestes a explodir.
Já no cenário internacional, provavelmente nenhum país chamou mais a atenção do que a Venezuela. Mesmo em situação caótica, o presidente Maduro ordenou o fechamento da fronteira e, em alguns casos, ordenou a queima de alimentos doados – negaram ajuda humanitária, alegando que não fazia sentido, pois não se tratavam de mendigos. Enquanto isto, o que vemos é uma triste realidade (bem diferente do discurso):
Como de costume, confiram os principais números e acontecimentos que sacudiram o país e o mundo (do redator chefe da Modal):
No mês passado comentei sobre a aliança entre Volksvagen e Ford, mas, desta vez, não tenho notícias boas. Neste mês, a Ford anunciou que fechará uma fábrica no ABC e encerrará a linha do Ford Fiesta ainda este ano – segundo a revista Quatro Rodas, “a marca anuncia de uma vez só que o Fiesta e os caminhões das linhas Cargo, F-4000 e F-350 deixarão de ser vendidos no Brasil“.
Conforme esperado, inúmeros balanços foram liberados…
A Ambev, por exemplo, apresentou lucro líquido ajustado de R$ 3.724,5 milhões no 4T18 – apesar do excelente resultado, foi 17,3% menor do que no 4T17 e, com isto, a cotação recuou consideravelmente na última semana. O Banco do Brasil continua impressionando, com lucro líquido ajustado de R$ 13,5 bilhões em 2018, crescimento de 22,2% em relação a 2017.
De maneira geral, o resultado das principais empresas que compõem minha carteira de renda variável, apresentaram excelente performance (lucro líquido no ano), como foi o caso de BBSE3(+9,3%), EGIE3 (+15,5%), CRFB3 (+48,1%), FLRY3 (+32,5%, porém -10% no 4T), GRND3 (+11,4%), ITUB3 (+3,4% de lucro e +21% sobre o patrimônio líquido), ITSA3 (+15,9%), HYPE3 (+2,2%), PETR3 (lucro líquido de R$ 25 bilhões, o primeiro desde uma sequência de prejuízos anuais), ODPV3 (+16,4%) e WEGE3 (+17%), por exemplo.
Ainda assim, surgiram inúmeras informações positivas para as empresas que participo. A Weg (WEGE3) anunciou a compra de uma fabricante americana de baterias Northern Power Systems (NPS). A Itaúsa (ITSA3) também informou o início das negociações para incorporação das ações da Itautec. O Banco do Brasil (BBAS3) também surpreendeu novamente, com remuneração complementar de R$ 1,6 bilhão aos acionistas. O ano ainda promete. Mas, estejam preparados para algumas turbulências.
“São informações como esta que mostram porque holders não devem olhar apenas para cotação!“
Quanto aos investimentos…
“Acabei atrasando mais do que esperava porque perdi o HD do computador no domingo e passei todo final de semana reinstalando o sistema e voltando backups (ninguém merece).“
“Pela primeira vez, após ativar o módulo de inteligência artificial (FANN2MQL), as operações de trade com mini contratos de dólar através do robô fecharam no positivo – o índice de acerto melhorou significativamente.“
Recebi proventos de BBSE3, ITUB3, BRCR11 (0,395%), FCFL11 (0,571%), PQDP11 (0,417%), KNRI11 (0,493%), RNGO11 (0,583%), SAAG11 (0,694%), GGRC11 (0,668%), MXRF11 (0,553%), KNCR11 (0,530%), HGRE11 (0,510%), FLMA11 (0,455%), HGBS11 (0,587%) e FIGS11 (1,405%). A carteira continua apresentando uma excelente performance, com valorização expressiva dos principais ativos (algo que pode levar a uma interpretação “equivocada” do rendimento de vários ativos). De maneira geral, o rendimento da carteira permanece excelente, sendo reforçado com o pagamento de dividendos e JCP de BBSE3 e ITUB3 (novamente, o dividendo pago por BBSE3 foi o mais expressivo).
“Ao levantar os rendimentos creditados, fiquei surpreso com o montante provisionado para março – será superior ao do mês de janeiro.“
Vale lembrar que logo mais deveremos alimentar o sistema da Receita Federal para a entrega da Declaração de IRPF. Para quem tiver alguma dúvida sobre o processo, recomendo assistir o seguinte vídeo:
Com o rendimento da própria carteira, somado ao capital que me prontifico separar para investir mensalmente, comprei mais ações (ou cotas) de EGIE3, FLRY3, FLMA11 e RNGO11. Esta distribuição foi bastante equilibrada, mas os maiores aportes aconteceram na subscrição de GGRC11 e HGBS11. Mesmo com a cotação um pouco esticada, decidi aumentar minhas posições em FLMA11 e, em seguida, abri posição em FLRY3.
Confiram a distribuição dos ativos, segundo o portal CEI (NÃO inclui o Fundo DI):
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 menos expressivo que o anterior, mas continua muito bom. O meu robô de trade finalmente deu uma trégua (risos) e fechou no positivo – eu pretendia incluir o código para realização parcial de lucro, mas um problema técnico em meu computador acabou atrapalhando. 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.
Desejo a todos um excelente feriado de carnaval!
Estou apenas demonstrando o potencial de crescimento, isto não é recomendação de investimento.
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.
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.