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 trade – nú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!



