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

Para finalizar a série de artigos sobre a codificação de indicadores no MT5, resolvi compartilhar mais um vídeo explicando as razões que nos levaram modificar o código para abertura de posição simulado pelo indicador.

Quanto maior o número de comparações dos preços do candlestick, menos preciso o algoritmo se mostrava em relação ao “histórico” (quando prev_calculated é igual a 0) e o “testador de estratégia” (a cada negócio) – por incrível que pareça, em um segundo, a estimativa de volume ou a diferença do preço máximo pelo fechamento pode mudar algum critério de decisão.

A única forma de coincidir as comparações históricas com o processamento online (no testador de estratégia ou durante o trade real), é validando os critérios para abertura de posição assim que a nova barra for desenhada e comparar os valores da barra anterior.

A última versão do projeto está disponível no link:
http://aprendizfinanceiro.com.br/APF-Color-Base.zip

Outro indicador que foi adicionado ao código foi o StdDev (desvio padrão). O objetivo é capturar a volatilidade do mercado – o valor do indicador aumenta na medida em que os preços se distanciam da média apurada (período).”

A variável “i” é o índice que representa cada barra processada. Para que possamos “identificar a barra atual (i)” e “comparar a anterior (i-1)“, podemos incluir outro índice (“k“) que será igual a “i-1” apenas quando a operação não estiver aberta – quando trade_open for igual a 0.

    for (int i=start; i < rates_total; i++) {
        HighBuf[i]=high[i];
        CloseBuf[i]=close[i];
        OpenBuf[i]=open[i];
        LowBuf[i]=low[i];
...
             int k=i;
             if (!trade_open) k=i-1;
...
             // Identificação da barra
             bool CANDLE_0          = (open[k]-close[k] == 0);
             bool CANDLE_UP       = (close[k]>open[k] && close[k]-open[k]>=1);
             bool CANDLE_DOWN  = (close[k]=1);
...

O ajuste anterior resolve a questão da comparação da barra anterior, mas precisamos alterar o momento em que as comparações serão liberadas. Este controle é feito pela função isNewBar.

bool isNewBar(const datetime lastbar_time, const int op_type, const int prev_calc)
  {
//--- memorize the time of opening of the last bar in the static variable
   static datetime last_time=0;
   static datetime init_time=0;
   
   datetime init_auxtime=TimeCurrent();

   int limit_time=0;
   long time_match=0;
   
   limit_time=300;
   time_match=(limit_time-(init_auxtime-init_time));
   if (time_match<0) time_match=0;
   
   string label_name1="Seconds", label_text="Seconds... "+(string) (long)time_match;
   ObjectDelete(0, label_name1);
   ObjectCreate(0, label_name1, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0,label_name1,OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0)-100);
   ObjectSetInteger(0,label_name1,OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,label_name1,OBJPROP_COLOR,YellowGreen);
   ObjectSetString(0,label_name1,OBJPROP_TEXT,label_text);
   
   if (last_time==0 || init_time==0 || last_time!=lastbar_time) {
      last_time=lastbar_time;
      init_time=init_auxtime;
      if (last_time==0) return(false);
      if (prev_calc==0 || op_type==1) return(true);
      return(false);
   }

   if (op_type==2 && time_match<=2) return(true);
   
   return(false);
  }

Todas as atualizações do projeto serão disponibilizadas no github:
https://github.com/betolj/Trade-MT5

Para quem ainda não estiver muito confortável com a codificação em MQL5, recomendo dedicar tempinho para acessar o seguinte canal (bastante didático):
https://www.youtube.com/channel/UCMEarUKP3ALctWTDxccj4Yg

Em breve, começaremos abordar a codificação do Expert Advisor!

Resultado do mês de abril (2019)

Mais um mês que encerra e, se analisarmos friamente, não há muita novidade no cenário político-econômico, onde a imprensa tradicional continua “procurando cabelo em ovo” (como de costume). Desta vez, serei breve em relação aos acontecimentos políticos e focarei nos acontecimentos econômicos. Desta vez, precisei lidar com pequenos imprevistos, mas nada que afetasse minha tranquilidade. Sem muitas delongas vamos aos resultados.

No cenário interno, por incrível que pareça, a má conduta do filho do presidente Bolsonaro, nas redes sociais, tem depreciado a imagem de ambos e também expõe claramente a “rivalidade” entre Olavistas e simpatizantes dos militares. Seja como for, não acho saudável endeusar alguém. Como comentei sobre o assunto em minha fanpage, não pretendo prolongar o assunto aqui.

A reforma da previdência é o assunto que mais chama atenção internamente e vem sofrendo bastante “resistência” da oposição – particularmente, ao contrário do que alguns grupos fazem parecer, entendo que o maior obstáculo está justamente nas camadas mais privilegiadas que não querem perder seus benefícios. Infelizmente, existe um trabalho de desinformação muito forte e não acredito que os conflitos sejam em defesa dos mais pobres (que, como sempre, servem de escudo).

Por outro lado, no cenário externo, quem vem chamando a atenção é a Venezuela. Na última semana do mês, o conflito na Venezuela se intensificou, ficando à beira de uma guerra civil. O grupo aliado ao Governo Maduro grita por “democracia” (parece piada), mas se cala quando carros blindados avançam sobre os manifestantes (literalmente). Não é preciso dizer que esta crise amplia o conflito entre países como Estados Unidos e Rússia.

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

Neste mês, precisei lidar com um pequeno “imprevisto financeiro” (escrevi entre parênteses porque tive liberdade de escolha). Já estou com o mesmo computador por mais de 9 anos e, depois de perder um HD de 1 Tb, resolvi comprar outro desktop. Sendo assim, precisei me programar para fazer isto e minha capacidade de aporte foi menor.

O prazo para entrega da declaração de IR encerrou no último dia do mês. Precisei de aproximadamente duas semanas para preencher e revisar antes de transmitir – uma carteira diversificada torna o processo mais trabalhoso, porém mais seguro. Já verifiquei minha situação através do app Pessoa Física da Receita Federal – após dois dias, constava em fila de restituição (na opção “Consulta Restituição“).

Nas últimas semanas do mês, muitas empresas divulgaram seu balanço e alguns fatos relevantes pertinentes…

A Grendene (GRND3), por exemplo, divulgou um resultado negativo no 1T19, com queda de 51% no lucro líquido e queda em todas as margens – evidentemente, a cotação foi castigada logo em seguida. Não é motivo para alarde, mas é preciso ficar atento com os próximos balanços. De qualquer forma, reparem que, na avaliação anual, o desempenho da empresa continua excelente.

Fonte: https://www.oceans14.com.br/acoes/grendene/grnd3/balanco-dividendo

O Grupo Fleury (FLRY3) apresentou um resultado positivo, porém abaixo da expectativa do mercado. Ou seja, o lucro líquido cresceu apenas 0,5% (baixo) e apresentou ROIC (Retorno sobre o Capital Investido) de 42,1%. Com o resultado abaixo da expectativa, era esperada uma queda expressiva na cotação. Por ter aberto posição recentemente, pretendo aproveitar o momento para reforçar os próximos aportes (acredito se tratar de um mercado promissor).

Dos ativos que mantenho em carteira, também foram divulgados os balanços de Hypera (HYPE3, lucro líquido +9,5% e ROIC de 19,3%), Banco Itaú (ITUB3, lucro líquido +6,2%), Odontoprev (ODPV3, lucro líquido +19% e ROIC de 22,3%) e Weg (WEGE3, lucro líquido +7,7% e ROIC de 18%). Vale destacar que o lucro líquido recorrente do Banco Itaú foi de R$ 6,9 bilhões no primeiro trimestre.

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

A Itaúsa divulgou fato relevante sobre o Direito de Retirada da Companhia após a incorporação de ações da Itautec S.A.. Confesso que, de imediato, não compreendi muito bem do que se tratava. Após buscar maiores informações, percebi que se trata de um evento que permite ao pequeno investidor (detentor de ações ordinárias ITEC3), caso não concorde com a incorporação, o Direito de Retirada no valor de R$ 6,52 por ação. Porém, levando em consideração que as ações de ITSA3 estão cotadas acima de R$ 13, não faz sentido o investidor exercer o direito.

Uma negociação que chamou bastante atenção foi a aquisição da Netshoes pela Magazine Luíza (MGLU3), no valor de U$ 62 milhões. Pois é, a Magazine Luíza não para de impressionar. Lamento não ter em carteira, mas é tarde para lamentações (risos).

O Banco do Brasil também chamou bastante atenção no mês:

– A primeira polêmica surgiu com a informação de que o presidente vetou uma propaganda do Banco destinada ao público jovem, com a suposta demissão do presidente de Marketing. Vale lembrar que o custo da propaganda foi de aproximadamente R$ 17 milhões (não, não é um filme). Obviamente, a CVM cobrou informações quanto a demissão do diretor e o Banco se pronunciou alegando que o diretor de Marketing foi apenas autorizado ausentar-se, por motivos pessoais, até 09/05/19. Resumindo: “não foi demitido“.

– Outra notícia que quase gerou desconforto no mercado financeiro foi o “pedido de redução da taxa de juros” feito pelo presidente Bolsonaro, no evento Agrishow 2019, ao Banco do Brasil. As mídias divulgaram a fala fora de contexto e as ações da estatal apresentaram uma volatilidade temporária (até a confirmação do contexto real).

Confiram o contexto real da fala do presidente (adiantem em 7 minutos):

Passamos por um mês relativamente agitado

Quanto aos investimentos…

Meu poder de aporte foi menor em função da troca de desktop que decidi fazer (é minha ferramenta de trabalho). Infelizmente, o meu “querido” robô de trade ainda não colaborou, excluindo R$ 200 da reserva para aportes.

Recebi proventos de ITSA3, ITUB3, BRCR11 (0,429%), FCFL11 (0,554%), PQDP11 (0,463%), KNRI11 (0,485%), RNGO11 (0,565%), SAAG11 (0,729%), GGRC11 (0,386%), MXRF11 (0,603%), KNCR11 (0,495%), HGRE11 (0,487%), FLMA11 (0,497%), HGBS11 (0,552%) e FIGS11 (1,244%). Este mês não impressionou tanto como os anteriores (algo esperado), mas o resultado da carteira continua excelente. Em relação aos FIIs, o pior rendimento foi do fundo GGRC11 – as razões não ficaram muito claras (como o fato de estar como muito dinheiro em caixa), dado uma queda tão expressiva. No mês passado, o fundo BRCR11 distribuiu um rendimento de 9,95% em função da conclusão da negociação com a Brookfield, portanto é evidente que não se trata de um rendimento recorrente e também vale lembrar que ainda resta R$ 4,00 para distribuir ao longo do ano (não sabemos como será feito). Outra novidade foi a eleição da Hedge como nova gestora e administradora do fundo FIGS11 – aliás, o fim da RMG traz algumas expectativas sobre a cotação atual. De maneira geral, o rendimento da carteira permanece excelente, sendo reforçado com o pagamento de dividendos e JCP de ITUB3 e ITSA3 (pouco expressivo).

Para conhecer um pouco mais a Engie (EGIE3), segue uma análise completa do Canal do Holder:

Com o rendimento da própria carteira, somado ao capital que me prontifico separar para investir mensalmente, comprei mais ações (ou cotas) de ODPV3, EGIE3, ITUB3 e MXRF11. O maior aporte foi para EGIE3 e o menor para MXRF11.

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

A proporção em ações aumentou 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

Apesar do resultado menos expressivo, a performance da carteira continua excelente. Minha capacidade de aporte foi a menor no ano porque troquei de computador – depois de 9 anos, já era hora de atualizar. Ainda assim, me programei para manter os aportes mensais em dia e um pequeno recurso para a avaliação do robô de trade.

Para conhecer um pouco mais sobre o processo de codificação do robô, não deixem de acessar o nosso canal do Youtube – infelizmente, o robô encerrou o mês com prejuízo de aproximadamente R$ 300

De maneira geral, continuo 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.

Armas de fogo aumentam ou diminuem a violência?

Resolvi escrever sobre o assunto após conferir alguns comentários quando compartilhei, em nossa fanpage, o resultado da pesquisa Datafolha que apontou que 51% dos brasileiros têm medo da polícia e apenas 47% confiam nos policiais.

Caso esse pessoal precise de ajuda, recorrerão ao Batman?

Na verdade não existe um consenso claro sobre o assunto…

É possível levantar pesquisas que comprovam que países com liberação de armas são mais seguros e, se quisermos, também encontramos material colocando em dúvida.

O problema é que tudo isto varia de acordo com a realidade de cada região. Não poderíamos usar o Japão como exemplo, pois os aspectos culturais, sociais e econômicos são MUITO diferentes. Quanto menos desenvolvido o país e mais desigual economicamente, mais frequentes serão os conflitos violentos – com ou sem arma de fogo.

– Se quiser reforçar a tese da liberação:
https://www.tercalivre.com.br
https://dellacellasouzaadvogados.jusbrasil.com.br

– E se quisermos refutar a tese:
http://mercadopopular.org

– Meio termo (considero o mais sensato):
https://veja.abril.com.br

O problema é que o Brasil é um país que carece em infraestrutura, saúde e segurança. Vi muitos questionamentos quanto a atuação da polícia – se, com a polícia existem problemas, sem ela vira um caos.

É fácil perceber que se trata de um assunto complexo. A defesa de cada tese acaba dependendo do viés que cada um prefere defender!”

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

Na terceira e última parte da programação de indicadores (nos próximos falaremos sobre o EA – Expert Advisor), veremos uma versão evoluída do exemplo anterior (baseado na Média Móvel), incluindo controles de tradenúmero de operações com ganho, número máximo de trades, prejuízo máximo, estimativa de ganho e etc.

A base para escolha de uma posição (comprada ou vendida) é bastante semelhante, mas incluímos algumas opções mais avançadas.

O exemplo demonstrado está disponíveis através da url:
http://aprendizfinanceiro.com.br/indicador-aulas3.zip

Conforme exposto no vídeo, a primeira diferença foi a codificação de um controle de trade (basicamente um controle de risco):

// Controle de risco para novas aberturas de posição - por isto !trade_open ou trade_open==0
if (!trade_open){
   //--- Critérios principais e globais
   // 1. Encerra ao atingir 20 pts
   if (trade_sum>20) close_trades=1;
   // 2. Encerra ao atingir o limite diário de trades
   else if (trade_ct>max_daytrades-1) close_trades=1;
   // 3. Encerra ao atingir o prejuízo diário máximo
   else if (trade_sum<=max_tradeloss) close_trades=1;
   //--- Critérios a partir de 3 pts
   else if (trade_ct>=3) {
      if (trade_ct>fail_trades-1 && gain_ct<1) close_trades=1;
      else if (trade_ct>gain_ct && trade_sum>=5) close_trades=1;
      else if (trade_ct==3 && gain_ct==3) close_trades=1;
   }
}

Em seguida, a base do código está na identificação do momento “ideal” para abertura ou fechamento de posição…

Este controle foi implementado através da variável trade_open. Quando trade_open for 0, verificaremos a possibilidade de abrir uma nova posição. Por outro lado, caso seja 1, avaliaremos as possibilidades de fechar a posição (desviando o processamento para o bloco else).

Também limitamos a capacidade de abrir novas operações através da variável close_trades – ao atribuir o valor 1, encerramos as operações no dia e fechamos qualquer posição em aberto.

//--- Verifica se existe um trade em aberto (trade_open):
// 1. Caso não exista operação em aberto, verifica se a próxima barra está prestes a ser desenha e libera o processamento (isNewBar)
// 2. Caso exista, verifica a possibilidade de fechar a posição (desviará para o bloco "else")
if (!trade_open && !close_trades) { 
    // Código para abertura de posição
    if (isNewBar(time[i], start, LM_OPEN)==true) {
       trade_dir=0;
       bars_trade=0;
       buf_color_line[i]=0;
       ...

       //--- Coloque aqui seu código para abertura de posição

    }
}
else {
    // Código para fechamento de posição
              
    // atualiza buf_color_line pelo último valor de trade_dir
    buf_color_line[i]=trade_dir;
    ...
    if (isNewBar(time[i], start, LM_CLOSE)==true && buf_color_line[i]>0) {
        ...

        //--- Coloque aqui os critérios para fechar a posição

        // 1. Fecha posição depois de 5 barras sem ganho superior a 2 pts
        // 2. Atualiza buf_color_line pelo valor de trade_dir
        if (close_trades) trade_dir=0;
        else if (bars_trade>5 && trade_maxgain<2) trade_dir=0;
        buf_color_line[i]=trade_dir;
        ...
    } // encerramento isNewBar
} // encerramento do bloco else (tenta fechar o trade)

Para facilitar no entendimento, coloquei vários comentários em todo código. Acredito que qualquer ajuste possa ser feito sem grandes dificuldades.

Caso você perceba algum bug ou tenha alguma ideia para acrescentar, por favor entre em contato!

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!

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! 😉