Não é de hoje que reparei que meus ganhos no AdSense caíram bastante (já pouco expressivo). Achei estranho, mas não dei muita importância. Hoje cedo, ao entrar na conta do AdSense, vi um alerta com a mensagem “Ganhos em risco” – agora entendi o que está acontecendo.
Vejam só o alerta:
Se alertaram por e-mail, não vi! 🙂
Resumindo: é preciso criar um arquivo ads.txt autorizando o serviço de propaganda em questão (como o Google-Adsense).
Segundo a Google, “O Authorized Digital Sellers (ou ads.txt) é uma iniciativa do IAB que ajuda a garantir que seu inventário de anúncios digital seja vendido apenas por vendedores (como o Google AdSense) que você identificou como autorizados. A criação de um arquivo ads.txt dá a você mais controle sobre quem tem permissão para vender anúncios no seu site. Isso também ajuda a evitar que um inventário falsificado seja apresentado aos anunciantes.“
Como de costume, passamos por outro mês agitado (risos), marcado por manifestações em prol e contra algumas medidas do governo. Prevalece o clima de otimismo, porém os últimos balanços econômicos indicam que a economia brasileira apresentou retração. Felizmente, o mercado vem demonstrando um forte otimismo, até pelas negociações que estão surgindo (compartilharei algumas). Sem muitas delongas, vamos aos resultados.
As manifestações sacudiram o país…
A primeira, foi um protesto dos estudantes quanto ao contingenciamento na educação – infelizmente, ficou nítida a infiltração da oposição para defender pautas de interesse próprio. Particularmente, entendo que o impacto era previsível e também considero que o governo não escolheu um bom momento ou setor para contingenciamento. Acredito que existem alternativas mais interessantes e menos polêmicas.
Ainda assim, a maior manifestação foi em apoio ao governo, defendendo pautas como a “Reforma da Previdência” e o “Pacote anticrimes” do Ministério da Justiça, por exemplo. Infelizmente, custou mais uma divisão na direita brasileira – alguns grupos estão demonstrando um extremismo preocupante. O MBL se opôs a manifestação, acreditando se tratar do movimento organizado pelo grupo Lobos Patriotas (agendado para o mesmo dia) e causou bastante reação quando se posicionou contrário ao movimento (a forma como se posicionaram causou revolta e reação). Ainda assim, particularmente, vejo que membros como Kim Kataguiri, Arthur do Val e Fernando Holiday defendem ativamente as principais pautas da manifestação. Portanto, apesar de discordar em alguns pontos, não os condeno e considero como grandes aliados.
Quem mais faria isto? Ninguém nunca havia feito algo parecido!
Além da polêmica em torno das manifestações, a decisão do STF em criminalizar a homofobia e transfobia também chamou atenção e preocupa. No meu entendimento, existe uma certa subjetividade no entendimento do “crime”, mas o que causa maior espanto é o fato do STF estar legislando (e não é a primeira vez).
Acredito que a manifestação do dia 26, ao demonstrar uma conscientização da população em relação a importância das reformas, acalmou os ânimos do mercado, levando a queda de preço do dólar e recuperação do índice Ibov. Ainda é cedo para comemorar, pois existe tensão no cenário externo.
Também não podemos negar que a economia brasileira apresentou uma pequena retração – alguns analistas afirmam que o acidente em Brumadinho influenciou no resultado. Segundo o portal Valor, “O orçamento da União para 2019 previa que o Brasil cresceria 2,5% este ano, mas hoje as projeções caminham para algo menor do que 1%. O recuo de 0,2% no Produto Interno Bruto (PIB) no primeiro trimestre reforçou essa percepção“.
Como de costume, confiram os principais números e acontecimentos que sacudiram o país e o mundo (do redator chefe da Modal):
Não sei se a retração econômica influenciou, mas o governo está avaliando liberar recursos de contas do FGTS e PIS-Pasep (mesmo as ativas) para estimular a economia. Espero que liberem!
Vale lembrar que, para quem for MEI, encerrou o prazo para a entrega da declaração DASM (sem multa). Solicitei o CNPJ como MEI no ano passado, no entanto outros projetos tomaram meu tempo e não tive faturamento algum. “Mesmo assim, isto não nos isenta da declaração – acessei o portal do empreendedor e declarei com todos os valores zerados.“
Novamente, nas últimas semanas do mês, muitas empresas divulgaram seu balanço e alguns fatos relevantes pertinentes…
A Engie Brasil Energia (EGIE3), por exemplo, anunciou a entrada no segmento de gás natural brasileiro ao adquirir participação na Transportadora Associada de Gás S.A. (TAG). Aliás, o desempenho da Engie permanece excelente.
Mas, nem tudo são flores… Adivinhem quem está tentando vender a participação da TAG para Engie? Ninguém menos que a Petrobras. Por ser uma estatal, o STF simplesmente suspendeu a negociação, alegando a necessidade de um processo de licitação. Então, não é à toa que defendemos as privatizações!
Dos ativos que mantenho em carteira, foram divulgados os balanços de Ambev (ABEV3 – lucro líquido +6,2%), BB Seguros (BBSE3 – lucro líquido +11,7%), Eztec (EZTC3 – lucro líquido +11,8%), Carrefour BR (CRFB3 – lucro líquido +28,8%), Engie (EGIE3 – lucro líquido +15,6%), Itaúsa (ITSA3 – lucro líquido +3,6%), Petrobras (PETR3 – lucro líquido -42%) e OdontoPrev (ODPV3 – lucro líquido +18,9%).
“A avaliação da Petrobras ainda pede cautela. O lucro líquido apurado pela Petrobras foi de -42% no ano (sim, foi negativo), porém comparado com o último trimestre, houve um ganho de +92%“
No mês passado comentei sobre o interesse da Magazine Luíza (MGLU3) pela Netshoes. Para o meu espanto, a Centauro também entrou na briga, elevando a oferta para cerca de U$ 108 milhões. Ambas as empresas estão apostando alto na capacidade de reestruturação.
Pois é, mas a Magazine Luíza não parou por aí. Além da negociação com a Netshoes, está fechando acordo para venda de eletro no Carrefour. Infelizmente não sou sócio da MGLU3 (perdi uma excelente oportunidade). De qualquer forma, entendo que o negocio pode oferecer bons frutos ao grupo Carrefour (CRFB3) – tenho uma pequena exposição em CRFB3.
Outra empresa que abri posição “recentemente” e vem surpreendendo é a Weg (WEGE3). A empresa lançou um novo modelo de turbina de energia eólica, com potência de 4 MW. Decidi aportar na Weg por se destacar no mercado de motores elétricos, que considero muito promissor. E para minha surpresa (ainda mais agradável), a empresa começou uma parceria com a Embraerpara construção de aeronaves com motor elétrico.
Quando parecia não haver mais espaço para novas negociações no mês, eis que o grupo Fleury (FLRY3) conclui a aquisição da dona da Lafe(laboratório de análises clínicas) por U$ 170 milhões. Aliás, não podemos esquecer também da proposta de fusão entre Fiat e Renault.
Faz algum tempo que não vejo o mercado tão otimista e promissor! 😉
Quanto aos investimentos…
Recebi proventos de BBAS3, FLRY3, GRND3, ITUB3, ODPV3, PETR3, BRCR11 (0,672%), FCFL11 (0,535%), PQDP11(0,396%), KNRI11(0,486%), RNGO11(0,576%), SAAG11(0,740%), GGRC11(0,508%), MXRF11(0,619%), KNCR11(0,573%), HGRE11(0,471%), FLMA11(0,393%), HGBS11(0,548%) e FIGS11(0,790%). O desempenho dos FIIs permanece bastante estável e satisfatório. O pior rendimento foi do fundo FLMA11 – acredito que seja em função da forte valorização no mês (R$ 3,6 por cota). O rendimento do fundo PQDP11 também decepcionou um pouco, mas os fundamentos permanecem positivos e tem oferecido um ganho de capital expressivo – este foi um dos motivos que me levou realizar um pequeno ajuste na carteira em jul de 2018. De maneira geral, o rendimento da carteira permanece excelente, sendo *reforçado* com o pagamento de dividendos e JCP de BBAS3, FLRY3, GRND3, ITUB3, ODPV3 e PETR3 (desta vez, superou o rendimento dos FIIs).
Confiram qual foi remanejamento realizado em jul de 2018:
Com o rendimento da própria carteira, somado ao capital que me prontifico separar para investir mensalmente, comprei mais ações (ou cotas) de FLRY3, EGIE3, SAAG11, BRCR11 e KNRI11. O maior aporte foi para FLRY3 e o menor para KNRI11. Fora o aporte no fundo KNRI11, a distribuição foi bastante equilibrada. Felizmente, contei com uma capacidade de aporte maior.
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“
Conforme venho compartilhando, minha atuação principal é como holder. No entanto, tenho avaliado a possibilidade de especular o mercado futuro através de trades com mini contratos de dólar. Meu objetivo, caso bem sucedido, é aumentar minha capacidade de aporte.
O resultado dos trades com o robô no MT5 foi positivo, porém insignificante. Como estou encerrando os ajustes na programação do robô, acabei perdendo algumas oportunidades interessantes e finalizei o mês com um ganho de apenas R$ 115,00. Não seria tão ruim caso não gerasse uma despesa de R$ 110 (risos). Ou seja, fechei com lucro líquido de apenas R$ 5 (risos). Nunca achei que seria fácil, tenho consciência. Mas, apesar do fraco resultado, fiquei muito satisfeito com a otimização que consegui realizar ao longo do mês.
De maneira geral, continuo bastante satisfeito com o resultado da carteira e com a evolução do robô de trades. 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!
Não resisti, precisava compartilhar esta imagem – é engraçada, mas há uma pitada de verdade na brincadeira. Tenham consciência de que o sucesso depende de paciência, esforço e perseverança. Acreditem, não é frase de autoajuda não, é uma constatação!
O tempo, neste caso, será sempre seu maior aliado.
A paciência é o segredo para o sucesso! 😉 O enriquecimento não acontecerá da noite para o dia…
Finalmente, trataremos a codificação do Expert Advisor (robô ou assistente especializado). As etapas tratadas anteriormente foram fundamentais para melhor compreensão e aprendizado da linguagem MQL5. Neste artigo, veremos como codificar um EA e integrá-lo com o indicador implementado anteriormente.
“Vale lembrar que o segredo deste EA está no indicador, não no EA. Logo, é preciso melhorar a eficiência do indicador APF-Color-Base!”
Para agilizar o processo de codificação e reduzir a margem de erros, incluímos as bibliotecas internas CPositionInfo (controle de posição), CTrade (operações de trade) e CSymbolInfo (informações de mercado, referentes ao ativo analisado).
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CPositionInfo m_position; // trade position object
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
Como o robô se orienta pelo indicador APF-Color-Base, precisamos obter a cor da barra através de uma chamada iCustom, no bloco OnInit:
Percebam que a chamada não difere muito dos exemplos que utilizamos no indicador com chamadas iMA e iSAR.
A leitura do sinal (obtenção da cor da barra) foi codificada na função GetSignal.
Mas, para ampliar a segurança das operações, a primeira verificação é referente a tentativa de encerrar operações em aberto (m_trade.PositionClose).
int signal=GetSignal();
if (signal==0 || close_trade) {
if (count_buy>0 || count_sell>0) {
int close_pos=0;
for(int i=PositionsTotal()-1;i>=0;i--)
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic) {
close_pos=0;
if (signal==0 || close_trade) {
m_trade.PositionClose(m_position.Ticket());
close_pos=1;
}
}
}
return;
}
“A função GetSignal retornará a cor da barra: sendo 0 (branco), 1 (verde/long) e 2 (vermelho/short) – vide indicador!“
Quando count_buy ou count_sell for maior que 0, certamente existirá uma operação em aberto (Long ou Short). Neste caso, a posição será fechada caso GetSignal retorne 0 (a barra mudou de cor – para branco) ou close_trade seja diferente de zero (para forçar o fechamento).
Confiram o código da função GetSignal:
int GetSignal()
{
//--- load buf_color_line
if (CopyBuffer(hAPF,4,0,2,buf_APF) < 0){
Print("CopyBuffer APF error =",GetLastError());
return(0);
}
int vSignal=0;
if ((buf_APF[0]==1 && buf_APF[1]==0) || (count_buy>0 && buf_APF[0]==1 && buf_APF[1]==1)) vSignal=1;
if ((buf_APF[0]==2 && buf_APF[1]==0) || (count_sell>0 && buf_APF[0]==2 && buf_APF[1]==2)) vSignal=2;
return (vSignal);
}
A cor dos dois últimos candles é obtida através da função do MQL5 CopyBuffer: o primeiro parâmetro identifica o handle do indicador (hAPF), o segundo parâmetro a posição do buffer do indicador (4 é o índice que representa buf_color_line – consulte os mapeamentos feitos com SetIndexBuffer), o terceiro a posição inicial (0 – última barra) e o último corresponde ao número de elementos para copiar (2 – duas barras).
“A leitura dos dois últimos candles se faz necessário para comparar uma possível mudança de cor“
Já a abertura de posição foi codificada na função OpenBuy (posição comprada) e OpenSell (posição vendida). Conforme exposto anteriormente, utilizamos a biblioteca CTrade para controlar a abertura de posição (m_trade.PositionOpen):
void OpenBuy(double sl,double tp)
{
sl=m_symbol.NormalizePrice(sl);
tp=m_symbol.NormalizePrice(tp);
int aux_Lots=InpLots;
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),aux_Lots,m_symbol.Ask(),ORDER_TYPE_BUY);
if (count_buy>0) return;
if(check_volume_lot!=0.0) {
if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_BUY,aux_Lots,m_symbol.Ask(),sl,tp,"LONG"))
{
if (trade_maxgain==0) {
count_buy++;
max_trades++;
}
Print("PositionOpen() BUY method executed SUCCESSFULLY. Return code=",m_trade.ResultRetcode(),
" (",m_trade.ResultRetcodeDescription(),")");
PrintResultTrade(m_trade,m_symbol);
// preço confirmado pela corretora
trade_open=m_trade.ResultPrice();
}
...
}
...
//---
}
“Cada ordem será enviada à mercado (ORDER_TYPE_BUY). Sendo assim, logo que o indicador sinalizar a mudança de cor, o robô fará a negociação pelo preço negociado naquele instante!“
Caso tenha ficado alguma dúvida referente a lógica básica de construção de um EA, também recomendo acessar o seguinte vídeo:
“No vídeo anterior, algumas estrategias foram escritas de maneira um pouco diferente (até porque abordou uma codificação em MQL4). Mas a lógica padrão é a mesma.“
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.
“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);
}